@lifi/sdk 3.16.3 → 3.17.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/package.json +1 -1
  2. package/src/_cjs/core/EVM/getEVMBalance.js +8 -1
  3. package/src/_cjs/core/EVM/getEVMBalance.js.map +1 -1
  4. package/src/_cjs/core/Solana/getSolanaBalance.js +21 -18
  5. package/src/_cjs/core/Solana/getSolanaBalance.js.map +1 -1
  6. package/src/_cjs/core/Sui/getSuiBalance.js +9 -11
  7. package/src/_cjs/core/Sui/getSuiBalance.js.map +1 -1
  8. package/src/_cjs/core/UTXO/getUTXOBalance.js +10 -3
  9. package/src/_cjs/core/UTXO/getUTXOBalance.js.map +1 -1
  10. package/src/_cjs/core/checkBalance.js +106 -23
  11. package/src/_cjs/core/checkBalance.js.map +1 -1
  12. package/src/_cjs/version.js +1 -1
  13. package/src/_cjs/version.js.map +1 -1
  14. package/src/_esm/core/EVM/getEVMBalance.js +10 -1
  15. package/src/_esm/core/EVM/getEVMBalance.js.map +1 -1
  16. package/src/_esm/core/Solana/getSolanaBalance.js +24 -18
  17. package/src/_esm/core/Solana/getSolanaBalance.js.map +1 -1
  18. package/src/_esm/core/Sui/getSuiBalance.js +11 -11
  19. package/src/_esm/core/Sui/getSuiBalance.js.map +1 -1
  20. package/src/_esm/core/UTXO/getUTXOBalance.js +12 -3
  21. package/src/_esm/core/UTXO/getUTXOBalance.js.map +1 -1
  22. package/src/_esm/core/checkBalance.js +126 -25
  23. package/src/_esm/core/checkBalance.js.map +1 -1
  24. package/src/_esm/version.js +1 -1
  25. package/src/_esm/version.js.map +1 -1
  26. package/src/_types/core/UTXO/getUTXOBalance.d.ts.map +1 -1
  27. package/src/_types/core/checkBalance.d.ts +13 -1
  28. package/src/_types/core/checkBalance.d.ts.map +1 -1
  29. package/src/_types/version.d.ts +1 -1
  30. package/src/_types/version.d.ts.map +1 -1
  31. package/src/core/EVM/getEVMBalance.ts +10 -1
  32. package/src/core/Solana/getSolanaBalance.ts +23 -16
  33. package/src/core/Sui/getSuiBalance.ts +10 -10
  34. package/src/core/UTXO/getUTXOBalance.ts +15 -3
  35. package/src/core/checkBalance.ts +165 -33
  36. package/src/version.ts +1 -1
package/package.json CHANGED
@@ -70,5 +70,5 @@
70
70
  "sideEffects": false,
71
71
  "types": "./src/_types/index.d.ts",
72
72
  "typings": "./src/_types/index.d.ts",
73
- "version": "3.16.3"
73
+ "version": "3.17.0-beta.0"
74
74
  }
@@ -52,9 +52,16 @@ const getEVMBalanceMulticall = async (chainId, tokens, walletAddress, multicallA
52
52
  return [];
53
53
  }
54
54
  return tokens.map((token, i) => {
55
+ const result = results[i];
56
+ if (result.status !== 'success') {
57
+ return {
58
+ ...token,
59
+ blockNumber,
60
+ };
61
+ }
55
62
  return {
56
63
  ...token,
57
- amount: results[i].result,
64
+ amount: result.result,
58
65
  blockNumber,
59
66
  };
60
67
  });
@@ -1 +1 @@
1
- {"version":3,"file":"getEVMBalance.js","sourceRoot":"","sources":["../../../core/EVM/getEVMBalance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getEVMBalance.js","sourceRoot":"","sources":["../../../core/EVM/getEVMBalance.ts"],"names":[],"mappings":"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"}
@@ -38,14 +38,13 @@ const getSolanaBalanceDefault = async (_chainId, tokens, walletAddress) => {
38
38
  }),
39
39
  ]);
40
40
  const blockNumber = slot.status === 'fulfilled' ? BigInt(slot.value) : 0n;
41
- const solBalance = balance.status === 'fulfilled' ? BigInt(balance.value) : 0n;
41
+ const nativeBalanceOk = balance.status === 'fulfilled';
42
+ const solBalance = nativeBalanceOk ? BigInt(balance.value) : 0n;
43
+ const tokenProgramOk = tokenAccountsByOwner.status === 'fulfilled';
44
+ const token2022ProgramOk = token2022AccountsByOwner.status === 'fulfilled';
42
45
  const walletTokenAmounts = [
43
- ...(tokenAccountsByOwner.status === 'fulfilled'
44
- ? tokenAccountsByOwner.value.value
45
- : []),
46
- ...(token2022AccountsByOwner.status === 'fulfilled'
47
- ? token2022AccountsByOwner.value.value
48
- : []),
46
+ ...(tokenProgramOk ? tokenAccountsByOwner.value.value : []),
47
+ ...(token2022ProgramOk ? token2022AccountsByOwner.value.value : []),
49
48
  ].reduce((tokenAmounts, value) => {
50
49
  const amount = BigInt(value.account.data.parsed.info.tokenAmount.amount);
51
50
  if (amount > 0n) {
@@ -53,19 +52,23 @@ const getSolanaBalanceDefault = async (_chainId, tokens, walletAddress) => {
53
52
  }
54
53
  return tokenAmounts;
55
54
  }, {});
56
- walletTokenAmounts[constants_js_1.SolSystemProgram] = solBalance;
55
+ const splZeroIsKnown = tokenProgramOk && token2022ProgramOk;
57
56
  const tokenAmounts = tokens.map((token) => {
58
- if (walletTokenAmounts[token.address]) {
59
- return {
60
- ...token,
61
- amount: walletTokenAmounts[token.address],
62
- blockNumber,
63
- };
57
+ const isNative = token.address === constants_js_1.SolSystemProgram;
58
+ if (isNative) {
59
+ if (!nativeBalanceOk) {
60
+ return { ...token, blockNumber };
61
+ }
62
+ return { ...token, amount: solBalance, blockNumber };
64
63
  }
65
- return {
66
- ...token,
67
- blockNumber,
68
- };
64
+ const found = walletTokenAmounts[token.address];
65
+ if (found !== undefined) {
66
+ return { ...token, amount: found, blockNumber };
67
+ }
68
+ if (splZeroIsKnown) {
69
+ return { ...token, amount: 0n, blockNumber };
70
+ }
71
+ return { ...token, blockNumber };
69
72
  });
70
73
  return tokenAmounts;
71
74
  };
@@ -1 +1 @@
1
- {"version":3,"file":"getSolanaBalance.js","sourceRoot":"","sources":["../../../core/Solana/getSolanaBalance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getSolanaBalance.js","sourceRoot":"","sources":["../../../core/Solana/getSolanaBalance.ts"],"names":[],"mappings":"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"}
@@ -23,7 +23,8 @@ const getSuiBalanceDefault = async (_chainId, tokens, walletAddress) => {
23
23
  })), { id: `${getSuiBalanceDefault.name}.getAllBalances` }),
24
24
  (0, withDedupe_js_1.withDedupe)(() => (0, suiClient_js_1.callSuiWithRetry)((client) => client.getLatestCheckpointSequenceNumber()), { id: `${getSuiBalanceDefault.name}.getLatestCheckpointSequenceNumber` }),
