Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Available as:

### Cosmos SDK Chains

Cosmos networks are sourced from the [Cosmos Chain Registry](https://github.com/cosmos/chain-registry). Advertised Cosmos networks load balances through current public RPC and LCD hosts (CryptoCrew, Lavender.Five, Polkachu, PublicNode, and official chain endpoints). Retired leftover Kujira and Stargaze hops (Lavender.Five 503; Stargaze is killed and Kleomedes now returns empty 200s) were removed, along with leftover Autostake 404 hops. Earlier leftover Evmos, official Neutron, ezstaking.dev, itastakers.com, and setten.io hops stay denylisted. Explorer links use current hosts (Mintscan, ATOMScan, BeeZee Explorer). Retired leftover explorers such as ezstaking.app, finder.kujira.app, and explorers.guru were removed.
Cosmos networks are sourced from the [Cosmos Chain Registry](https://github.com/cosmos/chain-registry). Advertised Cosmos networks load balances through current public RPC and LCD hosts (CryptoCrew, Lavender.Five, Polkachu, PublicNode, and official chain endpoints). Retired leftover Injective Polkachu hops (timeout) were removed. Earlier leftover Kujira and Stargaze hops, Autostake 404 hops, Evmos, official Neutron, ezstaking.dev, itastakers.com, and setten.io hops stay denylisted. Explorer links use current hosts (Mintscan, ATOMScan, BeeZee Explorer). Retired leftover explorers such as ezstaking.app, finder.kujira.app, and explorers.guru were removed.

| Network | Chain ID | Symbol | Status |
| ---------- | ----------- | ------ | ------- |
Expand Down Expand Up @@ -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 moonriver.unitedbloc.com were removed. Earlier leftover 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/eth were removed. Earlier leftover moonriver.unitedbloc.com, Sepolia.org RPCs, zkevm.polygonscan.com, Cloudflare Ethereum, Ankr public RPC, and BlastAPI hops stay denylisted.

### SVM Chains (Solana-like)

Expand Down
14 changes: 8 additions & 6 deletions docs/ADDING_COSMOS_CHAIN.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,10 +137,10 @@ The dynamic client:
- Caches results in `browser.storage.local` for 24 hours
- Works for any chain in the registry
- Filters out retired public hosts (QuickApi, Lava public RPC, Whispernode,
Notional cosmosia, leftover Kujira / Stargaze RPC/LCD hops, leftover Evmos
RPC/LCD hops, leftover official Neutron RPC/LCD hops, leftover
ezstaking.dev / itastakers / setten.io hops, and others). See
`src/lib/networks/cosmos-endpoints.ts`.
Notional cosmosia, leftover Injective Polkachu RPC/LCD hops, leftover
Kujira / Stargaze RPC/LCD hops, leftover Evmos RPC/LCD hops, leftover
official Neutron RPC/LCD hops, leftover ezstaking.dev / itastakers /
setten.io hops, and others). See `src/lib/networks/cosmos-endpoints.ts`.

## Method 3: Manual Configuration (Legacy)

Expand Down Expand Up @@ -249,8 +249,10 @@ The wallet automatically handles endpoint failover:
The sync script and runtime client both drop retired public hosts listed in
`src/lib/networks/cosmos-endpoints.ts` so a later registry pull does not
reintroduce QuickApi, Lava public RPC, Whispernode, Notional cosmosia,
leftover Kujira hops (`lavenderfive.com:443/kujira` 503; Kleomedes 525;
Polkachu DNS-dead), leftover Stargaze hops (chain-registry kill;
leftover Injective Polkachu hops (`injective-rpc.polkachu.com` /
`injective-api.polkachu.com` timeout), leftover Kujira hops
(`lavenderfive.com:443/kujira` 503; Kleomedes 525; Polkachu DNS-dead),
leftover Stargaze hops (chain-registry kill;
`lavenderfive.com:443/stargaze` 503; Kleomedes empty 200), leftover
Autostake 404 hops, leftover Evmos hops (`lavenderfive.com:443/evmos`
503 after the chain-registry kill; `goldenratiostaking.net` /
Expand Down
7 changes: 4 additions & 3 deletions docs/ADDING_EVM_CHAIN.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +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, and old Polygon/Fantom/Moonbeam gateways). See
`src/lib/networks/evm-endpoints.ts`.
moonriver.unitedbloc.com, leftover discontinued 1rpc.io/eth, and old
Polygon/Fantom/Moonbeam gateways). See `src/lib/networks/evm-endpoints.ts`.

## Method 3: Manual Configuration (Legacy)

Expand Down Expand Up @@ -219,7 +219,8 @@ The sync script and runtime client both drop retired public hosts listed in
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), or the old Polygon/Fantom/Moonbeam
`moonriver.unitedbloc.com` (DNS-dead), leftover discontinued
`1rpc.io/eth` (HTTP 410), or the old Polygon/Fantom/Moonbeam
gateways.

