wormhole-explorer/contract-watcher/cmd/backfiller/run.go

136 lines
6.9 KiB
Go

package backfiller
import (
"context"
"time"
"github.com/wormhole-foundation/wormhole-explorer/common/client/alert"
"github.com/wormhole-foundation/wormhole-explorer/common/dbutil"
"github.com/wormhole-foundation/wormhole-explorer/common/domain"
"github.com/wormhole-foundation/wormhole-explorer/common/logger"
"github.com/wormhole-foundation/wormhole-explorer/contract-watcher/builder"
"github.com/wormhole-foundation/wormhole-explorer/contract-watcher/config"
"github.com/wormhole-foundation/wormhole-explorer/contract-watcher/internal/metrics"
"github.com/wormhole-foundation/wormhole-explorer/contract-watcher/storage"
"github.com/wormhole-foundation/wormhole-explorer/contract-watcher/watcher"
"go.uber.org/zap"
)
func Run(config *config.BackfillerConfiguration) {
rootCtx := context.Background()
logger := logger.New("wormhole-explorer-contract-watcher", logger.WithLevel(config.LogLevel))
logger.Info("Starting wormhole-explorer-contract-watcher as backfiller ...")
//setup DB connection
db, err := dbutil.Connect(rootCtx, logger, config.MongoURI, config.MongoDatabase, false)
if err != nil {
logger.Fatal("failed to connect MongoDB", zap.Error(err))
}
// create metrics client
metrics := metrics.NewNoopMetrics()
// create alert client
alerts := alert.NewDummyClient()
// create repositories
repo := storage.NewRepository(db.Database, metrics, alerts, logger)
var watcher watcher.ContractWatcher
switch config.Network {
case domain.P2pMainNet:
watcher = newWatcherForMainnet(config, repo, metrics, logger)
case domain.P2pTestNet:
watcher = newWatcherForTestnet(config, repo, metrics, logger)
default:
logger.Fatal("P2P network not supported")
}
logger.Info("Processing backfill ...",
zap.String("network", config.Network),
zap.String("chain", config.ChainName),
zap.Bool("persistBlock", config.PersistBlock),
zap.Uint64("from", config.FromBlock),
zap.Uint64("to", config.ToBlock))
watcher.Backfill(rootCtx, config.FromBlock, config.ToBlock, config.PageSize, config.PersistBlock)
logger.Info("closing MongoDB connection...")
db.DisconnectWithTimeout(10 * time.Second)
logger.Info("Finish wormhole-explorer-contract-watcher as backfiller")
}
func newWatcherForMainnet(cfg *config.BackfillerConfiguration, repo *storage.Repository, metrics metrics.Metrics, logger *zap.Logger) watcher.ContractWatcher {
var watcher watcher.ContractWatcher
switch cfg.ChainName {
case config.ETHEREUM_MAINNET.ChainID.String():
watcher = builder.CreateAnkrEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.ETHEREUM_MAINNET, repo, metrics, logger)
case config.POLYGON_MAINNET.ChainID.String():
watcher = builder.CreateAnkrEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.POLYGON_MAINNET, repo, metrics, logger)
case config.BSC_MAINNET.ChainID.String():
watcher = builder.CreateAnkrEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.BSC_MAINNET, repo, metrics, logger)
case config.FANTOM_MAINNET.ChainID.String():
watcher = builder.CreateAnkrEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.FANTOM_MAINNET, repo, metrics, logger)
case config.AVALANCHE_MAINNET.ChainID.String():
watcher = builder.CreateAnkrEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.AVALANCHE_MAINNET, repo, metrics, logger)
case config.TERRA_MAINNET.ChainID.String():
watcher = builder.CreateTerraWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.TERRA_MAINNET, logger, repo, metrics)
case config.APTOS_MAINNET.ChainID.String():
watcher = builder.CreateAptosWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.APTOS_MAINNET, logger, repo, metrics)
case config.OASIS_MAINNET.ChainID.String():
watcher = builder.CreateEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.OASIS_MAINNET, logger, repo, metrics)
case config.MOONBEAM_MAINNET.ChainID.String():
watcher = builder.CreateEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.MOONBEAM_MAINNET, logger, repo, metrics)
case config.CELO_MAINNET.ChainID.String():
watcher = builder.CreateEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.CELO_MAINNET, logger, repo, metrics)
case config.ARBITRUM_MAINNET.ChainID.String():
watcher = builder.CreateEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.ARBITRUM_MAINNET, logger, repo, metrics)
case config.OPTIMISM_MAINNET.ChainID.String():
watcher = builder.CreateEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.OPTIMISM_MAINNET, logger, repo, metrics)
case config.BASE_MAINNET.ChainID.String():
watcher = builder.CreateEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.BASE_MAINNET, logger, repo, metrics)
default:
logger.Fatal("chain not supported")
}
return watcher
}
func newWatcherForTestnet(cfg *config.BackfillerConfiguration, repo *storage.Repository, metrics metrics.Metrics, logger *zap.Logger) watcher.ContractWatcher {
var watcher watcher.ContractWatcher
switch cfg.ChainName {
case config.ETHEREUM_TESTNET.ChainID.String():
watcher = builder.CreateAnkrEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.ETHEREUM_TESTNET, repo, metrics, logger)
case config.POLYGON_TESTNET.ChainID.String():
watcher = builder.CreateAnkrEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.POLYGON_TESTNET, repo, metrics, logger)
case config.BSC_TESTNET.ChainID.String():
watcher = builder.CreateAnkrEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.BSC_TESTNET, repo, metrics, logger)
case config.FANTOM_TESTNET.ChainID.String():
watcher = builder.CreateAnkrEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.FANTOM_TESTNET, repo, metrics, logger)
case config.AVALANCHE_TESTNET.ChainID.String():
watcher = builder.CreateAnkrEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.AVALANCHE_TESTNET, repo, metrics, logger)
case config.APTOS_TESTNET.ChainID.String():
watcher = builder.CreateAptosWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.APTOS_TESTNET, logger, repo, metrics)
case config.OASIS_TESTNET.ChainID.String():
watcher = builder.CreateEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.OASIS_TESTNET, logger, repo, metrics)
case config.MOONBEAM_TESTNET.ChainID.String():
watcher = builder.CreateEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.MOONBEAM_TESTNET, logger, repo, metrics)
case config.CELO_TESTNET.ChainID.String():
watcher = builder.CreateEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.CELO_TESTNET, logger, repo, metrics)
case config.ARBITRUM_TESTNET.ChainID.String():
watcher = builder.CreateEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.ARBITRUM_TESTNET, logger, repo, metrics)
case config.OPTIMISM_TESTNET.ChainID.String():
watcher = builder.CreateEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.OPTIMISM_TESTNET, logger, repo, metrics)
case config.BASE_TESTNET.ChainID.String():
watcher = builder.CreateEvmWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.BASE_TESTNET, logger, repo, metrics)
default:
logger.Fatal("chain not supported")
}
return watcher
}