diff --git a/cspell-custom-words.txt b/cspell-custom-words.txt index 4b0a42794f..1cb8060b6f 100644 --- a/cspell-custom-words.txt +++ b/cspell-custom-words.txt @@ -155,6 +155,8 @@ seievm Sepolia serde setcap +snaxchain +SnaxChain solana Solana Solana's diff --git a/deployments/testnet/tokenBridgeVAAs.csv b/deployments/testnet/tokenBridgeVAAs.csv index 33704ba634..8dccba582f 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 +Snaxchain (43) Testnet Token Bridge,010000000001008ed60dec76f13f6da695fc5f134c8cf3527f264712e7bb98d2e54a5f457759e0491e3f1cb42eed9b84edc60a96836df98a3752c8a4e10977801e6c35a39f211b000000000100000001000100000000000000000000000000000000000000000000000000000000000000040000000005ba971e00000000000000000000000000000000000000000000546f6b656e427269646765010000002b000000000000000000000000a10f2ef61de1f19f586ab8b6f2eba89bace63f7a Gateway (3104) Testnet Token Bridge,01000000000100117d1c7a124a9e2e29d82b3803b825be7c8a1dc7f19013669f7d11d42d448aa72339fe3657e4bd156c5c28dd10e78aab3e06e9e76c4bbd38c81e057533d577c40000000000d09296c5000100000000000000000000000000000000000000000000000000000000000000049ea4b9942b23298c20000000000000000000000000000000000000000000546f6b656e4272696467650100000c20ef5251ea1e99ae48732800ccc7b83b57881232a73eb796b63b1d86ed2ea44e27 Sepolia (10002) (Ethereum) Testnet Token Bridge,01000000000100a03841125d40e9df3cd80d027bc660191755587980e49f6a46e9baa1b5c3f6b46e51256c225bd242139ae11d3c84439acdc204a5f39a2e1acb750ae98bb759f1000000000100000001000100000000000000000000000000000000000000000000000000000000000000040000000005491ea100000000000000000000000000000000000000000000546f6b656e4272696467650100002712000000000000000000000000db5492265f6038831e89f495670ff909ade94bd9 Arbitrum Sepolia (10003) Testnet Token Bridge,010000000001001b0fbbcc7a3e8c491dc25f0a611075513032fe444d8e6585153e6ae2cf8c7514152b050e95a3e0af11e5b2705b2efb717bec3cfaa3b1617ff623c14e61a69224000000000100000001000100000000000000000000000000000000000000000000000000000000000000040000000001b8de3c00000000000000000000000000000000000000000000546f6b656e4272696467650100002713000000000000000000000000c7a204bdbfe983fcd8d8e61d02b475d4073ff97e diff --git a/ethereum/env/.env.snaxchain.testnet b/ethereum/env/.env.snaxchain.testnet new file mode 100644 index 0000000000..24b89e07cc --- /dev/null +++ b/ethereum/env/.env.snaxchain.testnet @@ -0,0 +1,21 @@ +# SnaxChain testnet env +# Rename to .env + +# Common config for forge deployment +RPC_URL="https://rpc-snaxchain-s50q0kjngn.t.conduit.xyz/" +FORGE_ARGS="--legacy" + +# Wormhole Core Migrations +INIT_SIGNERS=["0x13947Bd48b18E53fdAeEe77F3473391aC727C638"] +INIT_CHAIN_ID=43 +INIT_GOV_CHAIN_ID=0x1 +INIT_GOV_CONTRACT=0x0000000000000000000000000000000000000000000000000000000000000004 +INIT_EVM_CHAIN_ID=2192 + +# Bridge Migrations +BRIDGE_INIT_CHAIN_ID=43 +BRIDGE_INIT_GOV_CHAIN_ID=0x1 +BRIDGE_INIT_GOV_CONTRACT=0x0000000000000000000000000000000000000000000000000000000000000004 +BRIDGE_INIT_FINALITY=1 +# TODO: This exists. Is this what we should use? +BRIDGE_INIT_WETH=0x4200000000000000000000000000000000000006 \ No newline at end of file diff --git a/node/cmd/guardiand/adminnodes.go b/node/cmd/guardiand/adminnodes.go index eb32def6e1..945aae61e8 100644 --- a/node/cmd/guardiand/adminnodes.go +++ b/node/cmd/guardiand/adminnodes.go @@ -119,6 +119,7 @@ func runListNodes(cmd *cobra.Command, args []string) { {"XLayer", vaa.ChainIDXLayer}, {"Linea", vaa.ChainIDLinea}, {"Berachain", vaa.ChainIDBerachain}, + {"Snaxchain", vaa.ChainIDSnaxchain}, {"Wormchain", vaa.ChainIDWormchain}, {"Sepolia", vaa.ChainIDSepolia}, {"Holesky", vaa.ChainIDHolesky}, diff --git a/node/cmd/guardiand/node.go b/node/cmd/guardiand/node.go index 96b4694fcc..460757e45c 100644 --- a/node/cmd/guardiand/node.go +++ b/node/cmd/guardiand/node.go @@ -186,6 +186,9 @@ var ( berachainRPC *string berachainContract *string + snaxchainRPC *string + snaxchainContract *string + sepoliaRPC *string sepoliaContract *string @@ -389,6 +392,9 @@ func init() { berachainRPC = node.RegisterFlagWithValidationOrFail(NodeCmd, "berachainRPC", "Berachain RPC URL", "ws://eth-devnet:8545", []string{"ws", "wss"}) berachainContract = NodeCmd.Flags().String("berachainContract", "", "Berachain contract address") + snaxchainRPC = node.RegisterFlagWithValidationOrFail(NodeCmd, "snaxchainRPC", "Snaxchain RPC URL", "ws://eth-devnet:8545", []string{"ws", "wss"}) + snaxchainContract = NodeCmd.Flags().String("snaxchainContract", "", "Snaxchain contract address") + baseRPC = node.RegisterFlagWithValidationOrFail(NodeCmd, "baseRPC", "Base RPC URL", "ws://eth-devnet:8545", []string{"ws", "wss"}) baseContract = NodeCmd.Flags().String("baseContract", "", "Base contract address") @@ -646,6 +652,7 @@ func runNode(cmd *cobra.Command, args []string) { *blastContract = checkEvmArgs(logger, *blastRPC, *blastContract, "blast", true) *xlayerContract = checkEvmArgs(logger, *xlayerRPC, *xlayerContract, "xlayer", true) *berachainContract = checkEvmArgs(logger, *berachainRPC, *berachainContract, "berachain", false) + *snaxchainContract = checkEvmArgs(logger, *snaxchainRPC, *snaxchainContract, "snaxchain", false) // These chains will only ever be testnet / devnet. *sepoliaContract = checkEvmArgs(logger, *sepoliaRPC, *sepoliaContract, "sepolia", false) @@ -850,6 +857,7 @@ func runNode(cmd *cobra.Command, args []string) { } rpcMap["scrollRPC"] = *scrollRPC rpcMap["solanaRPC"] = *solanaRPC + rpcMap["snaxchainRPC"] = *snaxchainRPC rpcMap["suiRPC"] = *suiRPC rpcMap["terraWS"] = *terraWS rpcMap["terraLCD"] = *terraLCD @@ -1317,6 +1325,18 @@ func runNode(cmd *cobra.Command, args []string) { watcherConfigs = append(watcherConfigs, wc) } + if shouldStart(snaxchainRPC) { + wc := &evm.WatcherConfig{ + NetworkID: "snaxchain", + ChainID: vaa.ChainIDSnaxchain, + Rpc: *snaxchainRPC, + Contract: *snaxchainContract, + 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 361070d83a..64a1cea753 100644 --- a/node/pkg/query/query.go +++ b/node/pkg/query/query.go @@ -130,6 +130,7 @@ var perChainConfig = map[vaa.ChainID]PerChainConfig{ vaa.ChainIDXLayer: {NumWorkers: 1, TimestampCacheSupported: true}, vaa.ChainIDLinea: {NumWorkers: 1, TimestampCacheSupported: true}, vaa.ChainIDBerachain: {NumWorkers: 1, TimestampCacheSupported: true}, + vaa.ChainIDSnaxchain: {NumWorkers: 1, TimestampCacheSupported: true}, vaa.ChainIDSepolia: {NumWorkers: 1, TimestampCacheSupported: true}, vaa.ChainIDHolesky: {NumWorkers: 1, TimestampCacheSupported: true}, vaa.ChainIDArbitrumSepolia: {NumWorkers: 1, TimestampCacheSupported: true}, diff --git a/node/pkg/watchers/evm/watcher.go b/node/pkg/watchers/evm/watcher.go index dfaa0bbb97..1d5637613f 100644 --- a/node/pkg/watchers/evm/watcher.go +++ b/node/pkg/watchers/evm/watcher.go @@ -739,6 +739,7 @@ func (w *Watcher) getFinality(ctx context.Context) (bool, bool, error) { w.chainID == vaa.ChainIDOptimism || w.chainID == vaa.ChainIDOptimismSepolia || w.chainID == vaa.ChainIDSepolia || + w.chainID == vaa.ChainIDSnaxchain || w.chainID == vaa.ChainIDXLayer { finalized = true safe = true diff --git a/sdk/js/CHANGELOG.md b/sdk/js/CHANGELOG.md index bea24c9dc0..f24b3849f1 100644 --- a/sdk/js/CHANGELOG.md +++ b/sdk/js/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 0.10.18 + +Add Snaxchain testnet support + ## 0.10.17 Add Mantle mainnet support diff --git a/sdk/js/package.json b/sdk/js/package.json index fc62bc3b04..732cdf72dc 100644 --- a/sdk/js/package.json +++ b/sdk/js/package.json @@ -1,6 +1,6 @@ { "name": "@certusone/wormhole-sdk", - "version": "0.10.17", + "version": "0.10.18", "description": "SDK for interacting with Wormhole", "homepage": "https://wormhole.com", "main": "./lib/cjs/index.js", diff --git a/sdk/js/src/utils/consts.ts b/sdk/js/src/utils/consts.ts index 8642faa6b3..1c268259ca 100644 --- a/sdk/js/src/utils/consts.ts +++ b/sdk/js/src/utils/consts.ts @@ -38,6 +38,7 @@ export const CHAINS = { linea: 38, berachain: 39, seievm: 40, + snaxchain: 43, wormchain: 3104, cosmoshub: 4000, evmos: 4001, @@ -89,6 +90,7 @@ export const EVMChainNames = [ "linea", "berachain", "seievm", + "snaxchain", "sepolia", "arbitrum_sepolia", "base_sepolia", @@ -343,6 +345,11 @@ const MAINNET = { token_bridge: undefined, nft_bridge: undefined, }, + snaxchain: { + core: undefined, + token_bridge: undefined, + nft_bridge: undefined, + }, wormchain: { core: "wormhole1ufs3tlq4umljk0qfe8k5ya0x6hpavn897u2cnf9k0en9jr7qarqqaqfk2j", token_bridge: @@ -634,6 +641,11 @@ const TESTNET = { token_bridge: undefined, nft_bridge: undefined, }, + snaxchain: { + core: "0xBB73cB66C26740F31d1FabDC6b7A46a038A300dd", + token_bridge: "0xa10f2eF61dE1f19f586ab8B6F2EbA89bACE63F7a", + nft_bridge: undefined, + }, wormchain: { core: "wormhole16jzpxp0e8550c9aht6q9svcux30vtyyyyxv5w2l2djjra46580wsazcjwp", token_bridge: @@ -918,6 +930,11 @@ const DEVNET = { token_bridge: undefined, nft_bridge: undefined, }, + snaxchain: { + core: undefined, + token_bridge: undefined, + nft_bridge: undefined, + }, wormchain: { core: "wormhole1ghd753shjuwexxywmgs4xz7x2q732vcnkm6h2pyv9s6ah3hylvrqtm7t3h", token_bridge: @@ -1078,6 +1095,7 @@ export const CHAIN_ID_XLAYER = CHAINS["xlayer"]; export const CHAIN_ID_LINEA = CHAINS["linea"]; export const CHAIN_ID_BERACHAIN = CHAINS["berachain"]; export const CHAIN_ID_SEIEVM = CHAINS["seievm"]; +export const CHAIN_ID_SNAXCHAIN = CHAINS["snaxchain"]; export const CHAIN_ID_WORMCHAIN = CHAINS["wormchain"]; export const CHAIN_ID_GATEWAY = CHAIN_ID_WORMCHAIN; export const CHAIN_ID_COSMOSHUB = CHAINS["cosmoshub"]; diff --git a/sdk/testnet_consts.go b/sdk/testnet_consts.go index df8d8b9308..a188cd5321 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.ChainIDSnaxchain: "000000000000000000000000a10f2eF61dE1f19f586ab8B6F2EbA89bACE63F7a", vaa.ChainIDSepolia: "000000000000000000000000DB5492265f6038831E89f495670FF909aDe94bd9", vaa.ChainIDHolesky: "00000000000000000000000076d093BbaE4529a342080546cAFEec4AcbA59EC6", vaa.ChainIDArbitrumSepolia: "000000000000000000000000C7A204bDBFe983FCD8d8E61D02b475D4073fF97e", diff --git a/sdk/vaa/structs.go b/sdk/vaa/structs.go index a1d797a337..8c9ae5c633 100644 --- a/sdk/vaa/structs.go +++ b/sdk/vaa/structs.go @@ -209,6 +209,8 @@ func (c ChainID) String() string { return "berachain" case ChainIDSeiEVM: return "seievm" + case ChainIDSnaxchain: + return "snaxchain" case ChainIDCosmoshub: return "cosmoshub" case ChainIDEvmos: @@ -322,6 +324,8 @@ func ChainIDFromString(s string) (ChainID, error) { return ChainIDLinea, nil case "berachain": return ChainIDBerachain, nil + case "snaxchain": + return ChainIDSnaxchain, nil case "cosmoshub": return ChainIDCosmoshub, nil case "seievm": @@ -397,6 +401,7 @@ func GetAllNetworkIDs() []ChainID { ChainIDXLayer, ChainIDLinea, ChainIDBerachain, + ChainIDSnaxchain, ChainIDWormchain, ChainIDCosmoshub, ChainIDEvmos, @@ -493,6 +498,8 @@ const ( ChainIDBerachain ChainID = 39 // ChainIDSeiEVM is the ChainID of SeiEVM ChainIDSeiEVM ChainID = 40 + // ChainIDSnaxchain is the ChainID of Snaxchain + ChainIDSnaxchain ChainID = 43 //ChainIDWormchain is the ChainID of Wormchain ChainIDWormchain ChainID = 3104 // ChainIDCosmoshub is the ChainID of Cosmoshub diff --git a/sdk/vaa/structs_test.go b/sdk/vaa/structs_test.go index bd8106ad6e..09fc9fe186 100644 --- a/sdk/vaa/structs_test.go +++ b/sdk/vaa/structs_test.go @@ -65,6 +65,7 @@ func TestChainIDFromString(t *testing.T) { {input: "xlayer", output: ChainIDXLayer}, {input: "linea", output: ChainIDLinea}, {input: "berachain", output: ChainIDBerachain}, + {input: "snaxchain", output: ChainIDSnaxchain}, {input: "seievm", output: ChainIDSeiEVM}, {input: "wormchain", output: ChainIDWormchain}, {input: "cosmoshub", output: ChainIDCosmoshub}, @@ -119,6 +120,7 @@ func TestChainIDFromString(t *testing.T) { {input: "XLayer", output: ChainIDXLayer}, {input: "Linea", output: ChainIDLinea}, {input: "Berachain", output: ChainIDBerachain}, + {input: "Snaxchain", output: ChainIDSnaxchain}, {input: "SeiEVM", output: ChainIDSeiEVM}, {input: "Wormchain", output: ChainIDWormchain}, {input: "Cosmoshub", output: ChainIDCosmoshub}, @@ -314,6 +316,7 @@ func TestChainId_String(t *testing.T) { {input: 38, output: "linea"}, {input: 39, output: "berachain"}, {input: 40, output: "seievm"}, + {input: 43, output: "snaxchain"}, {input: 3104, output: "wormchain"}, {input: 4000, output: "cosmoshub"}, {input: 4001, output: "evmos"},