wormhole-explorer/contract-watcher/builder/watcher.go

83 lines
3.9 KiB
Go

package builder
import (
"time"
solana_go "github.com/gagliardetto/solana-go"
"github.com/wormhole-foundation/wormhole-explorer/contract-watcher/config"
"github.com/wormhole-foundation/wormhole-explorer/contract-watcher/internal/ankr"
"github.com/wormhole-foundation/wormhole-explorer/contract-watcher/internal/aptos"
"github.com/wormhole-foundation/wormhole-explorer/contract-watcher/internal/evm"
"github.com/wormhole-foundation/wormhole-explorer/contract-watcher/internal/metrics"
"github.com/wormhole-foundation/wormhole-explorer/contract-watcher/internal/solana"
"github.com/wormhole-foundation/wormhole-explorer/contract-watcher/internal/terra"
"github.com/wormhole-foundation/wormhole-explorer/contract-watcher/storage"
"github.com/wormhole-foundation/wormhole-explorer/contract-watcher/watcher"
"go.uber.org/ratelimit"
"go.uber.org/zap"
)
func CreateAnkrEvmWatcher(rateLimit int, chainURL string, wb config.WatcherBlockchainAddresses, repo *storage.Repository,
metrics metrics.Metrics, logger *zap.Logger) watcher.ContractWatcher {
evmLimiter := ratelimit.New(rateLimit, ratelimit.Per(time.Second))
ankrClient := ankr.NewAnkrSDK(chainURL, evmLimiter, metrics)
params := watcher.EVMParams{ChainID: wb.ChainID, Blockchain: wb.Name, SizeBlocks: wb.SizeBlocks,
WaitSeconds: wb.WaitSeconds, InitialBlock: wb.InitialBlock, MethodsByAddress: wb.MethodsByAddress}
return watcher.NewEVMWatcher(ankrClient, repo, params, metrics, logger)
}
func CreateSolanaWatcher(rateLimit int, chainURL string, wb config.WatcherBlockchain, logger *zap.Logger, repo *storage.Repository, metrics metrics.Metrics) watcher.ContractWatcher {
contractAddress, err := solana_go.PublicKeyFromBase58(wb.Address)
if err != nil {
logger.Fatal("failed to parse solana contract address", zap.Error(err))
}
solanaLimiter := ratelimit.New(rateLimit, ratelimit.Per(time.Second))
solanaClient := solana.NewSolanaSDK(chainURL, solanaLimiter, metrics, solana.WithRetries(3, 10*time.Second))
params := watcher.SolanaParams{Blockchain: wb.Name, ContractAddress: contractAddress,
SizeBlocks: wb.SizeBlocks, WaitSeconds: wb.WaitSeconds, InitialBlock: wb.InitialBlock}
return watcher.NewSolanaWatcher(solanaClient, repo, params, metrics, logger)
}
func CreateTerraWatcher(rateLimit int, chainURL string, wb config.WatcherBlockchain, logger *zap.Logger, repo *storage.Repository, metrics metrics.Metrics) watcher.ContractWatcher {
terraLimiter := ratelimit.New(rateLimit, ratelimit.Per(time.Second))
terraClient := terra.NewTerraSDK(chainURL, terraLimiter, metrics)
params := watcher.TerraParams{ChainID: wb.ChainID, Blockchain: wb.Name,
ContractAddress: wb.Address, WaitSeconds: wb.WaitSeconds, InitialBlock: wb.InitialBlock}
return watcher.NewTerraWatcher(terraClient, params, repo, metrics, logger)
}
func CreateAptosWatcher(rateLimit int, chainURL string, wb config.WatcherBlockchain, logger *zap.Logger, repo *storage.Repository, metrics metrics.Metrics) watcher.ContractWatcher {
aptosLimiter := ratelimit.New(rateLimit, ratelimit.Per(time.Second))
aptosClient := aptos.NewAptosSDK(chainURL, aptosLimiter, metrics)
params := watcher.AptosParams{
Blockchain: wb.Name,
ContractAddress: wb.Address,
SizeBlocks: wb.SizeBlocks,
WaitSeconds: wb.WaitSeconds,
InitialBlock: wb.InitialBlock}
return watcher.NewAptosWatcher(aptosClient, params, repo, metrics, logger)
}
func CreateEvmWatcher(
rateLimit int,
chainURL string,
wb config.WatcherBlockchainAddresses,
logger *zap.Logger,
repo *storage.Repository,
metrics metrics.Metrics,
) watcher.ContractWatcher {
limiter := ratelimit.New(rateLimit, ratelimit.Per(time.Second))
client := evm.NewEvmSDK(chainURL, limiter, metrics)
params := watcher.EVMParams{
ChainID: wb.ChainID,
Blockchain: wb.Name,
SizeBlocks: wb.SizeBlocks,
WaitSeconds: wb.WaitSeconds,
InitialBlock: wb.InitialBlock,
MethodsByAddress: wb.MethodsByAddress,
}
return watcher.NewEvmStandardWatcher(client, params, repo, metrics, logger)
}