From 21396e574e4d3068fbf0f4a9f8579adb03b9b4c0 Mon Sep 17 00:00:00 2001 From: Kyle Leighton Date: Tue, 16 Sep 2025 11:55:04 -0400 Subject: [PATCH 1/3] chore: improve low gas balance message on Solana --- src/utils/errors.ts | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/utils/errors.ts b/src/utils/errors.ts index ea52c8e3b..eacac81e0 100644 --- a/src/utils/errors.ts +++ b/src/utils/errors.ts @@ -15,12 +15,15 @@ import { } from 'telemetry/types'; import { InsufficientFundsForGasError } from 'sdklegacy'; import { routes, amount as sdkAmount } from '@wormhole-foundation/sdk'; +import { chainDisplayName, getGasToken, getTokenSymbol } from 'utils'; // TODO SDKV2 // attempt to capture errors using regex export const INSUFFICIENT_ALLOWANCE_REGEX = /insufficient token allowance/im; export const INSUFFICIENT_LAMPORTS_REGEX = /insufficient lamports.*?(\d+).*?(\d+)/im; +export const SIMULATION_ACCOUNT_NOT_FOUND_REGEX = + /simulation failed:.*accountnotfound/i; export const USER_REJECTED_REGEX = new RegExp( 'user rejected|rejected the request|rejected from user|user cancel|aborted by user|plugin closed|denied request signature', 'mi', @@ -50,7 +53,8 @@ export function interpretTransferError( uiErrorMessage = 'Transfer timed out, please try again'; internalErrorCode = ERR_TIMEOUT; } else if (InsufficientFundsForGasError.MESSAGE_REGEX.test(e?.message)) { - uiErrorMessage = 'Insufficient funds'; + uiErrorMessage = + 'Insufficient funds for network fees, please add more funds and try again'; internalErrorCode = ERR_INSUFFICIENT_GAS; } else if (USER_REJECTED_REGEX.test(e?.message)) { uiErrorMessage = 'Transfer rejected in wallet, please try again'; @@ -74,17 +78,20 @@ export function interpretTransferError( : ''; uiErrorMessage = `Amount exceeds Circle limit${limitString}. Please reduce transfer amount.`; internalErrorCode = ERR_AMOUNT_TOO_LARGE; - } else if (INSUFFICIENT_LAMPORTS_REGEX.test(e?.message)) { - const lamportMatches = e?.message.match(INSUFFICIENT_LAMPORTS_REGEX); - const currentLamports = lamportMatches?.[1]; - const requiredLamports = lamportMatches?.[2]; - uiErrorMessage = `Insufficient funds for gas.`; - if (currentLamports && requiredLamports) { - const currentAmount = sdkAmount.fromBaseUnits(currentLamports, 9); - const requiredAmount = sdkAmount.fromBaseUnits(requiredLamports, 9); - uiErrorMessage += ` Current balance is ${sdkAmount.display( - currentAmount, - )} SOL, but required ${sdkAmount.display(requiredAmount)} SOL`; + } else if ( + SIMULATION_ACCOUNT_NOT_FOUND_REGEX.test(e?.message) || + INSUFFICIENT_LAMPORTS_REGEX.test(e?.message) + ) { + const gasChain = transferDetails.fromChain; + try { + const gasToken = getGasToken(gasChain); + const gasSymbol = getTokenSymbol(gasToken); + const chainName = chainDisplayName(gasChain); + const chainSuffix = chainName ? ` on ${chainName}` : ''; + uiErrorMessage = `Insufficient ${gasSymbol} for fees${chainSuffix}, please add more ${gasSymbol} and try again`; + } catch { + uiErrorMessage = + 'Insufficient funds for network fees, please add more funds and try again'; } internalErrorCode = ERR_INSUFFICIENT_GAS; } From 14be850225b225200e487eddb63be418abfa156b Mon Sep 17 00:00:00 2001 From: Kyle Leighton Date: Tue, 16 Sep 2025 16:49:15 -0400 Subject: [PATCH 2/3] chore: extract message into const --- src/utils/errors.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/utils/errors.ts b/src/utils/errors.ts index eacac81e0..47eededaa 100644 --- a/src/utils/errors.ts +++ b/src/utils/errors.ts @@ -29,6 +29,8 @@ export const USER_REJECTED_REGEX = new RegExp( 'mi', ); export const AMOUNT_IN_TOO_SMALL = new RegExp('AmountInTooSmall', 'm'); +const INSUFFICIENT_FUNDS_FOR_GAS_ERROR = + 'Insufficient funds for network fees. Please add more funds and try again'; export function interpretTransferError( e: any, @@ -53,8 +55,7 @@ export function interpretTransferError( uiErrorMessage = 'Transfer timed out, please try again'; internalErrorCode = ERR_TIMEOUT; } else if (InsufficientFundsForGasError.MESSAGE_REGEX.test(e?.message)) { - uiErrorMessage = - 'Insufficient funds for network fees, please add more funds and try again'; + uiErrorMessage = INSUFFICIENT_FUNDS_FOR_GAS_ERROR; internalErrorCode = ERR_INSUFFICIENT_GAS; } else if (USER_REJECTED_REGEX.test(e?.message)) { uiErrorMessage = 'Transfer rejected in wallet, please try again'; @@ -88,10 +89,9 @@ export function interpretTransferError( const gasSymbol = getTokenSymbol(gasToken); const chainName = chainDisplayName(gasChain); const chainSuffix = chainName ? ` on ${chainName}` : ''; - uiErrorMessage = `Insufficient ${gasSymbol} for fees${chainSuffix}, please add more ${gasSymbol} and try again`; + uiErrorMessage = `Insufficient ${gasSymbol} for fees${chainSuffix}. Please add more ${gasSymbol} and try again`; } catch { - uiErrorMessage = - 'Insufficient funds for network fees, please add more funds and try again'; + uiErrorMessage = INSUFFICIENT_FUNDS_FOR_GAS_ERROR; } internalErrorCode = ERR_INSUFFICIENT_GAS; } From 3713505107a063b63fb3b9aede040df0b447a613 Mon Sep 17 00:00:00 2001 From: Kyle Leighton Date: Tue, 16 Sep 2025 17:56:51 -0400 Subject: [PATCH 3/3] chore: run checksdn --- src/consts/wallet.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/consts/wallet.ts b/src/consts/wallet.ts index c2f093a24..7a29925bd 100644 --- a/src/consts/wallet.ts +++ b/src/consts/wallet.ts @@ -221,8 +221,11 @@ export const SANCTIONED_WALLETS = Object.freeze( 'TMuCgBejD5RsNANZdjGtaM3YyKGNgDoy7N', 'TNmRfnSUXZoWWzxcDDbf95eGQYXt1mJDt8', 'TNZxGWCwvsHr6JxQxzoeDXV597Yf7Zb7nV', + 'TQ5H49Wz3K57zNHmuXVp6uLzFwitxviABs', 'TQ5mpZPbQMSq2s1vSM3RJgiB1AsTsiTpFZ', + 'TRakpsE1mZjCUMNPyozR4BW2ZtJsF7ZWFN', 'TRBACioxdrdsYEZHvJWiUDZcMdBPpEe5Ub', + 'TSxAAo67VTDgKT537EVXxdogkJtk9c6ojz', 'TTAHMdqoom4f2VTWniroPWQHcTRZ4caoH4', 'TTgcTTNbNuFdbrhvbjMZVrdU5KALyzDaPw', 'TTKnV2S1295UrPr7N67Tp9ykNL7xX2Z4Uj', @@ -236,6 +239,7 @@ export const SANCTIONED_WALLETS = Object.freeze( 'TX5GV4DyfxNB3rPkzZJhmqZ1efVmL4rEqG', 'TXEaKf4rT3rMoD3Vuqnuhwr6vLq6BL5t33', 'TXEsK1sEsKjZ1xtHitnyAAoqw3WLdYdRNW', + 'TYDUutYN4YLKUPeT7TG27Yyqw6kNVLq9QZ', 'XnPFsRWTaSgiVauosEwQ6dEitGYXgwznz2', 'Xs3vzQmNvAxRa3Xo8XzQqUb3BMgb9EogF4', 'XyARKoupuArYtToA2S6yMdnoquDCDaBsaT', @@ -259,6 +263,7 @@ export const SANCTIONED_WALLETS = Object.freeze( '0x43fa21d92141BA9db43052492E0DeEE5aa5f0A93', '0x4F47Bc496083C727c5fbe3CE9CDf2B0f6496270c', '0x530A64c0Ce595026a4A556b703644228179E2d57', + '0x532B77B33A040587e9FD1800088225f99b8B0E8A', '0x53b6936513e738f44FB50d2b9476730C0Ab3Bfc1', '0x57EC89A0C056163A0314e413320f9B3ABe761259', '0x5A7a51bFb49F190e5A6060a5bc6052Ac14a3b59f', @@ -284,7 +289,9 @@ export const SANCTIONED_WALLETS = Object.freeze( '0xd5ED34b52AC4ab84d8FA8A231a3218bbF01Ed510', '0xD8500C631dC32FA18645B7436344a99E4825e10e', '0xd882cFc20F52f2599D84b8e8D58C7FB62cfE344b', + '0xDb2720ebAd55399117ddB4C4a4afd9a4CCAda8fE', '0xdcbEfFBECcE100cCE9E4b153C4e15cB885643193', + '0xE3D35f68383732649669aA990832E017340DbcA5', '0xE950DC316b836e4EeFb8308bf32Bf7C72a1358FF', '0xeD6e0A7e4Ac94D976eeBfB82ccf777A3c6baD921', '0xf3701F445b6BDaFeDbcA97D1e477357839e4120D',