diff --git a/contract-watcher/builder/watcher.go b/contract-watcher/builder/watcher.go index 1d9bdbd61..0c1b3832c 100644 --- a/contract-watcher/builder/watcher.go +++ b/contract-watcher/builder/watcher.go @@ -96,3 +96,29 @@ func CreateCeloWatcher(rateLimit int, chainURL string, wb config.WatcherBlockcha MethodsByAddress: wb.MethodsByAddress} return watcher.NewEvmStandarWatcher(celoClient, params, repo, metrics, logger) } + +func CreateOptimismWatcher(rateLimit int, chainURL string, wb config.WatcherBlockchainAddresses, logger *zap.Logger, repo *storage.Repository, metrics metrics.Metrics) watcher.ContractWatcher { + optimismLimiter := ratelimit.New(rateLimit, ratelimit.Per(time.Second)) + optimismClient := evm.NewEvmSDK(chainURL, optimismLimiter, metrics) + params := watcher.EVMParams{ + ChainID: wb.ChainID, + Blockchain: wb.Name, + SizeBlocks: wb.SizeBlocks, + WaitSeconds: wb.WaitSeconds, + InitialBlock: wb.InitialBlock, + MethodsByAddress: wb.MethodsByAddress} + return watcher.NewEvmStandarWatcher(optimismClient, params, repo, metrics, logger) +} + +func CreateArbitrumWatcher(rateLimit int, chainURL string, wb config.WatcherBlockchainAddresses, logger *zap.Logger, repo *storage.Repository, metrics metrics.Metrics) watcher.ContractWatcher { + arbitrumLimiter := ratelimit.New(rateLimit, ratelimit.Per(time.Second)) + arbitrumClient := evm.NewEvmSDK(chainURL, arbitrumLimiter, metrics) + params := watcher.EVMParams{ + ChainID: wb.ChainID, + Blockchain: wb.Name, + SizeBlocks: wb.SizeBlocks, + WaitSeconds: wb.WaitSeconds, + InitialBlock: wb.InitialBlock, + MethodsByAddress: wb.MethodsByAddress} + return watcher.NewEvmStandarWatcher(arbitrumClient, params, repo, metrics, logger) +} diff --git a/contract-watcher/cmd/backfiller/run.go b/contract-watcher/cmd/backfiller/run.go index 822d6ae33..87c6a4e03 100644 --- a/contract-watcher/cmd/backfiller/run.go +++ b/contract-watcher/cmd/backfiller/run.go @@ -90,6 +90,10 @@ func newWatcherForMainnet(cfg *config.BackfillerConfiguration, repo *storage.Rep watcher = builder.CreateMoonbeamWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.MOONBEAM_MAINNET, logger, repo, metrics) case config.CELO_MAINNET.ChainID.String(): watcher = builder.CreateCeloWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.CELO_MAINNET, logger, repo, metrics) + case config.ARBITRUM_MAINNET.ChainID.String(): + watcher = builder.CreateArbitrumWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.ARBITRUM_MAINNET, logger, repo, metrics) + case config.OPTIMISM_MAINNET.ChainID.String(): + watcher = builder.CreateOptimismWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.OPTIMISM_MAINNET, logger, repo, metrics) default: logger.Fatal("chain not supported") } @@ -119,6 +123,10 @@ func newWatcherForTestnet(cfg *config.BackfillerConfiguration, repo *storage.Rep watcher = builder.CreateMoonbeamWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.MOONBEAM_TESTNET, logger, repo, metrics) case config.CELO_TESTNET.ChainID.String(): watcher = builder.CreateCeloWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.CELO_TESTNET, logger, repo, metrics) + case config.ARBITRUM_TESTNET.ChainID.String(): + watcher = builder.CreateArbitrumWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.ARBITRUM_TESTNET, logger, repo, metrics) + case config.OPTIMISM_TESTNET.ChainID.String(): + watcher = builder.CreateOptimismWatcher(cfg.RateLimitPerSecond, cfg.ChainUrl, config.OPTIMISM_TESTNET, logger, repo, metrics) default: logger.Fatal("chain not supported") } diff --git a/contract-watcher/cmd/service/run.go b/contract-watcher/cmd/service/run.go index 6ac80758e..e99325a28 100644 --- a/contract-watcher/cmd/service/run.go +++ b/contract-watcher/cmd/service/run.go @@ -46,6 +46,8 @@ type watchersConfig struct { oasis *config.WatcherBlockchainAddresses moonbeam *config.WatcherBlockchainAddresses celo *config.WatcherBlockchainAddresses + arbitrum *config.WatcherBlockchainAddresses + optimism *config.WatcherBlockchainAddresses rateLimit rateLimitConfig } @@ -57,6 +59,8 @@ type rateLimitConfig struct { oasis int moonbeam int celo int + optimism int + arbitrum int } func Run() { @@ -185,10 +189,24 @@ func newWatchers(config *config.ServiceConfiguration, repo *storage.Repository, result = append(result, moonbeamWatcher) } + // add celo watcher if watchers.celo != nil { celoWatcher := builder.CreateCeloWatcher(watchers.rateLimit.celo, config.CeloUrl, *watchers.celo, logger, repo, metrics) result = append(result, celoWatcher) } + + // add optimism watcher + if watchers.optimism != nil { + optimismWatcher := builder.CreateOptimismWatcher(watchers.rateLimit.optimism, config.OptimismUrl, *watchers.optimism, logger, repo, metrics) + result = append(result, optimismWatcher) + } + + // add arbitrum watcher + if watchers.arbitrum != nil { + arbitrumWatcher := builder.CreateOptimismWatcher(watchers.rateLimit.arbitrum, config.ArbitrumUrl, *watchers.arbitrum, logger, repo, metrics) + result = append(result, arbitrumWatcher) + } + return result } @@ -215,6 +233,8 @@ func newWatchersForMainnet(cfg *config.ServiceConfiguration) *watchersConfig { oasis: cfg.OasisRequestsPerSecond, moonbeam: cfg.MoonbeamRequestsPerSecond, celo: cfg.CeloRequestsPerSecond, + arbitrum: cfg.ArbitrumRequestsPerSecond, + optimism: cfg.OptimismRequestsPerSecond, }, } } @@ -241,6 +261,8 @@ func newWatchersForTestnet(cfg *config.ServiceConfiguration) *watchersConfig { oasis: cfg.OasisRequestsPerSecond, moonbeam: cfg.MoonbeamRequestsPerSecond, celo: cfg.CeloRequestsPerSecond, + optimism: cfg.OptimismRequestsPerSecond, + arbitrum: cfg.ArbitrumRequestsPerSecond, }, } } diff --git a/contract-watcher/config/config.go b/contract-watcher/config/config.go index 9010be92f..9c48ffbf4 100644 --- a/contract-watcher/config/config.go +++ b/contract-watcher/config/config.go @@ -9,29 +9,34 @@ import ( // ServiceConfiguration represents the application configuration when running as service with the default values. type ServiceConfiguration struct { - Environment string `env:"ENVIRONMENT,required"` - LogLevel string `env:"LOG_LEVEL,default=INFO"` - Port string `env:"PORT,default=8000"` - MongoURI string `env:"MONGODB_URI,required"` - MongoDatabase string `env:"MONGODB_DATABASE,required"` + Environment string `env:"ENVIRONMENT,required"` + LogLevel string `env:"LOG_LEVEL,default=INFO"` + Port string `env:"PORT,default=8000"` + MongoURI string `env:"MONGODB_URI,required"` + MongoDatabase string `env:"MONGODB_DATABASE,required"` + PprofEnabled bool `env:"PPROF_ENABLED,default=false"` + P2pNetwork string `env:"P2P_NETWORK,required"` + AlertEnabled bool `env:"ALERT_ENABLED,required"` + AlertApiKey string `env:"ALERT_API_KEY"` + AnkrUrl string `env:"ANKR_URL,required"` AnkrRequestsPerSecond int `env:"ANKR_REQUESTS_PER_SECOND,required"` - SolanaUrl string `env:"SOLANA_URL,required"` - SolanaRequestsPerSecond int `env:"SOLANA_REQUESTS_PER_SECOND,required"` - TerraUrl string `env:"TERRA_URL,required"` - TerraRequestsPerSecond int `env:"TERRA_REQUESTS_PER_SECOND,required"` AptosUrl string `env:"APTOS_URL,required"` AptosRequestsPerSecond int `env:"APTOS_REQUESTS_PER_SECOND,required"` - OasisUrl string `env:"OASIS_URL,required"` - OasisRequestsPerSecond int `env:"OASIS_REQUESTS_PER_SECOND,required"` - MoonbeamUrl string `env:"MOONBEAM_URL,required"` - MoonbeamRequestsPerSecond int `env:"MOONBEAM_REQUESTS_PER_SECOND,required"` + ArbitrumUrl string `env:"ARBITRUM_URL,required"` + ArbitrumRequestsPerSecond int `env:"ARBITRUM_REQUESTS_PER_SECOND,required"` CeloUrl string `env:"CELO_URL,required"` CeloRequestsPerSecond int `env:"CELO_REQUESTS_PER_SECOND,required"` - PprofEnabled bool `env:"PPROF_ENABLED,default=false"` - P2pNetwork string `env:"P2P_NETWORK,required"` - AlertEnabled bool `env:"ALERT_ENABLED,required"` - AlertApiKey string `env:"ALERT_API_KEY"` + MoonbeamUrl string `env:"MOONBEAM_URL,required"` + MoonbeamRequestsPerSecond int `env:"MOONBEAM_REQUESTS_PER_SECOND,required"` + OptimismUrl string `env:"OPTIMISM_URL,required"` + OptimismRequestsPerSecond int `env:"OPTIMISM_REQUESTS_PER_SECOND,required"` + OasisUrl string `env:"OASIS_URL,required"` + OasisRequestsPerSecond int `env:"OASIS_REQUESTS_PER_SECOND,required"` + SolanaUrl string `env:"SOLANA_URL,required"` + SolanaRequestsPerSecond int `env:"SOLANA_REQUESTS_PER_SECOND,required"` + TerraUrl string `env:"TERRA_URL,required"` + TerraRequestsPerSecond int `env:"TERRA_REQUESTS_PER_SECOND,required"` } // BackfillerConfiguration represents the application configuration when running as backfiller. diff --git a/contract-watcher/config/mainnet.go b/contract-watcher/config/mainnet.go index c41362bf9..c08d4d81d 100644 --- a/contract-watcher/config/mainnet.go +++ b/contract-watcher/config/mainnet.go @@ -71,6 +71,12 @@ var POLYGON_MAINNET = WatcherBlockchainAddresses{ Name: MetehodCompleteTransferWithRelay, }, }, + strings.ToLower("0x09959798B95d00a3183d20FaC298E4594E599eab"): { + { + ID: MethodIDReceiveTbtc, + Name: MethodReceiveTbtc, + }, + }, }, } @@ -298,3 +304,35 @@ var CELO_MAINNET = WatcherBlockchainAddresses{ }, }, } + +var ARBITRUM_MAINNET = WatcherBlockchainAddresses{ + ChainID: vaa.ChainIDArbitrum, + Name: "arbitrum", + SizeBlocks: 100, + WaitSeconds: 10, + InitialBlock: 75_577_070, + MethodsByAddress: map[string][]BlockchainMethod{ + strings.ToLower("0x1293a54e160D1cd7075487898d65266081A15458"): { + { + ID: MethodIDReceiveTbtc, + Name: MethodReceiveTbtc, + }, + }, + }, +} + +var OPTIMISM_MAINNET = WatcherBlockchainAddresses{ + ChainID: vaa.ChainIDOptimism, + Name: "optimism", + SizeBlocks: 100, + WaitSeconds: 10, + InitialBlock: 89_900_107, + MethodsByAddress: map[string][]BlockchainMethod{ + strings.ToLower("0x1293a54e160D1cd7075487898d65266081A15458"): { + { + ID: MethodIDReceiveTbtc, + Name: MethodReceiveTbtc, + }, + }, + }, +} diff --git a/contract-watcher/config/testnet.go b/contract-watcher/config/testnet.go index 14dc814b8..5c658327a 100644 --- a/contract-watcher/config/testnet.go +++ b/contract-watcher/config/testnet.go @@ -71,6 +71,12 @@ var POLYGON_TESTNET = WatcherBlockchainAddresses{ Name: MetehodCompleteTransferWithRelay, }, }, + strings.ToLower("0xc3D46e0266d95215589DE639cC4E93b79f88fc6C"): { + { + ID: MethodIDReceiveTbtc, + Name: MethodReceiveTbtc, + }, + }, }, } @@ -289,3 +295,35 @@ var CELO_TESTNET = WatcherBlockchainAddresses{ }, }, } + +var ARBITRUM_TESTNET = WatcherBlockchainAddresses{ + ChainID: vaa.ChainIDArbitrum, + Name: "arbitrum_goerli", + SizeBlocks: 100, + WaitSeconds: 10, + InitialBlock: 15_470_418, + MethodsByAddress: map[string][]BlockchainMethod{ + strings.ToLower("0xe3e0511EEbD87F08FbaE4486419cb5dFB06e1343"): { + { + ID: MethodIDReceiveTbtc, + Name: MethodReceiveTbtc, + }, + }, + }, +} + +var OPTIMISM_TESTNET = WatcherBlockchainAddresses{ + ChainID: vaa.ChainIDArbitrum, + Name: "optimism_goerli", + SizeBlocks: 100, + WaitSeconds: 10, + InitialBlock: 7_973_025, + MethodsByAddress: map[string][]BlockchainMethod{ + strings.ToLower("0xc3D46e0266d95215589DE639cC4E93b79f88fc6C"): { + { + ID: MethodIDReceiveTbtc, + Name: MethodReceiveTbtc, + }, + }, + }, +} diff --git a/contract-watcher/config/types.go b/contract-watcher/config/types.go index f5a429e90..67a30e057 100644 --- a/contract-watcher/config/types.go +++ b/contract-watcher/config/types.go @@ -15,6 +15,9 @@ const ( //Method name for wormhole connect wrapped contract. MetehodCompleteTransferWithRelay = "completeTransferWithRelay" + //Method name for wormhole tBTC gateway + MethodReceiveTbtc = "receiveTbtc" + //Method ids for wormhole token bridge contract MethodIDCompleteTransfer = "0xc6878519" MethodIDWrapAndTransfer = "0x9981509f" @@ -25,6 +28,9 @@ const ( MethodIDUpdateWrapped = "0xf768441f" //Method id for wormhole connect wrapped contract. MetehodIDCompleteTransferWithRelay = "0x2f25e25f" + + //Method id for wormhole tBTC gateway + MethodIDReceiveTbtc = "0x5d21a596" ) type WatcherBlockchain struct { diff --git a/deploy/contract-watcher/contract-watcher-service.yaml b/deploy/contract-watcher/contract-watcher-service.yaml index 20abcb1b7..974568e47 100644 --- a/deploy/contract-watcher/contract-watcher-service.yaml +++ b/deploy/contract-watcher/contract-watcher-service.yaml @@ -109,6 +109,20 @@ spec: key: celo-url - name: CELO_REQUESTS_PER_SECOND value: "{{ .CELO_REQUESTS_PER_SECOND }}" + - name: OPTIMISM_URL + valueFrom: + secretKeyRef: + name: blockchain + key: optimism-url + - name: OPTIMISM_REQUESTS_PER_SECOND + value: "{{ .OPTIMISM_REQUESTS_PER_SECOND }}" + - name: ARBITRUM_URL + valueFrom: + secretKeyRef: + name: blockchain + key: arbitrum-url + - name: ARBITRUM_REQUESTS_PER_SECOND + value: "{{ .ARBITRUM_REQUESTS_PER_SECOND }}" - name: ALERT_API_KEY valueFrom: secretKeyRef: diff --git a/deploy/contract-watcher/env/production.env b/deploy/contract-watcher/env/production.env index c09527d5a..f6cff547e 100644 --- a/deploy/contract-watcher/env/production.env +++ b/deploy/contract-watcher/env/production.env @@ -23,4 +23,8 @@ MOONBEAM_URL= MOONBEAM_REQUESTS_PER_SECOND=5 CELO_URL= CELO_REQUESTS_PER_SECOND=20 +ARBITRUM_URL= +ARBITRUM_REQUESTS_PER_SECOND=3 +OPTIMISM_URL= +OPTIMISM_REQUESTS_PER_SECOND=3 ALERT_ENABLED=true \ No newline at end of file diff --git a/deploy/contract-watcher/env/staging.env b/deploy/contract-watcher/env/staging.env index 49ed566ae..140979168 100644 --- a/deploy/contract-watcher/env/staging.env +++ b/deploy/contract-watcher/env/staging.env @@ -23,4 +23,8 @@ MOONBEAM_URL= MOONBEAM_REQUESTS_PER_SECOND=5 CELO_URL= CELO_REQUESTS_PER_SECOND=20 +ARBITRUM_URL= +ARBITRUM_REQUESTS_PER_SECOND=3 +OPTIMISM_URL= +OPTIMISM_REQUESTS_PER_SECOND=3 ALERT_ENABLED=false \ No newline at end of file diff --git a/deploy/contract-watcher/env/test.env b/deploy/contract-watcher/env/test.env index 5adcef0f8..daa727e99 100644 --- a/deploy/contract-watcher/env/test.env +++ b/deploy/contract-watcher/env/test.env @@ -23,4 +23,8 @@ MOONBEAM_URL= MOONBEAM_REQUESTS_PER_SECOND=2 CELO_URL= CELO_REQUESTS_PER_SECOND=20 +ARBITRUM_URL= +ARBITRUM_REQUESTS_PER_SECOND=1 +OPTIMISM_URL= +OPTIMISM_REQUESTS_PER_SECOND=1 ALERT_ENABLED=false \ No newline at end of file diff --git a/deploy/contract-watcher/secrets.yaml b/deploy/contract-watcher/secrets.yaml index 0e8bfcb66..328f770ce 100644 --- a/deploy/contract-watcher/secrets.yaml +++ b/deploy/contract-watcher/secrets.yaml @@ -12,4 +12,6 @@ data: oasis-url: {{ .OASIS_URL | b64enc }} moonbeam-url: {{ .MOONBEAM_URL | b64enc }} celo-url: {{ .CELO_URL | b64enc }} + arbitrum-url: {{ .ARBITRUM_URL | b64enc }} + optimism-url: {{ .OPTIMISM_URL | b64enc }} type: Opaque