### Pre-bundled Chains
Expand Down
2 changes: 2 additions & 0 deletions scripts/sync-chain-registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ const DEPRECATED_COSMOS_ENDPOINT_HOSTS = [
'kujira-rpc.polkachu.com',
'kujira-api.polkachu.com',
'theamsolutions.info',
'injective-rpc.polkachu.com',
'injective-api.polkachu.com',
] as const;

// Default chains to include in the bundle (most popular by TVL/usage)
Expand Down
1 change: 1 addition & 0 deletions scripts/sync-evm-registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ const DEPRECATED_EVM_ENDPOINT_HOSTS = [
'rpc.sepolia.org',
'rpc2.sepolia.org',
'zkevm.polygonscan.com',
'1rpc.io/eth',
] as const;

const CHAINS_JSON_URL = 'https://chainid.network/chains.json';
Expand Down
8 changes: 6 additions & 2 deletions src/lib/networks/cosmos-endpoints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,10 @@
* (502) plus w3coins.io / stakeflow.io (DNS-dead) hops still sat on
* side-chain lists. Leftover Kujira and Stargaze hops then lingered:
* Lavender.Five now 503s both, Stargaze is killed (Kleomedes empty 200,
* official/Polkachu DNS-dead), and Autostake public hops 404. Keep
* those hosts out of advertised lists so the first hop can succeed.
* official/Polkachu DNS-dead), and Autostake public hops 404. Leftover
* Injective Polkachu hops then lingered: injective-rpc.polkachu.com and
* injective-api.polkachu.com now time out. Keep those hosts out of
* advertised lists so the first hop can succeed.
*/