25
25
  ]);
26
- const coinsResult = coins.status === 'fulfilled' ? coins.value : [];
26
+ const coinsOk = coins.status === 'fulfilled';
27
+ const coinsResult = coinsOk ? coins.value : [];
27
28
  const blockNumber = checkpoint.status === 'fulfilled' ? BigInt(checkpoint.value) : 0n;
28
29
  const walletTokenAmounts = coinsResult.reduce((tokenAmounts, coin) => {
29
30
  const amount = BigInt(coin.totalBalance);
@@ -37,17 +38,14 @@ const getSuiBalanceDefault = async (_chainId, tokens, walletAddress) => {
37
38
  walletTokenAmounts[types_js_1.SuiTokenLongAddress] = BigInt(suiTokenBalance.totalBalance);
38
39
  }
39
40
  const tokenAmounts = tokens.map((token) => {
40
- if (walletTokenAmounts[token.address]) {
41
- return {
42
- ...token,
43
- amount: walletTokenAmounts[token.address],
44
- blockNumber,
45
- };
41
+ const found = walletTokenAmounts[token.address];
42
+ if (found !== undefined) {
43
+ return { ...token, amount: found, blockNumber };
46
44
  }
47
- return {
48
- ...token,
49
- blockNumber,
50
- };
45
+ if (coinsOk) {
46
+ return { ...token, amount: 0n, blockNumber };
47
+ }
48
+ return { ...token, blockNumber };
51
49
  });
52
50
  return tokenAmounts;
53
51
  };
@@ -1 +1 @@
1
- {"version":3,"file":"getSuiBalance.js","sourceRoot":"","sources":["../../../core/Sui/getSuiBalance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getSuiBalance.js","sourceRoot":"","sources":["../../../core/Sui/getSuiBalance.ts"],"names":[],"mappings":"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"}
@@ -14,14 +14,21 @@ const getUTXOBalance = async (walletAddress, tokens) => {
14
14
  }
15
15
  }
16
16
  const client = await (0, getUTXOPublicClient_js_1.getUTXOPublicClient)(types_1.ChainId.BTC);
17
- const [balance, blockCount] = await Promise.all([
17
+ const [balance, blockCount] = await Promise.allSettled([
18
18
  client.getBalance({ address: walletAddress }),
19
19
  client.getBlockCount(),
20
20
  ]);
21
+ const blockNumber = blockCount.status === 'fulfilled' ? BigInt(blockCount.value) : 0n;
22
+ if (balance.status !== 'fulfilled') {
23
+ return tokens.map((token) => ({
24
+ ...token,
25
+ blockNumber,
26
+ }));
27
+ }
21
28
  return tokens.map((token) => ({
22
29
  ...token,
23
- amount: balance,
24
- blockNumber: BigInt(blockCount),
30
+ amount: balance.value,
31
+ blockNumber,
25
32
  }));
26
33
  };
27
34
  exports.getUTXOBalance = getUTXOBalance;
@@ -1 +1 @@
1
- {"version":3,"file":"getUTXOBalance.js","sourceRoot":"","sources":["../../../core/UTXO/getUTXOBalance.ts"],"names":[],"mappings":";;;AAAA,uCAAmE;AACnE,qEAA8D;AAEvD,MAAM,cAAc,GAAG,KAAK,EACjC,aAAqB,EACrB,MAAe,EACS,EAAE;IAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,IAAA,4CAAmB,EAAC,eAAO,CAAC,GAAG,CAAC,CAAA;IACrD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9C,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QAC7C,MAAM,CAAC,aAAa,EAAE;KACvB,CAAC,CAAA;IAEF,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5B,GAAG,KAAK;QACR,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;KAChC,CAAC,CAAC,CAAA;AACL,CAAC,CAAA;AAxBY,QAAA,cAAc,kBAwB1B"}
1
+ {"version":3,"file":"getUTXOBalance.js","sourceRoot":"","sources":["../../../core/UTXO/getUTXOBalance.ts"],"names":[],"mappings":";;;AAAA,uCAAmE;AACnE,qEAA8D;AAEvD,MAAM,cAAc,GAAG,KAAK,EACjC,aAAqB,EACrB,MAAe,EACS,EAAE;IAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,IAAA,4CAAmB,EAAC,eAAO,CAAC,GAAG,CAAC,CAAA;IACrD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACrD,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QAC7C,MAAM,CAAC,aAAa,EAAE;KACvB,CAAC,CAAA;IAEF,MAAM,WAAW,GACf,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAEnE,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAGnC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5B,GAAG,KAAK;YACR,WAAW;SACZ,CAAC,CAAC,CAAA;IACL,CAAC;IAED,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5B,GAAG,KAAK;QACR,MAAM,EAAE,OAAO,CAAC,KAAK;QACrB,WAAW;KACZ,CAAC,CAAC,CAAA;AACL,CAAC,CAAA;AApCY,QAAA,cAAc,kBAoC1B"}
@@ -2,36 +2,119 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.checkBalance = void 0;
4
4
  const viem_1 = require("viem");
5
+ const config_js_1 = require("../config.js");
5
6
  const errors_js_1 = require("../errors/errors.js");
6
- const balance_js_1 = require("../services/balance.js");
7
7
  const sleep_js_1 = require("../utils/sleep.js");
8
- const checkBalance = async (walletAddress, step, depth = 0) => {
9
- const token = await (0, balance_js_1.getTokenBalance)(walletAddress, step.action.fromToken);
10
- if (token) {
11
- const currentBalance = token.amount ?? 0n;
12
- const neededBalance = BigInt(step.action.fromAmount);
13
- if (currentBalance < neededBalance) {
14
- if (depth <= 3) {
15
- await (0, sleep_js_1.sleep)(200);
16
- await (0, exports.checkBalance)(walletAddress, step, depth + 1);
8
+ const MAX_ATTEMPTS = 6;
9
+ const BACKOFF_BASE_MS = 150;
10
+ const OVERALL_TIMEOUT_MS = 10_000;
11
+ const SLIPPAGE_PRECISION = 1000000000n;
12
+ const checkBalance = async (walletAddress, step) => {
13
+ const fromChainId = step.action.fromChainId;
14
+ const requirements = new Map();
15
+ const add = (token, amount, source) => {
16
+ if (token.chainId !== fromChainId || amount === 0n) {
17
+ return;
18
+ }
19
+ const key = token.address.toLowerCase();
20
+ const req = requirements.get(key) ?? {
21
+ token,
22
+ sourcePart: 0n,
23
+ overheadPart: 0n,
24
+ };
25
+ if (source) {
26
+ req.sourcePart += amount;
27
+ }
28
+ else {
29
+ req.overheadPart += amount;
30
+ }
31
+ requirements.set(key, req);
32
+ };
33
+ add(step.action.fromToken, BigInt(step.action.fromAmount), true);
34
+ for (const gas of step.estimate?.gasCosts ?? []) {
35
+ add(gas.token, BigInt(gas.amount), false);
36
+ }
37
+ for (const fee of step.estimate?.feeCosts ?? []) {
38
+ if (!fee.included) {
39
+ add(fee.token, BigInt(fee.amount), false);
40
+ }
41
+ }
42
+ if (requirements.size === 0) {
43
+ return;
44
+ }
45
+ const provider = config_js_1.config
46
+ .get()
47
+ .providers.find((p) => p.isAddress(walletAddress));
48
+ if (!provider) {
49
+ throw new Error(`SDK Token Provider for ${walletAddress} is not found.`);
50
+ }
51
+ const reqs = Array.from(requirements.values());
52
+ const tokens = reqs.map((r) => r.token);
53
+ const slippage = step.action.slippage ?? 0;
54
+ const slippageScaled = BigInt(Math.floor((1 - slippage) * Number(SLIPPAGE_PRECISION)));
55
+ await (0, viem_1.withTimeout)(async () => {
56
+ for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
57
+ const isFinal = attempt === MAX_ATTEMPTS - 1;
58
+ let balances;
59
+ try {
60
+ balances = await provider.getBalance(walletAddress, tokens);
17
61
  }
18
- else if ((neededBalance *
19
- BigInt((1 - (step.action.slippage ?? 0)) * 1_000_000_000)) /
20
- 1000000000n <=
21
- currentBalance) {
22
- step.action.fromAmount = currentBalance.toString();
62
+ catch (error) {
63
+ if (isFinal) {
64
+ throw new errors_js_1.BalanceError('Could not read wallet balance.', error);
65
+ }
66
+ await (0, sleep_js_1.sleep)(BACKOFF_BASE_MS * 2 ** attempt);
67
+ continue;
68
+ }
69
+ const balanceByAddress = new Map(balances.map((b) => [b.address.toLowerCase(), b.amount]));
70
+ const unknown = [];
71
+ const insufficient = [];
72
+ for (const req of reqs) {
73
+ const have = balanceByAddress.get(req.token.address.toLowerCase());
74
+ if (have === undefined) {
75
+ unknown.push(req.token);
76
+ }
77
+ else if (have < req.sourcePart + req.overheadPart) {
78
+ insufficient.push({ req, have });
79
+ }
23
80
  }
24
- else {
25
- const needed = (0, viem_1.formatUnits)(neededBalance, token.decimals);
26
- const current = (0, viem_1.formatUnits)(currentBalance, token.decimals);
27
- let errorMessage = `Your ${token.symbol} balance is too low, you try to transfer ${needed} ${token.symbol}, but your wallet only holds ${current} ${token.symbol}. No funds have been sent.`;
28
- if (currentBalance !== 0n) {
29
- errorMessage += `If the problem consists, please delete this transfer and start a new one with a maximum of ${current} ${token.symbol}.`;
81
+ if (unknown.length === 0 && insufficient.length === 0) {
82
+ return;
83
+ }
84
+ if (isFinal &&
85
+ unknown.length === 0 &&
86
+ insufficient.length === 1 &&
87
+ insufficient[0].req.sourcePart > 0n) {
88
+ const { req, have } = insufficient[0];
89
+ const minAcceptable = (req.sourcePart * slippageScaled) / SLIPPAGE_PRECISION +
90
+ req.overheadPart;
91
+ if (have >= minAcceptable) {
92
+ step.action.fromAmount = (have - req.overheadPart).toString();
93
+ return;
94
+ }
95
+ }
96
+ if (isFinal) {
97
+ if (unknown.length > 0) {
98
+ throw new errors_js_1.BalanceError('Could not read wallet balance.', new Error(`Could not read balance for: ${unknown
99
+ .map((t) => t.symbol || t.address)
100
+ .join(', ')}.`));
30
101
  }
31
- throw new errors_js_1.BalanceError('The balance is too low.', new Error(errorMessage));
102
+ const lines = insufficient.map(({ req, have }) => {
103
+ const needed = (0, viem_1.formatUnits)(req.sourcePart + req.overheadPart, req.token.decimals);
104
+ const current = (0, viem_1.formatUnits)(have, req.token.decimals);
105
+ const symbol = req.token.symbol;
106
+ return req.sourcePart > 0n
107
+ ? `Your ${symbol} balance is too low, you try to transfer ${needed} ${symbol}, but your wallet only holds ${current} ${symbol}.`
108
+ : `Insufficient ${symbol} for fees: need ${needed} ${symbol}, have ${current} ${symbol}.`;
109
+ });
110
+ throw new errors_js_1.BalanceError('The balance is too low.', new Error(`${lines.join(' ')} No funds have been sent.`));
32
111
  }
112
+ await (0, sleep_js_1.sleep)(BACKOFF_BASE_MS * 2 ** attempt);
33
113
  }
34
- }
114
+ }, {
115
+ timeout: OVERALL_TIMEOUT_MS,
116
+ errorInstance: new errors_js_1.BalanceError('Could not read wallet balance.'),
117
+ });
35
118
  };
36
119
  exports.checkBalance = checkBalance;
37
120
  //# sourceMappingURL=checkBalance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkBalance.js","sourceRoot":"","sources":["../../core/checkBalance.ts"],"names":[],"mappings":";;;AACA,+BAAkC;AAClC,mDAAkD;AAClD,uDAAwD;AACxD,gDAAyC;AAElC,MAAM,YAAY,GAAG,KAAK,EAC/B,aAAqB,EACrB,IAAc,EACd,KAAK,GAAG,CAAC,EACM,EAAE;IACjB,MAAM,KAAK,GAAG,MAAM,IAAA,4BAAe,EAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACzE,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAA;QACzC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAEpD,IAAI,cAAc,GAAG,aAAa,EAAE,CAAC;YACnC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,MAAM,IAAA,gBAAK,EAAC,GAAG,CAAC,CAAA;gBAChB,MAAM,IAAA,oBAAY,EAAC,aAAa,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;YACpD,CAAC;iBAAM,IACL,CAAC,aAAa;gBACZ,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;gBAC1D,WAAc;gBAChB,cAAc,EACd,CAAC;gBAED,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAA;YACpD,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,IAAA,kBAAW,EAAC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;gBACzD,MAAM,OAAO,GAAG,IAAA,kBAAW,EAAC,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;gBAC3D,IAAI,YAAY,GAAG,QAAQ,KAAK,CAAC,MAAM,4CAA4C,MAAM,IAAI,KAAK,CAAC,MAAM,gCAAgC,OAAO,IAAI,KAAK,CAAC,MAAM,4BAA4B,CAAA;gBAE5L,IAAI,cAAc,KAAK,EAAE,EAAE,CAAC;oBAC1B,YAAY,IAAI,8FAA8F,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,CAAA;gBAC1I,CAAC;gBAED,MAAM,IAAI,wBAAY,CACpB,yBAAyB,EACzB,IAAI,KAAK,CAAC,YAAY,CAAC,CACxB,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAtCY,QAAA,YAAY,gBAsCxB"}
1
+ {"version":3,"file":"checkBalance.js","sourceRoot":"","sources":["../../core/checkBalance.ts"],"names":[],"mappings":"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"}
@@ -2,5 +2,5 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.version = exports.name = void 0;
4
4
  exports.name = '@lifi/sdk';
5
- exports.version = '3.16.3';
5
+ exports.version = '3.17.0-beta.0';
6
6
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../version.ts"],"names":[],"mappings":";;;AAAa,QAAA,IAAI,GAAG,WAAW,CAAA;AAClB,QAAA,OAAO,GAAG,QAAQ,CAAA"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../version.ts"],"names":[],"mappings":";;;AAAa,QAAA,IAAI,GAAG,WAAW,CAAA;AAClB,QAAA,OAAO,GAAG,eAAe,CAAA"}
@@ -48,9 +48,18 @@ const getEVMBalanceMulticall = async (chainId, tokens, walletAddress, multicallA
48
48
  return [];
49
49
  }
50
50
  return tokens.map((token, i) => {
51
+ const result = results[i];
52
+ if (result.status !== 'success') {
53
+ // RPC sub-call failed — leave amount undefined so callers can
54
+ // distinguish an unknown balance from a known zero.
55
+ return {
56
+ ...token,
57
+ blockNumber,
58
+ };
59
+ }
51
60
  return {
52
61
  ...token,
53
- amount: results[i].result,
62
+ amount: result.result,
54
63
  blockNumber,
55
64
  };
56
65
  });
@@ -1 +1 @@
1
- {"version":3,"file":"getEVMBalance.js","sourceRoot":"","sources":["../../../core/EVM/getEVMBalance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getEVMBalance.js","sourceRoot":"","sources":["../../../core/EVM/getEVMBalance.ts"],"names":[],"mappings":"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"}
@@ -34,14 +34,13 @@ const getSolanaBalanceDefault = async (_chainId, tokens, walletAddress) => {
34
34
  }),
35
35
  ]);
36
36
  const blockNumber = slot.status === 'fulfilled' ? BigInt(slot.value) : 0n;
37
- const solBalance = balance.status === 'fulfilled' ? BigInt(balance.value) : 0n;
37
+ const nativeBalanceOk = balance.status === 'fulfilled';
38
+ const solBalance = nativeBalanceOk ? BigInt(balance.value) : 0n;
39
+ const tokenProgramOk = tokenAccountsByOwner.status === 'fulfilled';
40
+ const token2022ProgramOk = token2022AccountsByOwner.status === 'fulfilled';
38
41
  const walletTokenAmounts = [
39
- ...(tokenAccountsByOwner.status === 'fulfilled'
40
- ? tokenAccountsByOwner.value.value
41
- : []),
42
- ...(token2022AccountsByOwner.status === 'fulfilled'
43
- ? token2022AccountsByOwner.value.value
44
- : []),
42
+ ...(tokenProgramOk ? tokenAccountsByOwner.value.value : []),
43
+ ...(token2022ProgramOk ? token2022AccountsByOwner.value.value : []),
45
44
  ].reduce((tokenAmounts, value) => {
46
45
  const amount = BigInt(value.account.data.parsed.info.tokenAmount.amount);
47
46
  if (amount > 0n) {
@@ -49,19 +48,26 @@ const getSolanaBalanceDefault = async (_chainId, tokens, walletAddress) => {
49
48
  }
50
49
  return tokenAmounts;
51
50
  }, {});
52
- walletTokenAmounts[SolSystemProgram] = solBalance;
51
+ // We can only confidently report 0n for an SPL mint when both Token and
52
+ // Token2022 program queries succeeded — otherwise the mint may live in the
53
+ // program whose query failed (e.g. PYUSD on Token2022).
54
+ const splZeroIsKnown = tokenProgramOk && token2022ProgramOk;
53
55
  const tokenAmounts = tokens.map((token) => {
54
- if (walletTokenAmounts[token.address]) {
55
- return {
56
- ...token,
57
- amount: walletTokenAmounts[token.address],
58
- blockNumber,
59
- };
56
+ const isNative = token.address === SolSystemProgram;
57
+ if (isNative) {
58
+ if (!nativeBalanceOk) {
59
+ return { ...token, blockNumber };
60
+ }
61
+ return { ...token, amount: solBalance, blockNumber };
60
62
  }
61
- return {
62
- ...token,
63
- blockNumber,
64
- };
63
+ const found = walletTokenAmounts[token.address];
64
+ if (found !== undefined) {
65
+ return { ...token, amount: found, blockNumber };
66
+ }
67
+ if (splZeroIsKnown) {
68
+ return { ...token, amount: 0n, blockNumber };
69
+ }
70
+ return { ...token, blockNumber };
65
71
  });
66
72
  return tokenAmounts;
67
73
  };
@@ -1 +1 @@
1
- {"version":3,"file":"getSolanaBalance.js","sourceRoot":"","sources":["../../../core/Solana/getSolanaBalance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getSolanaBalance.js","sourceRoot":"","sources":["../../../core/Solana/getSolanaBalance.ts"],"names":[],"mappings":"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"}
@@ -20,7 +20,8 @@ const getSuiBalanceDefault = async (_chainId, tokens, walletAddress) => {
20
20
  })), { id: `${getSuiBalanceDefault.name}.getAllBalances` }),
21
21
  withDedupe(() => callSuiWithRetry((client) => client.getLatestCheckpointSequenceNumber()), { id: `${getSuiBalanceDefault.name}.getLatestCheckpointSequenceNumber` }),
22
22
  ]);
23
- const coinsResult = coins.status === 'fulfilled' ? coins.value : [];
23
+ const coinsOk = coins.status === 'fulfilled';
24
+ const coinsResult = coinsOk ? coins.value : [];
24
25
  const blockNumber = checkpoint.status === 'fulfilled' ? BigInt(checkpoint.value) : 0n;
25
26
  const walletTokenAmounts = coinsResult.reduce((tokenAmounts, coin) => {
26
27
  const amount = BigInt(coin.totalBalance);
@@ -34,17 +35,16 @@ const getSuiBalanceDefault = async (_chainId, tokens, walletAddress) => {
34
35
  walletTokenAmounts[SuiTokenLongAddress] = BigInt(suiTokenBalance.totalBalance);
35
36
  }
36
37
  const tokenAmounts = tokens.map((token) => {
37
- if (walletTokenAmounts[token.address]) {
38
- return {
39
- ...token,
40
- amount: walletTokenAmounts[token.address],
41
- blockNumber,
42
- };
38
+ const found = walletTokenAmounts[token.address];
39
+ if (found !== undefined) {
40
+ return { ...token, amount: found, blockNumber };
43
41
  }
44
- return {
45
- ...token,
46
- blockNumber,
47
- };
42
+ if (coinsOk) {
43
+ // Wallet genuinely has no coins of this type.
44
+ return { ...token, amount: 0n, blockNumber };
45
+ }
46
+ // RPC failed — leave amount undefined.
47
+ return { ...token, blockNumber };
48
48
  });
49
49
  return tokenAmounts;
50
50
  };
@@ -1 +1 @@
1
- {"version":3,"file":"getSuiBalance.js","sourceRoot":"","sources":["../../../core/Sui/getSuiBalance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getSuiBalance.js","sourceRoot":"","sources":["../../../core/Sui/getSuiBalance.ts"],"names":[],"mappings":"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"}
@@ -11,14 +11,23 @@ export const getUTXOBalance = async (walletAddress, tokens) => {
11
11
  }
12
12
  }
13
13
  const client = await getUTXOPublicClient(ChainId.BTC);
14
- const [balance, blockCount] = await Promise.all([
14
+ const [balance, blockCount] = await Promise.allSettled([
15
15
  client.getBalance({ address: walletAddress }),
16
16
  client.getBlockCount(),
17
17
  ]);
18
+ const blockNumber = blockCount.status === 'fulfilled' ? BigInt(blockCount.value) : 0n;
19
+ if (balance.status !== 'fulfilled') {
20
+ // RPC failed — leave amount undefined so callers can distinguish
21
+ // an unknown balance from a known zero.
22
+ return tokens.map((token) => ({
23
+ ...token,
24
+ blockNumber,
25
+ }));
26
+ }
18
27
  return tokens.map((token) => ({
19
28
  ...token,
20
- amount: balance,
21
- blockNumber: BigInt(blockCount),
29
+ amount: balance.value,
30
+ blockNumber,
22
31
  }));
23
32
  };
24
33
  //# sourceMappingURL=getUTXOBalance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getUTXOBalance.js","sourceRoot":"","sources":["../../../core/UTXO/getUTXOBalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAgC,MAAM,aAAa,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAE9D,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,aAAqB,EACrB,MAAe,EACS,EAAE;IAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACrD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9C,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QAC7C,MAAM,CAAC,aAAa,EAAE;KACvB,CAAC,CAAA;IAEF,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5B,GAAG,KAAK;QACR,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC;KAChC,CAAC,CAAC,CAAA;AACL,CAAC,CAAA"}
1
+ {"version":3,"file":"getUTXOBalance.js","sourceRoot":"","sources":["../../../core/UTXO/getUTXOBalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAgC,MAAM,aAAa,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAE9D,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,aAAqB,EACrB,MAAe,EACS,EAAE;IAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;IAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACrD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACrD,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QAC7C,MAAM,CAAC,aAAa,EAAE;KACvB,CAAC,CAAA;IAEF,MAAM,WAAW,GACf,UAAU,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAEnE,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,iEAAiE;QACjE,wCAAwC;QACxC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5B,GAAG,KAAK;YACR,WAAW;SACZ,CAAC,CAAC,CAAA;IACL,CAAC;IAED,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5B,GAAG,KAAK;QACR,MAAM,EAAE,OAAO,CAAC,KAAK;QACrB,WAAW;KACZ,CAAC,CAAC,CAAA;AACL,CAAC,CAAA"}
@@ -1,34 +1,135 @@
1
- import { formatUnits } from 'viem';
1
+ import { formatUnits, withTimeout } from 'viem';
2
+ import { config } from '../config.js';
2
3
  import { BalanceError } from '../errors/errors.js';
3
- import { getTokenBalance } from '../services/balance.js';
4
4
  import { sleep } from '../utils/sleep.js';
5
- export const checkBalance = async (walletAddress, step, depth = 0) => {
6
- const token = await getTokenBalance(walletAddress, step.action.fromToken);
7
- if (token) {
8
- const currentBalance = token.amount ?? 0n;
9
- const neededBalance = BigInt(step.action.fromAmount);
10
- if (currentBalance < neededBalance) {
11
- if (depth <= 3) {
12
- await sleep(200);
13
- await checkBalance(walletAddress, step, depth + 1);
5
+ const MAX_ATTEMPTS = 6;
6
+ // Exponential backoff: 150, 300, 600, 1200, 2400 → ≈4.65s of sleep total.
7
+ const BACKOFF_BASE_MS = 150;
8
+ const OVERALL_TIMEOUT_MS = 10_000;
9
+ const SLIPPAGE_PRECISION = 1000000000n;
10
+ /**
11
+ * Verifies that the wallet holds enough of every token required to execute
12
+ * the step on its source chain — the source-token amount, any gas costs, and
13
+ * any non-included fee costs. Reads all balances in one batched provider
14
+ * call, retries within a bounded budget to absorb transient RPC failures and
15
+ * post-confirmation propagation lag, and applies slippage to the source-token
16
+ * portion only as a last resort (overhead is never trimmed).
17
+ *
18
+ * Throws BalanceError("The balance is too low.") on a genuine shortfall, or
19
+ * BalanceError("Could not read wallet balance.") if the balance can't be read
20
+ * after retries.
21
+ */
22
+ export const checkBalance = async (walletAddress, step) => {
23
+ const fromChainId = step.action.fromChainId;
24
+ const requirements = new Map();
25
+ const add = (token, amount, source) => {
26
+ if (token.chainId !== fromChainId || amount === 0n) {
27
+ return;
28
+ }
29
+ const key = token.address.toLowerCase();
30
+ const req = requirements.get(key) ?? {
31
+ token,
32
+ sourcePart: 0n,
33
+ overheadPart: 0n,
34
+ };
35
+ if (source) {
36
+ req.sourcePart += amount;
37
+ }
38
+ else {
39
+ req.overheadPart += amount;
40
+ }
41
+ requirements.set(key, req);
42
+ };
43
+ add(step.action.fromToken, BigInt(step.action.fromAmount), true);
44
+ for (const gas of step.estimate?.gasCosts ?? []) {
45
+ add(gas.token, BigInt(gas.amount), false);
46
+ }
47
+ for (const fee of step.estimate?.feeCosts ?? []) {
48
+ // Included fees are already part of fromAmount — don't count twice.
49
+ if (!fee.included) {
50
+ add(fee.token, BigInt(fee.amount), false);
51
+ }
52
+ }
53
+ if (requirements.size === 0) {
54
+ return;
55
+ }
56
+ // Provider is dispatched by wallet address; all requirements share the
57
+ // source chain, which matches this provider by virtue of the address.
58
+ const provider = config
59
+ .get()
60
+ .providers.find((p) => p.isAddress(walletAddress));
61
+ if (!provider) {
62
+ throw new Error(`SDK Token Provider for ${walletAddress} is not found.`);
63
+ }
64
+ const reqs = Array.from(requirements.values());
65
+ const tokens = reqs.map((r) => r.token);
66
+ const slippage = step.action.slippage ?? 0;
67
+ const slippageScaled = BigInt(Math.floor((1 - slippage) * Number(SLIPPAGE_PRECISION)));
68
+ await withTimeout(async () => {
69
+ for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
70
+ const isFinal = attempt === MAX_ATTEMPTS - 1;
71
+ let balances;
72
+ try {
73
+ balances = await provider.getBalance(walletAddress, tokens);
14
74
  }
15
- else if ((neededBalance *
16
- BigInt((1 - (step.action.slippage ?? 0)) * 1_000_000_000)) /
17
- 1000000000n <=
18
- currentBalance) {
19
- // adjust amount in slippage limits
20
- step.action.fromAmount = currentBalance.toString();
75
+ catch (error) {
76
+ if (isFinal) {
77
+ throw new BalanceError('Could not read wallet balance.', error);
78
+ }
79
+ await sleep(BACKOFF_BASE_MS * 2 ** attempt);
80
+ continue;
81
+ }
82
+ const balanceByAddress = new Map(balances.map((b) => [b.address.toLowerCase(), b.amount]));
83
+ const unknown = [];
84
+ const insufficient = [];
85
+ for (const req of reqs) {
86
+ const have = balanceByAddress.get(req.token.address.toLowerCase());
87
+ if (have === undefined) {
88
+ unknown.push(req.token);
89
+ }
90
+ else if (have < req.sourcePart + req.overheadPart) {
91
+ insufficient.push({ req, have });
92
+ }
21
93
  }
22
- else {
23
- const needed = formatUnits(neededBalance, token.decimals);
24
- const current = formatUnits(currentBalance, token.decimals);
25
- let errorMessage = `Your ${token.symbol} balance is too low, you try to transfer ${needed} ${token.symbol}, but your wallet only holds ${current} ${token.symbol}. No funds have been sent.`;
26
- if (currentBalance !== 0n) {
27
- errorMessage += `If the problem consists, please delete this transfer and start a new one with a maximum of ${current} ${token.symbol}.`;
94
+ if (unknown.length === 0 && insufficient.length === 0) {
95
+ return;
96
+ }
97
+ // Final-attempt slippage rescue: only when the sole shortfall is the
98
+ // source-token portion. Trim source down to (balance overhead) so
99
+ // the overhead reserve is preserved.
100
+ if (isFinal &&
101
+ unknown.length === 0 &&
102
+ insufficient.length === 1 &&
103
+ insufficient[0].req.sourcePart > 0n) {
104
+ const { req, have } = insufficient[0];
105
+ const minAcceptable = (req.sourcePart * slippageScaled) / SLIPPAGE_PRECISION +
106
+ req.overheadPart;
107
+ if (have >= minAcceptable) {
108
+ step.action.fromAmount = (have - req.overheadPart).toString();
109
+ return;
110
+ }
111
+ }
112
+ if (isFinal) {
113
+ if (unknown.length > 0) {
114
+ throw new BalanceError('Could not read wallet balance.', new Error(`Could not read balance for: ${unknown
115
+ .map((t) => t.symbol || t.address)
116
+ .join(', ')}.`));
28
117
  }
29
- throw new BalanceError('The balance is too low.', new Error(errorMessage));
118
+ const lines = insufficient.map(({ req, have }) => {
119
+ const needed = formatUnits(req.sourcePart + req.overheadPart, req.token.decimals);
120
+ const current = formatUnits(have, req.token.decimals);
121
+ const symbol = req.token.symbol;
122
+ return req.sourcePart > 0n
123
+ ? `Your ${symbol} balance is too low, you try to transfer ${needed} ${symbol}, but your wallet only holds ${current} ${symbol}.`
124
+ : `Insufficient ${symbol} for fees: need ${needed} ${symbol}, have ${current} ${symbol}.`;
125
+ });
126
+ throw new BalanceError('The balance is too low.', new Error(`${lines.join(' ')} No funds have been sent.`));
30
127
  }
128
+ await sleep(BACKOFF_BASE_MS * 2 ** attempt);
31
129
  }
32
- }
130
+ }, {
131
+ timeout: OVERALL_TIMEOUT_MS,
132
+ errorInstance: new BalanceError('Could not read wallet balance.'),
133
+ });
33
134
  };
34
135
  //# sourceMappingURL=checkBalance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkBalance.js","sourceRoot":"","sources":["../../core/checkBalance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,aAAqB,EACrB,IAAc,EACd,KAAK,GAAG,CAAC,EACM,EAAE;IACjB,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACzE,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAA;QACzC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAEpD,IAAI,cAAc,GAAG,aAAa,EAAE,CAAC;YACnC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA;gBAChB,MAAM,YAAY,CAAC,aAAa,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;YACpD,CAAC;iBAAM,IACL,CAAC,aAAa;gBACZ,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC;gBAC1D,WAAc;gBAChB,cAAc,EACd,CAAC;gBACD,mCAAmC;gBACnC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAA;YACpD,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,WAAW,CAAC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;gBACzD,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;gBAC3D,IAAI,YAAY,GAAG,QAAQ,KAAK,CAAC,MAAM,4CAA4C,MAAM,IAAI,KAAK,CAAC,MAAM,gCAAgC,OAAO,IAAI,KAAK,CAAC,MAAM,4BAA4B,CAAA;gBAE5L,IAAI,cAAc,KAAK,EAAE,EAAE,CAAC;oBAC1B,YAAY,IAAI,8FAA8F,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,CAAA;gBAC1I,CAAC;gBAED,MAAM,IAAI,YAAY,CACpB,yBAAyB,EACzB,IAAI,KAAK,CAAC,YAAY,CAAC,CACxB,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"checkBalance.js","sourceRoot":"","sources":["../../core/checkBalance.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  export const name = '@lifi/sdk';
2
- export const version = '3.16.3';
2
+ export const version = '3.17.0-beta.0';
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,WAAW,CAAA;AAC/B,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAA"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,WAAW,CAAA;AAC/B,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"getUTXOBalance.d.ts","sourceRoot":"","sources":["../../../core/UTXO/getUTXOBalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAGnE,eAAO,MAAM,cAAc,GACzB,eAAe,MAAM,EACrB,QAAQ,KAAK,EAAE,KACd,OAAO,CAAC,WAAW,EAAE,CAqBvB,CAAA"}
1
+ {"version":3,"file":"getUTXOBalance.d.ts","sourceRoot":"","sources":["../../../core/UTXO/getUTXOBalance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAGnE,eAAO,MAAM,cAAc,GACzB,eAAe,MAAM,EACrB,QAAQ,KAAK,EAAE,KACd,OAAO,CAAC,WAAW,EAAE,CAiCvB,CAAA"}
@@ -1,3 +1,15 @@
1
1
  import type { LiFiStep } from '@lifi/types';
2
- export declare const checkBalance: (walletAddress: string, step: LiFiStep, depth?: number) => Promise<void>;
2
+ /**
3
+ * Verifies that the wallet holds enough of every token required to execute
4
+ * the step on its source chain — the source-token amount, any gas costs, and
5
+ * any non-included fee costs. Reads all balances in one batched provider
6
+ * call, retries within a bounded budget to absorb transient RPC failures and
7
+ * post-confirmation propagation lag, and applies slippage to the source-token
8
+ * portion only as a last resort (overhead is never trimmed).
9
+ *
10
+ * Throws BalanceError("The balance is too low.") on a genuine shortfall, or
11
+ * BalanceError("Could not read wallet balance.") if the balance can't be read
12
+ * after retries.
13
+ */
14
+ export declare const checkBalance: (walletAddress: string, step: LiFiStep) => Promise<void>;
3
15
  //# sourceMappingURL=checkBalance.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkBalance.d.ts","sourceRoot":"","sources":["../../core/checkBalance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAM3C,eAAO,MAAM,YAAY,GACvB,eAAe,MAAM,EACrB,MAAM,QAAQ,EACd,cAAS,KACR,OAAO,CAAC,IAAI,CAkCd,CAAA"}
1
+ {"version":3,"file":"checkBalance.d.ts","sourceRoot":"","sources":["../../core/checkBalance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAsB,MAAM,aAAa,CAAA;AAkB/D;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,GACvB,eAAe,MAAM,EACrB,MAAM,QAAQ,KACb,OAAO,CAAC,IAAI,CA+Id,CAAA"}
@@ -1,3 +1,3 @@
1
1
  export declare const name = "@lifi/sdk";
2
- export declare const version = "3.16.3";
2
+ export declare const version = "3.17.0-beta.0";
3
3
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,cAAc,CAAA;AAC/B,eAAO,MAAM,OAAO,WAAW,CAAA"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,cAAc,CAAA;AAC/B,eAAO,MAAM,OAAO,kBAAkB,CAAA"}
@@ -76,9 +76,18 @@ const getEVMBalanceMulticall = async (
76
76
  }
77
77
 
78
78
  return tokens.map((token, i: number) => {
79
+ const result = results[i]
80
+ if (result.status !== 'success') {
81
+ // RPC sub-call failed — leave amount undefined so callers can
82
+ // distinguish an unknown balance from a known zero.
83
+ return {
84
+ ...token,
85
+ blockNumber,
86
+ }
87
+ }
79
88
  return {
80
89
  ...token,
81
- amount: results[i].result as bigint,
90
+ amount: result.result as bigint,
82
91
  blockNumber,
83
92
  }
84
93
  })
@@ -76,15 +76,14 @@ const getSolanaBalanceDefault = async (
76
76
  ),
77
77
  ])
78
78
  const blockNumber = slot.status === 'fulfilled' ? BigInt(slot.value) : 0n
79
- const solBalance = balance.status === 'fulfilled' ? BigInt(balance.value) : 0n
79
+ const nativeBalanceOk = balance.status === 'fulfilled'
80
+ const solBalance = nativeBalanceOk ? BigInt(balance.value) : 0n
81
+ const tokenProgramOk = tokenAccountsByOwner.status === 'fulfilled'
82
+ const token2022ProgramOk = token2022AccountsByOwner.status === 'fulfilled'
80
83
 
81
84
  const walletTokenAmounts = [
82
- ...(tokenAccountsByOwner.status === 'fulfilled'
83
- ? tokenAccountsByOwner.value.value
84
- : []),
85
- ...(token2022AccountsByOwner.status === 'fulfilled'
86
- ? token2022AccountsByOwner.value.value
87
- : []),
85
+ ...(tokenProgramOk ? tokenAccountsByOwner.value.value : []),
86
+ ...(token2022ProgramOk ? token2022AccountsByOwner.value.value : []),
88
87
  ].reduce(
89
88
  (tokenAmounts: Record<string, bigint>, value: any) => {
90
89
  const amount = BigInt(value.account.data.parsed.info.tokenAmount.amount)
@@ -96,19 +95,27 @@ const getSolanaBalanceDefault = async (
96
95
  {} as Record<string, bigint>
97
96
  )
98
97
 
99
- walletTokenAmounts[SolSystemProgram] = solBalance
98
+ // We can only confidently report 0n for an SPL mint when both Token and
99
+ // Token2022 program queries succeeded — otherwise the mint may live in the
100
+ // program whose query failed (e.g. PYUSD on Token2022).
101
+ const splZeroIsKnown = tokenProgramOk && token2022ProgramOk
102
+
100
103
  const tokenAmounts: TokenAmount[] = tokens.map((token) => {
101
- if (walletTokenAmounts[token.address]) {
102
- return {
103
- ...token,
104
- amount: walletTokenAmounts[token.address],
105
- blockNumber,
104
+ const isNative = token.address === SolSystemProgram
105
+ if (isNative) {
106
+ if (!nativeBalanceOk) {
107
+ return { ...token, blockNumber }
106
108
  }
109
+ return { ...token, amount: solBalance, blockNumber }
110
+ }
111
+ const found = walletTokenAmounts[token.address]
112
+ if (found !== undefined) {
113
+ return { ...token, amount: found, blockNumber }
107
114
  }
108
- return {
109
- ...token,
110
- blockNumber,
115
+ if (splZeroIsKnown) {
116
+ return { ...token, amount: 0n, blockNumber }
111
117
  }
118
+ return { ...token, blockNumber }
112
119
  })
113
120
  return tokenAmounts
114
121
  }
@@ -45,7 +45,8 @@ const getSuiBalanceDefault = async (
45
45
  ),
46
46
  ])
47
47
 
48
- const coinsResult = coins.status === 'fulfilled' ? coins.value : []
48
+ const coinsOk = coins.status === 'fulfilled'
49
+ const coinsResult = coinsOk ? coins.value : []
49
50
  const blockNumber =
50
51
  checkpoint.status === 'fulfilled' ? BigInt(checkpoint.value) : 0n
51
52
 
@@ -70,17 +71,16 @@ const getSuiBalanceDefault = async (
70
71
  }
71
72
 
72
73
  const tokenAmounts: TokenAmount[] = tokens.map((token) => {
73
- if (walletTokenAmounts[token.address]) {
74
- return {
75
- ...token,
76
- amount: walletTokenAmounts[token.address],
77
- blockNumber,
78
- }
74
+ const found = walletTokenAmounts[token.address]
75
+ if (found !== undefined) {
76
+ return { ...token, amount: found, blockNumber }
79
77
  }
80
- return {
81
- ...token,
82
- blockNumber,
78
+ if (coinsOk) {
79
+ // Wallet genuinely has no coins of this type.
80
+ return { ...token, amount: 0n, blockNumber }
83
81
  }
82
+ // RPC failed — leave amount undefined.
83
+ return { ...token, blockNumber }
84
84
  })
85
85
  return tokenAmounts
86
86
  }
@@ -15,14 +15,26 @@ export const getUTXOBalance = async (
15
15
  }
16
16
  }
17
17
  const client = await getUTXOPublicClient(ChainId.BTC)
18
- const [balance, blockCount] = await Promise.all([
18
+ const [balance, blockCount] = await Promise.allSettled([
19
19
  client.getBalance({ address: walletAddress }),
20
20
  client.getBlockCount(),
21
21
  ])
22
22
 
23
+ const blockNumber =
24
+ blockCount.status === 'fulfilled' ? BigInt(blockCount.value) : 0n
25
+
26
+ if (balance.status !== 'fulfilled') {
27
+ // RPC failed — leave amount undefined so callers can distinguish
28
+ // an unknown balance from a known zero.
29
+ return tokens.map((token) => ({
30
+ ...token,
31
+ blockNumber,
32
+ }))
33
+ }
34
+
23
35
  return tokens.map((token) => ({
24
36
  ...token,
25
- amount: balance,
26
- blockNumber: BigInt(blockCount),
37
+ amount: balance.value,
38
+ blockNumber,
27
39
  }))
28
40
  }
@@ -1,45 +1,177 @@
1
- import type { LiFiStep } from '@lifi/types'
2
- import { formatUnits } from 'viem'
1
+ import type { LiFiStep, Token, TokenAmount } from '@lifi/types'
2
+ import { formatUnits, withTimeout } from 'viem'
3
+ import { config } from '../config.js'
3
4
  import { BalanceError } from '../errors/errors.js'
4
- import { getTokenBalance } from '../services/balance.js'
5
5
  import { sleep } from '../utils/sleep.js'
6
6
 
7
+ const MAX_ATTEMPTS = 6
8
+ // Exponential backoff: 150, 300, 600, 1200, 2400 → ≈4.65s of sleep total.
9
+ const BACKOFF_BASE_MS = 150
10
+ const OVERALL_TIMEOUT_MS = 10_000
11
+ const SLIPPAGE_PRECISION = 1_000_000_000n
12
+
13
+ type Requirement = {
14
+ token: Token
15
+ sourcePart: bigint // 0n for pure overhead tokens
16
+ overheadPart: bigint // gas + non-included fees in this token
17
+ }
18
+
19
+ /**
20
+ * Verifies that the wallet holds enough of every token required to execute
21
+ * the step on its source chain — the source-token amount, any gas costs, and
22
+ * any non-included fee costs. Reads all balances in one batched provider
23
+ * call, retries within a bounded budget to absorb transient RPC failures and
24
+ * post-confirmation propagation lag, and applies slippage to the source-token
25
+ * portion only as a last resort (overhead is never trimmed).
26
+ *
27
+ * Throws BalanceError("The balance is too low.") on a genuine shortfall, or
28
+ * BalanceError("Could not read wallet balance.") if the balance can't be read
29
+ * after retries.
30
+ */
7
31
  export const checkBalance = async (
8
32
  walletAddress: string,
9
- step: LiFiStep,
10
- depth = 0
33
+ step: LiFiStep
11
34
  ): Promise<void> => {
12
- const token = await getTokenBalance(walletAddress, step.action.fromToken)
13
- if (token) {
14
- const currentBalance = token.amount ?? 0n
15
- const neededBalance = BigInt(step.action.fromAmount)
16
-
17
- if (currentBalance < neededBalance) {
18
- if (depth <= 3) {
19
- await sleep(200)
20
- await checkBalance(walletAddress, step, depth + 1)
21
- } else if (
22
- (neededBalance *
23
- BigInt((1 - (step.action.slippage ?? 0)) * 1_000_000_000)) /
24
- 1_000_000_000n <=
25
- currentBalance
26
- ) {
27
- // adjust amount in slippage limits
28
- step.action.fromAmount = currentBalance.toString()
29
- } else {
30
- const needed = formatUnits(neededBalance, token.decimals)
31
- const current = formatUnits(currentBalance, token.decimals)
32
- let errorMessage = `Your ${token.symbol} balance is too low, you try to transfer ${needed} ${token.symbol}, but your wallet only holds ${current} ${token.symbol}. No funds have been sent.`
33
-
34
- if (currentBalance !== 0n) {
35
- errorMessage += `If the problem consists, please delete this transfer and start a new one with a maximum of ${current} ${token.symbol}.`
35
+ const fromChainId = step.action.fromChainId
36
+ const requirements = new Map<string, Requirement>()
37
+ const add = (token: Token, amount: bigint, source: boolean): void => {
38
+ if (token.chainId !== fromChainId || amount === 0n) {
39
+ return
40
+ }
41
+ const key = token.address.toLowerCase()
42
+ const req = requirements.get(key) ?? {
43
+ token,
44
+ sourcePart: 0n,
45
+ overheadPart: 0n,
46
+ }
47
+ if (source) {
48
+ req.sourcePart += amount
49
+ } else {
50
+ req.overheadPart += amount
51
+ }
52
+ requirements.set(key, req)
53
+ }
54
+ add(step.action.fromToken, BigInt(step.action.fromAmount), true)
55
+ for (const gas of step.estimate?.gasCosts ?? []) {
56
+ add(gas.token, BigInt(gas.amount), false)
57
+ }
58
+ for (const fee of step.estimate?.feeCosts ?? []) {
59
+ // Included fees are already part of fromAmount — don't count twice.
60
+ if (!fee.included) {
61
+ add(fee.token, BigInt(fee.amount), false)
62
+ }
63
+ }
64
+ if (requirements.size === 0) {
65
+ return
66
+ }
67
+
68
+ // Provider is dispatched by wallet address; all requirements share the
69
+ // source chain, which matches this provider by virtue of the address.
70
+ const provider = config
71
+ .get()
72
+ .providers.find((p) => p.isAddress(walletAddress))
73
+ if (!provider) {
74
+ throw new Error(`SDK Token Provider for ${walletAddress} is not found.`)
75
+ }
76
+
77
+ const reqs = Array.from(requirements.values())
78
+ const tokens = reqs.map((r) => r.token)
79
+ const slippage = step.action.slippage ?? 0
80
+ const slippageScaled = BigInt(
81
+ Math.floor((1 - slippage) * Number(SLIPPAGE_PRECISION))
82
+ )
83
+
84
+ await withTimeout(
85
+ async () => {
86
+ for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
87
+ const isFinal = attempt === MAX_ATTEMPTS - 1
88
+
89
+ let balances: TokenAmount[]
90
+ try {
91
+ balances = await provider.getBalance(walletAddress, tokens)
92
+ } catch (error) {
93
+ if (isFinal) {
94
+ throw new BalanceError(
95
+ 'Could not read wallet balance.',
96
+ error as Error
97
+ )
98
+ }
99
+ await sleep(BACKOFF_BASE_MS * 2 ** attempt)
100
+ continue
36
101
  }
37
102
 
38
- throw new BalanceError(
39
- 'The balance is too low.',
40
- new Error(errorMessage)
103
+ const balanceByAddress = new Map(
104
+ balances.map((b) => [b.address.toLowerCase(), b.amount] as const)
41
105
  )
106
+
107
+ const unknown: Token[] = []
108
+ const insufficient: { req: Requirement; have: bigint }[] = []
109
+ for (const req of reqs) {
110
+ const have = balanceByAddress.get(req.token.address.toLowerCase())
111
+ if (have === undefined) {
112
+ unknown.push(req.token)
113
+ } else if (have < req.sourcePart + req.overheadPart) {
114
+ insufficient.push({ req, have })
115
+ }
116
+ }
117
+
118
+ if (unknown.length === 0 && insufficient.length === 0) {
119
+ return
120
+ }
121
+
122
+ // Final-attempt slippage rescue: only when the sole shortfall is the
123
+ // source-token portion. Trim source down to (balance − overhead) so
124
+ // the overhead reserve is preserved.
125
+ if (
126
+ isFinal &&
127
+ unknown.length === 0 &&
128
+ insufficient.length === 1 &&
129
+ insufficient[0].req.sourcePart > 0n
130
+ ) {
131
+ const { req, have } = insufficient[0]
132
+ const minAcceptable =
133
+ (req.sourcePart * slippageScaled) / SLIPPAGE_PRECISION +
134
+ req.overheadPart
135
+ if (have >= minAcceptable) {
136
+ step.action.fromAmount = (have - req.overheadPart).toString()
137
+ return
138
+ }
139
+ }
140
+
141
+ if (isFinal) {
142
+ if (unknown.length > 0) {
143
+ throw new BalanceError(
144
+ 'Could not read wallet balance.',
145
+ new Error(
146
+ `Could not read balance for: ${unknown
147
+ .map((t) => t.symbol || t.address)
148
+ .join(', ')}.`
149
+ )
150
+ )
151
+ }
152
+ const lines = insufficient.map(({ req, have }) => {
153
+ const needed = formatUnits(
154
+ req.sourcePart + req.overheadPart,
155
+ req.token.decimals
156
+ )
157
+ const current = formatUnits(have, req.token.decimals)
158
+ const symbol = req.token.symbol
159
+ return req.sourcePart > 0n
160
+ ? `Your ${symbol} balance is too low, you try to transfer ${needed} ${symbol}, but your wallet only holds ${current} ${symbol}.`
161
+ : `Insufficient ${symbol} for fees: need ${needed} ${symbol}, have ${current} ${symbol}.`
162
+ })
163
+ throw new BalanceError(
164
+ 'The balance is too low.',
165
+ new Error(`${lines.join(' ')} No funds have been sent.`)
166
+ )
167
+ }
168
+
169
+ await sleep(BACKOFF_BASE_MS * 2 ** attempt)
42
170
  }
171
+ },
172
+ {
173
+ timeout: OVERALL_TIMEOUT_MS,
174
+ errorInstance: new BalanceError('Could not read wallet balance.'),
43
175
  }
44
- }
176
+ )
45
177
  }
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export const name = '@lifi/sdk'
2
- export const version = '3.16.3'
2
+ export const version = '3.17.0-beta.0'