Skip to content
Open
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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down
23 changes: 18 additions & 5 deletions src/main/services/chain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 => {
Expand Down
Loading