export const DEPRECATED_COSMOS_ENDPOINT_HOSTS = [
Expand Down Expand Up @@ -69,6 +71,8 @@ export const DEPRECATED_COSMOS_ENDPOINT_HOSTS = [
'kujira-rpc.polkachu.com',
'kujira-api.polkachu.com',
'theamsolutions.info',
'injective-rpc.polkachu.com',
'injective-api.polkachu.com',
] as const;

export function cosmosEndpointHaystack(
Expand Down
9 changes: 6 additions & 3 deletions src/lib/networks/cosmos-registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@
* Lavender.Five started 503ing Kujira and Stargaze, Stargaze was marked
* killed (Kleomedes empty 200; official/Polkachu DNS-dead), and Autostake
* public hops 404ed.
* Leftover Injective Polkachu hops refreshed 2026-09-20 after
* injective-rpc.polkachu.com and injective-api.polkachu.com started
* timing out. Highstakes, Lavender.Five, and PublicNode remain public.
*/

import { CosmosNetworkConfig } from './types';
Expand Down Expand Up @@ -192,14 +195,14 @@ export const COSMOS_REGISTRY_CHAINS: CosmosRegistryConfig[] = [
decimals: 6,
coinType: 60,
// goldenratiostaking.net now 502s. stakeflow.io no longer resolves.
// Leftover Polkachu RPC/LCD now time out. PublicNode remains public.
rpc: [
'https://injective-rpc.highstakes.ch',
'https://injective-rpc.polkachu.com',
'https://rpc.lavenderfive.com:443/injective'
'https://rpc.lavenderfive.com:443/injective',
'https://injective-rpc.publicnode.com:443'
],
rest: [
'https://injective-api.highstakes.ch',
'https://injective-api.polkachu.com',
'https://rest.lavenderfive.com:443/injective',
'https://injective-rest.publicnode.com',
'https://public.stakewolle.com/cosmos/injective/rest'
Expand Down
5 changes: 4 additions & 1 deletion src/lib/networks/evm-endpoints.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
* Sepolia.org RPCs (site discontinued: 404 / timeout) and the sunset
* Polygon zkEVM explorer (zkevm.polygonscan.com is DNS-dead) also lingered.
* Leftover Moonriver UnitedBloc then lingered after Moonbeam UnitedBloc
* was denylisted: moonriver.unitedbloc.com no longer resolves. Keep
* 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.
*/

Expand Down Expand Up @@ -38,6 +40,7 @@ export const DEPRECATED_EVM_ENDPOINT_HOSTS = [
'rpc.sepolia.org',
'rpc2.sepolia.org',
'zkevm.polygonscan.com',
'1rpc.io/eth',
] as const;

export function evmEndpointHaystack(rpcUrls: readonly string[], explorerUrl?: string): string {
Expand Down
5 changes: 4 additions & 1 deletion src/lib/networks/evm-registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
* refreshed 2026-09-20 after sepolia.org discontinued and zkEVM sunset.
* Leftover Moonriver UnitedBloc hop refreshed 2026-09-20 after
* moonriver.unitedbloc.com stopped resolving.
* Leftover 1rpc.io/eth hop refreshed 2026-09-20 after 1RPC
* discontinued that Ethereum endpoint (HTTP 410).
*/

import { EvmNetworkConfig } from './types';
Expand Down Expand Up @@ -43,9 +45,10 @@ export const EVM_REGISTRY_CHAINS: EvmRegistryConfig[] = [
chainId: 1,
rpcUrls: [
// cloudflare-eth.com now returns JSON-RPC -32046 "Cannot fulfill request".
// 1rpc.io/eth is discontinued (HTTP 410). PublicNode, DRPC, and
// Tenderly remain public.
'https://ethereum-rpc.publicnode.com',
'https://eth.drpc.org',
'https://1rpc.io/eth',
'https://mainnet.gateway.tenderly.co'
],
nativeCurrency: {
Expand Down
6 changes: 3 additions & 3 deletions src/lib/networks/supported-catalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 Kujira / Stargaze RPC / LCD refresh).
* Last reviewed: 2026-09-20 (leftover Ethereum 1RPC / Injective Polkachu refresh).
*/

export { DEPRECATED_SVM_ENDPOINT_HOSTS } from './svm-endpoints';
Expand Down Expand Up @@ -66,11 +66,11 @@ export function getSupportedNetworkFamilyLabel(family: SupportedNetworkFamily):
export function getSupportedNetworkFamilySummary(family: SupportedNetworkFamily): string {
switch (family) {
case 'cosmos':
return 'Staking, IBC transfers, and Cosmos assets load through current public RPC and LCD hosts. Retired leftover Kujira and Stargaze hops (Lavender.Five 503; Stargaze is killed and Kleomedes now returns empty 200s) were removed, along with leftover Autostake 404 hops. Earlier leftover Evmos, official Neutron, ezstaking.dev, itastakers.com, and setten.io hops stay denylisted. Explorer links use current hosts (Mintscan, ATOMScan, BeeZee Explorer); retired leftover explorers such as ezstaking.app, finder.kujira.app, and explorers.guru were removed.';
return 'Staking, IBC transfers, and Cosmos assets load through current public RPC and LCD hosts. Retired leftover Injective Polkachu hops (timeout) were removed. Earlier leftover Kujira and Stargaze hops, Autostake 404 hops, Evmos, official Neutron, ezstaking.dev, itastakers.com, and setten.io hops stay denylisted. Explorer links use current hosts (Mintscan, ATOMScan, BeeZee Explorer); retired leftover explorers such as ezstaking.app, finder.kujira.app, and explorers.guru were removed.';
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 moonriver.unitedbloc.com were removed. Earlier leftover 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/eth were removed. Earlier leftover 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: {
Expand Down
2 changes: 1 addition & 1 deletion src/web/main.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ const WebAppFrame: React.FC<{ children: React.ReactNode }> = ({ children }) => (
<Text fontSize="xs" color="gray.400">
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 Kujira and Stargaze RPC and LCD hosts last checked in September 2026.
networks. Leftover Ethereum 1RPC and Injective Polkachu hosts last checked in September 2026.
</Text>
</Box>
</Flex>
Expand Down
28 changes: 27 additions & 1 deletion tests/lib/networks/cosmos-endpoints.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
* goldenratiostaking.net / owallet.io (502) and w3coins.io / stakeflow.io
* (DNS-dead) hops. Leftover Kujira and Stargaze hops then lingered
* (Lavender.Five 503; Stargaze killed / Kleomedes empty 200; Autostake
* 404). This keeps those lists honest.
* 404). Leftover Injective Polkachu hops then lingered (RPC/LCD
* timeout). This keeps those lists honest.
*/

import {
Expand Down Expand Up @@ -240,6 +241,9 @@ describe('Cosmos endpoint freshness', () => {
/goldenratiostaking\.net|stakeflow\.io/
);
expect(injective?.rpc[0]).toBe('https://injective-rpc.highstakes.ch');
expect(injective?.rpc.concat(injective?.rest ?? []).join(' ')).not.toMatch(
/injective-rpc\.polkachu\.com|injective-api\.polkachu\.com/
);

const noble = getChainById('noble-1');
expect(noble?.rpc.concat(noble?.rest ?? []).join(' ')).not.toContain('owallet.io');
Expand All @@ -259,6 +263,24 @@ describe('Cosmos endpoint freshness', () => {
expect(terra?.rpc.concat(terra?.rest ?? []).join(' ')).not.toContain('stakeflow.io');
});

it('drops leftover Injective Polkachu hops that now time out', () => {
const injective = getChainById('injective-1');
expect(injective?.rpc).toEqual([
'https://injective-rpc.highstakes.ch',
'https://rpc.lavenderfive.com:443/injective',
'https://injective-rpc.publicnode.com:443',
]);
expect(injective?.rest).toEqual([
'https://injective-api.highstakes.ch',
'https://rest.lavenderfive.com:443/injective',
'https://injective-rest.publicnode.com',
'https://public.stakewolle.com/cosmos/injective/rest',
]);
expect(injective?.rpc.concat(injective?.rest ?? []).join(' ')).not.toMatch(
/injective-rpc\.polkachu\.com|injective-api\.polkachu\.com/
);
});

it('drops leftover Kujira and Stargaze RPC/LCD hops after public hops died', () => {
const kujira = getChainById('kaiyo-1');
expect(kujira?.enabled).toBe(false);
Expand Down Expand Up @@ -424,6 +446,9 @@ describe('Cosmos endpoint freshness', () => {
expect(usesDeprecatedCosmosHost('https://kuji-rpc.kleomedes.network')).toBe(true);
expect(usesDeprecatedCosmosHost('https://kujira-rpc.polkachu.com')).toBe(true);
expect(usesDeprecatedCosmosHost('https://kujira-rpc.theamsolutions.info')).toBe(true);
expect(usesDeprecatedCosmosHost('https://injective-rpc.polkachu.com')).toBe(true);
expect(usesDeprecatedCosmosHost('https://injective-api.polkachu.com')).toBe(true);
expect(usesDeprecatedCosmosHost('https://noble-rpc.polkachu.com')).toBe(false);
expect(usesDeprecatedCosmosHost('https://rpc.lavenderfive.com:443/neutron')).toBe(false);
expect(usesDeprecatedCosmosHost('https://juno-rpc.kleomedes.network')).toBe(false);
expect(usesDeprecatedCosmosHost('https://www.mintscan.io/atomone')).toBe(false);
Expand Down Expand Up @@ -454,6 +479,7 @@ describe('Cosmos endpoint freshness', () => {
'https://dydx-mainnet-rpc.autostake.com:443',
'https://stargaze-rpc.kleomedes.network',
'https://kujira-rpc.theamsolutions.info',
'https://injective-rpc.polkachu.com',
])
).toEqual([
'https://rpc.lavenderfive.com:443/cosmoshub',
Expand Down
9 changes: 7 additions & 2 deletions tests/lib/networks/evm-endpoints.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
* Moonbeam/Moonriver/Blast hops also lingered. Leftover Sepolia.org RPCs
* (404 / timeout) and the sunset zkEVM explorer still sat in side-chain
* lists. Leftover Moonriver UnitedBloc then lingered after Moonbeam
* UnitedBloc was denylisted. This keeps EVM RPC and explorer lists honest.
* 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.
*/

import {
Expand Down Expand Up @@ -79,10 +81,10 @@ describe('EVM endpoint freshness', () => {
expect(ethereum?.rpcUrls).toEqual([
'https://ethereum-rpc.publicnode.com',
'https://eth.drpc.org',
'https://1rpc.io/eth',
'https://mainnet.gateway.tenderly.co',
]);
expect(ethereum?.rpcUrls.join(' ')).not.toContain('cloudflare-eth.com');
expect(ethereum?.rpcUrls.join(' ')).not.toContain('1rpc.io/eth');
});

it('replaces leftover Ankr and BlastAPI hops on bundled side chains', () => {
Expand Down Expand Up @@ -173,6 +175,8 @@ describe('EVM endpoint freshness', () => {
expect(usesDeprecatedEvmHost('https://rpc2.sepolia.org')).toBe(true);
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://ethereum-rpc.publicnode.com')).toBe(false);
expect(usesDeprecatedEvmHost('https://rpc.sepolia.ethpandaops.io')).toBe(false);

Expand All @@ -186,6 +190,7 @@ describe('EVM endpoint freshness', () => {
'https://cloudflare-eth.com',
'https://rpc.ankr.com/eth',
'https://rpc.sepolia.org',
'https://1rpc.io/eth',
'https://eth.drpc.org',
])
).toEqual(['https://ethereum-rpc.publicnode.com', 'https://eth.drpc.org']);
Expand Down
8 changes: 4 additions & 4 deletions tests/lib/networks/supported-catalog.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,19 +59,19 @@ describe('Supported network catalog', () => {
/current public RPCs \(PublicNode, DRPC/
);
expect(getSupportedNetworkFamilySummary('evm')).toMatch(
/moonriver\.unitedbloc\.com/
/1rpc\.io\/eth/
);
expect(getSupportedNetworkFamilySummary('evm')).toMatch(
/Sepolia\.org RPCs, zkevm\.polygonscan\.com, Cloudflare Ethereum/
/moonriver\.unitedbloc\.com, Sepolia\.org RPCs, zkevm\.polygonscan\.com/
);
expect(getSupportedNetworkFamilySummary('cosmos')).toMatch(
/current public RPC and LCD/
);
expect(getSupportedNetworkFamilySummary('cosmos')).toMatch(
/leftover Kujira and Stargaze hops \(Lavender\.Five 503/
/leftover Injective Polkachu hops \(timeout\)/
);
expect(getSupportedNetworkFamilySummary('cosmos')).toMatch(
/Autostake 404 hops/
/Kujira and Stargaze hops/
);
expect(getSupportedNetworkFamilySummary('cosmos')).toMatch(
/Evmos, official Neutron, ezstaking\.dev, itastakers\.com, and setten\.io/
Expand Down
Loading
Loading