From db1ee86bfbaf16383c46150a44b1437a522514da Mon Sep 17 00:00:00 2001 From: bruce-riley <96066700+bruce-riley@users.noreply.github.com> Date: Mon, 6 Jan 2025 12:08:20 -0600 Subject: [PATCH] Deploy SeiEVM testnet (#4209) * cli: arbitrary chain registration * Deploy SeiEVM Testnet --------- Co-authored-by: Evan Gray --- deployments/testnet/tokenBridgeVAAs.csv | 1 + ethereum/env/.env.seievm.devnet | 13 +++++++++++++ ethereum/env/.env.seievm.testnet | 22 ++++++++++++++-------- node/cmd/guardiand/node.go | 20 ++++++++++++++++++++ node/pkg/query/query.go | 1 + node/pkg/watchers/evm/watcher.go | 1 + sdk/testnet_consts.go | 1 + 7 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 ethereum/env/.env.seievm.devnet diff --git a/deployments/testnet/tokenBridgeVAAs.csv b/deployments/testnet/tokenBridgeVAAs.csv index f3c77f523..dc3a5a47f 100644 --- a/deployments/testnet/tokenBridgeVAAs.csv +++ b/deployments/testnet/tokenBridgeVAAs.csv @@ -30,6 +30,7 @@ Blast (36) Testnet Token Bridge,0100000000010052b4615add1ca354feb81a7f90b70a0d78 XLayer (37) Testnet Token Bridge,01000000000100c983babda02e84e346e49f823aa201d65c82e19c51cdfb555cc9aa2fa6809f4500f6344d86722b1a8023906d185c96bc9b4e332402ae2e05ec69d0d95c39ea81000000000100000001000100000000000000000000000000000000000000000000000000000000000000040000000005b1293100000000000000000000000000000000000000000000546f6b656e4272696467650100000025000000000000000000000000da91a06299bbf302091b053c6b9ef86eff0f930d Linea (38) Testnet Token Bridge,01000000000100411f65a20405ad0d85d6718a91bc16cf645a7eb7dbd29d4b2d0b9cc2d872dc01112cf96dc40c07ddf648325a5dcdba42c70612179126178e7fb9e9bcfef1cb4a01000000010000000100010000000000000000000000000000000000000000000000000000000000000004000000000183785600000000000000000000000000000000000000000000546f6b656e4272696467650100000026000000000000000000000000c7a204bdbfe983fcd8d8e61d02b475d4073ff97e Berachain (39) Testnet Token Bridge,01000000000100c19d35faa10139fef5b3244f120efb67ad22d2d9ece7d777bcb6e957506ba9f15e2e6fd91a18dcdd6bf434d96d624fd725f957437f2e86dfdcbb6d0e97f3eeb100000000010000000100010000000000000000000000000000000000000000000000000000000000000004000000000404250300000000000000000000000000000000000000000000546f6b656e4272696467650100000027000000000000000000000000a10f2ef61de1f19f586ab8b6f2eba89bace63f7a +SeiEVM (40) Testnet Token Bridge,0100000000010041e411c483dcf8a1dcd9ec21ca63a0265904418577f894089d4d4931b728369f1a7e088f72ff725184d0be107ef8d42069ee1b37257b98a7b276c09e03cb47e501000000010000000100010000000000000000000000000000000000000000000000000000000000000004000000000260150f00000000000000000000000000000000000000000000546f6b656e427269646765010000002800000000000000000000000023908a62110e21c04f3a4e011d24f901f911744a Snaxchain (43) Testnet Token Bridge,010000000001008ed60dec76f13f6da695fc5f134c8cf3527f264712e7bb98d2e54a5f457759e0491e3f1cb42eed9b84edc60a96836df98a3752c8a4e10977801e6c35a39f211b000000000100000001000100000000000000000000000000000000000000000000000000000000000000040000000005ba971e00000000000000000000000000000000000000000000546f6b656e427269646765010000002b000000000000000000000000a10f2ef61de1f19f586ab8b6f2eba89bace63f7a Unichain (44) Testnet Token Bridge,010000000001004f9c7be0694bcabbf1fec2300004b9d82f6a122c459fababcfdc897e894769290c9a9655015909b5c17667d63f8edcec9ad9ee2d05e7cdb24a7a64136a4312c70100000001000000010001000000000000000000000000000000000000000000000000000000000000000400000000008006e100000000000000000000000000000000000000000000546f6b656e427269646765010000002c000000000000000000000000a10f2ef61de1f19f586ab8b6f2eba89bace63f7a Worldchain (45) Testnet Token Bridge,01000000000100f1ae141e77e67110aecade87c6a5f9b34545638aba1a3a7dbf6a311fe58c99fd351650c8593a8161a03cc7f94b76cdc0a5978fa3e0ffbfb3738085a070172cc5010000000100000001000100000000000000000000000000000000000000000000000000000000000000040000000004f3500a00000000000000000000000000000000000000000000546f6b656e427269646765010000002d000000000000000000000000430855b4d43b8aeb9d2b9869b74d58dda79c0db2 diff --git a/ethereum/env/.env.seievm.devnet b/ethereum/env/.env.seievm.devnet new file mode 100644 index 000000000..83565e4db --- /dev/null +++ b/ethereum/env/.env.seievm.devnet @@ -0,0 +1,13 @@ +# Sei EVM testnet read only env. Use to deploy the core contract with forge. + +# ethereum$ ln -s env/.env.seievm.testnet .env + +RPC_URL="https://evm-rpc-arctic-1.sei-apis.com/" +FORGE_ARGS="--legacy --with-gas-price 3000000000" # 3 gwei + +# Wormhole Core +INIT_SIGNERS=["0x58CC3AE5C097b213cE3c81979e1B9f9570746AA5"] +INIT_CHAIN_ID=40 +INIT_GOV_CHAIN_ID=0x1 +INIT_GOV_CONTRACT=0x0000000000000000000000000000000000000000000000000000000000000004 +INIT_EVM_CHAIN_ID=713715 diff --git a/ethereum/env/.env.seievm.testnet b/ethereum/env/.env.seievm.testnet index 83565e4db..daae071fa 100644 --- a/ethereum/env/.env.seievm.testnet +++ b/ethereum/env/.env.seievm.testnet @@ -1,13 +1,19 @@ -# Sei EVM testnet read only env. Use to deploy the core contract with forge. +# SeiEVM testnet (atlantic-2) env +# Rename to .env -# ethereum$ ln -s env/.env.seievm.testnet .env +# Common config for forge deployment +RPC_URL="https://evm-rpc-testnet.sei-apis.com/" -RPC_URL="https://evm-rpc-arctic-1.sei-apis.com/" -FORGE_ARGS="--legacy --with-gas-price 3000000000" # 3 gwei - -# Wormhole Core -INIT_SIGNERS=["0x58CC3AE5C097b213cE3c81979e1B9f9570746AA5"] +# Wormhole Core Migrations +INIT_SIGNERS=["0x13947Bd48b18E53fdAeEe77F3473391aC727C638"] INIT_CHAIN_ID=40 INIT_GOV_CHAIN_ID=0x1 INIT_GOV_CONTRACT=0x0000000000000000000000000000000000000000000000000000000000000004 -INIT_EVM_CHAIN_ID=713715 +INIT_EVM_CHAIN_ID=1328 + +# Bridge Migrations +BRIDGE_INIT_CHAIN_ID=40 +BRIDGE_INIT_GOV_CHAIN_ID=0x1 +BRIDGE_INIT_GOV_CONTRACT=0x0000000000000000000000000000000000000000000000000000000000000004 +BRIDGE_INIT_WETH=0x3921eA6Cf927BE80211Bb57f19830700285b0AdA +BRIDGE_INIT_FINALITY=1 diff --git a/node/cmd/guardiand/node.go b/node/cmd/guardiand/node.go index 0bc96197f..d5646dd8a 100644 --- a/node/cmd/guardiand/node.go +++ b/node/cmd/guardiand/node.go @@ -204,6 +204,9 @@ var ( hyperEvmRPC *string hyperEvmContract *string + seiEvmRPC *string + seiEvmContract *string + sepoliaRPC *string sepoliaContract *string @@ -428,6 +431,9 @@ func init() { hyperEvmRPC = node.RegisterFlagWithValidationOrFail(NodeCmd, "hyperEvmRPC", "HyperEVM RPC URL", "ws://eth-devnet:8545", []string{"ws", "wss"}) hyperEvmContract = NodeCmd.Flags().String("hyperEvmContract", "", "HyperEVM contract address") + seiEvmRPC = node.RegisterFlagWithValidationOrFail(NodeCmd, "seiEvmRPC", "SeiEVM RPC URL", "ws://eth-devnet:8545", []string{"ws", "wss"}) + seiEvmContract = NodeCmd.Flags().String("seiEvmContract", "", "SeiEVM contract address") + arbitrumSepoliaRPC = node.RegisterFlagWithValidationOrFail(NodeCmd, "arbitrumSepoliaRPC", "Arbitrum on Sepolia RPC URL", "ws://eth-devnet:8545", []string{"ws", "wss"}) arbitrumSepoliaContract = NodeCmd.Flags().String("arbitrumSepoliaContract", "", "Arbitrum on Sepolia contract address") @@ -819,6 +825,7 @@ func runNode(cmd *cobra.Command, args []string) { *worldchainContract = checkEvmArgs(logger, *worldchainRPC, *worldchainContract, "worldchain", true) *inkContract = checkEvmArgs(logger, *inkRPC, *inkContract, "ink", false) *hyperEvmContract = checkEvmArgs(logger, *hyperEvmRPC, *hyperEvmContract, "hyperEvm", false) + *seiEvmContract = checkEvmArgs(logger, *seiEvmRPC, *seiEvmContract, "seiEvm", false) // These chains will only ever be testnet / devnet. *sepoliaContract = checkEvmArgs(logger, *sepoliaRPC, *sepoliaContract, "sepolia", false) @@ -963,6 +970,7 @@ func runNode(cmd *cobra.Command, args []string) { rpcMap["monadDevnetRPC"] = *monadDevnetRPC } rpcMap["scrollRPC"] = *scrollRPC + rpcMap["seiEvmRPC"] = *seiEvmRPC rpcMap["solanaRPC"] = *solanaRPC rpcMap["snaxchainRPC"] = *snaxchainRPC rpcMap["suiRPC"] = *suiRPC @@ -1449,6 +1457,18 @@ func runNode(cmd *cobra.Command, args []string) { watcherConfigs = append(watcherConfigs, wc) } + if shouldStart(seiEvmRPC) { + wc := &evm.WatcherConfig{ + NetworkID: "seievm", + ChainID: vaa.ChainIDSeiEVM, + Rpc: *seiEvmRPC, + Contract: *seiEvmContract, + CcqBackfillCache: *ccqBackfillCache, + } + + watcherConfigs = append(watcherConfigs, wc) + } + if shouldStart(terraWS) { wc := &cosmwasm.WatcherConfig{ NetworkID: "terra", diff --git a/node/pkg/query/query.go b/node/pkg/query/query.go index 94d13e741..811e23878 100644 --- a/node/pkg/query/query.go +++ b/node/pkg/query/query.go @@ -142,6 +142,7 @@ var perChainConfig = map[vaa.ChainID]PerChainConfig{ vaa.ChainIDPolygonSepolia: {NumWorkers: 1, TimestampCacheSupported: true}, vaa.ChainIDMonadDevnet: {NumWorkers: 1, TimestampCacheSupported: true}, vaa.ChainIDHyperEVM: {NumWorkers: 1, TimestampCacheSupported: true}, + vaa.ChainIDSeiEVM: {NumWorkers: 1, TimestampCacheSupported: true}, } // GetPerChainConfig returns the config for the specified chain. If the chain is not configured it returns an empty struct, diff --git a/node/pkg/watchers/evm/watcher.go b/node/pkg/watchers/evm/watcher.go index a0b5a7585..a8853430f 100644 --- a/node/pkg/watchers/evm/watcher.go +++ b/node/pkg/watchers/evm/watcher.go @@ -728,6 +728,7 @@ func (w *Watcher) getFinality(ctx context.Context) (bool, bool, error) { w.chainID == vaa.ChainIDMoonbeam || w.chainID == vaa.ChainIDOptimism || w.chainID == vaa.ChainIDOptimismSepolia || + w.chainID == vaa.ChainIDSeiEVM || w.chainID == vaa.ChainIDSepolia || w.chainID == vaa.ChainIDSnaxchain || w.chainID == vaa.ChainIDUnichain || diff --git a/sdk/testnet_consts.go b/sdk/testnet_consts.go index 2a9b68990..11cf6d493 100644 --- a/sdk/testnet_consts.go +++ b/sdk/testnet_consts.go @@ -39,6 +39,7 @@ var knownTestnetTokenbridgeEmitters = map[vaa.ChainID]string{ vaa.ChainIDXLayer: "000000000000000000000000dA91a06299BBF302091B053c6B9EF86Eff0f930D", vaa.ChainIDLinea: "000000000000000000000000C7A204bDBFe983FCD8d8E61D02b475D4073fF97e", vaa.ChainIDBerachain: "000000000000000000000000a10f2eF61dE1f19f586ab8B6F2EbA89bACE63F7a", + vaa.ChainIDSeiEVM: "00000000000000000000000023908A62110e21C04F3A4e011d24F901F911744A", vaa.ChainIDSnaxchain: "000000000000000000000000a10f2eF61dE1f19f586ab8B6F2EbA89bACE63F7a", vaa.ChainIDUnichain: "000000000000000000000000a10f2eF61dE1f19f586ab8B6F2EbA89bACE63F7a", vaa.ChainIDWorldchain: "000000000000000000000000430855B4D43b8AEB9D2B9869B74d58dda79C0dB2",