diff --git a/internal/cache/bootstrap.go b/internal/cache/bootstrap.go new file mode 100644 index 0000000..69f81ca --- /dev/null +++ b/internal/cache/bootstrap.go @@ -0,0 +1,71 @@ +package cache + +import ( + "context" + + "github.com/celo-org/celo-blockchain/common" + "github.com/grassrootseconomics/celo-tracker/internal/chain" + "github.com/grassrootseconomics/celoutils/v2" + "github.com/grassrootseconomics/w3-celo" + "github.com/grassrootseconomics/w3-celo/module/eth" +) + +func bootstrapAllGESmartContracts(ctx context.Context, registries []string, chain *chain.Chain, cache Cache) error { + for _, registry := range registries { + registryMap, err := chain.Provider.RegistryMap(ctx, w3.A(registry)) + if err != nil { + return nil + } + + for _, v := range registryMap { + cache.Add(v.Hex()) + } + + if registryMap[celoutils.TokenIndex] != common.ZeroAddress { + tokens, err := chain.GetAllTokensFromTokenIndex(ctx, registryMap[celoutils.TokenIndex]) + if err != nil { + return err + } + + for _, token := range tokens { + cache.Add(token.Hex()) + } + } + + if registryMap[celoutils.PoolIndex] != common.ZeroAddress { + pools, err := chain.GetAllTokensFromTokenIndex(ctx, registryMap[celoutils.PoolIndex]) + if err != nil { + return err + } + + for _, pool := range pools { + cache.Add(pool.Hex()) + + var ( + poolTokenRegistry common.Address + priceQuoter common.Address + ) + err := chain.Provider.Client.CallCtx( + ctx, + eth.CallFunc(pool, tokenRegistryGetter).Returns(&poolTokenRegistry), + eth.CallFunc(pool, quoterGetter).Returns(&priceQuoter), + ) + if err != nil { + return err + } + cache.Add(priceQuoter.Hex()) + + poolTokens, err := chain.GetAllTokensFromTokenIndex(ctx, poolTokenRegistry) + if err != nil { + return err + } + + for _, token := range poolTokens { + cache.Add(token.Hex()) + } + } + } + } + + return nil +} diff --git a/internal/cache/cache.go b/internal/cache/cache.go index 4a3e788..404bb08 100644 --- a/internal/cache/cache.go +++ b/internal/cache/cache.go @@ -4,11 +4,8 @@ import ( "context" "log/slog" - "github.com/celo-org/celo-blockchain/common" "github.com/grassrootseconomics/celo-tracker/internal/chain" - "github.com/grassrootseconomics/celoutils/v2" "github.com/grassrootseconomics/w3-celo" - "github.com/grassrootseconomics/w3-celo/module/eth" ) type ( @@ -28,7 +25,8 @@ type ( ) var ( - tokenRegistryFunc = w3.MustNewFunc("tokenRegistry()", "address") + tokenRegistryGetter = w3.MustNewFunc("tokenRegistry()", "address") + quoterGetter = w3.MustNewFunc("quoter()", "address") ) func New(o CacheOpts) (Cache, error) { @@ -43,58 +41,13 @@ func New(o CacheOpts) (Cache, error) { cache = NewMapCache() } - ctx := context.Background() - for _, registry := range o.Registries { - registryMap, err := o.Chain.Provider.RegistryMap(ctx, w3.A(registry)) - if err != nil { - return nil, err - } - - for _, v := range registryMap { - cache.Add(v.Hex()) - } - - if registryMap[celoutils.TokenIndex] != common.ZeroAddress { - tokens, err := o.Chain.GetAllTokensFromTokenIndex(ctx, registryMap[celoutils.TokenIndex]) - if err != nil { - return nil, err - } - - for _, token := range tokens { - cache.Add(token.Hex()) - } - } - - if registryMap[celoutils.PoolIndex] != common.ZeroAddress { - pools, err := o.Chain.GetAllTokensFromTokenIndex(ctx, registryMap[celoutils.PoolIndex]) - if err != nil { - return nil, err - } - - for _, pool := range pools { - cache.Add(pool.Hex()) - - var ( - poolTokenRegistry common.Address - ) - err := o.Chain.Provider.Client.CallCtx( - ctx, - eth.CallFunc(pool, tokenRegistryFunc).Returns(&poolTokenRegistry), - ) - if err != nil { - return nil, err - } - - poolTokens, err := o.Chain.GetAllTokensFromTokenIndex(ctx, poolTokenRegistry) - if err != nil { - return nil, err - } - - for _, token := range poolTokens { - cache.Add(token.Hex()) - } - } - } + if err := bootstrapAllGESmartContracts( + context.Background(), + o.Registries, + o.Chain, + cache, + ); err != nil { + return nil, err } o.Logg.Debug("cache bootstrap complete", "cached_addresses", cache.Size())