diff --git a/devnet/node.yaml b/devnet/node.yaml index c64d91949..7bae8b4c2 100644 --- a/devnet/node.yaml +++ b/devnet/node.yaml @@ -88,6 +88,8 @@ spec: - ws://eth-devnet:8545 - --arbitrumRPC - ws://eth-devnet:8545 + - --optimismRPC + - ws://eth-devnet:8545 - --neonRPC - ws://eth-devnet:8545 # - --wormchainWS diff --git a/ethereum/.env.optimism.mainnet b/ethereum/.env.optimism.mainnet index d3e0461fd..fd80fb5c7 100644 --- a/ethereum/.env.optimism.mainnet +++ b/ethereum/.env.optimism.mainnet @@ -7,3 +7,11 @@ INIT_CHAIN_ID=24 INIT_GOV_CHAIN_ID=0x1 INIT_GOV_CONTRACT=0x0000000000000000000000000000000000000000000000000000000000000004 INIT_EVM_CHAIN_ID=10 + +# Bridge Migrations +BRIDGE_INIT_CHAIN_ID=24 +BRIDGE_INIT_GOV_CHAIN_ID=0x1 +BRIDGE_INIT_GOV_CONTRACT=0x0000000000000000000000000000000000000000000000000000000000000004 +# There is no WETH. +BRIDGE_INIT_WETH=0x0000000000000000000000000000000000000000 +BRIDGE_INIT_FINALITY=1 \ No newline at end of file diff --git a/node/cmd/guardiand/adminnodes.go b/node/cmd/guardiand/adminnodes.go index 5be98afae..9cf415c92 100644 --- a/node/cmd/guardiand/adminnodes.go +++ b/node/cmd/guardiand/adminnodes.go @@ -107,6 +107,7 @@ func runListNodes(cmd *cobra.Command, args []string) { {"Pythnet", vaa.ChainIDPythNet}, {"Moonbeam", vaa.ChainIDMoonbeam}, {"Arbitrum", vaa.ChainIDArbitrum}, + {"Optimism", vaa.ChainIDOptimism}, {"Xpla", vaa.ChainIDXpla}, {"Injective", vaa.ChainIDInjective}, {"Neon", vaa.ChainIDNeon}, diff --git a/node/cmd/guardiand/node.go b/node/cmd/guardiand/node.go index a490d6bb3..62aca11bf 100644 --- a/node/cmd/guardiand/node.go +++ b/node/cmd/guardiand/node.go @@ -573,6 +573,10 @@ func runNode(cmd *cobra.Command, args []string) { } } + if (*optimismRPC == "") != (*optimismContract == "") { + logger.Fatal("Both --optimismContract and --optimismRPC must be set together or both unset") + } + if *testnetMode { if *neonRPC == "" { logger.Fatal("Please specify --neonRPC") @@ -589,9 +593,6 @@ func runNode(cmd *cobra.Command, args []string) { if *injectiveContract == "" { logger.Fatal("Please specify --injectiveContract") } - if (*optimismRPC == "") != (*optimismContract == "") { - logger.Fatal("Both --optimismContract and --optimismRPC must be set together or both unset") - } } else { if *neonRPC != "" && !*unsafeDevMode { logger.Fatal("Please do not specify --neonRPC") @@ -608,12 +609,6 @@ func runNode(cmd *cobra.Command, args []string) { if *injectiveContract != "" && !*unsafeDevMode { logger.Fatal("Please do not specify --injectiveContract") } - if *optimismRPC != "" && !*unsafeDevMode { - logger.Fatal("Please do not specify --optimismRPC") - } - if *optimismContract != "" && !*unsafeDevMode { - logger.Fatal("Please do not specify --optimismContract") - } } if *nodeName == "" { logger.Fatal("Please specify --nodeName") @@ -1049,6 +1044,18 @@ func runNode(cmd *cobra.Command, args []string) { return err } } + if shouldStart(optimismRPC) { + if ethWatcher == nil { + log.Fatalf("if optimism is enabled then ethereum must also be enabled.") + } + logger.Info("Starting Optimism watcher") + readiness.RegisterComponent(common.ReadinessOptimismSyncing) + chainObsvReqC[vaa.ChainIDOptimism] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize) + if err := supervisor.Run(ctx, "optimismwatch", + evm.NewEthWatcher(*optimismRPC, optimismContractAddr, "optimism", common.ReadinessOptimismSyncing, vaa.ChainIDOptimism, lockC, nil, 1, chainObsvReqC[vaa.ChainIDOptimism], *unsafeDevMode, ethWatcher).Run); err != nil { + return err + } + } if shouldStart(terraWS) { logger.Info("Starting Terra watcher") @@ -1157,18 +1164,6 @@ func runNode(cmd *cobra.Command, args []string) { return err } } - if shouldStart(optimismRPC) { - if ethWatcher == nil { - log.Fatalf("if optimism is enabled then ethereum must also be enabled.") - } - logger.Info("Starting Optimism watcher") - readiness.RegisterComponent(common.ReadinessOptimismSyncing) - chainObsvReqC[vaa.ChainIDOptimism] = make(chan *gossipv1.ObservationRequest, observationRequestBufferSize) - if err := supervisor.Run(ctx, "optimismwatch", - evm.NewEthWatcher(*optimismRPC, optimismContractAddr, "optimism", common.ReadinessOptimismSyncing, vaa.ChainIDOptimism, lockC, nil, 1, chainObsvReqC[vaa.ChainIDOptimism], *unsafeDevMode, ethWatcher).Run); err != nil { - return err - } - } if shouldStart(injectiveWS) { logger.Info("Starting Injective watcher") readiness.RegisterComponent(common.ReadinessInjectiveSyncing) diff --git a/node/hack/repair_eth/repair_eth.go b/node/hack/repair_eth/repair_eth.go index f03bfc942..a1bf4c4e3 100644 --- a/node/hack/repair_eth/repair_eth.go +++ b/node/hack/repair_eth/repair_eth.go @@ -43,6 +43,7 @@ var etherscanAPIMap = map[vaa.ChainID]string{ vaa.ChainIDCelo: "https://celoscan.xyz/api", vaa.ChainIDMoonbeam: "https://api-moonbeam.moonscan.io", vaa.ChainIDArbitrum: "https://api.arbiscan.io", + vaa.ChainIDOptimism: "https://api-optimistic.etherscan.io", } var coreContractMap = map[vaa.ChainID]string{ @@ -59,6 +60,7 @@ var coreContractMap = map[vaa.ChainID]string{ vaa.ChainIDCelo: strings.ToLower("0xa321448d90d4e5b0A732867c18eA198e75CAC48E"), vaa.ChainIDMoonbeam: strings.ToLower("0xC8e2b0cD52Cf01b0Ce87d389Daa3d414d4cE29f3"), vaa.ChainIDArbitrum: strings.ToLower("0xa5f208e072434bC67592E4C49C1B991BA79BCA46"), + vaa.ChainIDOptimism: strings.ToLower("0xEe91C335eab126dF5fDB3797EA9d6aD93aeC9722"), } var ( diff --git a/node/pkg/governor/mainnet_chains.go b/node/pkg/governor/mainnet_chains.go index 0528604d7..a1ea4efe7 100644 --- a/node/pkg/governor/mainnet_chains.go +++ b/node/pkg/governor/mainnet_chains.go @@ -28,6 +28,7 @@ func chainList() []chainConfigEntry { chainConfigEntry{emitterChainID: vaa.ChainIDTerra2, dailyLimit: 500_000, bigTransactionSize: 50_000}, chainConfigEntry{emitterChainID: vaa.ChainIDMoonbeam, dailyLimit: 5_000_000, bigTransactionSize: 500_000}, chainConfigEntry{emitterChainID: vaa.ChainIDArbitrum, dailyLimit: 200_000, bigTransactionSize: 20_000}, + chainConfigEntry{emitterChainID: vaa.ChainIDOptimism, dailyLimit: 200_000, bigTransactionSize: 20_000}, chainConfigEntry{emitterChainID: vaa.ChainIDAptos, dailyLimit: 5_000_000, bigTransactionSize: 500_000}, chainConfigEntry{emitterChainID: vaa.ChainIDXpla, dailyLimit: 200_000, bigTransactionSize: 20_000}, } diff --git a/node/pkg/governor/mainnet_tokens_test.go b/node/pkg/governor/mainnet_tokens_test.go index 400b81762..64b6515d8 100644 --- a/node/pkg/governor/mainnet_tokens_test.go +++ b/node/pkg/governor/mainnet_tokens_test.go @@ -14,7 +14,7 @@ func TestTokenListSize(t *testing.T) { /* Assuming that governed tokens will need to be updated every time we regenerate it */ - assert.Equal(t, 132, len(tokenConfigEntries)) + assert.Equal(t, 133, len(tokenConfigEntries)) } func TestTokenListAddressSize(t *testing.T) { diff --git a/node/pkg/governor/manual_tokens.go b/node/pkg/governor/manual_tokens.go index 1a973a7ff..1e2a708dd 100644 --- a/node/pkg/governor/manual_tokens.go +++ b/node/pkg/governor/manual_tokens.go @@ -15,5 +15,6 @@ func manualTokenList() []tokenConfigEntry { tokenConfigEntry{chain: 13, addr: "0000000000000000000000005096db80b21ef45230c9e423c373f1fc9c0198dd", symbol: "WEMIX", coinGeckoId: "wemix-token", decimals: 8, price: 1.74}, tokenConfigEntry{chain: 13, addr: "0000000000000000000000005c74070fdea071359b86082bd9f9b3deaafbe32b", symbol: "KDAI", coinGeckoId: "dai", decimals: 8, price: 1.00}, tokenConfigEntry{chain: 15, addr: "0000000000000000000000000000000000000000000000000000000000000000", symbol: "NEAR", coinGeckoId: "near", decimals: 8, price: 3.85}, + tokenConfigEntry{chain: 24, addr: "0000000000000000000000004200000000000000000000000000000000000042", symbol: "OP", coinGeckoId: "optimism", decimals: 8, price: 1.31}, } } diff --git a/sdk/js/src/utils/consts.ts b/sdk/js/src/utils/consts.ts index ec837c387..ce526459b 100644 --- a/sdk/js/src/utils/consts.ts +++ b/sdk/js/src/utils/consts.ts @@ -202,8 +202,8 @@ const MAINNET = { }, optimism: { core: "0xEe91C335eab126dF5fDB3797EA9d6aD93aeC9722", - token_bridge: undefined, - nft_bridge: undefined, + token_bridge: "0x1D68124e65faFC907325e3EDbF8c4d84499DAa8b", + nft_bridge: "0xfE8cD454b4A1CA468B57D79c0cc77Ef5B6f64585", }, gnosis: { core: "0xa321448d90d4e5b0A732867c18eA198e75CAC48E", diff --git a/sdk/mainnet_consts.go b/sdk/mainnet_consts.go index 1beb766b5..0973150a1 100644 --- a/sdk/mainnet_consts.go +++ b/sdk/mainnet_consts.go @@ -115,6 +115,7 @@ var knownTokenbridgeEmitters = map[vaa.ChainID]string{ vaa.ChainIDNear: "148410499d3fcda4dcfd68a1ebfcdddda16ab28326448d4aae4d2f0465cdfcb7", vaa.ChainIDMoonbeam: "000000000000000000000000B1731c586ca89a23809861c6103F0b96B3F57D92", vaa.ChainIDArbitrum: "0000000000000000000000000b2402144Bb366A632D14B83F244D2e0e21bD39c", + vaa.ChainIDOptimism: "0000000000000000000000001D68124e65faFC907325e3EDbF8c4d84499DAa8b", vaa.ChainIDXpla: "8f9cf727175353b17a5f574270e370776123d90fd74956ae4277962b4fdee24c", } @@ -135,6 +136,7 @@ var knownNFTBridgeEmitters = map[vaa.ChainID]string{ vaa.ChainIDCelo: "000000000000000000000000A6A377d75ca5c9052c9a77ED1e865Cc25Bd97bf3", vaa.ChainIDMoonbeam: "000000000000000000000000453cfBe096C0f8D763E8C5F24B441097d577bdE2", vaa.ChainIDArbitrum: "0000000000000000000000003dD14D553cFD986EAC8e3bddF629d82073e188c8", + vaa.ChainIDOptimism: "000000000000000000000000fE8cD454b4A1CA468B57D79c0cc77Ef5B6f64585", } func GetEmitterAddressForChain(chainID vaa.ChainID, emitterType EmitterType) (vaa.Address, error) { diff --git a/sdk/testnet_consts.go b/sdk/testnet_consts.go index d6a32d7ac..4194ea85d 100644 --- a/sdk/testnet_consts.go +++ b/sdk/testnet_consts.go @@ -27,6 +27,7 @@ var knownTestnetTokenbridgeEmitters = map[vaa.ChainID]string{ vaa.ChainIDNear: "c2c0b6ecbbe9ecf91b2b7999f0264018ba68126c2e83bf413f59f712f3a1df55", vaa.ChainIDMoonbeam: "000000000000000000000000bc976d4b9d57e57c3ca52e1fd136c45ff7955a96", vaa.ChainIDArbitrum: "00000000000000000000000023908A62110e21C04F3A4e011d24F901F911744A", + vaa.ChainIDOptimism: "000000000000000000000000C7A204bDBFe983FCD8d8E61D02b475D4073fF97e", vaa.ChainIDNeon: "000000000000000000000000c7a204bdbfe983fcd8d8e61d02b475d4073ff97e", vaa.ChainIDXpla: "b66da121bd3621c8d2604c08c82965640fe682d606af26a302ee09094f5e62cf", } @@ -48,5 +49,6 @@ var knownTestnetNFTBridgeEmitters = map[vaa.ChainID]string{ vaa.ChainIDCelo: "000000000000000000000000acd8190f647a31e56a656748bc30f69259f245db", vaa.ChainIDMoonbeam: "00000000000000000000000098a0f4b96972b32fcb3bd03caeb66a44a6ab9edb", vaa.ChainIDArbitrum: "000000000000000000000000Ee3dB83916Ccdc3593b734F7F2d16D630F39F1D0", + vaa.ChainIDOptimism: "00000000000000000000000023908A62110e21C04F3A4e011d24F901F911744A", vaa.ChainIDNeon: "00000000000000000000000023908a62110e21c04f3a4e011d24f901f911744a", }