From 208e28df5081e3949b2452d8ea4f86f0bc18801d Mon Sep 17 00:00:00 2001 From: martin0995 Date: Wed, 11 Jun 2025 11:06:16 -0400 Subject: [PATCH 01/10] logic to fetch ntt supported chains --- scripts/src/fetchRelayerNTTChains.ts | 43 ++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 scripts/src/fetchRelayerNTTChains.ts diff --git a/scripts/src/fetchRelayerNTTChains.ts b/scripts/src/fetchRelayerNTTChains.ts new file mode 100644 index 00000000..f34c7b8a --- /dev/null +++ b/scripts/src/fetchRelayerNTTChains.ts @@ -0,0 +1,43 @@ +import axios from 'axios'; +import fs from 'fs'; + +const RELAYER_FILE_URL = + 'https://raw.githubusercontent.com/wormhole-foundation/wormhole-sdk-ts/main/core/base/src/constants/contracts/relayer.ts'; + +async function extractRelayerNTTChains() { + const res = await axios.get(RELAYER_FILE_URL); + const text = res.data; + + const relayerChains: Record = { + Mainnet: [], + Testnet: [], + Devnet: [], + }; + + const networkBlockRegex = /\[\s*"(\w+)"\s*,\s*\[((?:.|\n)*?)\]\s*\]/gm; + let match; + while ((match = networkBlockRegex.exec(text)) !== null) { + const network = match[1]; + const body = match[2]; + + const chainRegex = /\[\s*"([\w\d]+)"\s*,\s*"0x[a-fA-F0-9]{40}"\s*\]/g; + let chainMatch; + while ((chainMatch = chainRegex.exec(body)) !== null) { + relayerChains[network].push(chainMatch[1]); + } + } + + relayerChains.Mainnet.push('Solana'); + relayerChains.Testnet.push('Solana'); + + for (const net of Object.keys(relayerChains)) { + relayerChains[net] = [...new Set(relayerChains[net])]; + } + + fs.mkdirSync('./src/generated', { recursive: true }); + fs.writeFileSync('./src/generated/ntt-support.json', JSON.stringify(relayerChains, null, 2)); + + console.log('Wrote NTT relayer support to scripts/generated/ntt-support.json'); +} + +extractRelayerNTTChains(); From bb2164b1b7344eb4b927945a8adf74a750af9725 Mon Sep 17 00:00:00 2001 From: martin0995 Date: Wed, 11 Jun 2025 11:06:28 -0400 Subject: [PATCH 02/10] import new logic --- scripts/src/config.ts | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/scripts/src/config.ts b/scripts/src/config.ts index 8f938c33..c58b2297 100644 --- a/scripts/src/config.ts +++ b/scripts/src/config.ts @@ -10,6 +10,7 @@ import { Chain, } from '@wormhole-foundation/sdk'; import fs from 'fs'; +import nttSupport from './generated/ntt-support.json'; // Many chains have the same underlying runtime export type ChainType = @@ -155,13 +156,15 @@ function getChainDetails(chainName: string): ExtraDetails { const chainType = getChainType(platform); // Only allow EVM and Solana (not other SVMs like Pythnet) - const isSupportedForNTT = - chainType === 'EVM' || (chainType === 'SVM' && chainName === 'Solana'); - if (contracts.coreBridge && isSupportedForNTT) { - if (!products.ntt) products.ntt = { mainnet: false, testnet: false, devnet: false }; - products.ntt[net.toLowerCase() as keyof ProductSupport] = true; + const isNTTSupported = (nttSupport[net] || []).includes(chainName); + + // Ensure `products.ntt` is initialized even if unsupported + if (!products.ntt) { + products.ntt = { mainnet: false, testnet: false, devnet: false }; } + products.ntt[net.toLowerCase() as keyof ProductSupport] = isNTTSupported; + // Multigov const isMultigovEligible = chainType === 'EVM' || (chainType === 'SVM' && chainName === 'Solana'); @@ -174,6 +177,14 @@ function getChainDetails(chainName: string): ExtraDetails { } } + // Remove any product with no support in any environment + for (const productKey of Object.keys(products) as (keyof Products)[]) { + const product = products[productKey]; + if (!product?.mainnet && !product?.testnet && !product?.devnet) { + delete products[productKey]; + } + } + // Only write if something was added const updatedDetails = { ...existingDetails, From b970c3727d259deecb79627dc444b2c47dee3bf9 Mon Sep 17 00:00:00 2001 From: martin0995 Date: Wed, 11 Jun 2025 11:06:42 -0400 Subject: [PATCH 03/10] update script to fetch ntt supported chains --- scripts/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/package.json b/scripts/package.json index 96898605..3c7d65c8 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -5,7 +5,7 @@ "main": "index.js", "scripts": { "update": "npx npm-check-updates -u && npm install --silent", - "generate": "npx tsx src/index.ts", + "generate": "npx tsx src/fetchRelayerNTTChains.ts && npx tsx src/index.ts", "check:consts": "npx tsx src/check.ts", "check:links": "find ../docs -name \\*.md -print0 | xargs -0 -n1 npx markdown-link-check" }, From a5f36f24418ee7a55d75175c510d826976651c35 Mon Sep 17 00:00:00 2001 From: martin0995 Date: Wed, 11 Jun 2025 11:07:22 -0400 Subject: [PATCH 04/10] update ntt supported chains --- scripts/src/chains/HyperEVM.json | 5 ----- scripts/src/chains/Mezo.json | 5 ----- scripts/src/chains/Worldchain.json | 2 +- scripts/src/chains/blast.json | 2 +- scripts/src/chains/gnosis.json | 5 ----- scripts/src/chains/holesky.json | 5 ----- scripts/src/chains/kaia.json | 1 - scripts/src/chains/klaytn.json | 12 ++++++------ scripts/src/chains/linea.json | 5 ----- scripts/src/chains/mantle.json | 2 +- scripts/src/chains/neon.json | 5 ----- scripts/src/chains/scroll.json | 2 +- scripts/src/chains/snaxchain.json | 2 +- scripts/src/chains/xlayer.json | 2 +- 14 files changed, 12 insertions(+), 43 deletions(-) diff --git a/scripts/src/chains/HyperEVM.json b/scripts/src/chains/HyperEVM.json index 757c0fac..c13c4193 100644 --- a/scripts/src/chains/HyperEVM.json +++ b/scripts/src/chains/HyperEVM.json @@ -17,11 +17,6 @@ "testnet": true, "devnet": false }, - "ntt": { - "mainnet": true, - "testnet": true, - "devnet": false - }, "multigov": { "mainnet": true, "testnet": true, diff --git a/scripts/src/chains/Mezo.json b/scripts/src/chains/Mezo.json index 86790e97..4f1a3713 100644 --- a/scripts/src/chains/Mezo.json +++ b/scripts/src/chains/Mezo.json @@ -23,11 +23,6 @@ "testnet": true, "devnet": false }, - "ntt": { - "mainnet": false, - "testnet": true, - "devnet": false - }, "multigov": { "mainnet": true, "testnet": true, diff --git a/scripts/src/chains/Worldchain.json b/scripts/src/chains/Worldchain.json index a4759a08..ff1f0b6b 100644 --- a/scripts/src/chains/Worldchain.json +++ b/scripts/src/chains/Worldchain.json @@ -28,7 +28,7 @@ }, "ntt": { "mainnet": true, - "testnet": true, + "testnet": false, "devnet": false }, "tokenBridge": { diff --git a/scripts/src/chains/blast.json b/scripts/src/chains/blast.json index 4538be56..be88411c 100644 --- a/scripts/src/chains/blast.json +++ b/scripts/src/chains/blast.json @@ -33,7 +33,7 @@ }, "ntt": { "mainnet": true, - "testnet": true, + "testnet": false, "devnet": false }, "tokenBridge": { diff --git a/scripts/src/chains/gnosis.json b/scripts/src/chains/gnosis.json index b2e5b860..0ce2ced5 100644 --- a/scripts/src/chains/gnosis.json +++ b/scripts/src/chains/gnosis.json @@ -23,11 +23,6 @@ } ], "products": { - "ntt": { - "mainnet": true, - "testnet": true, - "devnet": false - }, "multigov": { "mainnet": true, "testnet": true, diff --git a/scripts/src/chains/holesky.json b/scripts/src/chains/holesky.json index 5284ae13..5790dff7 100644 --- a/scripts/src/chains/holesky.json +++ b/scripts/src/chains/holesky.json @@ -26,11 +26,6 @@ "testnet": true, "devnet": false }, - "ntt": { - "mainnet": false, - "testnet": true, - "devnet": false - }, "multigov": { "mainnet": true, "testnet": true, diff --git a/scripts/src/chains/kaia.json b/scripts/src/chains/kaia.json index 845d2a3b..6a692829 100644 --- a/scripts/src/chains/kaia.json +++ b/scripts/src/chains/kaia.json @@ -16,7 +16,6 @@ }, "products": { "connect": { "mainnet": true, "testnet": true, "devnet": false }, - "ntt": { "mainnet": true, "testnet": true, "devnet": false }, "tokenBridge": { "mainnet": true, "testnet": true, "devnet": false } } } diff --git a/scripts/src/chains/klaytn.json b/scripts/src/chains/klaytn.json index 2f4226f0..c5216dd7 100644 --- a/scripts/src/chains/klaytn.json +++ b/scripts/src/chains/klaytn.json @@ -1,5 +1,5 @@ { - "title": "Kaia", + "title": "Klaytn", "homepage": "https://kaia.io/", "contractSource": "ethereum/contracts/bridge/Bridge.sol", "mainnet": { @@ -36,15 +36,15 @@ "testnet": true, "devnet": false }, - "ntt": { - "mainnet": true, - "testnet": true, - "devnet": false - }, "multigov": { "mainnet": true, "testnet": true, "devnet": true + }, + "ntt": { + "mainnet": true, + "testnet": false, + "devnet": false } } } \ No newline at end of file diff --git a/scripts/src/chains/linea.json b/scripts/src/chains/linea.json index ccf440eb..963859a1 100644 --- a/scripts/src/chains/linea.json +++ b/scripts/src/chains/linea.json @@ -30,11 +30,6 @@ "testnet": true, "devnet": false }, - "ntt": { - "mainnet": false, - "testnet": true, - "devnet": false - }, "multigov": { "mainnet": true, "testnet": true, diff --git a/scripts/src/chains/mantle.json b/scripts/src/chains/mantle.json index 8ed15ea6..dfbbd7c6 100644 --- a/scripts/src/chains/mantle.json +++ b/scripts/src/chains/mantle.json @@ -34,7 +34,7 @@ }, "ntt": { "mainnet": true, - "testnet": true, + "testnet": false, "devnet": false }, "tokenBridge": { diff --git a/scripts/src/chains/neon.json b/scripts/src/chains/neon.json index 86e30e22..507a4ee9 100644 --- a/scripts/src/chains/neon.json +++ b/scripts/src/chains/neon.json @@ -28,11 +28,6 @@ "testnet": true, "devnet": false }, - "ntt": { - "mainnet": false, - "testnet": true, - "devnet": false - }, "multigov": { "mainnet": true, "testnet": true, diff --git a/scripts/src/chains/scroll.json b/scripts/src/chains/scroll.json index 4fe3e31e..1d64b6d5 100644 --- a/scripts/src/chains/scroll.json +++ b/scripts/src/chains/scroll.json @@ -37,7 +37,7 @@ }, "ntt": { "mainnet": true, - "testnet": true, + "testnet": false, "devnet": false }, "tokenBridge": { diff --git a/scripts/src/chains/snaxchain.json b/scripts/src/chains/snaxchain.json index 9498f069..a4c36d8f 100644 --- a/scripts/src/chains/snaxchain.json +++ b/scripts/src/chains/snaxchain.json @@ -19,7 +19,7 @@ "products": { "ntt": { "mainnet": true, - "testnet": true, + "testnet": false, "devnet": false }, "tokenBridge": { diff --git a/scripts/src/chains/xlayer.json b/scripts/src/chains/xlayer.json index 3cc02fc3..6d0b2708 100644 --- a/scripts/src/chains/xlayer.json +++ b/scripts/src/chains/xlayer.json @@ -34,7 +34,7 @@ }, "ntt": { "mainnet": true, - "testnet": true, + "testnet": false, "devnet": false }, "tokenBridge": { From 376426db5c63636ad5cd39ea82bd995ab67fb8d5 Mon Sep 17 00:00:00 2001 From: martin0995 Date: Wed, 11 Jun 2025 11:07:32 -0400 Subject: [PATCH 05/10] ntt supported chains file --- scripts/src/generated/ntt-support.json | 53 ++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 scripts/src/generated/ntt-support.json diff --git a/scripts/src/generated/ntt-support.json b/scripts/src/generated/ntt-support.json new file mode 100644 index 00000000..5fb220c5 --- /dev/null +++ b/scripts/src/generated/ntt-support.json @@ -0,0 +1,53 @@ +{ + "Mainnet": [ + "Ethereum", + "Bsc", + "Polygon", + "Avalanche", + "Fantom", + "Klaytn", + "Celo", + "Moonbeam", + "Base", + "Arbitrum", + "Optimism", + "Blast", + "Scroll", + "Mantle", + "Xlayer", + "Berachain", + "Seievm", + "Ink", + "Worldchain", + "Snaxchain", + "Unichain", + "Solana" + ], + "Testnet": [ + "Ethereum", + "Bsc", + "Polygon", + "Avalanche", + "Fantom", + "Celo", + "Seievm", + "Moonbeam", + "Arbitrum", + "Optimism", + "Base", + "Sepolia", + "ArbitrumSepolia", + "BaseSepolia", + "OptimismSepolia", + "Berachain", + "Unichain", + "Ink", + "Monad", + "PolygonSepolia", + "Solana" + ], + "Devnet": [ + "Ethereum", + "Bsc" + ] +} \ No newline at end of file From 2d04af6d6fa5217e7f26ab3d89476879e8a246cb Mon Sep 17 00:00:00 2001 From: martin0995 Date: Wed, 11 Jun 2025 11:14:37 -0400 Subject: [PATCH 06/10] updae script for ntt --- scripts/src/config.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/src/config.ts b/scripts/src/config.ts index c58b2297..2fa434aa 100644 --- a/scripts/src/config.ts +++ b/scripts/src/config.ts @@ -152,11 +152,8 @@ function getChainDetails(chainName: string): ExtraDetails { } // NTT - const platform = chainToPlatform(chainName as Chain); - const chainType = getChainType(platform); - // Only allow EVM and Solana (not other SVMs like Pythnet) - const isNTTSupported = (nttSupport[net] || []).includes(chainName); + const isNTTSupported = (nttSupport[net] || []).includes(chainName) || (chainName === 'Solana' && net === 'Devnet'); // Ensure `products.ntt` is initialized even if unsupported if (!products.ntt) { @@ -166,6 +163,9 @@ function getChainDetails(chainName: string): ExtraDetails { products.ntt[net.toLowerCase() as keyof ProductSupport] = isNTTSupported; // Multigov + const platform = chainToPlatform(chainName as Chain); + const chainType = getChainType(platform); + const isMultigovEligible = chainType === 'EVM' || (chainType === 'SVM' && chainName === 'Solana'); From 3d947c338d275f841313e37a1d222a00386fa3b3 Mon Sep 17 00:00:00 2001 From: martin0995 Date: Mon, 16 Jun 2025 11:04:28 +0200 Subject: [PATCH 07/10] update script to map klaytn to kaia --- scripts/src/config.ts | 7 ++++++- scripts/src/fetchRelayerNTTChains.ts | 14 +++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/scripts/src/config.ts b/scripts/src/config.ts index 2fa434aa..6c0e01c6 100644 --- a/scripts/src/config.ts +++ b/scripts/src/config.ts @@ -111,6 +111,10 @@ const chainTypeMapping: Record = { Btc: 'BTC', }; +const chainNameOverrides: Record = { + Klaytn: 'Kaia', +}; + function getChainType(platformName: Platform): ChainType { return chainTypeMapping[platformName] ?? ''; } @@ -153,7 +157,8 @@ function getChainDetails(chainName: string): ExtraDetails { // NTT // Only allow EVM and Solana (not other SVMs like Pythnet) - const isNTTSupported = (nttSupport[net] || []).includes(chainName) || (chainName === 'Solana' && net === 'Devnet'); + const effectiveChainName = chainNameOverrides[chainName] || chainName; + const isNTTSupported = (nttSupport[net] || []).includes(effectiveChainName) || (chainName === 'Solana' && net === 'Devnet'); // Ensure `products.ntt` is initialized even if unsupported if (!products.ntt) { diff --git a/scripts/src/fetchRelayerNTTChains.ts b/scripts/src/fetchRelayerNTTChains.ts index f34c7b8a..6449f745 100644 --- a/scripts/src/fetchRelayerNTTChains.ts +++ b/scripts/src/fetchRelayerNTTChains.ts @@ -1,6 +1,15 @@ +// This script fetches the relayer NTT chains from the Wormhole SDK repository +// and generates a JSON file with the supported chains for each network. + import axios from 'axios'; import fs from 'fs'; +// The below mapping is used to override the chain names in the output. +const chainNameOverrides: Record = { + Klaytn: "Kaia", +}; + +// The URL to the relayer file in the Wormhole SDK repository. const RELAYER_FILE_URL = 'https://raw.githubusercontent.com/wormhole-foundation/wormhole-sdk-ts/main/core/base/src/constants/contracts/relayer.ts'; @@ -23,7 +32,10 @@ async function extractRelayerNTTChains() { const chainRegex = /\[\s*"([\w\d]+)"\s*,\s*"0x[a-fA-F0-9]{40}"\s*\]/g; let chainMatch; while ((chainMatch = chainRegex.exec(body)) !== null) { - relayerChains[network].push(chainMatch[1]); + const originalName = chainMatch[1]; + const normalizedName = chainNameOverrides[originalName] || originalName; + + relayerChains[network].push(normalizedName); } } From c0f34cf1a8450c6e41750559d519ffb0f37a159a Mon Sep 17 00:00:00 2001 From: martin0995 Date: Mon, 16 Jun 2025 11:04:40 +0200 Subject: [PATCH 08/10] update chain name --- scripts/src/chains/klaytn.json | 2 +- scripts/src/generated/ntt-support.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/src/chains/klaytn.json b/scripts/src/chains/klaytn.json index c5216dd7..5bae4802 100644 --- a/scripts/src/chains/klaytn.json +++ b/scripts/src/chains/klaytn.json @@ -1,5 +1,5 @@ { - "title": "Klaytn", + "title": "Kaia", "homepage": "https://kaia.io/", "contractSource": "ethereum/contracts/bridge/Bridge.sol", "mainnet": { diff --git a/scripts/src/generated/ntt-support.json b/scripts/src/generated/ntt-support.json index 5fb220c5..12237904 100644 --- a/scripts/src/generated/ntt-support.json +++ b/scripts/src/generated/ntt-support.json @@ -5,7 +5,7 @@ "Polygon", "Avalanche", "Fantom", - "Klaytn", + "Kaia", "Celo", "Moonbeam", "Base", From 89c7afa075d63cb6a4d0d4f331b1eb7bd108a273 Mon Sep 17 00:00:00 2001 From: martin0995 Date: Tue, 17 Jun 2025 15:11:36 +0200 Subject: [PATCH 09/10] prettier check --- scripts/src/fetchRelayerNTTChains.ts | 79 ++++++++++++++-------------- 1 file changed, 39 insertions(+), 40 deletions(-) diff --git a/scripts/src/fetchRelayerNTTChains.ts b/scripts/src/fetchRelayerNTTChains.ts index 6449f745..3732ec36 100644 --- a/scripts/src/fetchRelayerNTTChains.ts +++ b/scripts/src/fetchRelayerNTTChains.ts @@ -10,46 +10,45 @@ const chainNameOverrides: Record = { }; // The URL to the relayer file in the Wormhole SDK repository. -const RELAYER_FILE_URL = - 'https://raw.githubusercontent.com/wormhole-foundation/wormhole-sdk-ts/main/core/base/src/constants/contracts/relayer.ts'; - -async function extractRelayerNTTChains() { - const res = await axios.get(RELAYER_FILE_URL); - const text = res.data; - - const relayerChains: Record = { - Mainnet: [], - Testnet: [], - Devnet: [], - }; - - const networkBlockRegex = /\[\s*"(\w+)"\s*,\s*\[((?:.|\n)*?)\]\s*\]/gm; - let match; - while ((match = networkBlockRegex.exec(text)) !== null) { - const network = match[1]; - const body = match[2]; - - const chainRegex = /\[\s*"([\w\d]+)"\s*,\s*"0x[a-fA-F0-9]{40}"\s*\]/g; - let chainMatch; - while ((chainMatch = chainRegex.exec(body)) !== null) { - const originalName = chainMatch[1]; - const normalizedName = chainNameOverrides[originalName] || originalName; - - relayerChains[network].push(normalizedName); - } - } - - relayerChains.Mainnet.push('Solana'); - relayerChains.Testnet.push('Solana'); - - for (const net of Object.keys(relayerChains)) { - relayerChains[net] = [...new Set(relayerChains[net])]; - } - - fs.mkdirSync('./src/generated', { recursive: true }); - fs.writeFileSync('./src/generated/ntt-support.json', JSON.stringify(relayerChains, null, 2)); - - console.log('Wrote NTT relayer support to scripts/generated/ntt-support.json'); +const RELAYER_FILE_URL = 'https://raw.githubusercontent.com/wormhole-foundation/wormhole-sdk-ts/main/core/base/src/constants/contracts/relayer.ts'; + + async function extractRelayerNTTChains() { + const res = await axios.get(RELAYER_FILE_URL); + const text = res.data; + + const relayerChains: Record = { + Mainnet: [], + Testnet: [], + Devnet: [], + }; + + const networkBlockRegex = /\[\s*"(\w+)"\s*,\s*\[((?:.|\n)*?)\]\s*\]/gm; + let match; + while ((match = networkBlockRegex.exec(text)) !== null) { + const network = match[1]; + const body = match[2]; + + const chainRegex = /\[\s*"([\w\d]+)"\s*,\s*"0x[a-fA-F0-9]{40}"\s*\]/g; + let chainMatch; + while ((chainMatch = chainRegex.exec(body)) !== null) { + const originalName = chainMatch[1]; + const normalizedName = chainNameOverrides[originalName] || originalName; + + relayerChains[network].push(normalizedName); + } + } + + relayerChains.Mainnet.push('Solana'); + relayerChains.Testnet.push('Solana'); + + for (const net of Object.keys(relayerChains)) { + relayerChains[net] = [...new Set(relayerChains[net])]; + } + + fs.mkdirSync('./src/generated', { recursive: true }); + fs.writeFileSync('./src/generated/ntt-support.json', JSON.stringify(relayerChains, null, 2)); + + console.log('Wrote NTT relayer support to scripts/generated/ntt-support.json'); } extractRelayerNTTChains(); From b8de62605251ef124c774e98673fd053178b420c Mon Sep 17 00:00:00 2001 From: martin0995 Date: Tue, 17 Jun 2025 15:12:23 +0200 Subject: [PATCH 10/10] prettier --- scripts/src/fetchRelayerNTTChains.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/src/fetchRelayerNTTChains.ts b/scripts/src/fetchRelayerNTTChains.ts index 3732ec36..96018e11 100644 --- a/scripts/src/fetchRelayerNTTChains.ts +++ b/scripts/src/fetchRelayerNTTChains.ts @@ -12,7 +12,7 @@ const chainNameOverrides: Record = { // The URL to the relayer file in the Wormhole SDK repository. const RELAYER_FILE_URL = 'https://raw.githubusercontent.com/wormhole-foundation/wormhole-sdk-ts/main/core/base/src/constants/contracts/relayer.ts'; - async function extractRelayerNTTChains() { +async function extractRelayerNTTChains() { const res = await axios.get(RELAYER_FILE_URL); const text = res.data;