mirror of
				https://github.com/grassrootseconomics/eth-tracker.git
				synced 2025-11-03 18:11:53 +01:00 
			
		
		
		
	feat (BREAKING): evm compat tracker with mod directive replace approach
This commit is contained in:
		
							parent
							
								
									afacc4425d
								
							
						
					
					
						commit
						8c15109238
					
				@ -33,7 +33,7 @@ We provide pre-built images for `linux/amd64`. See the packages tab on Github.
 | 
			
		||||
If you are on any other platform:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
git clone https://github.com/grassrootseconomics/celo-tracker.git
 | 
			
		||||
git clone https://github.com/grassrootseconomics/eth-tracker.git
 | 
			
		||||
cd celo-tracker
 | 
			
		||||
docker buildx build --build-arg BUILD=$(git rev-parse --short HEAD) --tag celo-tracker:$(git rev-parse --short HEAD) --tag celo-tracker:latest .
 | 
			
		||||
docker images
 | 
			
		||||
 | 
			
		||||
@ -7,14 +7,14 @@ import (
 | 
			
		||||
	"os"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/common"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/cache"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/chain"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/util"
 | 
			
		||||
	"github.com/grassrootseconomics/celoutils/v3"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo/module/eth"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/cache"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/chain"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/util"
 | 
			
		||||
	"github.com/grassrootseconomics/ethutils"
 | 
			
		||||
	"github.com/knadh/koanf/v2"
 | 
			
		||||
	"github.com/lmittmann/w3"
 | 
			
		||||
	"github.com/lmittmann/w3/module/eth"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const cacheType = "redis"
 | 
			
		||||
@ -44,7 +44,7 @@ func main() {
 | 
			
		||||
		quoterGetter        = w3.MustNewFunc("quoter()", "address")
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	chain, err := chain.NewRPCFetcher(chain.CeloRPCOpts{
 | 
			
		||||
	chain, err := chain.NewRPCFetcher(chain.EthRPCOpts{
 | 
			
		||||
		RPCEndpoint: ko.MustString("chain.rpc_endpoint"),
 | 
			
		||||
		ChainID:     ko.MustInt64("chain.chainid"),
 | 
			
		||||
	})
 | 
			
		||||
@ -67,13 +67,13 @@ func main() {
 | 
			
		||||
	defer cancel()
 | 
			
		||||
 | 
			
		||||
	for _, registry := range ko.MustStrings("bootstrap.ge_registries") {
 | 
			
		||||
		registryMap, err := chain.Provider().RegistryMap(ctx, celoutils.HexToAddress(registry))
 | 
			
		||||
		registryMap, err := chain.Provider().RegistryMap(ctx, ethutils.HexToAddress(registry))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			lo.Error("could not fetch registry", "error", err)
 | 
			
		||||
			os.Exit(1)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if tokenIndex := registryMap[celoutils.TokenIndex]; tokenIndex != celoutils.ZeroAddress {
 | 
			
		||||
		if tokenIndex := registryMap[ethutils.TokenIndex]; tokenIndex != ethutils.ZeroAddress {
 | 
			
		||||
			tokenIndexIter, err := chain.Provider().NewBatchIterator(ctx, tokenIndex)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				lo.Error("could not create token index iter", "error", err)
 | 
			
		||||
@ -99,7 +99,7 @@ func main() {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if poolIndex := registryMap[celoutils.PoolIndex]; poolIndex != celoutils.ZeroAddress {
 | 
			
		||||
		if poolIndex := registryMap[ethutils.PoolIndex]; poolIndex != ethutils.ZeroAddress {
 | 
			
		||||
			poolIndexIter, err := chain.Provider().NewBatchIterator(ctx, poolIndex)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				lo.Error("cache could create pool index iter", "error", err)
 | 
			
		||||
@ -132,13 +132,13 @@ func main() {
 | 
			
		||||
						lo.Error("error fetching pool token index and/or quoter", "error", err)
 | 
			
		||||
						os.Exit(1)
 | 
			
		||||
					}
 | 
			
		||||
					if priceQuoter != celoutils.ZeroAddress {
 | 
			
		||||
					if priceQuoter != ethutils.ZeroAddress {
 | 
			
		||||
						if err := cache.Add(ctx, priceQuoter.Hex()); err != nil {
 | 
			
		||||
							lo.Error("redis error setting key", "error", err)
 | 
			
		||||
							os.Exit(1)
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					if poolTokenIndex != celoutils.ZeroAddress {
 | 
			
		||||
					if poolTokenIndex != ethutils.ZeroAddress {
 | 
			
		||||
						if err := cache.Add(ctx, poolTokenIndex.Hex()); err != nil {
 | 
			
		||||
							lo.Error("redis error setting key", "error", err)
 | 
			
		||||
							os.Exit(1)
 | 
			
		||||
@ -161,7 +161,7 @@ func main() {
 | 
			
		||||
							}
 | 
			
		||||
							lo.Debug("index batch", "index", poolTokenIndex.Hex(), "size", len(batch))
 | 
			
		||||
							for _, address := range batch {
 | 
			
		||||
								if address != celoutils.ZeroAddress {
 | 
			
		||||
								if address != ethutils.ZeroAddress {
 | 
			
		||||
									if err := cache.Add(ctx, address.Hex()); err != nil {
 | 
			
		||||
										lo.Error("redis error setting key", "error", err)
 | 
			
		||||
										os.Exit(1)
 | 
			
		||||
@ -174,7 +174,7 @@ func main() {
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if accountsIndex := registryMap[celoutils.AccountIndex]; accountsIndex != celoutils.ZeroAddress {
 | 
			
		||||
		if accountsIndex := registryMap[ethutils.AccountIndex]; accountsIndex != ethutils.ZeroAddress {
 | 
			
		||||
			accountsIndexIter, err := chain.Provider().NewBatchIterator(ctx, accountsIndex)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				lo.Error("could not create accounts index iter", "error", err)
 | 
			
		||||
@ -222,7 +222,7 @@ func main() {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := cache.Remove(ctx, celoutils.ZeroAddress.Hex()); err != nil {
 | 
			
		||||
	if err := cache.Remove(ctx, ethutils.ZeroAddress.Hex()); err != nil {
 | 
			
		||||
		lo.Error("redis error deleting key", "error", err)
 | 
			
		||||
		os.Exit(1)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -13,17 +13,17 @@ import (
 | 
			
		||||
	"syscall"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/db"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/api"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/backfill"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/cache"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/chain"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/pool"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/processor"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/pub"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/stats"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/syncer"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/util"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/db"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/api"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/backfill"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/cache"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/chain"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/pool"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/processor"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/pub"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/stats"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/syncer"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/util"
 | 
			
		||||
	"github.com/knadh/koanf/v2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@ -52,7 +52,7 @@ func main() {
 | 
			
		||||
	var wg sync.WaitGroup
 | 
			
		||||
	ctx, stop := notifyShutdown()
 | 
			
		||||
 | 
			
		||||
	chain, err := chain.NewRPCFetcher(chain.CeloRPCOpts{
 | 
			
		||||
	chain, err := chain.NewRPCFetcher(chain.EthRPCOpts{
 | 
			
		||||
		RPCEndpoint: ko.MustString("chain.rpc_endpoint"),
 | 
			
		||||
		ChainID:     ko.MustInt64("chain.chainid"),
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
@ -1,10 +1,10 @@
 | 
			
		||||
package main
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/cache"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/handler"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/router"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/cache"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/handler"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/router"
 | 
			
		||||
	"github.com/lmittmann/w3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func bootstrapEventRouter(cacheProvider cache.Cache, pubCB router.Callback) *router.Router {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										63
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								go.mod
									
									
									
									
									
								
							@ -1,19 +1,21 @@
 | 
			
		||||
module github.com/grassrootseconomics/celo-tracker
 | 
			
		||||
module github.com/grassrootseconomics/eth-tracker
 | 
			
		||||
 | 
			
		||||
go 1.23.0
 | 
			
		||||
 | 
			
		||||
replace github.com/ethereum/go-ethereum v1.14.8 => github.com/celo-org/op-geth v1.101408.1-0.20240927090724-573364d396d3
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/VictoriaMetrics/metrics v1.35.1
 | 
			
		||||
	github.com/alitto/pond v1.9.2
 | 
			
		||||
	github.com/bits-and-blooms/bitset v1.14.3
 | 
			
		||||
	github.com/celo-org/celo-blockchain v1.8.4
 | 
			
		||||
	github.com/grassrootseconomics/celoutils/v3 v3.3.1
 | 
			
		||||
	github.com/grassrootseconomics/w3-celo v0.19.0
 | 
			
		||||
	github.com/ethereum/go-ethereum v1.14.8
 | 
			
		||||
	github.com/grassrootseconomics/ethutils v1.3.0
 | 
			
		||||
	github.com/kamikazechaser/common v0.2.0
 | 
			
		||||
	github.com/knadh/koanf/parsers/toml v0.1.0
 | 
			
		||||
	github.com/knadh/koanf/providers/env v0.1.0
 | 
			
		||||
	github.com/knadh/koanf/providers/file v1.1.0
 | 
			
		||||
	github.com/knadh/koanf/v2 v2.1.1
 | 
			
		||||
	github.com/lmittmann/w3 v0.17.0
 | 
			
		||||
	github.com/nats-io/nats.go v1.36.0
 | 
			
		||||
	github.com/puzpuzpuz/xsync/v3 v3.4.0
 | 
			
		||||
	github.com/redis/rueidis v1.0.46
 | 
			
		||||
@ -23,62 +25,47 @@ require (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	filippo.io/edwards25519 v1.0.0-alpha.2 // indirect
 | 
			
		||||
	github.com/BurntSushi/toml v1.4.0 // indirect
 | 
			
		||||
	github.com/Microsoft/go-winio v0.6.2 // indirect
 | 
			
		||||
	github.com/StackExchange/wmi v1.2.1 // indirect
 | 
			
		||||
	github.com/VictoriaMetrics/fastcache v1.12.2 // indirect
 | 
			
		||||
	github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect
 | 
			
		||||
	github.com/celo-org/celo-bls-go v0.3.4 // indirect
 | 
			
		||||
	github.com/celo-org/celo-bls-go-android v0.3.3 // indirect
 | 
			
		||||
	github.com/celo-org/celo-bls-go-ios v0.3.3 // indirect
 | 
			
		||||
	github.com/celo-org/celo-bls-go-linux v0.3.3 // indirect
 | 
			
		||||
	github.com/celo-org/celo-bls-go-macos v0.3.3 // indirect
 | 
			
		||||
	github.com/celo-org/celo-bls-go-other v0.3.3 // indirect
 | 
			
		||||
	github.com/celo-org/celo-bls-go-windows v0.3.3 // indirect
 | 
			
		||||
	github.com/cespare/xxhash/v2 v2.3.0 // indirect
 | 
			
		||||
	github.com/davecgh/go-spew v1.1.1 // indirect
 | 
			
		||||
	github.com/deckarep/golang-set v1.8.0 // indirect
 | 
			
		||||
	github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect
 | 
			
		||||
	github.com/consensys/bavard v0.1.13 // indirect
 | 
			
		||||
	github.com/consensys/gnark-crypto v0.12.1 // indirect
 | 
			
		||||
	github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect
 | 
			
		||||
	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
 | 
			
		||||
	github.com/deckarep/golang-set/v2 v2.6.0 // indirect
 | 
			
		||||
	github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
 | 
			
		||||
	github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240821192748-42bd03ba8313 // indirect
 | 
			
		||||
	github.com/ethereum/c-kzg-4844 v1.0.0 // indirect
 | 
			
		||||
	github.com/fsnotify/fsnotify v1.7.0 // indirect
 | 
			
		||||
	github.com/go-ole/go-ole v1.3.0 // indirect
 | 
			
		||||
	github.com/go-stack/stack v1.8.1 // indirect
 | 
			
		||||
	github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 // indirect
 | 
			
		||||
	github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect
 | 
			
		||||
	github.com/google/go-cmp v0.6.0 // indirect
 | 
			
		||||
	github.com/gorilla/websocket v1.5.0 // indirect
 | 
			
		||||
	github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect
 | 
			
		||||
	github.com/hdevalence/ed25519consensus v0.0.0-20201207055737-7fde80a9d5ff // indirect
 | 
			
		||||
	github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
 | 
			
		||||
	github.com/holiman/uint256 v1.3.0 // indirect
 | 
			
		||||
	github.com/huin/goupnp v1.3.0 // indirect
 | 
			
		||||
	github.com/jackpal/go-nat-pmp v1.0.2 // indirect
 | 
			
		||||
	github.com/holiman/uint256 v1.3.1 // indirect
 | 
			
		||||
	github.com/klauspost/compress v1.17.2 // indirect
 | 
			
		||||
	github.com/knadh/koanf/maps v0.1.1 // indirect
 | 
			
		||||
	github.com/lmittmann/tint v1.0.4 // indirect
 | 
			
		||||
	github.com/mattn/go-runewidth v0.0.14 // indirect
 | 
			
		||||
	github.com/mitchellh/copystructure v1.2.0 // indirect
 | 
			
		||||
	github.com/mitchellh/reflectwalk v1.0.2 // indirect
 | 
			
		||||
	github.com/mmcloughlin/addchain v0.4.0 // indirect
 | 
			
		||||
	github.com/nats-io/nkeys v0.4.7 // indirect
 | 
			
		||||
	github.com/nats-io/nuid v1.0.1 // indirect
 | 
			
		||||
	github.com/olekukonko/tablewriter v0.0.5 // indirect
 | 
			
		||||
	github.com/onsi/gomega v1.34.1 // indirect
 | 
			
		||||
	github.com/pelletier/go-toml v1.9.5 // indirect
 | 
			
		||||
	github.com/pkg/errors v0.9.1 // indirect
 | 
			
		||||
	github.com/pmezard/go-difflib v1.0.0 // indirect
 | 
			
		||||
	github.com/prometheus/tsdb v0.7.1 // indirect
 | 
			
		||||
	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
 | 
			
		||||
	github.com/rivo/uniseg v0.4.2 // indirect
 | 
			
		||||
	github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect
 | 
			
		||||
	github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect
 | 
			
		||||
	github.com/supranational/blst v0.3.11 // indirect
 | 
			
		||||
	github.com/tklauser/go-sysconf v0.3.12 // indirect
 | 
			
		||||
	github.com/tklauser/numcpus v0.6.1 // indirect
 | 
			
		||||
	github.com/valyala/fastrand v1.1.0 // indirect
 | 
			
		||||
	github.com/valyala/histogram v1.2.0 // indirect
 | 
			
		||||
	golang.org/x/crypto v0.25.0 // indirect
 | 
			
		||||
	golang.org/x/crypto v0.26.0 // indirect
 | 
			
		||||
	golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
 | 
			
		||||
	golang.org/x/net v0.27.0 // indirect
 | 
			
		||||
	golang.org/x/sync v0.7.0 // indirect
 | 
			
		||||
	golang.org/x/mod v0.20.0 // indirect
 | 
			
		||||
	golang.org/x/sync v0.8.0 // indirect
 | 
			
		||||
	golang.org/x/sys v0.24.0 // indirect
 | 
			
		||||
	golang.org/x/text v0.16.0 // indirect
 | 
			
		||||
	golang.org/x/time v0.5.0 // indirect
 | 
			
		||||
	gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect
 | 
			
		||||
	golang.org/x/time v0.6.0 // indirect
 | 
			
		||||
	gopkg.in/yaml.v3 v3.0.1 // indirect
 | 
			
		||||
	rsc.io/tmplfunc v0.0.3 // indirect
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										284
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										284
									
								
								go.sum
									
									
									
									
									
								
							@ -1,118 +1,105 @@
 | 
			
		||||
filippo.io/edwards25519 v1.0.0-alpha.2 h1:EWbZLqGEPSIj2W69gx04KtNVkyPIfe3uj0DhDQJonbQ=
 | 
			
		||||
filippo.io/edwards25519 v1.0.0-alpha.2/go.mod h1:X+pm78QAUPtFLi1z9PYIlS/bdDnvbCOGKtZ+ACWEf7o=
 | 
			
		||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 | 
			
		||||
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/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e h1:ZIWapoIRN1VqT8GR8jAwb1Ie9GyehWjVcGh32Y2MznE=
 | 
			
		||||
github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
 | 
			
		||||
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
 | 
			
		||||
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
 | 
			
		||||
github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA=
 | 
			
		||||
github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
 | 
			
		||||
github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI=
 | 
			
		||||
github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI=
 | 
			
		||||
github.com/VictoriaMetrics/metrics v1.35.1 h1:o84wtBKQbzLdDy14XeskkCZih6anG+veZ1SwJHFGwrU=
 | 
			
		||||
github.com/VictoriaMetrics/metrics v1.35.1/go.mod h1:r7hveu6xMdUACXvB8TYdAj8WEsKzWB0EkpJN+RDtOf8=
 | 
			
		||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 | 
			
		||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 | 
			
		||||
github.com/alitto/pond v1.9.2 h1:9Qb75z/scEZVCoSU+osVmQ0I0JOeLfdTDafrbcJ8CLs=
 | 
			
		||||
github.com/alitto/pond v1.9.2/go.mod h1:xQn3P/sHTYcU/1BR3i86IGIrilcrGC2LiS+E2+CJWsI=
 | 
			
		||||
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8=
 | 
			
		||||
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
 | 
			
		||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 | 
			
		||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 | 
			
		||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
 | 
			
		||||
github.com/bits-and-blooms/bitset v1.14.3 h1:Gd2c8lSNf9pKXom5JtD7AaKO8o7fGQ2LtFj1436qilA=
 | 
			
		||||
github.com/bits-and-blooms/bitset v1.14.3/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
 | 
			
		||||
github.com/btcsuite/btcd v0.23.2 h1:/YOgUp25sdCnP5ho6Hl3s0E438zlX+Kak7E6TgBgoT0=
 | 
			
		||||
github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k=
 | 
			
		||||
github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU=
 | 
			
		||||
github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ=
 | 
			
		||||
github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04=
 | 
			
		||||
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U=
 | 
			
		||||
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
 | 
			
		||||
github.com/buraksezer/consistent v0.0.0-20191006190839-693edf70fd72 h1:fUmDBbSvv1uOzo/t8WaxZMVb7BxJ8JECo5lGoR9c5bA=
 | 
			
		||||
github.com/buraksezer/consistent v0.0.0-20191006190839-693edf70fd72/go.mod h1:OEE5igu/CDjGegM1Jn6ZMo7R6LlV/JChAkjfQQIRLpg=
 | 
			
		||||
github.com/celo-org/celo-blockchain v1.8.4 h1:QJiRRGcZyO+PutT8WkFO1juORANAOGhN8yGNP7HvBqk=
 | 
			
		||||
github.com/celo-org/celo-blockchain v1.8.4/go.mod h1:0udpV9QnZ2rnVu3vf8G9Wjs5di6Bf9urjwGVgAUEGB8=
 | 
			
		||||
github.com/celo-org/celo-bls-go v0.3.4 h1:slNePT/gVjgUi7f8M4KTwBz/YYgv3JWU6XqyY0xKN84=
 | 
			
		||||
github.com/celo-org/celo-bls-go v0.3.4/go.mod h1:qDZHMC3bBqOw5qle28cRtKlEyJhslZtckcc2Tomqdks=
 | 
			
		||||
github.com/celo-org/celo-bls-go-android v0.3.3 h1:iZ2Gragn3JItkptmppeq1SENmNVc1f1W25UE4u231HY=
 | 
			
		||||
github.com/celo-org/celo-bls-go-android v0.3.3/go.mod h1:cFgtFRH8+6x5b+EyG5SqniXY3aKd03NBSGDgITscX34=
 | 
			
		||||
github.com/celo-org/celo-bls-go-ios v0.3.3 h1:/yHaEYft9WfXyPIGuJz7V2/r+tp2IqSpkvKsMsVgbuY=
 | 
			
		||||
github.com/celo-org/celo-bls-go-ios v0.3.3/go.mod h1:eaSoMpx29YV5oF7jXVChzJpNfxeZHnAa8G4PjL5CyW0=
 | 
			
		||||
github.com/celo-org/celo-bls-go-linux v0.3.3 h1:ukSQSIRyFCQeC1i7LJJunRKvlLuG1JMwNZ6DQZC51fE=
 | 
			
		||||
github.com/celo-org/celo-bls-go-linux v0.3.3/go.mod h1:DVpJadg22OrxBtMb0ub6iNVdqDBL/r6EDdWVAA0bHa0=
 | 
			
		||||
github.com/celo-org/celo-bls-go-macos v0.3.3 h1:H4ZGc+kS3e/w9Q6qru6FtlkYtVDS8eIQgw6UURB/Jlo=
 | 
			
		||||
github.com/celo-org/celo-bls-go-macos v0.3.3/go.mod h1:mYPuRqGMVxj6yZUeL6Q6ggtP52HPBS1jz+FvBPXQ7QA=
 | 
			
		||||
github.com/celo-org/celo-bls-go-other v0.3.3 h1:/Q9SLJK22hibPm/WI/OPxbBmgXTgUhjUgobfzz7qj/w=
 | 
			
		||||
github.com/celo-org/celo-bls-go-other v0.3.3/go.mod h1:tNxZNfekzyT7TdYQbyNPhkfpcYtA3KCU/IKX5FNxM/U=
 | 
			
		||||
github.com/celo-org/celo-bls-go-windows v0.3.3 h1:0IP+Ad9l+op50TIfkmFr+j7+TIjKksVROe+EoF7Ixa4=
 | 
			
		||||
github.com/celo-org/celo-bls-go-windows v0.3.3/go.mod h1:82GC5iJA9Qw5gynhYqR8ht3J+l/MO8eSNzgSTMI8UdA=
 | 
			
		||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
			
		||||
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
			
		||||
github.com/celo-org/op-geth v1.101408.1-0.20240927090724-573364d396d3 h1:W+lKfZRELXrGt/U+C82thNuVpjcutY/h7mQKLhEynT8=
 | 
			
		||||
github.com/celo-org/op-geth v1.101408.1-0.20240927090724-573364d396d3/go.mod h1:Mk8AhvlqFbjI9oW2ymThSSoqc6kiEH0/tCmHGMEu6ac=
 | 
			
		||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
 | 
			
		||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4=
 | 
			
		||||
github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo=
 | 
			
		||||
github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I=
 | 
			
		||||
github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8=
 | 
			
		||||
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4=
 | 
			
		||||
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M=
 | 
			
		||||
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE=
 | 
			
		||||
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs=
 | 
			
		||||
github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA=
 | 
			
		||||
github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU=
 | 
			
		||||
github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30=
 | 
			
		||||
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
 | 
			
		||||
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
 | 
			
		||||
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
 | 
			
		||||
github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ=
 | 
			
		||||
github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI=
 | 
			
		||||
github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M=
 | 
			
		||||
github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY=
 | 
			
		||||
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
 | 
			
		||||
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 | 
			
		||||
github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I=
 | 
			
		||||
github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs=
 | 
			
		||||
github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI=
 | 
			
		||||
github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM=
 | 
			
		||||
github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
 | 
			
		||||
github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=
 | 
			
		||||
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
 | 
			
		||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=
 | 
			
		||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
 | 
			
		||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 | 
			
		||||
github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c=
 | 
			
		||||
github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 | 
			
		||||
github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240821192748-42bd03ba8313 h1:SVSFg8ccdRBJxOdRS1pK8oIHvMufiPAQz1gkQsEPnZc=
 | 
			
		||||
github.com/ethereum-optimism/superchain-registry/superchain v0.0.0-20240821192748-42bd03ba8313/go.mod h1:XaVXL9jg8BcyOeugECgIUGa9Y3DjYJj71RHmb5qon6M=
 | 
			
		||||
github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA=
 | 
			
		||||
github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0=
 | 
			
		||||
github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0 h1:KrE8I4reeVvf7C1tm8elRjj4BdscTYzz/WAbYyf/JI4=
 | 
			
		||||
github.com/ethereum/go-verkle v0.1.1-0.20240306133620-7d920df305f0/go.mod h1:D9AJLVXSyZQXJQVk8oh1EwjISE+sJTn2duYIZC0dy3w=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
 | 
			
		||||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
 | 
			
		||||
github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0=
 | 
			
		||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 | 
			
		||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 | 
			
		||||
github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA=
 | 
			
		||||
github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
 | 
			
		||||
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
 | 
			
		||||
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
 | 
			
		||||
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI=
 | 
			
		||||
github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww=
 | 
			
		||||
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
 | 
			
		||||
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
 | 
			
		||||
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
 | 
			
		||||
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
 | 
			
		||||
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
 | 
			
		||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 | 
			
		||||
github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw=
 | 
			
		||||
github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4=
 | 
			
		||||
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
 | 
			
		||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
 | 
			
		||||
github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c=
 | 
			
		||||
github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
 | 
			
		||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 | 
			
		||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
 | 
			
		||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
 | 
			
		||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
 | 
			
		||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 | 
			
		||||
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
			
		||||
github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw=
 | 
			
		||||
github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
 | 
			
		||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 | 
			
		||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 | 
			
		||||
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
 | 
			
		||||
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 | 
			
		||||
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
 | 
			
		||||
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
 | 
			
		||||
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk=
 | 
			
		||||
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 | 
			
		||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
			
		||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 | 
			
		||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
			
		||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 | 
			
		||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg=
 | 
			
		||||
github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
 | 
			
		||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
 | 
			
		||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 | 
			
		||||
github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
 | 
			
		||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
 | 
			
		||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
			
		||||
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
 | 
			
		||||
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 | 
			
		||||
github.com/grassrootseconomics/celoutils/v3 v3.3.1 h1:ehf0eG2c8BfR2DojOm/nk8SQ44DyTFxXKISw1dHym/w=
 | 
			
		||||
github.com/grassrootseconomics/celoutils/v3 v3.3.1/go.mod h1:HTHFNnWmvL6rY096xAraOMV3POYFAquoTABP6ogaF7U=
 | 
			
		||||
github.com/grassrootseconomics/w3-celo v0.19.0 h1:3O5GK2os3/f9D/5oKsB0YxGyO5S3aqon/kx7ckyjQ4o=
 | 
			
		||||
github.com/grassrootseconomics/w3-celo v0.19.0/go.mod h1:M3KJaj25DspF9siaqNXyamAuzC5DmWXx74tpyPp+R4Y=
 | 
			
		||||
github.com/grassrootseconomics/ethutils v1.3.0 h1:0uX9HG7EujqoNyueYN2gB40zki50AIdxuNLmU0FZroU=
 | 
			
		||||
github.com/grassrootseconomics/ethutils v1.3.0/go.mod h1:Wuv1VEZrkLIXqTSEYI3Nh9HG/ZHOUQ+U+xvWJ8QtjgQ=
 | 
			
		||||
github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE=
 | 
			
		||||
github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0=
 | 
			
		||||
github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs=
 | 
			
		||||
github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 | 
			
		||||
github.com/hdevalence/ed25519consensus v0.0.0-20201207055737-7fde80a9d5ff h1:LeVKjw8pcDQj7WVVnbFvbD7ovcv+r/l15ka1NH6Lswc=
 | 
			
		||||
github.com/hdevalence/ed25519consensus v0.0.0-20201207055737-7fde80a9d5ff/go.mod h1:Feit0l8NcNO4g69XNjwvsR0LGcwMMfzI1TF253rOIlQ=
 | 
			
		||||
github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4=
 | 
			
		||||
github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc=
 | 
			
		||||
github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao=
 | 
			
		||||
github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA=
 | 
			
		||||
github.com/holiman/uint256 v1.3.0 h1:4wdcm/tnd0xXdu7iS3ruNvxkWwrb4aeBQv19ayYn8F4=
 | 
			
		||||
github.com/holiman/uint256 v1.3.0/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E=
 | 
			
		||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 | 
			
		||||
github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs=
 | 
			
		||||
github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E=
 | 
			
		||||
github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc=
 | 
			
		||||
github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8=
 | 
			
		||||
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
 | 
			
		||||
@ -131,21 +118,26 @@ github.com/knadh/koanf/providers/file v1.1.0 h1:MTjA+gRrVl1zqgetEAIaXHqYje0XSosx
 | 
			
		||||
github.com/knadh/koanf/providers/file v1.1.0/go.mod h1:/faSBcv2mxPVjFrXck95qeoyoZ5myJ6uxN8OOVNJJCI=
 | 
			
		||||
github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM=
 | 
			
		||||
github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es=
 | 
			
		||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 | 
			
		||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 | 
			
		||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 | 
			
		||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 | 
			
		||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 | 
			
		||||
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
 | 
			
		||||
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
 | 
			
		||||
github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c=
 | 
			
		||||
github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8=
 | 
			
		||||
github.com/lmittmann/tint v1.0.4 h1:LeYihpJ9hyGvE0w+K2okPTGUdVLfng1+nDNVR4vWISc=
 | 
			
		||||
github.com/lmittmann/tint v1.0.4/go.mod h1:HIS3gSy7qNwGCj+5oRjAutErFBl4BzdQP6cJZ0NfMwE=
 | 
			
		||||
github.com/lmittmann/w3 v0.17.0 h1:Bsb6xSNU+woj7+VO7ERBCus97oCy6EWWKVUmoFbt534=
 | 
			
		||||
github.com/lmittmann/w3 v0.17.0/go.mod h1:sQXu3RJpP6Oj398bFyHeFiMHUExVxVOzoKrWZd/+yZ0=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
 | 
			
		||||
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.16 h1:bq3VjFmv/sOjHtdEhmkEV4x1AJtvUvOJ2PFAZ5+peKQ=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
 | 
			
		||||
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
 | 
			
		||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
 | 
			
		||||
github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU=
 | 
			
		||||
github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 | 
			
		||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
 | 
			
		||||
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
 | 
			
		||||
github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
 | 
			
		||||
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
 | 
			
		||||
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
 | 
			
		||||
github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
 | 
			
		||||
@ -154,41 +146,33 @@ github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjU
 | 
			
		||||
github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4=
 | 
			
		||||
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
 | 
			
		||||
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
 | 
			
		||||
github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY=
 | 
			
		||||
github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU=
 | 
			
		||||
github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU=
 | 
			
		||||
github.com/nats-io/nats.go v1.36.0 h1:suEUPuWzTSse/XhESwqLxXGuj8vGRuPRoG7MoRN/qyU=
 | 
			
		||||
github.com/nats-io/nats.go v1.36.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8=
 | 
			
		||||
github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=
 | 
			
		||||
github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=
 | 
			
		||||
github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
 | 
			
		||||
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
 | 
			
		||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 | 
			
		||||
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
 | 
			
		||||
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
 | 
			
		||||
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 | 
			
		||||
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
 | 
			
		||||
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
 | 
			
		||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
			
		||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
 | 
			
		||||
github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA=
 | 
			
		||||
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
 | 
			
		||||
github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA=
 | 
			
		||||
github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
 | 
			
		||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 | 
			
		||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 | 
			
		||||
github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k=
 | 
			
		||||
github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY=
 | 
			
		||||
github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
 | 
			
		||||
github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
 | 
			
		||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
			
		||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 | 
			
		||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
 | 
			
		||||
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 | 
			
		||||
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 | 
			
		||||
github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA=
 | 
			
		||||
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/prometheus/client_golang v1.12.0 h1:C+UIj/QWtmqY13Arb8kwMt5j34/0Z2iKamrJ+ryC0Gg=
 | 
			
		||||
github.com/prometheus/client_golang v1.12.0/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
 | 
			
		||||
github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a h1:CmF68hwI0XsOQ5UwlBopMi2Ow4Pbg32akc4KIVCOm+Y=
 | 
			
		||||
github.com/prometheus/client_model v0.2.1-0.20210607210712-147c58e9608a/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
 | 
			
		||||
github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=
 | 
			
		||||
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
 | 
			
		||||
github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
 | 
			
		||||
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
 | 
			
		||||
github.com/puzpuzpuz/xsync/v3 v3.4.0 h1:DuVBAdXuGFHv8adVXjWWZ63pJq+NRXOWVXlKDBZ+mJ4=
 | 
			
		||||
github.com/puzpuzpuz/xsync/v3 v3.4.0/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA=
 | 
			
		||||
github.com/redis/rueidis v1.0.46 h1:D4XWUZU2ByZpWky+LfIB/AouuLCkIL44BDI2NlJN63E=
 | 
			
		||||
@ -196,98 +180,70 @@ github.com/redis/rueidis v1.0.46/go.mod h1:by+34b0cFXndxtYmPAHpoTHO5NkosDlBvhexo
 | 
			
		||||
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
 | 
			
		||||
github.com/rivo/uniseg v0.4.2 h1:YwD0ulJSJytLpiaWua0sBDusfsCZohxjxzVTYjwxfV8=
 | 
			
		||||
github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
 | 
			
		||||
github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE=
 | 
			
		||||
github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
 | 
			
		||||
github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
 | 
			
		||||
github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
 | 
			
		||||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
 | 
			
		||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
			
		||||
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU=
 | 
			
		||||
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 | 
			
		||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 | 
			
		||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
			
		||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 | 
			
		||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 | 
			
		||||
github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA=
 | 
			
		||||
github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg=
 | 
			
		||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
 | 
			
		||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 | 
			
		||||
github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4=
 | 
			
		||||
github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw=
 | 
			
		||||
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=
 | 
			
		||||
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
 | 
			
		||||
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
 | 
			
		||||
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
 | 
			
		||||
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
 | 
			
		||||
github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8=
 | 
			
		||||
github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U=
 | 
			
		||||
github.com/uptrace/bunrouter v1.0.22 h1:634bRGogHxjMaSqc5a3MjM/sisS/MkfXhWJ/WZXrktc=
 | 
			
		||||
github.com/uptrace/bunrouter v1.0.22/go.mod h1:O3jAcl+5qgnF+ejhgkmbceEk0E/mqaK+ADOocdNpY8M=
 | 
			
		||||
github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs=
 | 
			
		||||
github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
 | 
			
		||||
github.com/valyala/fastrand v1.1.0 h1:f+5HkLW4rsgzdNoleUOB69hyT9IlD2ZQh9GyDMfb5G8=
 | 
			
		||||
github.com/valyala/fastrand v1.1.0/go.mod h1:HWqCzkrkg6QXT8V2EXWvXCoow7vLwOFN002oeRzjapQ=
 | 
			
		||||
github.com/valyala/histogram v1.2.0 h1:wyYGAZZt3CpwUiIb9AU/Zbllg1llXyrtApRS815OLoQ=
 | 
			
		||||
github.com/valyala/histogram v1.2.0/go.mod h1:Hb4kBwb4UxsaNbbbh+RRz8ZR6pdodR57tzWUS3BUzXY=
 | 
			
		||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
 | 
			
		||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
 | 
			
		||||
go.etcd.io/bbolt v1.3.11 h1:yGEzV1wPz2yVCLsD8ZAiGHhHVlczyC9d1rP43/VCRJ0=
 | 
			
		||||
go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 | 
			
		||||
golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
 | 
			
		||||
golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
 | 
			
		||||
golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw=
 | 
			
		||||
golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
 | 
			
		||||
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
 | 
			
		||||
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
 | 
			
		||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 | 
			
		||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 | 
			
		||||
golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
			
		||||
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
 | 
			
		||||
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 | 
			
		||||
golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
 | 
			
		||||
golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
 | 
			
		||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
 | 
			
		||||
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 | 
			
		||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
 | 
			
		||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 | 
			
		||||
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
 | 
			
		||||
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 | 
			
		||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
 | 
			
		||||
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
 | 
			
		||||
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.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg=
 | 
			
		||||
golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 | 
			
		||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
 | 
			
		||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
 | 
			
		||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
 | 
			
		||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 | 
			
		||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 | 
			
		||||
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
 | 
			
		||||
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
 | 
			
		||||
golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
 | 
			
		||||
golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 | 
			
		||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
 | 
			
		||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 | 
			
		||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 | 
			
		||||
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU=
 | 
			
		||||
gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c=
 | 
			
		||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 | 
			
		||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 | 
			
		||||
gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0=
 | 
			
		||||
gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0=
 | 
			
		||||
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 | 
			
		||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
 | 
			
		||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
 | 
			
		||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 | 
			
		||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 | 
			
		||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
			
		||||
rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU=
 | 
			
		||||
rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA=
 | 
			
		||||
 | 
			
		||||
@ -5,8 +5,8 @@ import (
 | 
			
		||||
	"log/slog"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/db"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/pool"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/db"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/pool"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
 | 
			
		||||
@ -1,121 +1,121 @@
 | 
			
		||||
package chain
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"math/big"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"time"
 | 
			
		||||
// import (
 | 
			
		||||
// 	"context"
 | 
			
		||||
// 	"math/big"
 | 
			
		||||
// 	"net/http"
 | 
			
		||||
// 	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/common"
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/core/types"
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/rpc"
 | 
			
		||||
	"github.com/grassrootseconomics/celoutils/v3"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo/module/eth"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo/w3types"
 | 
			
		||||
)
 | 
			
		||||
// 	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
// 	"github.com/ethereum/go-ethereum/core/types"
 | 
			
		||||
// 	"github.com/ethereum/go-ethereum/rpc"
 | 
			
		||||
// 	"github.com/grassrootseconomics/ethutils"
 | 
			
		||||
// 	"github.com/lmittmann/w3"
 | 
			
		||||
// 	"github.com/lmittmann/w3/module/eth"
 | 
			
		||||
// 	"github.com/lmittmann/w3/w3types"
 | 
			
		||||
// )
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
	CeloRPCOpts struct {
 | 
			
		||||
		RPCEndpoint string
 | 
			
		||||
		ChainID     int64
 | 
			
		||||
	}
 | 
			
		||||
// type (
 | 
			
		||||
// 	CeloRPCOpts struct {
 | 
			
		||||
// 		RPCEndpoint string
 | 
			
		||||
// 		ChainID     int64
 | 
			
		||||
// 	}
 | 
			
		||||
 | 
			
		||||
	CeloRPC struct {
 | 
			
		||||
		provider *celoutils.Provider
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
// 	CeloRPC struct {
 | 
			
		||||
// 		provider *ethutils.Provider
 | 
			
		||||
// 	}
 | 
			
		||||
// )
 | 
			
		||||
 | 
			
		||||
func NewRPCFetcher(o CeloRPCOpts) (Chain, error) {
 | 
			
		||||
	customRPCClient, err := lowTimeoutRPCClient(o.RPCEndpoint)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
// func NewRPCFetcher(o CeloRPCOpts) (Chain, error) {
 | 
			
		||||
// 	customRPCClient, err := lowTimeoutRPCClient(o.RPCEndpoint)
 | 
			
		||||
// 	if err != nil {
 | 
			
		||||
// 		return nil, err
 | 
			
		||||
// 	}
 | 
			
		||||
 | 
			
		||||
	chainProvider := celoutils.NewProvider(
 | 
			
		||||
		o.RPCEndpoint,
 | 
			
		||||
		o.ChainID,
 | 
			
		||||
		celoutils.WithClient(customRPCClient),
 | 
			
		||||
	)
 | 
			
		||||
// 	chainProvider := ethutils.NewProvider(
 | 
			
		||||
// 		o.RPCEndpoint,
 | 
			
		||||
// 		o.ChainID,
 | 
			
		||||
// 		ethutils.WithClient(customRPCClient),
 | 
			
		||||
// 	)
 | 
			
		||||
 | 
			
		||||
	return &CeloRPC{
 | 
			
		||||
		provider: chainProvider,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
// 	return &CeloRPC{
 | 
			
		||||
// 		provider: chainProvider,
 | 
			
		||||
// 	}, nil
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func lowTimeoutRPCClient(rpcEndpoint string) (*w3.Client, error) {
 | 
			
		||||
	httpClient := &http.Client{
 | 
			
		||||
		Timeout: 10 * time.Second,
 | 
			
		||||
	}
 | 
			
		||||
// func lowTimeoutRPCClient(rpcEndpoint string) (*w3.Client, error) {
 | 
			
		||||
// 	httpClient := &http.Client{
 | 
			
		||||
// 		Timeout: 10 * time.Second,
 | 
			
		||||
// 	}
 | 
			
		||||
 | 
			
		||||
	rpcClient, err := rpc.DialHTTPWithClient(
 | 
			
		||||
		rpcEndpoint,
 | 
			
		||||
		httpClient,
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
// 	rpcClient, err := rpc.DialHTTPWithClient(
 | 
			
		||||
// 		rpcEndpoint,
 | 
			
		||||
// 		httpClient,
 | 
			
		||||
// 	)
 | 
			
		||||
// 	if err != nil {
 | 
			
		||||
// 		return nil, err
 | 
			
		||||
// 	}
 | 
			
		||||
 | 
			
		||||
	return w3.NewClient(rpcClient), nil
 | 
			
		||||
}
 | 
			
		||||
// 	return w3.NewClient(rpcClient), nil
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func (c *CeloRPC) GetBlocks(ctx context.Context, blockNumbers []uint64) ([]types.Block, error) {
 | 
			
		||||
	blocksCount := len(blockNumbers)
 | 
			
		||||
	calls := make([]w3types.RPCCaller, blocksCount)
 | 
			
		||||
	blocks := make([]types.Block, blocksCount)
 | 
			
		||||
// func (c *CeloRPC) GetBlocks(ctx context.Context, blockNumbers []uint64) ([]types.Block, error) {
 | 
			
		||||
// 	blocksCount := len(blockNumbers)
 | 
			
		||||
// 	calls := make([]w3types.RPCCaller, blocksCount)
 | 
			
		||||
// 	blocks := make([]types.Block, blocksCount)
 | 
			
		||||
 | 
			
		||||
	for i, v := range blockNumbers {
 | 
			
		||||
		calls[i] = eth.BlockByNumber(new(big.Int).SetUint64(v)).Returns(&blocks[i])
 | 
			
		||||
	}
 | 
			
		||||
// 	for i, v := range blockNumbers {
 | 
			
		||||
// 		calls[i] = eth.BlockByNumber(new(big.Int).SetUint64(v)).Returns(&blocks[i])
 | 
			
		||||
// 	}
 | 
			
		||||
 | 
			
		||||
	if err := c.provider.Client.CallCtx(ctx, calls...); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
// 	if err := c.provider.Client.CallCtx(ctx, calls...); err != nil {
 | 
			
		||||
// 		return nil, err
 | 
			
		||||
// 	}
 | 
			
		||||
 | 
			
		||||
	return blocks, nil
 | 
			
		||||
}
 | 
			
		||||
// 	return blocks, nil
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func (c *CeloRPC) GetBlock(ctx context.Context, blockNumber uint64) (*types.Block, error) {
 | 
			
		||||
	var block types.Block
 | 
			
		||||
	blockCall := eth.BlockByNumber(new(big.Int).SetUint64(blockNumber)).Returns(&block)
 | 
			
		||||
// func (c *CeloRPC) GetBlock(ctx context.Context, blockNumber uint64) (*types.Block, error) {
 | 
			
		||||
// 	var block types.Block
 | 
			
		||||
// 	blockCall := eth.BlockByNumber(new(big.Int).SetUint64(blockNumber)).Returns(&block)
 | 
			
		||||
 | 
			
		||||
	if err := c.provider.Client.CallCtx(ctx, blockCall); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
// 	if err := c.provider.Client.CallCtx(ctx, blockCall); err != nil {
 | 
			
		||||
// 		return nil, err
 | 
			
		||||
// 	}
 | 
			
		||||
 | 
			
		||||
	return &block, nil
 | 
			
		||||
}
 | 
			
		||||
// 	return &block, nil
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func (c *CeloRPC) GetLatestBlock(ctx context.Context) (uint64, error) {
 | 
			
		||||
	var latestBlock big.Int
 | 
			
		||||
	latestBlockCall := eth.BlockNumber().Returns(&latestBlock)
 | 
			
		||||
// func (c *CeloRPC) GetLatestBlock(ctx context.Context) (uint64, error) {
 | 
			
		||||
// 	var latestBlock big.Int
 | 
			
		||||
// 	latestBlockCall := eth.BlockNumber().Returns(&latestBlock)
 | 
			
		||||
 | 
			
		||||
	if err := c.provider.Client.CallCtx(ctx, latestBlockCall); err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
// 	if err := c.provider.Client.CallCtx(ctx, latestBlockCall); err != nil {
 | 
			
		||||
// 		return 0, err
 | 
			
		||||
// 	}
 | 
			
		||||
 | 
			
		||||
	return latestBlock.Uint64(), nil
 | 
			
		||||
}
 | 
			
		||||
// 	return latestBlock.Uint64(), nil
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func (c *CeloRPC) GetTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, error) {
 | 
			
		||||
	var transaction types.Transaction
 | 
			
		||||
	if err := c.provider.Client.CallCtx(ctx, eth.Tx(txHash).Returns(&transaction)); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
// func (c *CeloRPC) GetTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, error) {
 | 
			
		||||
// 	var transaction types.Transaction
 | 
			
		||||
// 	if err := c.provider.Client.CallCtx(ctx, eth.Tx(txHash).Returns(&transaction)); err != nil {
 | 
			
		||||
// 		return nil, err
 | 
			
		||||
// 	}
 | 
			
		||||
 | 
			
		||||
	return &transaction, nil
 | 
			
		||||
}
 | 
			
		||||
// 	return &transaction, nil
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func (c *CeloRPC) GetReceipts(ctx context.Context, blockNumber *big.Int) (types.Receipts, error) {
 | 
			
		||||
	var receipts types.Receipts
 | 
			
		||||
// func (c *CeloRPC) GetReceipts(ctx context.Context, blockNumber *big.Int) (types.Receipts, error) {
 | 
			
		||||
// 	var receipts types.Receipts
 | 
			
		||||
 | 
			
		||||
	if err := c.provider.Client.CallCtx(ctx, eth.BlockReceipts(blockNumber).Returns(&receipts)); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
// 	if err := c.provider.Client.CallCtx(ctx, eth.BlockReceipts(blockNumber).Returns(&receipts)); err != nil {
 | 
			
		||||
// 		return nil, err
 | 
			
		||||
// 	}
 | 
			
		||||
 | 
			
		||||
	return receipts, nil
 | 
			
		||||
}
 | 
			
		||||
// 	return receipts, nil
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func (c *CeloRPC) Provider() *celoutils.Provider {
 | 
			
		||||
	return c.provider
 | 
			
		||||
}
 | 
			
		||||
// func (c *CeloRPC) Provider() *ethutils.Provider {
 | 
			
		||||
// 	return c.provider
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
@ -1,98 +1,98 @@
 | 
			
		||||
package chain
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
// import (
 | 
			
		||||
// 	"context"
 | 
			
		||||
// 	"testing"
 | 
			
		||||
// 	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
)
 | 
			
		||||
// 	"github.com/stretchr/testify/require"
 | 
			
		||||
// )
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	testRPCEndpoint = "https://celo.archive.grassecon.net"
 | 
			
		||||
	testChainID     = 42220
 | 
			
		||||
)
 | 
			
		||||
// const (
 | 
			
		||||
// 	testRPCEndpoint = "https://celo.archive.grassecon.net"
 | 
			
		||||
// 	testChainID     = 42220
 | 
			
		||||
// )
 | 
			
		||||
 | 
			
		||||
func setupCeloRPC() (Chain, error) {
 | 
			
		||||
	opts := CeloRPCOpts{
 | 
			
		||||
		RPCEndpoint: testRPCEndpoint,
 | 
			
		||||
		ChainID:     testChainID,
 | 
			
		||||
	}
 | 
			
		||||
	return NewRPCFetcher(opts)
 | 
			
		||||
}
 | 
			
		||||
// func setupCeloRPC() (Chain, error) {
 | 
			
		||||
// 	opts := CeloRPCOpts{
 | 
			
		||||
// 		RPCEndpoint: testRPCEndpoint,
 | 
			
		||||
// 		ChainID:     testChainID,
 | 
			
		||||
// 	}
 | 
			
		||||
// 	return NewRPCFetcher(opts)
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func TestRPC_GetBlocks(t *testing.T) {
 | 
			
		||||
	rpcFetcher, err := setupCeloRPC()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
// func TestRPC_GetBlocks(t *testing.T) {
 | 
			
		||||
// 	rpcFetcher, err := setupCeloRPC()
 | 
			
		||||
// 	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	blockNumbers := []uint64{
 | 
			
		||||
		19_600_000,
 | 
			
		||||
		23_000_000,
 | 
			
		||||
		27_000_000,
 | 
			
		||||
	}
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
// 	blockNumbers := []uint64{
 | 
			
		||||
// 		19_600_000,
 | 
			
		||||
// 		23_000_000,
 | 
			
		||||
// 		27_000_000,
 | 
			
		||||
// 	}
 | 
			
		||||
// 	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
// 	defer cancel()
 | 
			
		||||
 | 
			
		||||
	blocks, err := rpcFetcher.GetBlocks(ctx, blockNumbers)
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	t.Logf("blocks %+v\n", blocks)
 | 
			
		||||
}
 | 
			
		||||
// 	blocks, err := rpcFetcher.GetBlocks(ctx, blockNumbers)
 | 
			
		||||
// 	require.NoError(t, err)
 | 
			
		||||
// 	t.Logf("blocks %+v\n", blocks)
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func TestRPC_GetBlock(t *testing.T) {
 | 
			
		||||
	rpcFetcher, err := setupCeloRPC()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
// func TestRPC_GetBlock(t *testing.T) {
 | 
			
		||||
// 	rpcFetcher, err := setupCeloRPC()
 | 
			
		||||
// 	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	var blockNumber uint64 = 19_900_000
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
// 	var blockNumber uint64 = 19_900_000
 | 
			
		||||
// 	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
// 	defer cancel()
 | 
			
		||||
 | 
			
		||||
	block, err := rpcFetcher.GetBlock(ctx, blockNumber)
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	t.Logf("block %+v\n", block)
 | 
			
		||||
}
 | 
			
		||||
// 	block, err := rpcFetcher.GetBlock(ctx, blockNumber)
 | 
			
		||||
// 	require.NoError(t, err)
 | 
			
		||||
// 	t.Logf("block %+v\n", block)
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func TestRPC_GetLatestBlock(t *testing.T) {
 | 
			
		||||
	rpcFetcher, err := setupCeloRPC()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
// func TestRPC_GetLatestBlock(t *testing.T) {
 | 
			
		||||
// 	rpcFetcher, err := setupCeloRPC()
 | 
			
		||||
// 	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
// 	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
// 	defer cancel()
 | 
			
		||||
 | 
			
		||||
	block, err := rpcFetcher.GetLatestBlock(ctx)
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	t.Logf("block %+v\n", block)
 | 
			
		||||
}
 | 
			
		||||
// 	block, err := rpcFetcher.GetLatestBlock(ctx)
 | 
			
		||||
// 	require.NoError(t, err)
 | 
			
		||||
// 	t.Logf("block %+v\n", block)
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func TestRPC_GetTransaction(t *testing.T) {
 | 
			
		||||
	rpcFetcher, err := setupCeloRPC()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
// func TestRPC_GetTransaction(t *testing.T) {
 | 
			
		||||
// 	rpcFetcher, err := setupCeloRPC()
 | 
			
		||||
// 	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	var blockNumber uint64 = 19_900_000
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
// 	var blockNumber uint64 = 19_900_000
 | 
			
		||||
// 	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
// 	defer cancel()
 | 
			
		||||
 | 
			
		||||
	block, err := rpcFetcher.GetBlock(ctx, blockNumber)
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	require.NotNil(t, block)
 | 
			
		||||
// 	block, err := rpcFetcher.GetBlock(ctx, blockNumber)
 | 
			
		||||
// 	require.NoError(t, err)
 | 
			
		||||
// 	require.NotNil(t, block)
 | 
			
		||||
 | 
			
		||||
	transaction, err := rpcFetcher.GetTransaction(ctx, block.Transactions()[0].Hash())
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	t.Logf("transaction %+v\n", transaction)
 | 
			
		||||
}
 | 
			
		||||
// 	transaction, err := rpcFetcher.GetTransaction(ctx, block.Transactions()[0].Hash())
 | 
			
		||||
// 	require.NoError(t, err)
 | 
			
		||||
// 	t.Logf("transaction %+v\n", transaction)
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
func TestRPC_GetReceipts(t *testing.T) {
 | 
			
		||||
	rpcFetcher, err := setupCeloRPC()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
// func TestRPC_GetReceipts(t *testing.T) {
 | 
			
		||||
// 	rpcFetcher, err := setupCeloRPC()
 | 
			
		||||
// 	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	var blockNumber uint64 = 19_900_000
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
// 	var blockNumber uint64 = 19_900_000
 | 
			
		||||
// 	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
// 	defer cancel()
 | 
			
		||||
 | 
			
		||||
	block, err := rpcFetcher.GetBlock(ctx, blockNumber)
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	require.NotNil(t, block)
 | 
			
		||||
// 	block, err := rpcFetcher.GetBlock(ctx, blockNumber)
 | 
			
		||||
// 	require.NoError(t, err)
 | 
			
		||||
// 	require.NotNil(t, block)
 | 
			
		||||
 | 
			
		||||
	receipts, err := rpcFetcher.GetReceipts(ctx, block.Number())
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	t.Logf("receipts %+v\n", receipts)
 | 
			
		||||
}
 | 
			
		||||
// 	receipts, err := rpcFetcher.GetReceipts(ctx, block.Number())
 | 
			
		||||
// 	require.NoError(t, err)
 | 
			
		||||
// 	t.Logf("receipts %+v\n", receipts)
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
@ -4,17 +4,17 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"math/big"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/common"
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/core/types"
 | 
			
		||||
	"github.com/grassrootseconomics/celoutils/v3"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core/types"
 | 
			
		||||
	"github.com/grassrootseconomics/ethutils"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Chain interface {
 | 
			
		||||
	GetBlocks(context.Context, []uint64) ([]types.Block, error)
 | 
			
		||||
	GetBlocks(context.Context, []uint64) ([]*types.Block, error)
 | 
			
		||||
	GetBlock(context.Context, uint64) (*types.Block, error)
 | 
			
		||||
	GetLatestBlock(context.Context) (uint64, error)
 | 
			
		||||
	GetTransaction(context.Context, common.Hash) (*types.Transaction, error)
 | 
			
		||||
	GetReceipts(context.Context, *big.Int) (types.Receipts, error)
 | 
			
		||||
	// Expose provider until we eject from celoutils
 | 
			
		||||
	Provider() *celoutils.Provider
 | 
			
		||||
	Provider() *ethutils.Provider
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,118 @@
 | 
			
		||||
package chain
 | 
			
		||||
 | 
			
		||||
// TBA
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"math/big"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core/types"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/rpc"
 | 
			
		||||
	"github.com/grassrootseconomics/ethutils"
 | 
			
		||||
	"github.com/lmittmann/w3"
 | 
			
		||||
	"github.com/lmittmann/w3/module/eth"
 | 
			
		||||
	"github.com/lmittmann/w3/w3types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
	EthRPCOpts struct {
 | 
			
		||||
		RPCEndpoint string
 | 
			
		||||
		ChainID     int64
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	EthRPC struct {
 | 
			
		||||
		provider *ethutils.Provider
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func NewRPCFetcher(o EthRPCOpts) (Chain, error) {
 | 
			
		||||
	customRPCClient, err := lowTimeoutRPCClient(o.RPCEndpoint)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	chainProvider := ethutils.NewProvider(
 | 
			
		||||
		o.RPCEndpoint,
 | 
			
		||||
		o.ChainID,
 | 
			
		||||
		ethutils.WithClient(customRPCClient),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	return &EthRPC{
 | 
			
		||||
		provider: chainProvider,
 | 
			
		||||
	}, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func lowTimeoutRPCClient(rpcEndpoint string) (*w3.Client, error) {
 | 
			
		||||
	httpClient := &http.Client{
 | 
			
		||||
		Timeout: 10 * time.Second,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rpcClient, err := rpc.DialOptions(context.Background(), rpcEndpoint, rpc.WithHTTPClient(httpClient))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return w3.NewClient(rpcClient), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *EthRPC) GetBlocks(ctx context.Context, blockNumbers []uint64) ([]*types.Block, error) {
 | 
			
		||||
	blocksCount := len(blockNumbers)
 | 
			
		||||
	calls := make([]w3types.RPCCaller, blocksCount)
 | 
			
		||||
	blocks := make([]*types.Block, blocksCount)
 | 
			
		||||
 | 
			
		||||
	for i, v := range blockNumbers {
 | 
			
		||||
		calls[i] = eth.BlockByNumber(new(big.Int).SetUint64(v)).Returns(&blocks[i])
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := c.provider.Client.CallCtx(ctx, calls...); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return blocks, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *EthRPC) GetBlock(ctx context.Context, blockNumber uint64) (*types.Block, error) {
 | 
			
		||||
	var block *types.Block
 | 
			
		||||
	blockCall := eth.BlockByNumber(new(big.Int).SetUint64(blockNumber)).Returns(&block)
 | 
			
		||||
 | 
			
		||||
	if err := c.provider.Client.CallCtx(ctx, blockCall); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return block, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *EthRPC) GetLatestBlock(ctx context.Context) (uint64, error) {
 | 
			
		||||
	var latestBlock *big.Int
 | 
			
		||||
	latestBlockCall := eth.BlockNumber().Returns(&latestBlock)
 | 
			
		||||
 | 
			
		||||
	if err := c.provider.Client.CallCtx(ctx, latestBlockCall); err != nil {
 | 
			
		||||
		return 0, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return latestBlock.Uint64(), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *EthRPC) GetTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, error) {
 | 
			
		||||
	var transaction *types.Transaction
 | 
			
		||||
	if err := c.provider.Client.CallCtx(ctx, eth.Tx(txHash).Returns(&transaction)); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return transaction, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *EthRPC) GetReceipts(ctx context.Context, blockNumber *big.Int) (types.Receipts, error) {
 | 
			
		||||
	var receipts types.Receipts
 | 
			
		||||
 | 
			
		||||
	if err := c.provider.Client.CallCtx(ctx, eth.BlockReceipts(blockNumber).Returns(&receipts)); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return receipts, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *EthRPC) Provider() *ethutils.Provider {
 | 
			
		||||
	return c.provider
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										98
									
								
								internal/chain/eth_rpc_e2e_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								internal/chain/eth_rpc_e2e_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,98 @@
 | 
			
		||||
package chain
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	testRPCEndpoint = "https://alfajores-forno.celo-testnet.org"
 | 
			
		||||
	testChainID     = 44787
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func setupEthRPC() (Chain, error) {
 | 
			
		||||
	opts := EthRPCOpts{
 | 
			
		||||
		RPCEndpoint: testRPCEndpoint,
 | 
			
		||||
		ChainID:     testChainID,
 | 
			
		||||
	}
 | 
			
		||||
	return NewRPCFetcher(opts)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestRPC_GetBlocks(t *testing.T) {
 | 
			
		||||
	rpcFetcher, err := setupEthRPC()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	blockNumbers := []uint64{
 | 
			
		||||
		19_600_000,
 | 
			
		||||
		23_000_000,
 | 
			
		||||
		26_385_000,
 | 
			
		||||
	}
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
 | 
			
		||||
	blocks, err := rpcFetcher.GetBlocks(ctx, blockNumbers)
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	t.Logf("blocks %+v\n", blocks)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestRPC_GetBlock(t *testing.T) {
 | 
			
		||||
	rpcFetcher, err := setupEthRPC()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	var blockNumber uint64 = 26_386_000
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
 | 
			
		||||
	block, err := rpcFetcher.GetBlock(ctx, blockNumber)
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	t.Logf("block %+v\n", block)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestRPC_GetLatestBlock(t *testing.T) {
 | 
			
		||||
	rpcFetcher, err := setupEthRPC()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
 | 
			
		||||
	block, err := rpcFetcher.GetLatestBlock(ctx)
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	t.Logf("block %+v\n", block)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestRPC_GetTransaction(t *testing.T) {
 | 
			
		||||
	rpcFetcher, err := setupEthRPC()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	var blockNumber uint64 = 26_387_000
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
 | 
			
		||||
	block, err := rpcFetcher.GetBlock(ctx, blockNumber)
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	require.NotNil(t, block)
 | 
			
		||||
 | 
			
		||||
	transaction, err := rpcFetcher.GetTransaction(ctx, block.Transactions()[0].Hash())
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	t.Logf("transaction %+v\n", transaction)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestRPC_GetReceipts(t *testing.T) {
 | 
			
		||||
	rpcFetcher, err := setupEthRPC()
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	var blockNumber uint64 = 26_388_000
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
 | 
			
		||||
	block, err := rpcFetcher.GetBlock(ctx, blockNumber)
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	require.NotNil(t, block)
 | 
			
		||||
 | 
			
		||||
	receipts, err := rpcFetcher.GetReceipts(ctx, block.Number())
 | 
			
		||||
	require.NoError(t, err)
 | 
			
		||||
	t.Logf("receipts %+v\n", receipts)
 | 
			
		||||
}
 | 
			
		||||
@ -4,11 +4,11 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"math/big"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/common"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/router"
 | 
			
		||||
	"github.com/grassrootseconomics/celoutils/v3"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/router"
 | 
			
		||||
	"github.com/grassrootseconomics/ethutils"
 | 
			
		||||
	"github.com/lmittmann/w3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const faucetGiveEventName = "FAUCET_GIVE"
 | 
			
		||||
@ -71,15 +71,15 @@ func HandleFaucetGiveInputData() router.InputDataHandlerFunc {
 | 
			
		||||
 | 
			
		||||
			faucetGiveEvent.Payload = map[string]any{
 | 
			
		||||
				"recipient": to.Hex(),
 | 
			
		||||
				"token":     celoutils.ZeroAddress,
 | 
			
		||||
				"token":     ethutils.ZeroAddress,
 | 
			
		||||
				"amount":    "0",
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			return c(ctx, faucetGiveEvent)
 | 
			
		||||
		case "de82efb4":
 | 
			
		||||
			faucetGiveEvent.Payload = map[string]any{
 | 
			
		||||
				"recipient": celoutils.ZeroAddress,
 | 
			
		||||
				"token":     celoutils.ZeroAddress,
 | 
			
		||||
				"recipient": ethutils.ZeroAddress,
 | 
			
		||||
				"token":     ethutils.ZeroAddress,
 | 
			
		||||
				"amount":    "0",
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
package handler
 | 
			
		||||
 | 
			
		||||
import "github.com/grassrootseconomics/celo-tracker/internal/cache"
 | 
			
		||||
import "github.com/grassrootseconomics/eth-tracker/internal/cache"
 | 
			
		||||
 | 
			
		||||
type HandlerContainer struct {
 | 
			
		||||
	cache cache.Cache
 | 
			
		||||
 | 
			
		||||
@ -3,10 +3,10 @@ package handler
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/common"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/router"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/router"
 | 
			
		||||
	"github.com/lmittmann/w3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const indexAddEventName = "INDEX_ADD"
 | 
			
		||||
 | 
			
		||||
@ -3,10 +3,10 @@ package handler
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/common"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/router"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/router"
 | 
			
		||||
	"github.com/lmittmann/w3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const indexRemoveEventName = "INDEX_REMOVE"
 | 
			
		||||
 | 
			
		||||
@ -3,10 +3,10 @@ package handler
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/common"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/router"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/router"
 | 
			
		||||
	"github.com/lmittmann/w3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const ownershipEventName = "OWNERSHIP_TRANSFERRED"
 | 
			
		||||
 | 
			
		||||
@ -4,10 +4,10 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"math/big"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/common"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/router"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/router"
 | 
			
		||||
	"github.com/lmittmann/w3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const poolDepositEventName = "POOL_DEPOSIT"
 | 
			
		||||
 | 
			
		||||
@ -4,10 +4,10 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"math/big"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/common"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/router"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/router"
 | 
			
		||||
	"github.com/lmittmann/w3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const poolSwapEventName = "POOL_SWAP"
 | 
			
		||||
 | 
			
		||||
@ -4,10 +4,10 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"math/big"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/common"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/router"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/router"
 | 
			
		||||
	"github.com/lmittmann/w3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const quoterPriceEventName = "QUOTER_PRICE_INDEX_UPDATED"
 | 
			
		||||
 | 
			
		||||
@ -4,9 +4,9 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"math/big"
 | 
			
		||||
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/router"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/router"
 | 
			
		||||
	"github.com/lmittmann/w3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const sealEventName = "SEAL_STATE_CHANGE"
 | 
			
		||||
 | 
			
		||||
@ -4,10 +4,10 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"math/big"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/common"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/router"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/router"
 | 
			
		||||
	"github.com/lmittmann/w3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const burnEventName = "TOKEN_BURN"
 | 
			
		||||
 | 
			
		||||
@ -4,10 +4,10 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"math/big"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/common"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/router"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/router"
 | 
			
		||||
	"github.com/lmittmann/w3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const mintEventName = "TOKEN_MINT"
 | 
			
		||||
 | 
			
		||||
@ -4,14 +4,21 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"math/big"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/common"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/router"
 | 
			
		||||
	"github.com/grassrootseconomics/celoutils/v3"
 | 
			
		||||
	"github.com/grassrootseconomics/w3-celo"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/router"
 | 
			
		||||
	"github.com/lmittmann/w3"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const transferEventName = "TOKEN_TRANSFER"
 | 
			
		||||
const (
 | 
			
		||||
	transferEventName = "TOKEN_TRANSFER"
 | 
			
		||||
 | 
			
		||||
	CUSDContractMainnet = "0x765DE816845861e75A25fCA122bb6898B8B1282a"
 | 
			
		||||
	CKESContractMainnet = "0x456a3D042C0DbD3db53D5489e98dFb038553B0d0"
 | 
			
		||||
	CEURContractmainnet = "0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73"
 | 
			
		||||
	USDCContractMainnet = "0xcebA9300f2b948710d2653dD7B07f33A8B32118C"
 | 
			
		||||
	USDTContractMainnet = "0x617f3112bf5397D0467D315cC709EF968D9ba546"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	tokenTransferEvent   = w3.MustNewEvent("Transfer(address indexed _from, address indexed _to, uint256 _value)")
 | 
			
		||||
@ -19,10 +26,10 @@ var (
 | 
			
		||||
	tokenTransferFromSig = w3.MustNewFunc("transferFrom(address, address, uint256)", "bool")
 | 
			
		||||
 | 
			
		||||
	stables = map[string]bool{
 | 
			
		||||
		celoutils.CUSDContractMainnet: true,
 | 
			
		||||
		celoutils.CKESContractMainnet: true,
 | 
			
		||||
		celoutils.USDTContractMainnet: true,
 | 
			
		||||
		celoutils.USDCContractMainnet: true,
 | 
			
		||||
		CUSDContractMainnet: true,
 | 
			
		||||
		CKESContractMainnet: true,
 | 
			
		||||
		USDTContractMainnet: true,
 | 
			
		||||
		USDCContractMainnet: true,
 | 
			
		||||
	}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,7 @@ import (
 | 
			
		||||
	"runtime/debug"
 | 
			
		||||
 | 
			
		||||
	"github.com/alitto/pond"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/processor"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/processor"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
 | 
			
		||||
@ -6,12 +6,12 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"log/slog"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/common"
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/core/types"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/db"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/cache"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/chain"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/router"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core/types"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/db"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/cache"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/chain"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/router"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@ import (
 | 
			
		||||
	"log/slog"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/event"
 | 
			
		||||
	"github.com/nats-io/nats.go"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@ package pub
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/event"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/event"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type Pub interface {
 | 
			
		||||
 | 
			
		||||
@ -6,8 +6,8 @@ import (
 | 
			
		||||
	"sync/atomic"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/cache"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/pool"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/cache"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/pool"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
 | 
			
		||||
@ -4,9 +4,9 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain"
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/core/types"
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/event"
 | 
			
		||||
	"github.com/ethereum/go-ethereum"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core/types"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/event"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type BlockQueueFn func(uint64) error
 | 
			
		||||
@ -23,7 +23,7 @@ func (s *Syncer) Start() {
 | 
			
		||||
	s.realtimeSub = event.ResubscribeErr(resubscribeInterval, s.resubscribeFn())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *Syncer) receiveRealtimeBlocks(ctx context.Context, fn BlockQueueFn) (celo.Subscription, error) {
 | 
			
		||||
func (s *Syncer) receiveRealtimeBlocks(ctx context.Context, fn BlockQueueFn) (ethereum.Subscription, error) {
 | 
			
		||||
	newHeadersReceiver := make(chan *types.Header, 1)
 | 
			
		||||
	sub, err := s.ethClient.SubscribeNewHead(ctx, newHeadersReceiver)
 | 
			
		||||
	s.logg.Info("realtime syncer connected to ws endpoint")
 | 
			
		||||
 | 
			
		||||
@ -4,12 +4,12 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"log/slog"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain"
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/ethclient"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/db"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/chain"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/pool"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/internal/stats"
 | 
			
		||||
	"github.com/ethereum/go-ethereum"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/ethclient"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/db"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/chain"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/pool"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/internal/stats"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
@ -27,7 +27,7 @@ type (
 | 
			
		||||
		db          db.DB
 | 
			
		||||
		ethClient   *ethclient.Client
 | 
			
		||||
		logg        *slog.Logger
 | 
			
		||||
		realtimeSub celo.Subscription
 | 
			
		||||
		realtimeSub ethereum.Subscription
 | 
			
		||||
		pool        *pool.Pool
 | 
			
		||||
		stats       *stats.Stats
 | 
			
		||||
		stopCh      chan struct{}
 | 
			
		||||
 | 
			
		||||
@ -3,9 +3,9 @@ package router
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/common"
 | 
			
		||||
	"github.com/celo-org/celo-blockchain/core/types"
 | 
			
		||||
	"github.com/grassrootseconomics/celo-tracker/pkg/event"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/common"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/core/types"
 | 
			
		||||
	"github.com/grassrootseconomics/eth-tracker/pkg/event"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user