@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.
- package/package.json +1 -1
- package/src/_cjs/core/EVM/getEVMBalance.js +8 -1
- package/src/_cjs/core/EVM/getEVMBalance.js.map +1 -1
- package/src/_cjs/core/Solana/getSolanaBalance.js +21 -18
- package/src/_cjs/core/Solana/getSolanaBalance.js.map +1 -1
- package/src/_cjs/core/Sui/getSuiBalance.js +9 -11
- package/src/_cjs/core/Sui/getSuiBalance.js.map +1 -1
- package/src/_cjs/core/UTXO/getUTXOBalance.js +10 -3
- package/src/_cjs/core/UTXO/getUTXOBalance.js.map +1 -1
- package/src/_cjs/core/checkBalance.js +106 -23
- package/src/_cjs/core/checkBalance.js.map +1 -1
- package/src/_cjs/version.js +1 -1
- package/src/_cjs/version.js.map +1 -1
- package/src/_esm/core/EVM/getEVMBalance.js +10 -1
- package/src/_esm/core/EVM/getEVMBalance.js.map +1 -1
- package/src/_esm/core/Solana/getSolanaBalance.js +24 -18
- package/src/_esm/core/Solana/getSolanaBalance.js.map +1 -1
- package/src/_esm/core/Sui/getSuiBalance.js +11 -11
- package/src/_esm/core/Sui/getSuiBalance.js.map +1 -1
- package/src/_esm/core/UTXO/getUTXOBalance.js +12 -3
- package/src/_esm/core/UTXO/getUTXOBalance.js.map +1 -1
- package/src/_esm/core/checkBalance.js +126 -25
- package/src/_esm/core/checkBalance.js.map +1 -1
- package/src/_esm/version.js +1 -1
- package/src/_esm/version.js.map +1 -1
- package/src/_types/core/UTXO/getUTXOBalance.d.ts.map +1 -1
- package/src/_types/core/checkBalance.d.ts +13 -1
- package/src/_types/core/checkBalance.d.ts.map +1 -1
- package/src/_types/version.d.ts +1 -1
- package/src/_types/version.d.ts.map +1 -1
- package/src/core/EVM/getEVMBalance.ts +10 -1
- package/src/core/Solana/getSolanaBalance.ts +23 -16
- package/src/core/Sui/getSuiBalance.ts +10 -10
- package/src/core/UTXO/getUTXOBalance.ts +15 -3
- package/src/core/checkBalance.ts +165 -33
- package/src/version.ts +1 -1
package/package.json
CHANGED
|
@@ -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:
|
|
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":";;;AAEA,0CAKqB;AACrB,mEAA4D;AAC5D,qCAAyD;AACzD,uDAAmD;AACnD,yCAAgD;AAEzC,MAAM,aAAa,GAAG,KAAK,EAChC,aAAsB,EACtB,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;IAED,MAAM,gBAAgB,GAAG,MAAM,IAAA,8BAAmB,EAAC,OAAO,CAAC,CAAA;IAE3D,IAAI,gBAAgB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,sBAAsB,CAC3B,OAAO,EACP,MAAM,EACN,aAAa,EACb,gBAAgB,CACjB,CAAA;IACH,CAAC;IACD,OAAO,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAA;AAC7D,CAAC,CAAA;AAzBY,QAAA,aAAa,iBAyBzB;AAED,MAAM,sBAAsB,GAAG,KAAK,EAClC,OAAgB,EAChB,MAAe,EACf,aAAqB,EACrB,gBAAwB,EACA,EAAE;IAC1B,MAAM,MAAM,GAAG,MAAM,IAAA,iCAAe,EAAC,OAAO,CAAC,CAAA;IAE7C,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACrC,IAAI,IAAA,gCAAa,EAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,OAAO;gBACL,OAAO,EAAE,gBAA2B;gBACpC,GAAG,EAAE,yBAAgB;gBACrB,YAAY,EAAE,eAAe;gBAC7B,IAAI,EAAE,CAAC,aAAa,CAAC;aACtB,CAAA;QACH,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAkB;YACjC,GAAG,EAAE,qBAAY;YACjB,YAAY,EAAE,WAAW;YACzB,IAAI,EAAE,CAAC,aAAa,CAAC;SACtB,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/C,IAAA,wBAAc,EAAC,MAAM,CAAC;QACtB,IAAA,mBAAS,EAAC,MAAM,EAAE;YAChB,SAAS;YACT,gBAAgB,EAAE,gBAA2B;SAC9C,CAAC;KACH,CAAC,CAAA;IAEF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAS,EAAE,EAAE;QACrC,OAAO;YACL,GAAG,KAAK;YACR,MAAM,EAAE,
|
|
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
|
|
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.
|
|
44
|
-
|
|
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
|
-
|
|
55
|
+
const splZeroIsKnown = tokenProgramOk && token2022ProgramOk;
|
|
57
56
|
const tokenAmounts = tokens.map((token) => {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
66
|
-
|
|
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":";;;AACA,6CAA2C;AAC3C,qDAAqD;AACrD,6DAAsD;AACtD,mDAAqD;AACrD,yCAA+D;AAExD,MAAM,gBAAgB,GAAG,KAAK,EACnC,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;IAED,OAAO,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAA;AAChE,CAAC,CAAA;AAfY,QAAA,gBAAgB,oBAe5B;AAED,MAAM,uBAAuB,GAAG,KAAK,EACnC,QAAiB,EACjB,MAAe,EACf,aAAqB,EACG,EAAE;IAC1B,MAAM,gBAAgB,GAAG,IAAI,mBAAS,CAAC,aAAa,CAAC,CAAA;IACrD,MAAM,uBAAuB,GAAG,IAAI,mBAAS,CAAC,yBAAc,CAAC,CAAA;IAC7D,MAAM,2BAA2B,GAAG,IAAI,mBAAS,CAAC,6BAAkB,CAAC,CAAA;IACrE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,CAAC,GACnE,MAAM,OAAO,CAAC,UAAU,CAAC;QACvB,IAAA,0BAAU,EACR,GAAG,EAAE,CACH,IAAA,mCAAmB,EAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,EACtE,EAAE,EAAE,EAAE,GAAG,uBAAuB,CAAC,IAAI,UAAU,EAAE,CAClD;QACD,IAAA,0BAAU,EACR,GAAG,EAAE,CACH,IAAA,mCAAmB,EAAC,CAAC,UAAU,EAAE,EAAE,CACjC,UAAU,CAAC,UAAU,CAAC,gBAAgB,EAAE,WAAW,CAAC,CACrD,EACH,EAAE,EAAE,EAAE,GAAG,uBAAuB,CAAC,IAAI,aAAa,EAAE,CACrD;QACD,IAAA,0BAAU,EACR,GAAG,EAAE,CACH,IAAA,mCAAmB,EAAC,CAAC,UAAU,EAAE,EAAE,CACjC,UAAU,CAAC,6BAA6B,CACtC,gBAAgB,EAChB;YACE,SAAS,EAAE,uBAAuB;SACnC,EACD,WAAW,CACZ,CACF,EACH;YACE,EAAE,EAAE,GAAG,uBAAuB,CAAC,IAAI,kCAAkC,yBAAc,EAAE;SACtF,CACF;QACD,IAAA,0BAAU,EACR,GAAG,EAAE,CACH,IAAA,mCAAmB,EAAC,CAAC,UAAU,EAAE,EAAE,CACjC,UAAU,CAAC,6BAA6B,CACtC,gBAAgB,EAChB;YACE,SAAS,EAAE,2BAA2B;SACvC,EACD,WAAW,CACZ,CACF,EACH;YACE,EAAE,EAAE,GAAG,uBAAuB,CAAC,IAAI,kCAAkC,6BAAkB,EAAE;SAC1F,CACF;KACF,CAAC,CAAA;IACJ,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACzE,MAAM,
|
|
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
|
|
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
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
48
|
-
...token,
|
|
49
|
-
|
|
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":";;AAKA,sCAgBC;AApBD,6DAAsD;AACtD,iDAAiD;AACjD,yCAAsE;AAE/D,KAAK,UAAU,aAAa,CACjC,aAAqB,EACrB,MAAe;IAEf,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,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;IAED,OAAO,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAA;AAC7D,CAAC;AAED,MAAM,oBAAoB,GAAG,KAAK,EAChC,QAAgB,EAChB,MAAe,EACf,aAAqB,EACG,EAAE;IAC1B,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACnD,IAAA,0BAAU,EACR,GAAG,EAAE,CACH,IAAA,+BAAgB,EAAC,CAAC,MAAM,EAAE,EAAE,CAC1B,MAAM,CAAC,cAAc,CAAC;YACpB,KAAK,EAAE,aAAa;SACrB,CAAC,CACH,EACH,EAAE,EAAE,EAAE,GAAG,oBAAoB,CAAC,IAAI,iBAAiB,EAAE,CACtD;QACD,IAAA,0BAAU,EACR,GAAG,EAAE,CACH,IAAA,+BAAgB,EAAC,CAAC,MAAM,EAAE,EAAE,CAC1B,MAAM,CAAC,iCAAiC,EAAE,CAC3C,EACH,EAAE,EAAE,EAAE,GAAG,oBAAoB,CAAC,IAAI,oCAAoC,EAAE,CACzE;KACF,CAAC,CAAA;IAEF,MAAM,
|
|
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.
|
|
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
|
|
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,
|
|
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
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
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,+
|
|
1
|
+
{"version":3,"file":"checkBalance.js","sourceRoot":"","sources":["../../core/checkBalance.ts"],"names":[],"mappings":";;;AACA,+BAA+C;AAC/C,4CAAqC;AACrC,mDAAkD;AAClD,gDAAyC;AAEzC,MAAM,YAAY,GAAG,CAAC,CAAA;AAEtB,MAAM,eAAe,GAAG,GAAG,CAAA;AAC3B,MAAM,kBAAkB,GAAG,MAAM,CAAA;AACjC,MAAM,kBAAkB,GAAG,WAAc,CAAA;AAoBlC,MAAM,YAAY,GAAG,KAAK,EAC/B,aAAqB,EACrB,IAAc,EACC,EAAE;IACjB,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAA;IAC3C,MAAM,YAAY,GAAG,IAAI,GAAG,EAAuB,CAAA;IACnD,MAAM,GAAG,GAAG,CAAC,KAAY,EAAE,MAAc,EAAE,MAAe,EAAQ,EAAE;QAClE,IAAI,KAAK,CAAC,OAAO,KAAK,WAAW,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;YACnD,OAAM;QACR,CAAC;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAA;QACvC,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI;YACnC,KAAK;YACL,UAAU,EAAE,EAAE;YACd,YAAY,EAAE,EAAE;SACjB,CAAA;QACD,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,CAAC,UAAU,IAAI,MAAM,CAAA;QAC1B,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,YAAY,IAAI,MAAM,CAAA;QAC5B,CAAC;QACD,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAC5B,CAAC,CAAA;IACD,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC,CAAA;IAChE,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;QAChD,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAA;IAC3C,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;QAEhD,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YAClB,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC;IACD,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAM;IACR,CAAC;IAID,MAAM,QAAQ,GAAG,kBAAM;SACpB,GAAG,EAAE;SACL,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAA;IACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,0BAA0B,aAAa,gBAAgB,CAAC,CAAA;IAC1E,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAA;IAC1C,MAAM,cAAc,GAAG,MAAM,CAC3B,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC,CACxD,CAAA;IAED,MAAM,IAAA,kBAAW,EACf,KAAK,IAAI,EAAE;QACT,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC;YACxD,MAAM,OAAO,GAAG,OAAO,KAAK,YAAY,GAAG,CAAC,CAAA;YAE5C,IAAI,QAAuB,CAAA;YAC3B,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;YAC7D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,IAAI,wBAAY,CACpB,gCAAgC,EAChC,KAAc,CACf,CAAA;gBACH,CAAC;gBACD,MAAM,IAAA,gBAAK,EAAC,eAAe,GAAG,CAAC,IAAI,OAAO,CAAC,CAAA;gBAC3C,SAAQ;YACV,CAAC;YAED,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,CAAU,CAAC,CAClE,CAAA;YAED,MAAM,OAAO,GAAY,EAAE,CAAA;YAC3B,MAAM,YAAY,GAAyC,EAAE,CAAA;YAC7D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;gBAClE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBACzB,CAAC;qBAAM,IAAI,IAAI,GAAG,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;oBACpD,YAAY,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;gBAClC,CAAC;YACH,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtD,OAAM;YACR,CAAC;YAKD,IACE,OAAO;gBACP,OAAO,CAAC,MAAM,KAAK,CAAC;gBACpB,YAAY,CAAC,MAAM,KAAK,CAAC;gBACzB,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,GAAG,EAAE,EACnC,CAAC;gBACD,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;gBACrC,MAAM,aAAa,GACjB,CAAC,GAAG,CAAC,UAAU,GAAG,cAAc,CAAC,GAAG,kBAAkB;oBACtD,GAAG,CAAC,YAAY,CAAA;gBAClB,IAAI,IAAI,IAAI,aAAa,EAAE,CAAC;oBAC1B,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAA;oBAC7D,OAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,MAAM,IAAI,wBAAY,CACpB,gCAAgC,EAChC,IAAI,KAAK,CACP,+BAA+B,OAAO;yBACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC;yBACjC,IAAI,CAAC,IAAI,CAAC,GAAG,CACjB,CACF,CAAA;gBACH,CAAC;gBACD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;oBAC/C,MAAM,MAAM,GAAG,IAAA,kBAAW,EACxB,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC,YAAY,EACjC,GAAG,CAAC,KAAK,CAAC,QAAQ,CACnB,CAAA;oBACD,MAAM,OAAO,GAAG,IAAA,kBAAW,EAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;oBACrD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAA;oBAC/B,OAAO,GAAG,CAAC,UAAU,GAAG,EAAE;wBACxB,CAAC,CAAC,QAAQ,MAAM,4CAA4C,MAAM,IAAI,MAAM,gCAAgC,OAAO,IAAI,MAAM,GAAG;wBAChI,CAAC,CAAC,gBAAgB,MAAM,mBAAmB,MAAM,IAAI,MAAM,UAAU,OAAO,IAAI,MAAM,GAAG,CAAA;gBAC7F,CAAC,CAAC,CAAA;gBACF,MAAM,IAAI,wBAAY,CACpB,yBAAyB,EACzB,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,2BAA2B,CAAC,CACzD,CAAA;YACH,CAAC;YAED,MAAM,IAAA,gBAAK,EAAC,eAAe,GAAG,CAAC,IAAI,OAAO,CAAC,CAAA;QAC7C,CAAC;IACH,CAAC,EACD;QACE,OAAO,EAAE,kBAAkB;QAC3B,aAAa,EAAE,IAAI,wBAAY,CAAC,gCAAgC,CAAC;KAClE,CACF,CAAA;AACH,CAAC,CAAA;AAlJY,QAAA,YAAY,gBAkJxB"}
|
package/src/_cjs/version.js
CHANGED
package/src/_cjs/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../version.ts"],"names":[],"mappings":";;;AAAa,QAAA,IAAI,GAAG,WAAW,CAAA;AAClB,QAAA,OAAO,GAAG,
|
|
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:
|
|
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":"AAEA,OAAO,EACL,UAAU,EACV,cAAc,EACd,SAAS,EACT,YAAY,GACb,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEhD,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,aAAsB,EACtB,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;IAED,MAAM,gBAAgB,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAA;IAE3D,IAAI,gBAAgB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO,sBAAsB,CAC3B,OAAO,EACP,MAAM,EACN,aAAa,EACb,gBAAgB,CACjB,CAAA;IACH,CAAC;IACD,OAAO,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAA;AAC7D,CAAC,CAAA;AAED,MAAM,sBAAsB,GAAG,KAAK,EAClC,OAAgB,EAChB,MAAe,EACf,aAAqB,EACrB,gBAAwB,EACA,EAAE;IAC1B,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,CAAA;IAE7C,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACrC,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,OAAO;gBACL,OAAO,EAAE,gBAA2B;gBACpC,GAAG,EAAE,gBAAgB;gBACrB,YAAY,EAAE,eAAe;gBAC7B,IAAI,EAAE,CAAC,aAAa,CAAC;aACtB,CAAA;QACH,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAkB;YACjC,GAAG,EAAE,YAAY;YACjB,YAAY,EAAE,WAAW;YACzB,IAAI,EAAE,CAAC,aAAa,CAAC;SACtB,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/C,cAAc,CAAC,MAAM,CAAC;QACtB,SAAS,CAAC,MAAM,EAAE;YAChB,SAAS;YACT,gBAAgB,EAAE,gBAA2B;SAC9C,CAAC;KACH,CAAC,CAAA;IAEF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAS,EAAE,EAAE;QACrC,OAAO;YACL,GAAG,KAAK;YACR,MAAM,EAAE,
|
|
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
|
|
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.
|
|
40
|
-
|
|
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
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
62
|
-
|
|
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":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAE/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,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;IAED,OAAO,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAA;AAChE,CAAC,CAAA;AAED,MAAM,uBAAuB,GAAG,KAAK,EACnC,QAAiB,EACjB,MAAe,EACf,aAAqB,EACG,EAAE;IAC1B,MAAM,gBAAgB,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,CAAA;IACrD,MAAM,uBAAuB,GAAG,IAAI,SAAS,CAAC,cAAc,CAAC,CAAA;IAC7D,MAAM,2BAA2B,GAAG,IAAI,SAAS,CAAC,kBAAkB,CAAC,CAAA;IACrE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,CAAC,GACnE,MAAM,OAAO,CAAC,UAAU,CAAC;QACvB,UAAU,CACR,GAAG,EAAE,CACH,mBAAmB,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,EACtE,EAAE,EAAE,EAAE,GAAG,uBAAuB,CAAC,IAAI,UAAU,EAAE,CAClD;QACD,UAAU,CACR,GAAG,EAAE,CACH,mBAAmB,CAAC,CAAC,UAAU,EAAE,EAAE,CACjC,UAAU,CAAC,UAAU,CAAC,gBAAgB,EAAE,WAAW,CAAC,CACrD,EACH,EAAE,EAAE,EAAE,GAAG,uBAAuB,CAAC,IAAI,aAAa,EAAE,CACrD;QACD,UAAU,CACR,GAAG,EAAE,CACH,mBAAmB,CAAC,CAAC,UAAU,EAAE,EAAE,CACjC,UAAU,CAAC,6BAA6B,CACtC,gBAAgB,EAChB;YACE,SAAS,EAAE,uBAAuB;SACnC,EACD,WAAW,CACZ,CACF,EACH;YACE,EAAE,EAAE,GAAG,uBAAuB,CAAC,IAAI,kCAAkC,cAAc,EAAE;SACtF,CACF;QACD,UAAU,CACR,GAAG,EAAE,CACH,mBAAmB,CAAC,CAAC,UAAU,EAAE,EAAE,CACjC,UAAU,CAAC,6BAA6B,CACtC,gBAAgB,EAChB;YACE,SAAS,EAAE,2BAA2B;SACvC,EACD,WAAW,CACZ,CACF,EACH;YACE,EAAE,EAAE,GAAG,uBAAuB,CAAC,IAAI,kCAAkC,kBAAkB,EAAE;SAC1F,CACF;KACF,CAAC,CAAA;IACJ,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACzE,MAAM,
|
|
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
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
45
|
-
|
|
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":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEtE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,aAAqB,EACrB,MAAe;IAEf,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,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;IAED,OAAO,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,CAAA;AAC7D,CAAC;AAED,MAAM,oBAAoB,GAAG,KAAK,EAChC,QAAgB,EAChB,MAAe,EACf,aAAqB,EACG,EAAE;IAC1B,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACnD,UAAU,CACR,GAAG,EAAE,CACH,gBAAgB,CAAC,CAAC,MAAM,EAAE,EAAE,CAC1B,MAAM,CAAC,cAAc,CAAC;YACpB,KAAK,EAAE,aAAa;SACrB,CAAC,CACH,EACH,EAAE,EAAE,EAAE,GAAG,oBAAoB,CAAC,IAAI,iBAAiB,EAAE,CACtD;QACD,UAAU,CACR,GAAG,EAAE,CACH,gBAAgB,CAAC,CAAC,MAAM,EAAE,EAAE,CAC1B,MAAM,CAAC,iCAAiC,EAAE,CAC3C,EACH,EAAE,EAAE,EAAE,GAAG,oBAAoB,CAAC,IAAI,oCAAoC,EAAE,CACzE;KACF,CAAC,CAAA;IAEF,MAAM,
|
|
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.
|
|
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
|
|
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,
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"checkBalance.js","sourceRoot":"","sources":["../../core/checkBalance.ts"],"names":[],"mappings":"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"}
|
package/src/_esm/version.js
CHANGED
package/src/_esm/version.js.map
CHANGED
|
@@ -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,
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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"}
|
package/src/_types/version.d.ts
CHANGED
|
@@ -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,
|
|
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:
|
|
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
|
|
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.
|
|
83
|
-
|
|
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
|
-
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
81
|
-
|
|
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.
|
|
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
|
|
37
|
+
amount: balance.value,
|
|
38
|
+
blockNumber,
|
|
27
39
|
}))
|
|
28
40
|
}
|
package/src/core/checkBalance.ts
CHANGED
|
@@ -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
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
39
|
-
|
|
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.
|
|
2
|
+
export const version = '3.17.0-beta.0'
|