From da3a032b6b5922fcf3555bff6ed881066e24a89f Mon Sep 17 00:00:00 2001 From: Aleksandr Pasevin Date: Wed, 28 Jan 2026 17:52:12 +0300 Subject: [PATCH] feat(adapter-polkadot): re-enable Kusama Hub network Re-enable the Kusama Hub (Asset Hub) network support in the Polkadot adapter. This includes: - Kusama Hub viem chain definition (chain ID: 420420418) - kusamaHubMainnet network configuration - All related exports and tests Closes #315 --- .../src/__tests__/adapter.test.ts | 2 +- .../src/__tests__/networks.test.ts | 86 ++++++++++--------- packages/adapter-polkadot/src/index.ts | 6 +- .../adapter-polkadot/src/networks/chains.ts | 45 +++++----- .../adapter-polkadot/src/networks/index.ts | 6 +- .../adapter-polkadot/src/networks/mainnet.ts | 59 ++++++------- .../adapter-polkadot/src/wallet/chains.ts | 7 +- 7 files changed, 98 insertions(+), 113 deletions(-) diff --git a/packages/adapter-polkadot/src/__tests__/adapter.test.ts b/packages/adapter-polkadot/src/__tests__/adapter.test.ts index 4372ee18..8ef05d6a 100644 --- a/packages/adapter-polkadot/src/__tests__/adapter.test.ts +++ b/packages/adapter-polkadot/src/__tests__/adapter.test.ts @@ -260,7 +260,7 @@ describe('Module Exports', () => { // Verify Hub chains are present const chainIds = polkadotChains.map((c) => c.id); expect(chainIds).toContain(420420419); // polkadotHub - // expect(chainIds).toContain(420420418); // kusamaHub - Temporarily disabled, RPC DNS not resolving + expect(chainIds).toContain(420420418); // kusamaHub expect(chainIds).toContain(420420417); // polkadotHubTestNet // Verify Parachain chains are present diff --git a/packages/adapter-polkadot/src/__tests__/networks.test.ts b/packages/adapter-polkadot/src/__tests__/networks.test.ts index a18c7496..df26fe0f 100644 --- a/packages/adapter-polkadot/src/__tests__/networks.test.ts +++ b/packages/adapter-polkadot/src/__tests__/networks.test.ts @@ -2,7 +2,8 @@ import { moonbaseAlpha, moonbeam, moonriver } from 'viem/chains'; import { describe, expect, it } from 'vitest'; import { - // NOTE: kusamaHub and kusamaHubMainnet temporarily disabled - RPC DNS not resolving + kusamaHub, + kusamaHubMainnet, moonbaseAlphaTestnet, moonbeamMainnet, moonriverMainnet, @@ -42,27 +43,30 @@ describe('Polkadot Hub Network Configurations', () => { }); }); - // NOTE: kusamaHubMainnet tests temporarily disabled - RPC DNS not resolving - // Re-enable once the Kusama Hub EVM RPC service is publicly available. - // describe('kusamaHubMainnet', () => { - // it('should have correct chain configuration', () => { - // expect(kusamaHubMainnet.id).toBe('kusama-hub'); - // expect(kusamaHubMainnet.chainId).toBe(420420418); - // expect(kusamaHubMainnet.ecosystem).toBe('polkadot'); - // expect(kusamaHubMainnet.executionType).toBe('evm'); - // expect(kusamaHubMainnet.networkCategory).toBe('hub'); - // expect(kusamaHubMainnet.relayChain).toBe('kusama'); - // }); - // - // it('should have correct native currency', () => { - // expect(kusamaHubMainnet.nativeCurrency.symbol).toBe('KSM'); - // expect(kusamaHubMainnet.nativeCurrency.decimals).toBe(18); - // }); - // - // it('should use Blockscout (Etherscan V1 API)', () => { - // expect(kusamaHubMainnet.supportsEtherscanV2).toBe(false); - // }); - // }); + describe('kusamaHubMainnet', () => { + it('should have correct chain configuration', () => { + expect(kusamaHubMainnet.id).toBe('kusama-hub'); + expect(kusamaHubMainnet.chainId).toBe(420420418); + expect(kusamaHubMainnet.ecosystem).toBe('polkadot'); + expect(kusamaHubMainnet.executionType).toBe('evm'); + expect(kusamaHubMainnet.networkCategory).toBe('hub'); + expect(kusamaHubMainnet.relayChain).toBe('kusama'); + }); + + it('should have correct native currency', () => { + expect(kusamaHubMainnet.nativeCurrency.symbol).toBe('KSM'); + expect(kusamaHubMainnet.nativeCurrency.decimals).toBe(18); + }); + + it('should use Blockscout (Etherscan V1 API)', () => { + expect(kusamaHubMainnet.supportsEtherscanV2).toBe(false); + }); + + it('should include viem chain definition', () => { + expect(kusamaHubMainnet.viemChain).toBeDefined(); + expect(kusamaHubMainnet.viemChain).toBe(kusamaHub); + }); + }); describe('polkadotHubTestnet', () => { it('should have correct chain configuration', () => { @@ -187,17 +191,15 @@ describe('Viem Chain Definitions', () => { }); }); - // NOTE: kusamaHub tests temporarily disabled - RPC DNS not resolving - // Re-enable once the Kusama Hub EVM RPC service is publicly available. - // describe('kusamaHub', () => { - // it('should have correct chain ID', () => { - // expect(kusamaHub.id).toBe(420420418); - // }); - // - // it('should have correct native currency', () => { - // expect(kusamaHub.nativeCurrency.symbol).toBe('KSM'); - // }); - // }); + describe('kusamaHub', () => { + it('should have correct chain ID', () => { + expect(kusamaHub.id).toBe(420420418); + }); + + it('should have correct native currency', () => { + expect(kusamaHub.nativeCurrency.symbol).toBe('KSM'); + }); + }); describe('polkadotHubTestNet', () => { it('should have correct chain ID', () => { @@ -212,17 +214,18 @@ describe('Viem Chain Definitions', () => { describe('Network Collections', () => { describe('polkadotMainnetNetworks', () => { - // NOTE: kusamaHubMainnet temporarily excluded - RPC DNS not resolving it('should contain Hub networks before parachains (priority order)', () => { - expect(polkadotMainnetNetworks).toHaveLength(3); // Was 4, now 3 without Kusama Hub + expect(polkadotMainnetNetworks).toHaveLength(4); // Hub networks first (P1) expect(polkadotMainnetNetworks[0].id).toBe('polkadot-hub'); expect(polkadotMainnetNetworks[0].networkCategory).toBe('hub'); - // Parachains after (P2) - now at index 1 and 2 - expect(polkadotMainnetNetworks[1].id).toBe('polkadot-moonbeam-mainnet'); - expect(polkadotMainnetNetworks[1].networkCategory).toBe('parachain'); - expect(polkadotMainnetNetworks[2].id).toBe('polkadot-moonriver-mainnet'); + expect(polkadotMainnetNetworks[1].id).toBe('kusama-hub'); + expect(polkadotMainnetNetworks[1].networkCategory).toBe('hub'); + // Parachains after (P2) + expect(polkadotMainnetNetworks[2].id).toBe('polkadot-moonbeam-mainnet'); expect(polkadotMainnetNetworks[2].networkCategory).toBe('parachain'); + expect(polkadotMainnetNetworks[3].id).toBe('polkadot-moonriver-mainnet'); + expect(polkadotMainnetNetworks[3].networkCategory).toBe('parachain'); }); it('should only contain mainnet networks', () => { @@ -253,15 +256,14 @@ describe('Network Collections', () => { }); describe('polkadotNetworks', () => { - // NOTE: kusamaHubMainnet temporarily excluded - RPC DNS not resolving it('should contain all networks', () => { - expect(polkadotNetworks).toHaveLength(5); // Was 6, now 5 without Kusama Hub + expect(polkadotNetworks).toHaveLength(6); }); it('should contain all mainnet and testnet networks', () => { const ids = polkadotNetworks.map((n) => n.id); expect(ids).toContain('polkadot-hub'); - // expect(ids).toContain('kusama-hub'); // Temporarily disabled + expect(ids).toContain('kusama-hub'); expect(ids).toContain('polkadot-hub-testnet'); expect(ids).toContain('polkadot-moonbeam-mainnet'); expect(ids).toContain('polkadot-moonriver-mainnet'); diff --git a/packages/adapter-polkadot/src/index.ts b/packages/adapter-polkadot/src/index.ts index 8d691210..76557b42 100644 --- a/packages/adapter-polkadot/src/index.ts +++ b/packages/adapter-polkadot/src/index.ts @@ -32,8 +32,7 @@ export type { export { polkadotNetworks, polkadotMainnetNetworks, polkadotTestnetNetworks } from './networks'; // Individual Hub networks (P1 - MVP) -// NOTE: kusamaHubMainnet temporarily disabled - RPC DNS not resolving -export { polkadotHubMainnet, polkadotHubTestnet } from './networks'; +export { kusamaHubMainnet, polkadotHubMainnet, polkadotHubTestnet } from './networks'; // Individual Parachain networks (P2) export { moonbeamMainnet, moonriverMainnet, moonbaseAlphaTestnet } from './networks'; @@ -43,8 +42,7 @@ export { moonbeamMainnet, moonriverMainnet, moonbaseAlphaTestnet } from './netwo // ============================================================================ // Custom Hub chain definitions -// NOTE: kusamaHub temporarily disabled - RPC DNS not resolving -export { polkadotHub, polkadotHubTestNet } from './networks/chains'; +export { kusamaHub, polkadotHub, polkadotHubTestNet } from './networks/chains'; // Parachain viem chains (re-exported from viem/chains) export { moonbeam, moonriver, moonbaseAlpha } from './networks'; diff --git a/packages/adapter-polkadot/src/networks/chains.ts b/packages/adapter-polkadot/src/networks/chains.ts index 8a5bced6..5521a687 100644 --- a/packages/adapter-polkadot/src/networks/chains.ts +++ b/packages/adapter-polkadot/src/networks/chains.ts @@ -37,32 +37,27 @@ export const polkadotHub = defineChain({ /** * Kusama Hub mainnet chain definition. * Chain ID: 420420418 - * - * NOTE: Temporarily disabled - The official RPC endpoint DNS - * (kusama-asset-hub-eth-rpc.polkadot.io) does not resolve as of Jan 2026. - * Re-enable once the Kusama Hub EVM RPC service is publicly available. - * @see https://kusama.network/smart-contracts for updates */ -// export const kusamaHub = defineChain({ -// id: 420420418, -// name: 'Kusama Hub', -// nativeCurrency: { -// name: 'Kusama', -// symbol: 'KSM', -// decimals: 18, -// }, -// rpcUrls: { -// default: { -// http: ['https://kusama-asset-hub-eth-rpc.polkadot.io'], -// }, -// }, -// blockExplorers: { -// default: { -// name: 'Blockscout', -// url: 'https://blockscout-kusama-asset-hub.parity-chains-scw.parity.io', -// }, -// }, -// }); +export const kusamaHub = defineChain({ + id: 420420418, + name: 'Kusama Hub', + nativeCurrency: { + name: 'Kusama', + symbol: 'KSM', + decimals: 18, + }, + rpcUrls: { + default: { + http: ['https://kusama-asset-hub-eth-rpc.polkadot.io'], + }, + }, + blockExplorers: { + default: { + name: 'Blockscout', + url: 'https://blockscout-kusama-asset-hub.parity-chains-scw.parity.io', + }, + }, +}); /** * Polkadot Hub TestNet chain definition. diff --git a/packages/adapter-polkadot/src/networks/index.ts b/packages/adapter-polkadot/src/networks/index.ts index 1fce1963..d9eb3b1d 100644 --- a/packages/adapter-polkadot/src/networks/index.ts +++ b/packages/adapter-polkadot/src/networks/index.ts @@ -12,15 +12,13 @@ import { mainnetNetworks } from './mainnet'; import { testnetNetworks } from './testnet'; // Viem chain definitions (custom Hub chains) -// NOTE: kusamaHub temporarily disabled - RPC DNS not resolving -export { polkadotHub, polkadotHubTestNet } from './chains'; +export { kusamaHub, polkadotHub, polkadotHubTestNet } from './chains'; // Viem chain definitions (from viem/chains) export { moonbeam, moonriver, moonbaseAlpha } from 'viem/chains'; // Individual mainnet networks - Hub networks first, then parachains -// NOTE: kusamaHubMainnet temporarily disabled - RPC DNS not resolving -export { polkadotHubMainnet, moonbeamMainnet, moonriverMainnet } from './mainnet'; +export { kusamaHubMainnet, polkadotHubMainnet, moonbeamMainnet, moonriverMainnet } from './mainnet'; // Individual testnet networks - Hub networks first, then parachains export { polkadotHubTestnet, moonbaseAlphaTestnet } from './testnet'; diff --git a/packages/adapter-polkadot/src/networks/mainnet.ts b/packages/adapter-polkadot/src/networks/mainnet.ts index 0414b6b3..c73528c6 100644 --- a/packages/adapter-polkadot/src/networks/mainnet.ts +++ b/packages/adapter-polkadot/src/networks/mainnet.ts @@ -6,7 +6,7 @@ import { NetworkMoonbeam, NetworkPolkadot } from '@web3icons/react'; import { moonbeam, moonriver } from 'viem/chains'; import type { TypedPolkadotNetworkConfig } from '../types'; -import { polkadotHub } from './chains'; +import { kusamaHub, polkadotHub } from './chains'; /** * Polkadot Hub mainnet configuration. @@ -40,36 +40,31 @@ export const polkadotHubMainnet: TypedPolkadotNetworkConfig = { /** * Kusama Hub mainnet configuration. * Chain ID: 420420418, Currency: KSM, Explorer: Blockscout - * - * NOTE: Temporarily disabled - The official RPC endpoint DNS - * (kusama-asset-hub-eth-rpc.polkadot.io) does not resolve as of Jan 2026. - * Re-enable once the Kusama Hub EVM RPC service is publicly available. - * @see https://kusama.network/smart-contracts for updates */ -// export const kusamaHubMainnet: TypedPolkadotNetworkConfig = { -// id: 'kusama-hub', -// name: 'Kusama Hub', -// exportConstName: 'kusamaHubMainnet', -// ecosystem: 'polkadot', -// network: 'kusama-hub', -// type: 'mainnet', -// isTestnet: false, -// chainId: 420420418, -// rpcUrl: 'https://kusama-asset-hub-eth-rpc.polkadot.io', -// explorerUrl: 'https://blockscout-kusama-asset-hub.parity-chains-scw.parity.io', -// apiUrl: 'https://blockscout-kusama-asset-hub.parity-chains-scw.parity.io/api', -// supportsEtherscanV2: false, -// iconComponent: NetworkPolkadot, // Kusama uses Polkadot icon as fallback (canary network) -// nativeCurrency: { -// name: 'Kusama', -// symbol: 'KSM', -// decimals: 18, -// }, -// viemChain: kusamaHub, -// executionType: 'evm', -// networkCategory: 'hub', -// relayChain: 'kusama', -// }; +export const kusamaHubMainnet: TypedPolkadotNetworkConfig = { + id: 'kusama-hub', + name: 'Kusama Hub', + exportConstName: 'kusamaHubMainnet', + ecosystem: 'polkadot', + network: 'kusama-hub', + type: 'mainnet', + isTestnet: false, + chainId: 420420418, + rpcUrl: 'https://kusama-asset-hub-eth-rpc.polkadot.io', + explorerUrl: 'https://blockscout-kusama-asset-hub.parity-chains-scw.parity.io', + apiUrl: 'https://blockscout-kusama-asset-hub.parity-chains-scw.parity.io/api', + supportsEtherscanV2: false, + iconComponent: NetworkPolkadot, // Kusama uses Polkadot icon as fallback (canary network) + nativeCurrency: { + name: 'Kusama', + symbol: 'KSM', + decimals: 18, + }, + viemChain: kusamaHub, + executionType: 'evm', + networkCategory: 'hub', + relayChain: 'kusama', +}; // ============================================================================ // PARACHAIN NETWORKS (P2) @@ -138,12 +133,10 @@ export const moonriverMainnet: TypedPolkadotNetworkConfig = { /** * All mainnet network configurations in priority order. * Hub networks first (P1), then parachains (P2). - * - * NOTE: kusamaHubMainnet temporarily excluded - RPC not available yet. */ export const mainnetNetworks = [ polkadotHubMainnet, - // kusamaHubMainnet, // Temporarily disabled - RPC DNS not resolving + kusamaHubMainnet, moonbeamMainnet, moonriverMainnet, ] as const; diff --git a/packages/adapter-polkadot/src/wallet/chains.ts b/packages/adapter-polkadot/src/wallet/chains.ts index 1162e140..e1ae36dc 100644 --- a/packages/adapter-polkadot/src/wallet/chains.ts +++ b/packages/adapter-polkadot/src/wallet/chains.ts @@ -5,19 +5,18 @@ import type { Chain } from 'viem'; import { moonbaseAlpha, moonbeam, moonriver } from '../networks'; -// NOTE: kusamaHub temporarily disabled - RPC DNS not resolving -import { polkadotHub, polkadotHubTestNet } from '../networks/chains'; +import { kusamaHub, polkadotHub, polkadotHubTestNet } from '../networks/chains'; /** * All Polkadot ecosystem chains for wagmi configuration. * * Includes Hub networks (P1) followed by parachain networks (P2): - * - Hub: Polkadot Hub, Polkadot Hub TestNet (Kusama Hub temporarily disabled) + * - Hub: Polkadot Hub, Kusama Hub, Polkadot Hub TestNet * - Parachains: Moonbeam, Moonriver, Moonbase Alpha */ export const polkadotChains: readonly [Chain, ...Chain[]] = [ polkadotHub, - // kusamaHub, // Temporarily disabled - RPC DNS not resolving + kusamaHub, polkadotHubTestNet, moonbeam, moonriver,