From 66f2c985d9f85fcbf1576fc5572ae35c78bbc295 Mon Sep 17 00:00:00 2001 From: Vibhav Simha G Date: Tue, 25 Aug 2026 13:58:38 +0530 Subject: [PATCH] fix(sdk-coin-sui): use live JSON-RPC nodes and surface recover errors Sui Foundation disabled JSON-RPC on fullnode.*.sui.io, so every SDK consumer hit "Method not found" and Sui.recover() reported "no funds" because the RPC error was swallowed. Point sdk-core defaults at PublicNode for mainnet and testnet, and rethrow getBalance failures with address, index, and RPC URL so the real cause surfaces. Ticket: WCI-1455 Co-authored-by: Cursor --- modules/sdk-coin-sui/src/sui.ts | 6 +++++- modules/sdk-coin-sui/test/unit/sui.ts | 19 +++++++++++++++++++ modules/sdk-core/src/bitgo/environments.ts | 4 ++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/modules/sdk-coin-sui/src/sui.ts b/modules/sdk-coin-sui/src/sui.ts index 4a0de36c07..082ed8afa5 100644 --- a/modules/sdk-coin-sui/src/sui.ts +++ b/modules/sdk-coin-sui/src/sui.ts @@ -368,7 +368,11 @@ export class Sui extends BaseCoin { availableBalance = new BigNumber(balanceInfo.totalBalance); fundsInAddressBalance = new BigNumber(balanceInfo.fundsInAddressBalance); } catch (e) { - continue; + throw new Error( + `Failed to query Sui balance for address ${senderAddress} at index ${idx} via ${this.getPublicNodeUrl()}: ${ + (e as Error).message + }` + ); } if (availableBalance.minus(MAX_GAS_BUDGET).toNumber() <= 0) { continue; diff --git a/modules/sdk-coin-sui/test/unit/sui.ts b/modules/sdk-coin-sui/test/unit/sui.ts index 76f095814d..846cd6c701 100644 --- a/modules/sdk-coin-sui/test/unit/sui.ts +++ b/modules/sdk-coin-sui/test/unit/sui.ts @@ -3018,6 +3018,25 @@ describe('SUI:', function () { sandBox.assert.callCount(basecoin.getBalance, 10); }); + + it('should surface RPC errors from getBalance instead of reporting no funds', async function () { + const callBack = sandBox.stub(Sui.prototype, 'getBalance' as keyof Sui); + callBack.rejects(new Error('Method not found')); + + await basecoin + .recover({ + userKey: keys.userKey, + backupKey: keys.backupKey, + bitgoKey: keys.bitgoKey, + recoveryDestination, + walletPassphrase, + startingScanIndex: '0', + scan: 1, + }) + .should.be.rejectedWith(/Failed to query Sui balance.*Method not found/); + + sandBox.assert.callCount(basecoin.getBalance, 1); + }); }); describe('Consolidation Transaction Failures:', () => { diff --git a/modules/sdk-core/src/bitgo/environments.ts b/modules/sdk-core/src/bitgo/environments.ts index b2ef2ff3d4..cf9cbdc0ef 100644 --- a/modules/sdk-core/src/bitgo/environments.ts +++ b/modules/sdk-core/src/bitgo/environments.ts @@ -210,7 +210,7 @@ const mainnetBase: EnvironmentTemplate = { }, hmacVerificationEnforced: true, tonNodeUrl: 'https://toncenter.com/api/v2/jsonRPC', - suiNodeUrl: 'https://fullnode.mainnet.sui.io', + suiNodeUrl: 'https://sui-rpc.publicnode.com', iotaNodeUrl: 'https://api.mainnet.iota.cafe', etcNodeUrl: 'https://etc.blockscout.com', coredaoExplorerBaseUrl: 'https://openapi.coredao.org', @@ -449,7 +449,7 @@ const testnetBase: EnvironmentTemplate = { }, hmacVerificationEnforced: false, tonNodeUrl: 'https://testnet.toncenter.com/api/v2/jsonRPC', - suiNodeUrl: 'https://fullnode.testnet.sui.io', + suiNodeUrl: 'https://sui-testnet-rpc.publicnode.com', iotaNodeUrl: 'https://api.testnet.iota.cafe', etcNodeUrl: 'https://etc-mordor.blockscout.com', coredaoExplorerBaseUrl: 'https://api.test2.btcs.network',