@lifi/sdk 3.3.0 → 3.4.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 +4 -4
- package/src/_cjs/config.js +6 -5
- package/src/_cjs/config.js.map +1 -1
- package/src/_cjs/core/Solana/SolanaStepExecutor.js +12 -57
- package/src/_cjs/core/Solana/SolanaStepExecutor.js.map +1 -1
- package/src/_cjs/core/Solana/connection.js +30 -9
- package/src/_cjs/core/Solana/connection.js.map +1 -1
- package/src/_cjs/core/Solana/getSolanaBalance.js +5 -5
- package/src/_cjs/core/Solana/getSolanaBalance.js.map +1 -1
- package/src/_cjs/core/Solana/sendAndConfirmTransaction.js +68 -0
- package/src/_cjs/core/Solana/sendAndConfirmTransaction.js.map +1 -0
- package/src/_cjs/utils/withDedupe.js.map +1 -1
- package/src/_cjs/version.js +1 -1
- package/src/_esm/config.js +6 -5
- package/src/_esm/config.js.map +1 -1
- package/src/_esm/core/Solana/SolanaStepExecutor.js +14 -75
- package/src/_esm/core/Solana/SolanaStepExecutor.js.map +1 -1
- package/src/_esm/core/Solana/connection.js +40 -10
- package/src/_esm/core/Solana/connection.js.map +1 -1
- package/src/_esm/core/Solana/getSolanaBalance.js +6 -6
- package/src/_esm/core/Solana/getSolanaBalance.js.map +1 -1
- package/src/_esm/core/Solana/sendAndConfirmTransaction.js +76 -0
- package/src/_esm/core/Solana/sendAndConfirmTransaction.js.map +1 -0
- package/src/_esm/utils/withDedupe.js.map +1 -1
- package/src/_esm/version.js +1 -1
- package/src/_types/config.d.ts +2 -2
- package/src/_types/config.d.ts.map +1 -1
- package/src/_types/core/Solana/SolanaStepExecutor.d.ts.map +1 -1
- package/src/_types/core/Solana/connection.d.ts +14 -3
- package/src/_types/core/Solana/connection.d.ts.map +1 -1
- package/src/_types/core/Solana/getSolanaBalance.d.ts.map +1 -1
- package/src/_types/core/Solana/sendAndConfirmTransaction.d.ts +13 -0
- package/src/_types/core/Solana/sendAndConfirmTransaction.d.ts.map +1 -0
- package/src/_types/utils/withDedupe.d.ts +1 -1
- package/src/_types/utils/withDedupe.d.ts.map +1 -1
- package/src/_types/version.d.ts +1 -1
- package/src/config.ts +6 -6
- package/src/core/Solana/SolanaStepExecutor.ts +15 -98
- package/src/core/Solana/connection.ts +43 -10
- package/src/core/Solana/getSolanaBalance.ts +27 -7
- package/src/core/Solana/sendAndConfirmTransaction.ts +111 -0
- package/src/utils/withDedupe.ts +3 -3
- package/src/version.ts +1 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"dependencies": {
|
|
3
|
-
"@bigmi/core": "^0.0.
|
|
4
|
-
"@lifi/types": "^16.
|
|
3
|
+
"@bigmi/core": "^0.0.4",
|
|
4
|
+
"@lifi/types": "^16.1.0",
|
|
5
5
|
"@noble/curves": "^1.6.0",
|
|
6
6
|
"@noble/hashes": "^1.5.0",
|
|
7
7
|
"@solana/wallet-adapter-base": "^0.9.23",
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"bech32": "^2.0.0",
|
|
10
10
|
"bitcoinjs-lib": "^7.0.0-rc.0",
|
|
11
11
|
"bs58": "^6.0.0",
|
|
12
|
-
"viem": "^2.21.
|
|
12
|
+
"viem": "^2.21.35"
|
|
13
13
|
},
|
|
14
14
|
"description": "LI.FI Any-to-Any Cross-Chain-Swap SDK",
|
|
15
15
|
"exports": {
|
|
@@ -65,5 +65,5 @@
|
|
|
65
65
|
"sideEffects": false,
|
|
66
66
|
"types": "./src/_types/index.d.ts",
|
|
67
67
|
"typings": "./src/_types/index.d.ts",
|
|
68
|
-
"version": "3.
|
|
68
|
+
"version": "3.4.0"
|
|
69
69
|
}
|
package/src/_cjs/config.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.config = void 0;
|
|
4
|
+
const types_1 = require("@lifi/types");
|
|
4
5
|
exports.config = (() => {
|
|
5
6
|
const _config = {
|
|
6
7
|
integrator: 'lifi-sdk',
|
|
@@ -47,7 +48,7 @@ exports.config = (() => {
|
|
|
47
48
|
}
|
|
48
49
|
return rpcUrls;
|
|
49
50
|
}, {});
|
|
50
|
-
this.setRPCUrls(rpcUrls);
|
|
51
|
+
this.setRPCUrls(rpcUrls, [types_1.ChainId.SOL]);
|
|
51
52
|
_config.chains = chains;
|
|
52
53
|
_loading = undefined;
|
|
53
54
|
},
|
|
@@ -67,9 +68,9 @@ exports.config = (() => {
|
|
|
67
68
|
}
|
|
68
69
|
return chain;
|
|
69
70
|
},
|
|
70
|
-
setRPCUrls(rpcUrls) {
|
|
71
|
+
setRPCUrls(rpcUrls, skipChains) {
|
|
71
72
|
for (const rpcUrlsKey in rpcUrls) {
|
|
72
|
-
const chainId = rpcUrlsKey;
|
|
73
|
+
const chainId = Number(rpcUrlsKey);
|
|
73
74
|
const urls = rpcUrls[chainId];
|
|
74
75
|
if (!urls?.length) {
|
|
75
76
|
continue;
|
|
@@ -77,9 +78,9 @@ exports.config = (() => {
|
|
|
77
78
|
if (!_config.rpcUrls[chainId]?.length) {
|
|
78
79
|
_config.rpcUrls[chainId] = Array.from(urls);
|
|
79
80
|
}
|
|
80
|
-
else {
|
|
81
|
+
else if (!skipChains?.includes(chainId)) {
|
|
81
82
|
const filteredUrls = urls.filter((url) => !_config.rpcUrls[chainId]?.includes(url));
|
|
82
|
-
_config.rpcUrls[chainId]
|
|
83
|
+
_config.rpcUrls[chainId].push(...filteredUrls);
|
|
83
84
|
}
|
|
84
85
|
}
|
|
85
86
|
},
|
package/src/_cjs/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SolanaStepExecutor = void 0;
|
|
4
4
|
const web3_js_1 = require("@solana/web3.js");
|
|
5
|
-
const bs58_1 = require("bs58");
|
|
6
5
|
const viem_1 = require("viem");
|
|
7
6
|
const config_js_1 = require("../../config.js");
|
|
8
7
|
const constants_js_1 = require("../../errors/constants.js");
|
|
@@ -10,7 +9,6 @@ const errors_js_1 = require("../../errors/errors.js");
|
|
|
10
9
|
const api_js_1 = require("../../services/api.js");
|
|
11
10
|
const base64ToUint8Array_js_1 = require("../../utils/base64ToUint8Array.js");
|
|
12
11
|
const getTransactionMessage_js_1 = require("../../utils/getTransactionMessage.js");
|
|
13
|
-
const sleep_js_1 = require("../../utils/sleep.js");
|
|
14
12
|
const BaseStepExecutor_js_1 = require("../BaseStepExecutor.js");
|
|
15
13
|
const checkBalance_js_1 = require("../checkBalance.js");
|
|
16
14
|
const processMessages_js_1 = require("../processMessages.js");
|
|
@@ -18,6 +16,7 @@ const stepComparison_js_1 = require("../stepComparison.js");
|
|
|
18
16
|
const waitForReceivingTransaction_js_1 = require("../waitForReceivingTransaction.js");
|
|
19
17
|
const connection_js_1 = require("./connection.js");
|
|
20
18
|
const parseSolanaErrors_js_1 = require("./parseSolanaErrors.js");
|
|
19
|
+
const sendAndConfirmTransaction_js_1 = require("./sendAndConfirmTransaction.js");
|
|
21
20
|
class SolanaStepExecutor extends BaseStepExecutor_js_1.BaseStepExecutor {
|
|
22
21
|
constructor(options) {
|
|
23
22
|
super(options);
|
|
@@ -53,7 +52,6 @@ class SolanaStepExecutor extends BaseStepExecutor_js_1.BaseStepExecutor {
|
|
|
53
52
|
});
|
|
54
53
|
if (process.status !== 'DONE') {
|
|
55
54
|
try {
|
|
56
|
-
const connection = await (0, connection_js_1.getSolanaConnection)();
|
|
57
55
|
process = this.statusManager.updateProcess(step, process.type, 'STARTED');
|
|
58
56
|
await (0, checkBalance_js_1.checkBalance)(this.walletAdapter.publicKey.toString(), step);
|
|
59
57
|
if (!step.transactionRequest) {
|
|
@@ -75,9 +73,6 @@ class SolanaStepExecutor extends BaseStepExecutor_js_1.BaseStepExecutor {
|
|
|
75
73
|
let transactionRequest = {
|
|
76
74
|
data: step.transactionRequest.data,
|
|
77
75
|
};
|
|
78
|
-
const blockhashResult = await connection.getLatestBlockhash({
|
|
79
|
-
commitment: 'confirmed',
|
|
80
|
-
});
|
|
81
76
|
if (this.executionOptions?.updateTransactionRequestHook) {
|
|
82
77
|
const customizedTransactionRequest = await this.executionOptions.updateTransactionRequestHook({
|
|
83
78
|
requestType: 'transaction',
|
|
@@ -97,67 +92,27 @@ class SolanaStepExecutor extends BaseStepExecutor_js_1.BaseStepExecutor {
|
|
|
97
92
|
timeout: 120_000,
|
|
98
93
|
errorInstance: new errors_js_1.TransactionError(constants_js_1.LiFiErrorCode.TransactionExpired, 'Transaction has expired: blockhash is no longer recent enough.'),
|
|
99
94
|
});
|
|
100
|
-
async function bufferToBase64(buffer) {
|
|
101
|
-
const base64url = (await new Promise((r) => {
|
|
102
|
-
const reader = new FileReader();
|
|
103
|
-
reader.onload = () => r(reader.result);
|
|
104
|
-
reader.readAsDataURL(new Blob([buffer]));
|
|
105
|
-
}));
|
|
106
|
-
return base64url.slice(base64url.indexOf(',') + 1);
|
|
107
|
-
}
|
|
108
|
-
const _s = await bufferToBase64(signedTx.serialize());
|
|
109
|
-
console.log(_s);
|
|
110
95
|
process = this.statusManager.updateProcess(step, process.type, 'PENDING');
|
|
111
|
-
const simulationResult = await connection.simulateTransaction(signedTx, {
|
|
112
|
-
commitment: '
|
|
96
|
+
const simulationResult = await (0, connection_js_1.callSolanaWithRetry)((connection) => connection.simulateTransaction(signedTx, {
|
|
97
|
+
commitment: 'confirmed',
|
|
113
98
|
replaceRecentBlockhash: true,
|
|
114
|
-
});
|
|
99
|
+
}));
|
|
115
100
|
if (simulationResult.value.err) {
|
|
116
101
|
throw new errors_js_1.TransactionError(constants_js_1.LiFiErrorCode.TransactionSimulationFailed, 'Transaction simulation failed');
|
|
117
102
|
}
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
const abortController = new AbortController();
|
|
121
|
-
const confirmTransactionPromise = connection
|
|
122
|
-
.confirmTransaction({
|
|
123
|
-
signature: txSignature,
|
|
124
|
-
blockhash: blockhashResult.blockhash,
|
|
125
|
-
lastValidBlockHeight: lastValidBlockHeight,
|
|
126
|
-
abortSignal: abortController.signal,
|
|
127
|
-
}, 'confirmed')
|
|
128
|
-
.then((result) => result.value);
|
|
129
|
-
let confirmedTx = null;
|
|
130
|
-
let blockHeight = await connection.getBlockHeight();
|
|
131
|
-
const rawTransactionOptions = {
|
|
132
|
-
skipPreflight: true,
|
|
133
|
-
maxRetries: 0,
|
|
134
|
-
preflightCommitment: 'confirmed',
|
|
135
|
-
};
|
|
136
|
-
const signedTxSerialized = signedTx.serialize();
|
|
137
|
-
while (!confirmedTx && blockHeight < lastValidBlockHeight) {
|
|
138
|
-
await connection.sendRawTransaction(signedTxSerialized, rawTransactionOptions);
|
|
139
|
-
confirmedTx = await Promise.race([
|
|
140
|
-
confirmTransactionPromise,
|
|
141
|
-
(0, sleep_js_1.sleep)(1000),
|
|
142
|
-
]);
|
|
143
|
-
if (confirmedTx) {
|
|
144
|
-
break;
|
|
145
|
-
}
|
|
146
|
-
blockHeight = await connection.getBlockHeight();
|
|
147
|
-
}
|
|
148
|
-
abortController.abort();
|
|
149
|
-
if (!confirmedTx) {
|
|
103
|
+
const confirmedTx = await (0, sendAndConfirmTransaction_js_1.sendAndConfirmTransaction)(signedTx);
|
|
104
|
+
if (!confirmedTx.signatureResult) {
|
|
150
105
|
throw new errors_js_1.TransactionError(constants_js_1.LiFiErrorCode.TransactionExpired, 'Transaction has expired: The block height has exceeded the maximum allowed limit.');
|
|
151
106
|
}
|
|
152
|
-
if (confirmedTx
|
|
153
|
-
const reason = typeof confirmedTx.err === 'object'
|
|
154
|
-
? JSON.stringify(confirmedTx.err)
|
|
155
|
-
: confirmedTx.err;
|
|
107
|
+
if (confirmedTx.signatureResult.err) {
|
|
108
|
+
const reason = typeof confirmedTx.signatureResult.err === 'object'
|
|
109
|
+
? JSON.stringify(confirmedTx.signatureResult.err)
|
|
110
|
+
: confirmedTx.signatureResult.err;
|
|
156
111
|
throw new errors_js_1.TransactionError(constants_js_1.LiFiErrorCode.TransactionFailed, `Transaction failed: ${reason}`);
|
|
157
112
|
}
|
|
158
113
|
process = this.statusManager.updateProcess(step, process.type, 'PENDING', {
|
|
159
|
-
txHash: txSignature,
|
|
160
|
-
txLink: `${fromChain.metamask.blockExplorerUrls[0]}tx/${txSignature}`,
|
|
114
|
+
txHash: confirmedTx.txSignature,
|
|
115
|
+
txLink: `${fromChain.metamask.blockExplorerUrls[0]}tx/${confirmedTx.txSignature}`,
|
|
161
116
|
});
|
|
162
117
|
if (isBridgeExecution) {
|
|
163
118
|
process = this.statusManager.updateProcess(step, process.type, 'DONE');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolanaStepExecutor.js","sourceRoot":"","sources":["../../../core/Solana/SolanaStepExecutor.ts"],"names":[],"mappings":";;;AAEA,
|
|
1
|
+
{"version":3,"file":"SolanaStepExecutor.js","sourceRoot":"","sources":["../../../core/Solana/SolanaStepExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,38 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.getSolanaConnections = exports.ensureConnections = void 0;
|
|
4
|
+
exports.callSolanaWithRetry = callSolanaWithRetry;
|
|
4
5
|
const types_1 = require("@lifi/types");
|
|
5
6
|
const web3_js_1 = require("@solana/web3.js");
|
|
6
7
|
const rpc_js_1 = require("../rpc.js");
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
const connections = new Map();
|
|
9
|
+
const ensureConnections = async () => {
|
|
10
|
+
const rpcUrls = await (0, rpc_js_1.getRpcUrls)(types_1.ChainId.SOL);
|
|
11
|
+
for (const rpcUrl of rpcUrls) {
|
|
12
|
+
if (!connections.get(rpcUrl)) {
|
|
13
|
+
const connection = new web3_js_1.Connection(rpcUrl);
|
|
14
|
+
connections.set(rpcUrl, connection);
|
|
15
|
+
}
|
|
13
16
|
}
|
|
14
|
-
return connection;
|
|
15
17
|
};
|
|
16
|
-
exports.
|
|
18
|
+
exports.ensureConnections = ensureConnections;
|
|
19
|
+
const getSolanaConnections = async () => {
|
|
20
|
+
await (0, exports.ensureConnections)();
|
|
21
|
+
return Array.from(connections.values());
|
|
22
|
+
};
|
|
23
|
+
exports.getSolanaConnections = getSolanaConnections;
|
|
24
|
+
async function callSolanaWithRetry(fn) {
|
|
25
|
+
await (0, exports.ensureConnections)();
|
|
26
|
+
let lastError = null;
|
|
27
|
+
for (const connection of connections.values()) {
|
|
28
|
+
try {
|
|
29
|
+
const result = await fn(connection);
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
lastError = error;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
throw lastError;
|
|
37
|
+
}
|
|
17
38
|
//# sourceMappingURL=connection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../core/Solana/connection.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../core/Solana/connection.ts"],"names":[],"mappings":";;;AAkCA,kDAgBC;AAlDD,uCAAqC;AACrC,6CAA4C;AAC5C,sCAAsC;AAEtC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAA;AAM1C,MAAM,iBAAiB,GAAG,KAAK,IAAmB,EAAE;IACzD,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAU,EAAC,eAAO,CAAC,GAAG,CAAC,CAAA;IAC7C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,IAAI,oBAAU,CAAC,MAAM,CAAC,CAAA;YACzC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AARY,QAAA,iBAAiB,qBAQ7B;AAMM,MAAM,oBAAoB,GAAG,KAAK,IAA2B,EAAE;IACpE,MAAM,IAAA,yBAAiB,GAAE,CAAA;IACzB,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAA;AACzC,CAAC,CAAA;AAHY,QAAA,oBAAoB,wBAGhC;AAOM,KAAK,UAAU,mBAAmB,CACvC,EAA0C;IAG1C,MAAM,IAAA,yBAAiB,GAAE,CAAA;IACzB,IAAI,SAAS,GAAQ,IAAI,CAAA;IACzB,KAAK,MAAM,UAAU,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,UAAU,CAAC,CAAA;YACnC,OAAO,MAAM,CAAA;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAA;QACnB,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAA;AACjB,CAAC"}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.getSolanaBalance = void 0;
|
|
4
4
|
const web3_js_1 = require("@solana/web3.js");
|
|
5
5
|
const constants_js_1 = require("../../constants.js");
|
|
6
|
+
const withDedupe_js_1 = require("../../utils/withDedupe.js");
|
|
6
7
|
const connection_js_1 = require("./connection.js");
|
|
7
8
|
const types_js_1 = require("./types.js");
|
|
8
9
|
const getSolanaBalance = async (walletAddress, tokens) => {
|
|
@@ -19,15 +20,14 @@ const getSolanaBalance = async (walletAddress, tokens) => {
|
|
|
19
20
|
};
|
|
20
21
|
exports.getSolanaBalance = getSolanaBalance;
|
|
21
22
|
const getSolanaBalanceDefault = async (_chainId, tokens, walletAddress) => {
|
|
22
|
-
const connection = await (0, connection_js_1.getSolanaConnection)();
|
|
23
23
|
const accountPublicKey = new web3_js_1.PublicKey(walletAddress);
|
|
24
24
|
const tokenProgramPublicKey = new web3_js_1.PublicKey(types_js_1.TokenProgramAddress);
|
|
25
25
|
const [slot, balance, tokenAccountsByOwner] = await Promise.allSettled([
|
|
26
|
-
connection.getSlot(),
|
|
27
|
-
connection.getBalance(accountPublicKey),
|
|
28
|
-
connection.getParsedTokenAccountsByOwner(accountPublicKey, {
|
|
26
|
+
(0, withDedupe_js_1.withDedupe)(() => (0, connection_js_1.callSolanaWithRetry)((connection) => connection.getSlot('confirmed')), { id: `${getSolanaBalanceDefault.name}.getSlot` }),
|
|
27
|
+
(0, withDedupe_js_1.withDedupe)(() => (0, connection_js_1.callSolanaWithRetry)((connection) => connection.getBalance(accountPublicKey, 'confirmed')), { id: `${getSolanaBalanceDefault.name}.getBalance` }),
|
|
28
|
+
(0, withDedupe_js_1.withDedupe)(() => (0, connection_js_1.callSolanaWithRetry)((connection) => connection.getParsedTokenAccountsByOwner(accountPublicKey, {
|
|
29
29
|
programId: tokenProgramPublicKey,
|
|
30
|
-
}),
|
|
30
|
+
}, 'confirmed')), { id: `${getSolanaBalanceDefault.name}.getParsedTokenAccountsByOwner` }),
|
|
31
31
|
]);
|
|
32
32
|
const blockNumber = slot.status === 'fulfilled' ? BigInt(slot.value) : 0n;
|
|
33
33
|
const solBalance = balance.status === 'fulfilled' ? BigInt(balance.value) : 0n;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSolanaBalance.js","sourceRoot":"","sources":["../../../core/Solana/getSolanaBalance.ts"],"names":[],"mappings":";;;AACA,6CAA2C;AAC3C,qDAAqD;AACrD,mDAAqD;AACrD,yCAAgD;AAEzC,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,
|
|
1
|
+
{"version":3,"file":"getSolanaBalance.js","sourceRoot":"","sources":["../../../core/Solana/getSolanaBalance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sendAndConfirmTransaction = sendAndConfirmTransaction;
|
|
4
|
+
const bs58_1 = require("bs58");
|
|
5
|
+
const sleep_js_1 = require("../../utils/sleep.js");
|
|
6
|
+
const connection_js_1 = require("./connection.js");
|
|
7
|
+
async function sendAndConfirmTransaction(signedTx) {
|
|
8
|
+
const connections = await (0, connection_js_1.getSolanaConnections)();
|
|
9
|
+
const signedTxSerialized = signedTx.serialize();
|
|
10
|
+
const txSignature = bs58_1.default.encode(signedTx.signatures[0]);
|
|
11
|
+
if (!txSignature) {
|
|
12
|
+
throw new Error('Transaction signature is missing.');
|
|
13
|
+
}
|
|
14
|
+
const rawTransactionOptions = {
|
|
15
|
+
skipPreflight: true,
|
|
16
|
+
maxRetries: 0,
|
|
17
|
+
preflightCommitment: 'confirmed',
|
|
18
|
+
};
|
|
19
|
+
for (const connection of connections) {
|
|
20
|
+
connection
|
|
21
|
+
.sendRawTransaction(signedTxSerialized, rawTransactionOptions)
|
|
22
|
+
.catch();
|
|
23
|
+
}
|
|
24
|
+
const abortControllers = [];
|
|
25
|
+
const confirmPromises = connections.map(async (connection) => {
|
|
26
|
+
const abortController = new AbortController();
|
|
27
|
+
abortControllers.push(abortController);
|
|
28
|
+
try {
|
|
29
|
+
const blockhashResult = await connection.getLatestBlockhash('confirmed');
|
|
30
|
+
const confirmTransactionPromise = connection
|
|
31
|
+
.confirmTransaction({
|
|
32
|
+
signature: txSignature,
|
|
33
|
+
blockhash: blockhashResult.blockhash,
|
|
34
|
+
lastValidBlockHeight: blockhashResult.lastValidBlockHeight,
|
|
35
|
+
abortSignal: abortController.signal,
|
|
36
|
+
}, 'confirmed')
|
|
37
|
+
.then((result) => result.value);
|
|
38
|
+
let signatureResult = null;
|
|
39
|
+
let blockHeight = await connection.getBlockHeight('confirmed');
|
|
40
|
+
while (!signatureResult &&
|
|
41
|
+
blockHeight < blockhashResult.lastValidBlockHeight) {
|
|
42
|
+
await connection.sendRawTransaction(signedTxSerialized, rawTransactionOptions);
|
|
43
|
+
signatureResult = await Promise.race([
|
|
44
|
+
confirmTransactionPromise,
|
|
45
|
+
(0, sleep_js_1.sleep)(1000),
|
|
46
|
+
]);
|
|
47
|
+
if (signatureResult || abortController.signal.aborted) {
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
blockHeight = await connection.getBlockHeight('confirmed');
|
|
51
|
+
}
|
|
52
|
+
abortController.abort();
|
|
53
|
+
return signatureResult;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (abortController.signal.aborted) {
|
|
57
|
+
return Promise.reject(new Error('Confirmation aborted.'));
|
|
58
|
+
}
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
const signatureResult = await Promise.any(confirmPromises).catch(() => null);
|
|
63
|
+
for (const abortController of abortControllers) {
|
|
64
|
+
abortController.abort();
|
|
65
|
+
}
|
|
66
|
+
return { signatureResult, txSignature };
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=sendAndConfirmTransaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendAndConfirmTransaction.js","sourceRoot":"","sources":["../../../core/Solana/sendAndConfirmTransaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withDedupe.js","sourceRoot":"","sources":["../../utils/withDedupe.ts"],"names":[],"mappings":";;;AA+BA,gCAaC;AAvCD,MAAa,MAAwB,SAAQ,GAAkB;IAG7D,YAAY,IAAY;QACtB,KAAK,EAAE,CAAA;QAHT;;;;;WAAe;QAIb,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACrB,CAAC;IAEQ,GAAG,CAAC,GAAW,EAAE,KAAY;QACpC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACrB,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC,CAAA;QACxC,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAfD,wBAeC;AAGY,QAAA,YAAY,GAAiB,IAAI,MAAM,CAAe,IAAI,CAAC,CAAA;AAQxE,SAAgB,UAAU,CACxB,
|
|
1
|
+
{"version":3,"file":"withDedupe.js","sourceRoot":"","sources":["../../utils/withDedupe.ts"],"names":[],"mappings":";;;AA+BA,gCAaC;AAvCD,MAAa,MAAwB,SAAQ,GAAkB;IAG7D,YAAY,IAAY;QACtB,KAAK,EAAE,CAAA;QAHT;;;;;WAAe;QAIb,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACrB,CAAC;IAEQ,GAAG,CAAC,GAAW,EAAE,KAAY;QACpC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACrB,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC,CAAA;QACxC,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;CACF;AAfD,wBAeC;AAGY,QAAA,YAAY,GAAiB,IAAI,MAAM,CAAe,IAAI,CAAC,CAAA;AAQxE,SAAgB,UAAU,CACxB,EAAoB,EACpB,EAAE,OAAO,GAAG,IAAI,EAAE,EAAE,EAAqB;IAEzC,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC;QACpB,OAAO,EAAE,EAAE,CAAA;IACb,CAAC;IACD,IAAI,oBAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QACzB,OAAO,oBAAY,CAAC,GAAG,CAAC,EAAE,CAAE,CAAA;IAC9B,CAAC;IACD,MAAM,OAAO,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,oBAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3D,oBAAY,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
package/src/_cjs/version.js
CHANGED
package/src/_esm/config.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ChainId } from '@lifi/types';
|
|
1
2
|
export const config = (() => {
|
|
2
3
|
const _config = {
|
|
3
4
|
integrator: 'lifi-sdk',
|
|
@@ -44,7 +45,7 @@ export const config = (() => {
|
|
|
44
45
|
}
|
|
45
46
|
return rpcUrls;
|
|
46
47
|
}, {});
|
|
47
|
-
this.setRPCUrls(rpcUrls);
|
|
48
|
+
this.setRPCUrls(rpcUrls, [ChainId.SOL]);
|
|
48
49
|
_config.chains = chains;
|
|
49
50
|
_loading = undefined;
|
|
50
51
|
},
|
|
@@ -64,9 +65,9 @@ export const config = (() => {
|
|
|
64
65
|
}
|
|
65
66
|
return chain;
|
|
66
67
|
},
|
|
67
|
-
setRPCUrls(rpcUrls) {
|
|
68
|
+
setRPCUrls(rpcUrls, skipChains) {
|
|
68
69
|
for (const rpcUrlsKey in rpcUrls) {
|
|
69
|
-
const chainId = rpcUrlsKey;
|
|
70
|
+
const chainId = Number(rpcUrlsKey);
|
|
70
71
|
const urls = rpcUrls[chainId];
|
|
71
72
|
if (!urls?.length) {
|
|
72
73
|
continue;
|
|
@@ -74,9 +75,9 @@ export const config = (() => {
|
|
|
74
75
|
if (!_config.rpcUrls[chainId]?.length) {
|
|
75
76
|
_config.rpcUrls[chainId] = Array.from(urls);
|
|
76
77
|
}
|
|
77
|
-
else {
|
|
78
|
+
else if (!skipChains?.includes(chainId)) {
|
|
78
79
|
const filteredUrls = urls.filter((url) => !_config.rpcUrls[chainId]?.includes(url));
|
|
79
|
-
_config.rpcUrls[chainId]
|
|
80
|
+
_config.rpcUrls[chainId].push(...filteredUrls);
|
|
80
81
|
}
|
|
81
82
|
}
|
|
82
83
|
},
|
package/src/_esm/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { VersionedTransaction
|
|
2
|
-
import bs58 from 'bs58';
|
|
1
|
+
import { VersionedTransaction } from '@solana/web3.js';
|
|
3
2
|
import { withTimeout } from 'viem';
|
|
4
3
|
import { config } from '../../config.js';
|
|
5
4
|
import { LiFiErrorCode } from '../../errors/constants.js';
|
|
@@ -7,14 +6,14 @@ import { TransactionError } from '../../errors/errors.js';
|
|
|
7
6
|
import { getStepTransaction } from '../../services/api.js';
|
|
8
7
|
import { base64ToUint8Array } from '../../utils/base64ToUint8Array.js';
|
|
9
8
|
import { getTransactionFailedMessage } from '../../utils/getTransactionMessage.js';
|
|
10
|
-
import { sleep } from '../../utils/sleep.js';
|
|
11
9
|
import { BaseStepExecutor } from '../BaseStepExecutor.js';
|
|
12
10
|
import { checkBalance } from '../checkBalance.js';
|
|
13
11
|
import { getSubstatusMessage } from '../processMessages.js';
|
|
14
12
|
import { stepComparison } from '../stepComparison.js';
|
|
15
13
|
import { waitForReceivingTransaction } from '../waitForReceivingTransaction.js';
|
|
16
|
-
import {
|
|
14
|
+
import { callSolanaWithRetry } from './connection.js';
|
|
17
15
|
import { parseSolanaErrors } from './parseSolanaErrors.js';
|
|
16
|
+
import { sendAndConfirmTransaction } from './sendAndConfirmTransaction.js';
|
|
18
17
|
export class SolanaStepExecutor extends BaseStepExecutor {
|
|
19
18
|
constructor(options) {
|
|
20
19
|
super(options);
|
|
@@ -52,7 +51,6 @@ export class SolanaStepExecutor extends BaseStepExecutor {
|
|
|
52
51
|
});
|
|
53
52
|
if (process.status !== 'DONE') {
|
|
54
53
|
try {
|
|
55
|
-
const connection = await getSolanaConnection();
|
|
56
54
|
process = this.statusManager.updateProcess(step, process.type, 'STARTED');
|
|
57
55
|
// Check balance
|
|
58
56
|
await checkBalance(this.walletAdapter.publicKey.toString(), step);
|
|
@@ -76,9 +74,6 @@ export class SolanaStepExecutor extends BaseStepExecutor {
|
|
|
76
74
|
let transactionRequest = {
|
|
77
75
|
data: step.transactionRequest.data,
|
|
78
76
|
};
|
|
79
|
-
const blockhashResult = await connection.getLatestBlockhash({
|
|
80
|
-
commitment: 'confirmed',
|
|
81
|
-
});
|
|
82
77
|
if (this.executionOptions?.updateTransactionRequestHook) {
|
|
83
78
|
const customizedTransactionRequest = await this.executionOptions.updateTransactionRequestHook({
|
|
84
79
|
requestType: 'transaction',
|
|
@@ -101,84 +96,28 @@ export class SolanaStepExecutor extends BaseStepExecutor {
|
|
|
101
96
|
timeout: 120_000,
|
|
102
97
|
errorInstance: new TransactionError(LiFiErrorCode.TransactionExpired, 'Transaction has expired: blockhash is no longer recent enough.'),
|
|
103
98
|
});
|
|
104
|
-
async function bufferToBase64(buffer) {
|
|
105
|
-
const base64url = (await new Promise((r) => {
|
|
106
|
-
const reader = new FileReader();
|
|
107
|
-
reader.onload = () => r(reader.result);
|
|
108
|
-
reader.readAsDataURL(new Blob([buffer]));
|
|
109
|
-
}));
|
|
110
|
-
return base64url.slice(base64url.indexOf(',') + 1);
|
|
111
|
-
}
|
|
112
|
-
const _s = await bufferToBase64(signedTx.serialize());
|
|
113
|
-
console.log(_s);
|
|
114
99
|
process = this.statusManager.updateProcess(step, process.type, 'PENDING');
|
|
115
|
-
const simulationResult = await connection.simulateTransaction(signedTx, {
|
|
116
|
-
commitment: '
|
|
100
|
+
const simulationResult = await callSolanaWithRetry((connection) => connection.simulateTransaction(signedTx, {
|
|
101
|
+
commitment: 'confirmed',
|
|
117
102
|
replaceRecentBlockhash: true,
|
|
118
|
-
});
|
|
103
|
+
}));
|
|
119
104
|
if (simulationResult.value.err) {
|
|
120
105
|
throw new TransactionError(LiFiErrorCode.TransactionSimulationFailed, 'Transaction simulation failed');
|
|
121
106
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
// A known weirdness - MAX_RECENT_BLOCKHASHES is 300
|
|
125
|
-
// https://github.com/solana-labs/solana/blob/master/sdk/program/src/clock.rs#L123
|
|
126
|
-
// but MAX_PROCESSING_AGE is 150
|
|
127
|
-
// https://github.com/solana-labs/solana/blob/master/sdk/program/src/clock.rs#L129
|
|
128
|
-
// the blockhash queue in the bank tells you 300 + current slot, but it won't be accepted 150 blocks later.
|
|
129
|
-
// https://solana.com/docs/advanced/confirmation#transaction-expiration
|
|
130
|
-
const lastValidBlockHeight = blockhashResult.lastValidBlockHeight - 150;
|
|
131
|
-
// In the following section, we wait and constantly check for the transaction to be confirmed
|
|
132
|
-
// and resend the transaction if it is not confirmed within a certain time interval
|
|
133
|
-
// thus handling tx retries on the client side rather than relying on the RPC
|
|
134
|
-
const abortController = new AbortController();
|
|
135
|
-
const confirmTransactionPromise = connection
|
|
136
|
-
.confirmTransaction({
|
|
137
|
-
signature: txSignature,
|
|
138
|
-
blockhash: blockhashResult.blockhash,
|
|
139
|
-
lastValidBlockHeight: lastValidBlockHeight,
|
|
140
|
-
abortSignal: abortController.signal,
|
|
141
|
-
}, 'confirmed')
|
|
142
|
-
.then((result) => result.value);
|
|
143
|
-
let confirmedTx = null;
|
|
144
|
-
let blockHeight = await connection.getBlockHeight();
|
|
145
|
-
const rawTransactionOptions = {
|
|
146
|
-
// We can skip preflight check after the first transaction has been sent
|
|
147
|
-
// https://solana.com/docs/advanced/retry#the-cost-of-skipping-preflight
|
|
148
|
-
skipPreflight: true,
|
|
149
|
-
// Setting max retries to 0 as we are handling retries manually
|
|
150
|
-
maxRetries: 0,
|
|
151
|
-
// https://solana.com/docs/advanced/confirmation#use-an-appropriate-preflight-commitment-level
|
|
152
|
-
preflightCommitment: 'confirmed',
|
|
153
|
-
};
|
|
154
|
-
const signedTxSerialized = signedTx.serialize();
|
|
155
|
-
// https://solana.com/docs/advanced/retry#customizing-rebroadcast-logic
|
|
156
|
-
while (!confirmedTx && blockHeight < lastValidBlockHeight) {
|
|
157
|
-
await connection.sendRawTransaction(signedTxSerialized, rawTransactionOptions);
|
|
158
|
-
confirmedTx = await Promise.race([
|
|
159
|
-
confirmTransactionPromise,
|
|
160
|
-
sleep(1000),
|
|
161
|
-
]);
|
|
162
|
-
if (confirmedTx) {
|
|
163
|
-
break;
|
|
164
|
-
}
|
|
165
|
-
blockHeight = await connection.getBlockHeight();
|
|
166
|
-
}
|
|
167
|
-
// Stop waiting for tx confirmation
|
|
168
|
-
abortController.abort();
|
|
169
|
-
if (!confirmedTx) {
|
|
107
|
+
const confirmedTx = await sendAndConfirmTransaction(signedTx);
|
|
108
|
+
if (!confirmedTx.signatureResult) {
|
|
170
109
|
throw new TransactionError(LiFiErrorCode.TransactionExpired, 'Transaction has expired: The block height has exceeded the maximum allowed limit.');
|
|
171
110
|
}
|
|
172
|
-
if (confirmedTx
|
|
173
|
-
const reason = typeof confirmedTx.err === 'object'
|
|
174
|
-
? JSON.stringify(confirmedTx.err)
|
|
175
|
-
: confirmedTx.err;
|
|
111
|
+
if (confirmedTx.signatureResult.err) {
|
|
112
|
+
const reason = typeof confirmedTx.signatureResult.err === 'object'
|
|
113
|
+
? JSON.stringify(confirmedTx.signatureResult.err)
|
|
114
|
+
: confirmedTx.signatureResult.err;
|
|
176
115
|
throw new TransactionError(LiFiErrorCode.TransactionFailed, `Transaction failed: ${reason}`);
|
|
177
116
|
}
|
|
178
117
|
// Transaction has been confirmed and we can update the process
|
|
179
118
|
process = this.statusManager.updateProcess(step, process.type, 'PENDING', {
|
|
180
|
-
txHash: txSignature,
|
|
181
|
-
txLink: `${fromChain.metamask.blockExplorerUrls[0]}tx/${txSignature}`,
|
|
119
|
+
txHash: confirmedTx.txSignature,
|
|
120
|
+
txLink: `${fromChain.metamask.blockExplorerUrls[0]}tx/${confirmedTx.txSignature}`,
|
|
182
121
|
});
|
|
183
122
|
if (isBridgeExecution) {
|
|
184
123
|
process = this.statusManager.updateProcess(step, process.type, 'DONE');
|