From 317c07de79dc3d0c79f53638995c25c88998e0e2 Mon Sep 17 00:00:00 2001 From: vro <168573323+golangisfun123@users.noreply.github.com> Date: Fri, 16 Aug 2024 05:30:21 -0500 Subject: [PATCH] feat(promexporter): relayer balances (#3016) * initial impl * Better * logic fix * change param * only unique addresses * add relayer balances * [goreleaser] * lint * [goreleaser] * fix config lint [goreleaser] * lint [goreleaser] --- contrib/promexporter/config/config.go | 17 +-- contrib/promexporter/exporters/exporter.go | 6 +- contrib/promexporter/exporters/otel.go | 67 ++++++++++-- .../promexporter/exporters/otel_generated.go | 2 + contrib/promexporter/exporters/relayer.go | 101 ++++++++++++++++++ contrib/promexporter/go.mod | 1 + contrib/promexporter/go.sum | 2 + contrib/screener-api/go.mod | 1 - contrib/screener-api/go.sum | 3 + core/go.sum | 4 + ethergo/go.mod | 1 - 11 files changed, 188 insertions(+), 17 deletions(-) create mode 100644 contrib/promexporter/exporters/relayer.go diff --git a/contrib/promexporter/config/config.go b/contrib/promexporter/config/config.go index f798dd9c99..16ba029f83 100644 --- a/contrib/promexporter/config/config.go +++ b/contrib/promexporter/config/config.go @@ -3,29 +3,32 @@ package config import ( "fmt" + "os" + "path/filepath" + "github.com/creasty/defaults" "github.com/jftuga/ellipsis" "github.com/synapsecns/sanguine/contrib/promexporter/internal/types" "gopkg.in/yaml.v2" - "os" - "path/filepath" ) -// Config contains the config for the prometheues exporter. type Config struct { // Port is the port of the config Port int `yaml:"port"` // DFKApiUrl is the url of the DFK API - DFKUrl string `yaml:"dfk_url" default:"https://defi-kingdoms-community-api-gateway-co06z8vi.uc.gateway.dev/graphql"` + DFKUrl string `default:"https://defi-kingdoms-community-api-gateway-co06z8vi.uc.gateway.dev/graphql" yaml:"dfk_url"` // DFKPending is the list of pending heroes DFKPending []DFKPending `yaml:"dfk_pending"` // SubmitterChecks is the list of gas checks SubmitterChecks []SubmitterChecks `yaml:"gas_checks"` - OmnirpcURL string `yaml:"omnirpc_url" default:"https://rpc.omnirpc.io"` - // map chainid->address - BridgeChecks map[int]string + // OmniRpcURL is the url of the omnirpc + OmnirpcURL string `default:"https://rpc.omnirpc.io" yaml:"omnirpc_url"` // VpriceCheckTokens is the list of tokens to check vprice for VpriceCheckTokens []string `yaml:"vprice_tokens"` + // RFQAPIURL is the url of the RFQ API + RFQAPIUrl string `default:"http://rfq-api.omnirpc.io/quotes" yaml:"rfq_api_url"` + // map chainid->address + BridgeChecks map[int]string // BridgeConfig is the config for the bridge. BridgeConfig BridgeConfig // BatchCallLimit is the limit of batch calls diff --git a/contrib/promexporter/exporters/exporter.go b/contrib/promexporter/exporters/exporter.go index 01010bc52e..813a15c025 100644 --- a/contrib/promexporter/exporters/exporter.go +++ b/contrib/promexporter/exporters/exporter.go @@ -121,12 +121,16 @@ func (e *exporter) recordMetrics(ctx context.Context) (err error) { // nolint: cyclop func (e *exporter) collectMetrics(ctx context.Context) error { var errs []error + + if err := e.fetchRelayerBalances(ctx, e.cfg.RFQAPIUrl); err != nil { + errs = append(errs, fmt.Errorf("could not fetch relayer balances: %w", err)) + } + if err := e.getTokenBalancesStats(ctx); err != nil { errs = append(errs, fmt.Errorf("could not get token balances: %w", err)) } // TODO: parallelize - for _, pending := range e.cfg.DFKPending { if err := e.stuckHeroCountStats(ctx, common.HexToAddress(pending.Owner), pending.ChainName); err != nil { errs = append(errs, fmt.Errorf("could not get stuck hero count: %w", err)) diff --git a/contrib/promexporter/exporters/otel.go b/contrib/promexporter/exporters/otel.go index 30df77544e..c6188a5088 100644 --- a/contrib/promexporter/exporters/otel.go +++ b/contrib/promexporter/exporters/otel.go @@ -20,6 +20,11 @@ type submitterMetadata struct { balance float64 } +type relayerMetadata struct { + address common.Address + balance float64 +} + //go:generate go run github.com/vburenin/ifacemaker -f otel.go -s otelRecorder -i iOtelRecorder -p exporters -o otel_generated.go -c "autogenerated file" type otelRecorder struct { metrics metrics.Handler @@ -48,19 +53,24 @@ type otelRecorder struct { submitters *hashmap.Map[int, []submitterMetadata] balanceGauge metric.Float64ObservableGauge nonceGauge metric.Int64ObservableGauge + + // relayer stats + relayerBalance *hashmap.Map[int, []relayerMetadata] + relayerBalanceGauge metric.Float64ObservableGauge } // TODO: unexport all methods. // nolint: cyclop func newOtelRecorder(meterHandler metrics.Handler) iOtelRecorder { otr := otelRecorder{ - metrics: meterHandler, - meter: meterHandler.Meter(meterName), - stuckHeroes: hashmap.New[string, int64](), - vPrice: hashmap.New[int, float64](), - gasBalance: hashmap.New[int, float64](), - td: hashmap.New[int, []tokenData](), - submitters: hashmap.New[int, []submitterMetadata](), + metrics: meterHandler, + meter: meterHandler.Meter(meterName), + stuckHeroes: hashmap.New[string, int64](), + vPrice: hashmap.New[int, float64](), + gasBalance: hashmap.New[int, float64](), + td: hashmap.New[int, []tokenData](), + submitters: hashmap.New[int, []submitterMetadata](), + relayerBalance: hashmap.New[int, []relayerMetadata](), } var err error @@ -96,6 +106,10 @@ func newOtelRecorder(meterHandler metrics.Handler) iOtelRecorder { log.Warnf("failed to create stuckHeroes gauge: %v", err) } + if otr.relayerBalanceGauge, err = otr.meter.Float64ObservableGauge("relayer_balance"); err != nil { + log.Warnf("failed to create relayerBalance gauge: %v", err) + } + // Register VPrice callback if _, err = otr.meter.RegisterCallback(otr.recordVpriceGauge, otr.vpriceGauge); err != nil { log.Warnf("failed to register callback for vprice metrics: %v", err) @@ -125,6 +139,11 @@ func newOtelRecorder(meterHandler metrics.Handler) iOtelRecorder { log.Warnf("failed to register callback for bridge gas balance metrics: %v", err) } + // The Relayer code of interest. + if _, err = otr.meter.RegisterCallback(otr.recordRelayerBalance, otr.relayerBalanceGauge); err != nil { + log.Warnf("failed to register callback for relayer balance metrics: %v", err) + } + return &otr } @@ -195,6 +214,7 @@ func (o *otelRecorder) RecordTokenBalance( o.td.Set(chainID, td) } + func (o *otelRecorder) recordTokenBalance( _ context.Context, observer metric.Observer, @@ -310,3 +330,36 @@ func (o *otelRecorder) recordSubmitterStats( }) return nil } + +// RELAYER CODE. +func (o *otelRecorder) RecordRelayerBalance(chainID int, relayer relayerMetadata) { + relayerBalances, _ := o.relayerBalance.Get(chainID) + relayerBalances = append(relayerBalances, relayer) + o.relayerBalance.Set(chainID, relayerBalances) +} + +func (o *otelRecorder) recordRelayerBalance( + _ context.Context, + observer metric.Observer, +) (err error) { + if o.metrics == nil || o.relayerBalance == nil { + return nil + } + + o.relayerBalance.Range(func(chainID int, relayerBalances []relayerMetadata) bool { + for _, relayer := range relayerBalances { + observer.ObserveFloat64( + o.relayerBalanceGauge, + relayer.balance, + metric.WithAttributes( + attribute.Int(metrics.ChainID, chainID), + attribute.String("relayer_address", relayer.address.String()), + ), + ) + } + + return true + }) + + return nil +} diff --git a/contrib/promexporter/exporters/otel_generated.go b/contrib/promexporter/exporters/otel_generated.go index 1c42e04db0..37445e8a54 100644 --- a/contrib/promexporter/exporters/otel_generated.go +++ b/contrib/promexporter/exporters/otel_generated.go @@ -13,4 +13,6 @@ type iOtelRecorder interface { RecordStuckHeroCount(stuckHeroes int64, chainname string) // Submitter stats. RecordSubmitterStats(chainid int, metadata submitterMetadata) + // RELAYER CODE. + RecordRelayerBalance(chainID int, relayer relayerMetadata) } diff --git a/contrib/promexporter/exporters/relayer.go b/contrib/promexporter/exporters/relayer.go new file mode 100644 index 0000000000..2ded5f53d6 --- /dev/null +++ b/contrib/promexporter/exporters/relayer.go @@ -0,0 +1,101 @@ +package exporters + +import ( + "context" + "encoding/json" + "fmt" + "io" + "math/big" + "net/http" + "slices" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/params" + "github.com/lmittmann/w3/module/eth" + "github.com/lmittmann/w3/w3types" + rfqAPIModel "github.com/synapsecns/sanguine/services/rfq/api/model" +) + +func (e *exporter) fetchRelayerBalances(ctx context.Context, url string) error { + // Fetch relayer addresses + quotes, err := e.fetchAllQuotes(ctx, url) + if err != nil { + return fmt.Errorf("could not fetch relayer addresses: %w", err) + } + + // chainIDs is a map of chain ID to relayer addresses + chainIDToRelayers := make(map[int][]string) + + // Get all chain IDs + for _, quote := range quotes { + if !slices.Contains(chainIDToRelayers[quote.OriginChainID], quote.RelayerAddr) { + chainIDToRelayers[quote.OriginChainID] = append(chainIDToRelayers[quote.OriginChainID], quote.RelayerAddr) + } + + if !slices.Contains(chainIDToRelayers[quote.DestChainID], quote.RelayerAddr) { + chainIDToRelayers[quote.DestChainID] = append(chainIDToRelayers[quote.DestChainID], quote.RelayerAddr) + } + } + + for chainID, relayers := range chainIDToRelayers { + client, err := e.omnirpcClient.GetConfirmationsClient(ctx, chainID, 1) + if err != nil { + return fmt.Errorf("could not get confirmations client: %w", err) + } + + var relayerBalances []*big.Int + for range relayers { + relayerBalances = append(relayerBalances, new(big.Int)) + } + + var callsForCurrentChainID []w3types.Caller + for i, relayer := range relayers { + callsForCurrentChainID = append( + callsForCurrentChainID, + eth.Balance(common.HexToAddress(relayer), nil).Returns(relayerBalances[i]), + ) + } + + _ = e.batchCalls(ctx, client, callsForCurrentChainID) + + for i, balanceOfRelayer := range relayerBalances { + balanceFloat, _ := new(big.Float).SetInt(balanceOfRelayer).Float64() + relayerMetadata := relayerMetadata{ + address: common.HexToAddress(relayers[i]), + balance: balanceFloat / params.Ether, + } + // the line of interest, where we record each relayer data for the respective chainID + e.otelRecorder.RecordRelayerBalance(chainID, relayerMetadata) + } + } + + return nil +} + +func (e *exporter) fetchAllQuotes(ctx context.Context, url string) ([]rfqAPIModel.GetQuoteResponse, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + return nil, fmt.Errorf("could not get quotes: %w", err) + } + + res, err := e.client.Do(req) + if err != nil { + return nil, fmt.Errorf("could not get quotes: %w", err) + } + defer func() { + _ = res.Body.Close() + }() + + body, err := io.ReadAll(res.Body) + if err != nil { + return nil, fmt.Errorf("could not read body: %w", err) + } + + var quotes []rfqAPIModel.GetQuoteResponse + err = json.Unmarshal(body, "es) + if err != nil { + return nil, fmt.Errorf("could not unmarshal quotes: %w", err) + } + + return quotes, nil +} diff --git a/contrib/promexporter/go.mod b/contrib/promexporter/go.mod index 8bfc4e4cd1..2d842ce83d 100644 --- a/contrib/promexporter/go.mod +++ b/contrib/promexporter/go.mod @@ -36,6 +36,7 @@ require ( github.com/synapsecns/sanguine/ethergo v0.1.0 github.com/synapsecns/sanguine/services/explorer v0.0.0-00010101000000-000000000000 github.com/synapsecns/sanguine/services/omnirpc v0.0.0-00010101000000-000000000000 + github.com/synapsecns/sanguine/services/rfq v1.8.0 github.com/urfave/cli/v2 v2.27.2 go.opentelemetry.io/otel v1.28.0 go.opentelemetry.io/otel/metric v1.28.0 diff --git a/contrib/promexporter/go.sum b/contrib/promexporter/go.sum index 80d1d0ea66..599d1ece58 100644 --- a/contrib/promexporter/go.sum +++ b/contrib/promexporter/go.sum @@ -1033,6 +1033,8 @@ github.com/synapsecns/fasthttp-http2 v1.0.0 h1:G1/8AKgAzVImHpGbCGZo8w4c0kUBXb4eR github.com/synapsecns/fasthttp-http2 v1.0.0/go.mod h1:QM9mQS/FygGB3PdvmW8a0/70FirWmEZVvj6Dlo1pisw= github.com/synapsecns/gqlgenc v0.10.0-hotfix h1:EkxocO6V/xRcHJ+1sNY+fwDY5l1/jL9qooPEpWzrbLg= github.com/synapsecns/gqlgenc v0.10.0-hotfix/go.mod h1:OeQhghEgvGWvRwzx9XjMeg3FUQOHnTo5/12iuJSJxLg= +github.com/synapsecns/sanguine/services/rfq v1.8.0 h1:0s5ywpXMbtcoKGD3E00pPWa/OAHQi07l2+tHEpbbNSE= +github.com/synapsecns/sanguine/services/rfq v1.8.0/go.mod h1:1jtien0M/VFz/2hzr/YHCkd8WxPOIWVNZ+47sGB+Gl8= github.com/syndtr/goleveldb v1.0.1-0.20210305035536-64b5b1c73954/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= diff --git a/contrib/screener-api/go.mod b/contrib/screener-api/go.mod index 41551f76bf..3acdfdba30 100644 --- a/contrib/screener-api/go.mod +++ b/contrib/screener-api/go.mod @@ -39,7 +39,6 @@ require ( require ( dario.cat/mergo v1.0.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/BurntSushi/toml v1.4.0 // indirect github.com/ImVexed/fasturl v0.0.0-20230304231329-4e41488060f3 // indirect github.com/KyleBanks/depth v1.2.1 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect diff --git a/contrib/screener-api/go.sum b/contrib/screener-api/go.sum index 3aca8ecf3b..ea7f410d9b 100644 --- a/contrib/screener-api/go.sum +++ b/contrib/screener-api/go.sum @@ -42,6 +42,7 @@ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOEl github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Flaque/filet v0.0.0-20201012163910-45f684403088 h1:PnnQln5IGbhLeJOi6hVs+lCeF+B1dRfFKPGXUAez0Ww= github.com/Flaque/filet v0.0.0-20201012163910-45f684403088/go.mod h1:TK+jB3mBs+8ZMWhU5BqZKnZWJ1MrLo8etNVg51ueTBo= @@ -185,6 +186,7 @@ github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= github.com/go-errors/errors v1.4.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= @@ -321,6 +323,7 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= diff --git a/core/go.sum b/core/go.sum index ab4d9782ce..36944e18dd 100644 --- a/core/go.sum +++ b/core/go.sum @@ -42,6 +42,7 @@ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOEl github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Flaque/filet v0.0.0-20201012163910-45f684403088 h1:PnnQln5IGbhLeJOi6hVs+lCeF+B1dRfFKPGXUAez0Ww= github.com/Flaque/filet v0.0.0-20201012163910-45f684403088/go.mod h1:TK+jB3mBs+8ZMWhU5BqZKnZWJ1MrLo8etNVg51ueTBo= @@ -185,6 +186,7 @@ github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE= github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8= github.com/go-errors/errors v1.4.1/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= @@ -311,6 +313,7 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= @@ -814,6 +817,7 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= diff --git a/ethergo/go.mod b/ethergo/go.mod index 99fca7d280..ca5dd23beb 100644 --- a/ethergo/go.mod +++ b/ethergo/go.mod @@ -85,7 +85,6 @@ require ( cloud.google.com/go/longrunning v0.5.7 // indirect dario.cat/mergo v1.0.0 // indirect github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect - github.com/BurntSushi/toml v1.4.0 // indirect github.com/DataDog/zstd v1.5.2 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect