Skip to content

Commit 30e2175

Browse files
committed
Update ether's price and gas price in realtime
1 parent 4c818b0 commit 30e2175

File tree

15 files changed

+205
-56
lines changed

15 files changed

+205
-56
lines changed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,18 @@ require (
77
github.com/ethereum/go-ethereum v1.10.26
88
github.com/gdamore/tcell/v2 v2.5.4
99
github.com/rivo/tview v0.0.0-20230104153304-892d1a2eb0da
10-
github.com/rs/zerolog v1.28.0
1110
github.com/spf13/cobra v1.6.1
1211
github.com/stretchr/testify v1.8.1
1312
)
1413

14+
require github.com/shopspring/decimal v1.3.1
15+
1516
require (
1617
github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect
1718
github.com/davecgh/go-spew v1.1.1 // indirect
1819
github.com/deckarep/golang-set v1.8.0 // indirect
1920
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
2021
github.com/gdamore/encoding v1.0.0 // indirect
21-
github.com/gdamore/tcell v1.4.0
2222
github.com/go-ole/go-ole v1.2.6 // indirect
2323
github.com/go-stack/stack v1.8.1 // indirect
2424
github.com/gorilla/websocket v1.5.0 // indirect

go.sum

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPx
55
github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU=
66
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
77
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
8-
github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
98
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
109
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
1110
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -24,15 +23,12 @@ github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlK
2423
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI=
2524
github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko=
2625
github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=
27-
github.com/gdamore/tcell v1.4.0 h1:vUnHwJRvcPQa3tzi+0QI4U9JINXYJlOz9yiaiPQ2wMU=
28-
github.com/gdamore/tcell v1.4.0/go.mod h1:vxEiSDZdW3L+Uhjii9c3375IlDmR05bzxY404ZVSMo0=
2926
github.com/gdamore/tcell/v2 v2.5.4 h1:TGU4tSjD3sCL788vFNeJnTdzpNKIw1H5dgLnJRQVv/k=
3027
github.com/gdamore/tcell/v2 v2.5.4/go.mod h1:dZgRy5v4iMobMEcWNYBtREnDZAT9DYmfqIkrgEMxLyw=
3128
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
3229
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
3330
github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw=
3431
github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4=
35-
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
3632
github.com/golang-jwt/jwt/v4 v4.3.0 h1:kHL1vqdqWNfATmA0FNMdmZNMyZI1U6O31X4rlIPoBog=
3733
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
3834
github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
@@ -47,24 +43,19 @@ github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf
4743
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
4844
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
4945
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
50-
github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
5146
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
5247
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
53-
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
5448
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
5549
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
56-
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
5750
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
5851
github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
5952
github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
60-
github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
6153
github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU=
6254
github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
6355
github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
6456
github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A=
6557
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
6658
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
67-
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
6859
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
6960
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
7061
github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=
@@ -75,13 +66,12 @@ github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw=
7566
github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
7667
github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE=
7768
github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
78-
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
79-
github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY=
80-
github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
8169
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
8270
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
8371
github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
8472
github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
73+
github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
74+
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
8575
github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
8676
github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
8777
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
@@ -117,12 +107,9 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
117107
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=
118108
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
119109
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
120-
golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
121110
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
122111
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
123112
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
124-
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
125-
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
126113
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
127114
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
128115
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

internal/common/conv/ether.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,6 @@ func ToEther(wei *big.Int) *big.Float {
1010
return new(big.Float).Quo(new(big.Float).SetInt(wei), big.NewFloat(params.Ether))
1111
}
1212

13+
func ToGwei(wei *big.Int) *big.Int {
14+
return new(big.Int).Quo(wei, big.NewInt(params.GWei))
15+
}

internal/config/config.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package config
22

33
import (
44
"fmt"
5+
"strings"
56

67
"github.com/dyng/ramen/internal/view/style"
78
)
@@ -36,16 +37,11 @@ func (c *Config) Endpoint() string {
3637
apiKey := c.ApiKey
3738

3839
// config network
39-
network := c.Network
40-
if network == "homestead" {
41-
network = "mainnet"
42-
}
43-
4440
switch c.Provider {
4541
case "local":
4642
return "ws://localhost:8545"
4743
case "alchemy":
48-
return fmt.Sprintf("wss://eth-%s.alchemyapi.io/v2/%s", network, apiKey)
44+
return fmt.Sprintf("wss://eth-%s.alchemyapi.io/v2/%s", strings.ToLower(c.Network), apiKey)
4945
default:
5046
return ""
5147
}
@@ -55,7 +51,7 @@ func (c *Config) EtherscanEndpoint() string {
5551
if c.Network == "mainnet" {
5652
return fmt.Sprintf("https://api.etherscan.io/api")
5753
} else {
58-
return fmt.Sprintf("https://api-%s.etherscan.io/api", c.Network)
54+
return fmt.Sprintf("https://api-%s.etherscan.io/api", strings.ToLower(c.Network))
5955
}
6056
}
6157

internal/provider/ethereum.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,12 @@ func (p *Provider) GetNetwork() (common.BigInt, error) {
103103
return p.chainId, nil
104104
}
105105

106+
func (p *Provider) GetGasPrice() (common.BigInt, error) {
107+
ctx, cancel := p.createContext()
108+
defer cancel()
109+
return p.client.SuggestGasPrice(ctx)
110+
}
111+
106112
func (p *Provider) GetSigner() (types.Signer, error) {
107113
_, err := p.GetNetwork()
108114
if err != nil {

internal/provider/etherscan/etherscan.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/dyng/ramen/internal/common"
1414
"github.com/ethereum/go-ethereum/accounts/abi"
1515
"github.com/ethereum/go-ethereum/log"
16+
"github.com/shopspring/decimal"
1617
)
1718

1819
const (
@@ -103,6 +104,37 @@ func (c *EtherscanClient) GetSourceCode(address common.Address) (string, *abi.AB
103104
return code.SourceCode, &parsedAbi, nil
104105
}
105106

107+
func (c *EtherscanClient) EthPrice() (*decimal.Decimal, error) {
108+
req, err := http.NewRequest(http.MethodGet, c.endpoint, nil)
109+
if err != nil {
110+
return nil, err
111+
}
112+
113+
// build request
114+
q := req.URL.Query()
115+
q.Add("apikey", c.apiKey)
116+
q.Add("module", "stats")
117+
q.Add("action", "ethprice")
118+
req.URL.RawQuery = q.Encode()
119+
120+
result, err := c.doRequest(req)
121+
if err != nil {
122+
return nil, err
123+
}
124+
125+
var ethprice ethpriceJSON
126+
if err = json.Unmarshal(result, &ethprice); err != nil {
127+
return nil, err
128+
}
129+
130+
price, err := decimal.NewFromString(ethprice.EthUsd)
131+
if err != nil {
132+
return nil, err
133+
}
134+
135+
return &price, nil
136+
}
137+
106138
func (c *EtherscanClient) doRequest(request *http.Request) ([]byte, error) {
107139
ctx, cancel := c.createContext()
108140
defer cancel()

internal/provider/etherscan/types.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,3 +120,10 @@ type contractJSON struct {
120120
ABI string `json:"ABI"`
121121
ContractName string `json:"ContractName"`
122122
}
123+
124+
type ethpriceJSON struct {
125+
EthBtc string `json:"ethbtc"`
126+
EthBtcTimestamp string `json:"ethbtc_timestamp"`
127+
EthUsd string `json:"ethusd"`
128+
EthUsdTimestamp string `json:"ethusd_timestamp"`
129+
}

internal/provider/etherum_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,15 @@ func TestCallContract_NoError(t *testing.T) {
5656
balance := result[0].(common.BigInt)
5757
assert.Equal(t, 1, balance.Cmp(big.NewInt(100)), "balance should be greater than 100")
5858
}
59+
60+
func TestGetGasPrice_NoError(t *testing.T) {
61+
// prepare
62+
provider := NewProvider(testAlchemyEndpoint, ProviderAlchemy)
63+
64+
// process
65+
result, err := provider.GetGasPrice()
66+
67+
// verify
68+
assert.NoError(t, err)
69+
assert.Equal(t, 1, result.Cmp(big.NewInt(100)), "gas price should be greater than 100")
70+
}

internal/service/service.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,7 @@ import (
1212
"github.com/dyng/ramen/internal/provider/etherscan"
1313
gcommon "github.com/ethereum/go-ethereum/common"
1414
"github.com/ethereum/go-ethereum/log"
15-
)
16-
17-
const (
18-
// TopicNewBlock is the topic about received new blocks
19-
TopicNewBlock = "service:newBlock"
15+
"github.com/shopspring/decimal"
2016
)
2117

2218
//go:embed data/chains.json
@@ -88,6 +84,14 @@ func (s *Service) GetBlockHeight() (uint64, error) {
8884
return s.provider.GetBlockHeight()
8985
}
9086

87+
func (s *Service) GetGasPrice() (common.BigInt, error) {
88+
return s.provider.GetGasPrice()
89+
}
90+
91+
func (s *Service) GetEthPrice() (*decimal.Decimal, error) {
92+
return s.esclient.EthPrice()
93+
}
94+
9195
func (s *Service) GetAccount(address string) (*Account, error) {
9296
addr := gcommon.HexToAddress(address)
9397
log.Debug("Try to fetch account", "address", address)

internal/service/syncer.go

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,48 @@ package service
22

33
import (
44
"errors"
5+
"math/big"
56
"sync"
7+
"time"
68

79
"github.com/asaskevich/EventBus"
810
"github.com/dyng/ramen/internal/common"
9-
"github.com/dyng/ramen/internal/provider"
1011
"github.com/ethereum/go-ethereum"
1112
"github.com/ethereum/go-ethereum/log"
13+
"github.com/shopspring/decimal"
1214
)
1315

16+
const (
17+
// TopicNewBlock is the topic about received new blocks
18+
TopicNewBlock = "service:newBlock"
19+
// TopicNewChainData is the topic about latest chain data (ether price, gas price, etc.)
20+
TopicNewChainData = "service:newChainData"
21+
22+
// UpdatePeriod is the time duration between two updates
23+
UpdatePeriod = 5 * time.Second
24+
)
25+
26+
type ChainData struct {
27+
Price *decimal.Decimal
28+
GasPrice *big.Int
29+
}
30+
1431
type Syncer struct {
1532
*sync.Mutex
1633

1734
started bool
18-
provider *provider.Provider
35+
service *Service
1936
eventBus EventBus.Bus
37+
ticker *time.Ticker
2038
chBlock chan *common.Header
2139
ethSub ethereum.Subscription
2240
}
2341

24-
func NewSyncer(provider *provider.Provider, eventBus EventBus.Bus) *Syncer {
42+
func NewSyncer(service *Service, eventBus EventBus.Bus) *Syncer {
2543
return &Syncer{
2644
Mutex: &sync.Mutex{},
2745
started: false,
28-
provider: provider,
46+
service: service,
2947
eventBus: eventBus,
3048
chBlock: make(chan *common.Header),
3149
}
@@ -40,12 +58,16 @@ func (s *Syncer) Start() error {
4058
}
4159
s.started = true
4260

43-
sub, err := s.provider.SubscribeNewHead(s.chBlock)
61+
// subscribe to new blocks
62+
sub, err := s.service.GetProvider().SubscribeNewHead(s.chBlock)
4463
if err != nil {
4564
return err
4665
}
4766
s.ethSub = sub
4867

68+
// start ticker for periodic update
69+
s.ticker = time.NewTicker(UpdatePeriod)
70+
4971
// start syncing
5072
go s.sync()
5173

@@ -55,17 +77,35 @@ func (s *Syncer) Start() error {
5577
func (s *Syncer) sync() {
5678
for {
5779
select {
58-
// new block event
5980
case newHeader := <-s.chBlock:
6081
log.Debug("Received new block header", "hash", newHeader.Hash(),
6182
"number", newHeader.Number)
6283

63-
block, err := s.provider.GetBlockByHash(newHeader.Hash())
84+
block, err := s.service.GetProvider().GetBlockByHash(newHeader.Hash())
6485
if err != nil {
86+
log.Error("Failed to fetch block by hash", "hash", newHeader.Hash(), "error", err)
6587
continue
6688
}
6789

6890
s.eventBus.Publish(TopicNewBlock, block)
91+
case tick := <-s.ticker.C:
92+
log.Debug("Process periodic synchronization", "tick", tick)
93+
94+
price, err := s.service.GetEthPrice()
95+
if err != nil {
96+
log.Error("Failed to fetch ether's price", "error", err)
97+
}
98+
99+
gasPrice, err := s.service.GetGasPrice()
100+
if err != nil {
101+
log.Error("Failed to fetch gas price", "error", err)
102+
}
103+
104+
data := &ChainData{
105+
Price: price,
106+
GasPrice: gasPrice,
107+
}
108+
s.eventBus.Publish(TopicNewChainData, data)
69109
}
70110
}
71111
}

0 commit comments

Comments
 (0)