diff --git a/README.md b/README.md index 34b8448..9fdb0f8 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,7 @@ Electron ABI. If you later want to run unit tests, run | Address format | bech32; app + nodes use the `sent` HRP, chain-side node identity is `sentnode` | | At-rest encryption | Electron `safeStorage` (OS keychain: Keychain / DPAPI / libsecret) | | Balance query | `StargateClient.getBalance(addr, 'udvpn')` | -| RPC pool | Three endpoints (rpc.sentinel.co + AutoStake + Polkachu) with latency-aware failover | +| RPC pool | Eight audited endpoints (busurnode → suchnode → publicnode → trinitystake → polkachu → autostake → freshSTAKING → sentinel.co) with latency-aware failover. Audited 2026-05-02; sentinel.co kept last as a stale-fallback only. | | Send / MsgSend | `SigningSentinelClient.sendTokens` with explicit StdFee; error codes classified | | Operator seeding | 1 DVPN auto-transferred to each new node's operator address on deploy | | QR code | Real SVG from `qrcode` in main, inlined in renderer | diff --git a/src/main/services/chain.ts b/src/main/services/chain.ts index b3a2c2b..f89e064 100644 --- a/src/main/services/chain.ts +++ b/src/main/services/chain.ts @@ -16,14 +16,27 @@ export const DEFAULT_GAS_PRICE_UDVPN = '0.1'; /** * Public RPC pool. The app picks whichever endpoint answers fastest and - * falls through on failure. These are the three endpoints named by the - * Sentinel docs + two community validators (AutoStake + Polkachu) with - * historically strong uptime. + * falls through on failure. + * + * Audited 2026-05-02 against a known funded address — every entry below + * reported `catching_up=false` AND served a correct ABCI bank balance. + * `rpc.sentinel.co` is kept last as a stale-fallback only: it has been + * stuck behind tip while reporting `catching_up=false`, returning stale + * balances for several weeks. New code should not rely on it as primary. + * + * Primary picks (busurnode + suchnode + publicnode + trinitystake) are + * sub-500ms in the audit; community validators (polkachu, freshSTAKING) + * follow; sentinel.co last. */ export const DEFAULT_RPC_POOL: readonly string[] = [ - 'https://rpc.sentinel.co:443', - 'https://sentinel-mainnet-rpc.autostake.com:443', + 'https://rpc-sentinel.busurnode.com', + 'https://rpc.sentinel.suchnode.net', + 'https://sentinel-rpc.publicnode.com', + 'https://rpc.trinitystake.io', 'https://sentinel-rpc.polkachu.com:443', + 'https://sentinel-mainnet-rpc.autostake.com:443', + 'https://sentinel-rpc.freshstaking.com', + 'https://rpc.sentinel.co:443', ]; export const udvpnToDvpn = (u: string | number | bigint): number => {