diff --git a/README.md b/README.md index 77671e8..f26c79c 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Bitcoin and Litecoin load balances through Esplora APIs (Blockstream, Mempool.sp | Base | base-mainnet | ETH | 8453 | Enabled | | Arbitrum One | arb1-mainnet | ETH | 42161 | Enabled | -Advertised EVM networks load balances through current public RPCs (PublicNode, DRPC, and official chain endpoints). Retired leftover hosts such as 1rpc.io/eth were removed. Earlier leftover moonriver.unitedbloc.com, Sepolia.org RPCs, zkevm.polygonscan.com, Cloudflare Ethereum, Ankr public RPC, and BlastAPI hops stay denylisted. +Advertised EVM networks load balances through current public RPCs (PublicNode, DRPC, and official chain endpoints). Retired leftover hosts such as 1rpc.io/sepolia were removed. Earlier leftover 1rpc.io/eth, moonriver.unitedbloc.com, Sepolia.org RPCs, zkevm.polygonscan.com, Cloudflare Ethereum, Ankr public RPC, and BlastAPI hops stay denylisted. ### SVM Chains (Solana-like) diff --git a/docs/ADDING_EVM_CHAIN.md b/docs/ADDING_EVM_CHAIN.md index 0cef805..b10a70a 100644 --- a/docs/ADDING_EVM_CHAIN.md +++ b/docs/ADDING_EVM_CHAIN.md @@ -87,7 +87,8 @@ The runtime client: - Filters out deprecated chains, invalid RPC endpoints, and retired public hosts (MyCrypto, MaticVigil, Cloudflare Ethereum, Ankr public RPC, BlastAPI, leftover Sepolia.org RPCs, DNS-dead zkevm.polygonscan.com, leftover - moonriver.unitedbloc.com, leftover discontinued 1rpc.io/eth, and old + moonriver.unitedbloc.com, leftover discontinued 1rpc.io/eth, leftover + 1rpc.io/sepolia (old public path; use public.1rpc.io/sepolia), and old Polygon/Fantom/Moonbeam gateways). See `src/lib/networks/evm-endpoints.ts`. ## Method 3: Manual Configuration (Legacy) @@ -220,7 +221,9 @@ reintroduce MyCrypto, MaticVigil, Cloudflare Ethereum, Ankr public RPC, BlastAPI, leftover Sepolia.org RPCs (`rpc.sepolia.org` 404, `rpc2.sepolia.org` timeout), DNS-dead `zkevm.polygonscan.com`, leftover `moonriver.unitedbloc.com` (DNS-dead), leftover discontinued -`1rpc.io/eth` (HTTP 410), or the old Polygon/Fantom/Moonbeam +`1rpc.io/eth` (HTTP 410), leftover `1rpc.io/sepolia` (old public +path; intermittent 403 after 1RPC moved public hops to +`public.1rpc.io`), or the old Polygon/Fantom/Moonbeam gateways. ### Pre-bundled Chains diff --git a/scripts/sync-evm-registry.ts b/scripts/sync-evm-registry.ts index b895d28..f51fe56 100644 --- a/scripts/sync-evm-registry.ts +++ b/scripts/sync-evm-registry.ts @@ -49,6 +49,7 @@ const DEPRECATED_EVM_ENDPOINT_HOSTS = [ 'rpc2.sepolia.org', 'zkevm.polygonscan.com', '1rpc.io/eth', + 'https://1rpc.io/sepolia', ] as const; const CHAINS_JSON_URL = 'https://chainid.network/chains.json'; diff --git a/src/lib/networks/evm-endpoints.ts b/src/lib/networks/evm-endpoints.ts index a8c30f5..caefe3a 100644 --- a/src/lib/networks/evm-endpoints.ts +++ b/src/lib/networks/evm-endpoints.ts @@ -10,8 +10,10 @@ * Leftover Moonriver UnitedBloc then lingered after Moonbeam UnitedBloc * was denylisted: moonriver.unitedbloc.com no longer resolves. Leftover * 1rpc.io/eth then lingered after 1RPC discontinued that Ethereum hop - * (HTTP 410; other 1RPC paths such as Sepolia still answer). Keep - * those hosts out of advertised lists so the first hop can succeed. + * (HTTP 410). Leftover 1rpc.io/sepolia then lingered after 1RPC moved + * public hops to public.1rpc.io (old 1rpc.io/sepolia now 403s + * intermittently; public.1rpc.io/sepolia stays public). Keep those + * hosts out of advertised lists so the first hop can succeed. */ export const DEPRECATED_EVM_ENDPOINT_HOSTS = [ @@ -41,6 +43,7 @@ export const DEPRECATED_EVM_ENDPOINT_HOSTS = [ 'rpc2.sepolia.org', 'zkevm.polygonscan.com', '1rpc.io/eth', + 'https://1rpc.io/sepolia', ] as const; export function evmEndpointHaystack(rpcUrls: readonly string[], explorerUrl?: string): string { diff --git a/src/lib/networks/evm-registry.ts b/src/lib/networks/evm-registry.ts index 452c498..731a1cd 100644 --- a/src/lib/networks/evm-registry.ts +++ b/src/lib/networks/evm-registry.ts @@ -16,6 +16,8 @@ * moonriver.unitedbloc.com stopped resolving. * Leftover 1rpc.io/eth hop refreshed 2026-09-20 after 1RPC * discontinued that Ethereum endpoint (HTTP 410). + * Leftover 1rpc.io/sepolia hop refreshed 2026-09-20 after 1RPC + * moved public hops to public.1rpc.io (old path 403s intermittently). */ import { EvmNetworkConfig } from './types'; @@ -665,11 +667,13 @@ export const EVM_REGISTRY_CHAINS: EvmRegistryConfig[] = [ chainId: 11155111, rpcUrls: [ // sepolia.org discontinued its RPCs (rpc.sepolia.org 404, - // rpc2.sepolia.org times out). PublicNode, Tenderly, 1RPC, and + // rpc2.sepolia.org times out). Leftover 1rpc.io/sepolia is the + // old public path (intermittent 403 after 1RPC moved public hops + // to public.1rpc.io). PublicNode, Tenderly, public.1rpc.io, and // EthPandaOps remain public. 'https://ethereum-sepolia-rpc.publicnode.com', 'https://sepolia.gateway.tenderly.co', - 'https://1rpc.io/sepolia', + 'https://public.1rpc.io/sepolia', 'https://rpc.sepolia.ethpandaops.io' ], nativeCurrency: { diff --git a/src/lib/networks/supported-catalog.ts b/src/lib/networks/supported-catalog.ts index b8e4690..b6708c6 100644 --- a/src/lib/networks/supported-catalog.ts +++ b/src/lib/networks/supported-catalog.ts @@ -4,7 +4,7 @@ * The live registry can include additional auto-synced chains. This list is the * curated set shown in Settings and kept in sync with README.md. * - * Last reviewed: 2026-09-20 (leftover Ethereum 1RPC / Injective Polkachu refresh). + * Last reviewed: 2026-09-20 (leftover Sepolia 1RPC public hop refresh). */ export { DEPRECATED_SVM_ENDPOINT_HOSTS } from './svm-endpoints'; @@ -70,7 +70,7 @@ export function getSupportedNetworkFamilySummary(family: SupportedNetworkFamily) case 'utxo': return 'Bitcoin and Litecoin can load balances today. Other Bitcoin-like networks still show your address. Explorer links use current hosts (CipherScan, Ravencoin Explorer, OKLink, Flux Blockbook); retired sites such as dogechain.info, explorer.runonflux.io, and explorer.nosocoin.com were removed.'; case 'evm': - return 'Ethereum and compatible networks load balances through current public RPCs (PublicNode, DRPC, and official chain endpoints). Retired leftover hosts such as 1rpc.io/eth were removed. Earlier leftover moonriver.unitedbloc.com, Sepolia.org RPCs, zkevm.polygonscan.com, Cloudflare Ethereum, Ankr public RPC, and BlastAPI hops stay denylisted.'; + return 'Ethereum and compatible networks load balances through current public RPCs (PublicNode, DRPC, and official chain endpoints). Retired leftover hosts such as 1rpc.io/sepolia were removed. Earlier leftover 1rpc.io/eth, moonriver.unitedbloc.com, Sepolia.org RPCs, zkevm.polygonscan.com, Cloudflare Ethereum, Ankr public RPC, and BlastAPI hops stay denylisted.'; case 'svm': return 'Solana mainnet balances load through current public RPCs (official Solana and PublicNode). Retired or key-gated hosts such as Ankr public RPC and Solana dRPC were removed.'; default: { diff --git a/src/web/main.tsx b/src/web/main.tsx index c6a6867..2a6cf9d 100644 --- a/src/web/main.tsx +++ b/src/web/main.tsx @@ -111,7 +111,7 @@ const WebAppFrame: React.FC<{ children: React.ReactNode }> = ({ children }) => ( Vidulum is a cross-chain wallet for Cosmos, Bitcoin-like, EVM, and Solana networks. Use Vidulum for IBC transfers, multi-chain swaps, and asset management across supported - networks. Leftover Ethereum 1RPC and Injective Polkachu hosts last checked in September 2026. + networks. Leftover Sepolia 1RPC hosts last checked in September 2026. diff --git a/tests/lib/networks/evm-endpoints.test.ts b/tests/lib/networks/evm-endpoints.test.ts index a869619..e56ae3e 100644 --- a/tests/lib/networks/evm-endpoints.test.ts +++ b/tests/lib/networks/evm-endpoints.test.ts @@ -7,8 +7,9 @@ * (404 / timeout) and the sunset zkEVM explorer still sat in side-chain * lists. Leftover Moonriver UnitedBloc then lingered after Moonbeam * UnitedBloc was denylisted. Leftover 1rpc.io/eth then lingered after - * 1RPC discontinued that Ethereum hop (HTTP 410). This keeps EVM RPC - * and explorer lists honest. + * 1RPC discontinued that Ethereum hop (HTTP 410). Leftover + * 1rpc.io/sepolia then lingered after 1RPC moved public hops to + * public.1rpc.io. This keeps EVM RPC and explorer lists honest. */ import { @@ -129,10 +130,11 @@ describe('EVM endpoint freshness', () => { expect(sepolia?.rpcUrls).toEqual([ 'https://ethereum-sepolia-rpc.publicnode.com', 'https://sepolia.gateway.tenderly.co', - 'https://1rpc.io/sepolia', + 'https://public.1rpc.io/sepolia', 'https://rpc.sepolia.ethpandaops.io', ]); expect(sepolia?.rpcUrls.join(' ')).not.toMatch(/rpc\.sepolia\.org|rpc2\.sepolia\.org/); + expect(sepolia?.rpcUrls.join(' ')).not.toContain('https://1rpc.io/sepolia'); expect(sepolia?.explorerUrl).toBe('https://sepolia.etherscan.io'); }); @@ -176,7 +178,8 @@ describe('EVM endpoint freshness', () => { expect(usesDeprecatedEvmHost('https://zkevm.polygonscan.com')).toBe(true); expect(usesDeprecatedEvmHost('https://moonriver.unitedbloc.com')).toBe(true); expect(usesDeprecatedEvmHost('https://1rpc.io/eth')).toBe(true); - expect(usesDeprecatedEvmHost('https://1rpc.io/sepolia')).toBe(false); + expect(usesDeprecatedEvmHost('https://1rpc.io/sepolia')).toBe(true); + expect(usesDeprecatedEvmHost('https://public.1rpc.io/sepolia')).toBe(false); expect(usesDeprecatedEvmHost('https://ethereum-rpc.publicnode.com')).toBe(false); expect(usesDeprecatedEvmHost('https://rpc.sepolia.ethpandaops.io')).toBe(false); @@ -191,9 +194,15 @@ describe('EVM endpoint freshness', () => { 'https://rpc.ankr.com/eth', 'https://rpc.sepolia.org', 'https://1rpc.io/eth', + 'https://1rpc.io/sepolia', 'https://eth.drpc.org', + 'https://public.1rpc.io/sepolia', ]) - ).toEqual(['https://ethereum-rpc.publicnode.com', 'https://eth.drpc.org']); + ).toEqual([ + 'https://ethereum-rpc.publicnode.com', + 'https://eth.drpc.org', + 'https://public.1rpc.io/sepolia', + ]); expect( selectPublicEvmExplorer([ diff --git a/tests/lib/networks/supported-catalog.test.ts b/tests/lib/networks/supported-catalog.test.ts index 849f94a..05e84db 100644 --- a/tests/lib/networks/supported-catalog.test.ts +++ b/tests/lib/networks/supported-catalog.test.ts @@ -59,10 +59,10 @@ describe('Supported network catalog', () => { /current public RPCs \(PublicNode, DRPC/ ); expect(getSupportedNetworkFamilySummary('evm')).toMatch( - /1rpc\.io\/eth/ + /1rpc\.io\/sepolia/ ); expect(getSupportedNetworkFamilySummary('evm')).toMatch( - /moonriver\.unitedbloc\.com, Sepolia\.org RPCs, zkevm\.polygonscan\.com/ + /1rpc\.io\/eth, moonriver\.unitedbloc\.com, Sepolia\.org RPCs, zkevm\.polygonscan\.com/ ); expect(getSupportedNetworkFamilySummary('cosmos')).toMatch( /current public RPC and LCD/ diff --git a/tests/popup/SupportedNetworksPanel.test.tsx b/tests/popup/SupportedNetworksPanel.test.tsx index 7a026f5..ccc13a1 100644 --- a/tests/popup/SupportedNetworksPanel.test.tsx +++ b/tests/popup/SupportedNetworksPanel.test.tsx @@ -56,8 +56,8 @@ describe('SupportedNetworksPanel', () => { expect(screen.getByText(/Ethereum, OP Mainnet, BNB Chain, Polygon, Base, Arbitrum One/)).toBeInTheDocument(); expect(screen.getByText(/Ethereum and compatible networks load balances through current public RPCs/)).toBeInTheDocument(); expect(screen.getByText(/PublicNode, DRPC, and official chain endpoints/)).toBeInTheDocument(); - expect(screen.getByText(/1rpc\.io\/eth/)).toBeInTheDocument(); - expect(screen.getByText(/moonriver\.unitedbloc\.com, Sepolia\.org RPCs, zkevm\.polygonscan\.com/)).toBeInTheDocument(); + expect(screen.getByText(/1rpc\.io\/sepolia/)).toBeInTheDocument(); + expect(screen.getByText(/1rpc\.io\/eth, moonriver\.unitedbloc\.com, Sepolia\.org RPCs, zkevm\.polygonscan\.com/)).toBeInTheDocument(); expect(screen.getByText(/^Solana$/)).toBeInTheDocument(); expect(screen.getByText(/official Solana and PublicNode/)).toBeInTheDocument(); expect(screen.getByText(/Ankr public RPC and Solana dRPC/)).toBeInTheDocument();