@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolanaStepExecutor.js","sourceRoot":"","sources":["../../../core/Solana/SolanaStepExecutor.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"SolanaStepExecutor.js","sourceRoot":"","sources":["../../../core/Solana/SolanaStepExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,47 @@
|
|
|
1
1
|
import { ChainId } from '@lifi/types';
|
|
2
2
|
import { Connection } from '@solana/web3.js';
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import { getRpcUrls } from '../rpc.js';
|
|
4
|
+
const connections = new Map();
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
7
|
-
* @returns -
|
|
6
|
+
* Initializes the Solana connections if they haven't been initialized yet.
|
|
7
|
+
* @returns - Promise that resolves when connections are initialized.
|
|
8
8
|
*/
|
|
9
|
-
export const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
export const ensureConnections = async () => {
|
|
10
|
+
const rpcUrls = await getRpcUrls(ChainId.SOL);
|
|
11
|
+
for (const rpcUrl of rpcUrls) {
|
|
12
|
+
if (!connections.get(rpcUrl)) {
|
|
13
|
+
const connection = new Connection(rpcUrl);
|
|
14
|
+
connections.set(rpcUrl, connection);
|
|
15
|
+
}
|
|
14
16
|
}
|
|
15
|
-
return connection;
|
|
16
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* Wrapper around getting the connection (RPC provider) for Solana
|
|
20
|
+
* @returns - Solana RPC connections
|
|
21
|
+
*/
|
|
22
|
+
export const getSolanaConnections = async () => {
|
|
23
|
+
await ensureConnections();
|
|
24
|
+
return Array.from(connections.values());
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Calls a function on the Connection instances with retry logic.
|
|
28
|
+
* @param fn - The function to call, which receives a Connection instance.
|
|
29
|
+
* @returns - The result of the function call.
|
|
30
|
+
*/
|
|
31
|
+
export async function callSolanaWithRetry(fn) {
|
|
32
|
+
// Ensure connections are initialized
|
|
33
|
+
await ensureConnections();
|
|
34
|
+
let lastError = null;
|
|
35
|
+
for (const connection of connections.values()) {
|
|
36
|
+
try {
|
|
37
|
+
const result = await fn(connection);
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
lastError = error;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Throw the last encountered error
|
|
45
|
+
throw lastError;
|
|
46
|
+
}
|
|
17
47
|
//# sourceMappingURL=connection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../core/Solana/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../core/Solana/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAA;AAEjD;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,IAAmB,EAAE;IACzD,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,OAAO,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,UAAU,CAAC,MAAM,CAAC,CAAA;YACzC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,IAA2B,EAAE;IACpE,MAAM,iBAAiB,EAAE,CAAA;IACzB,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAA;AACzC,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAA0C;IAE1C,qCAAqC;IACrC,MAAM,iBAAiB,EAAE,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;IACD,mCAAmC;IACnC,MAAM,SAAS,CAAA;AACjB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { PublicKey } from '@solana/web3.js';
|
|
2
2
|
import { SolSystemProgram } from '../../constants.js';
|
|
3
|
-
import {
|
|
3
|
+
import { withDedupe } from '../../utils/withDedupe.js';
|
|
4
|
+
import { callSolanaWithRetry } from './connection.js';
|
|
4
5
|
import { TokenProgramAddress } from './types.js';
|
|
5
6
|
export const getSolanaBalance = async (walletAddress, tokens) => {
|
|
6
7
|
if (tokens.length === 0) {
|
|
@@ -15,15 +16,14 @@ export const getSolanaBalance = async (walletAddress, tokens) => {
|
|
|
15
16
|
return getSolanaBalanceDefault(chainId, tokens, walletAddress);
|
|
16
17
|
};
|
|
17
18
|
const getSolanaBalanceDefault = async (_chainId, tokens, walletAddress) => {
|
|
18
|
-
const connection = await getSolanaConnection();
|
|
19
19
|
const accountPublicKey = new PublicKey(walletAddress);
|
|
20
20
|
const tokenProgramPublicKey = new PublicKey(TokenProgramAddress);
|
|
21
21
|
const [slot, balance, tokenAccountsByOwner] = await Promise.allSettled([
|
|
22
|
-
connection.getSlot(),
|
|
23
|
-
connection.getBalance(accountPublicKey),
|
|
24
|
-
connection.getParsedTokenAccountsByOwner(accountPublicKey, {
|
|
22
|
+
withDedupe(() => callSolanaWithRetry((connection) => connection.getSlot('confirmed')), { id: `${getSolanaBalanceDefault.name}.getSlot` }),
|
|
23
|
+
withDedupe(() => callSolanaWithRetry((connection) => connection.getBalance(accountPublicKey, 'confirmed')), { id: `${getSolanaBalanceDefault.name}.getBalance` }),
|
|
24
|
+
withDedupe(() => callSolanaWithRetry((connection) => connection.getParsedTokenAccountsByOwner(accountPublicKey, {
|
|
25
25
|
programId: tokenProgramPublicKey,
|
|
26
|
-
}),
|
|
26
|
+
}, 'confirmed')), { id: `${getSolanaBalanceDefault.name}.getParsedTokenAccountsByOwner` }),
|
|
27
27
|
]);
|
|
28
28
|
const blockNumber = slot.status === 'fulfilled' ? BigInt(slot.value) : 0n;
|
|
29
29
|
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,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEhD,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,
|
|
1
|
+
{"version":3,"file":"getSolanaBalance.js","sourceRoot":"","sources":["../../../core/Solana/getSolanaBalance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import bs58 from 'bs58';
|
|
2
|
+
import { sleep } from '../../utils/sleep.js';
|
|
3
|
+
import { getSolanaConnections } from './connection.js';
|
|
4
|
+
/**
|
|
5
|
+
* Sends a Solana transaction to multiple RPC endpoints and returns the confirmation
|
|
6
|
+
* as soon as any of them confirm the transaction.
|
|
7
|
+
* @param signedTx - The signed transaction to send.
|
|
8
|
+
* @returns - The confirmation result of the transaction.
|
|
9
|
+
*/
|
|
10
|
+
export async function sendAndConfirmTransaction(signedTx) {
|
|
11
|
+
const connections = await getSolanaConnections();
|
|
12
|
+
const signedTxSerialized = signedTx.serialize();
|
|
13
|
+
// Create transaction hash (signature)
|
|
14
|
+
const txSignature = bs58.encode(signedTx.signatures[0]);
|
|
15
|
+
if (!txSignature) {
|
|
16
|
+
throw new Error('Transaction signature is missing.');
|
|
17
|
+
}
|
|
18
|
+
const rawTransactionOptions = {
|
|
19
|
+
// We can skip preflight check after the first transaction has been sent
|
|
20
|
+
// https://solana.com/docs/advanced/retry#the-cost-of-skipping-preflight
|
|
21
|
+
skipPreflight: true,
|
|
22
|
+
// Setting max retries to 0 as we are handling retries manually
|
|
23
|
+
maxRetries: 0,
|
|
24
|
+
// https://solana.com/docs/advanced/confirmation#use-an-appropriate-preflight-commitment-level
|
|
25
|
+
preflightCommitment: 'confirmed',
|
|
26
|
+
};
|
|
27
|
+
for (const connection of connections) {
|
|
28
|
+
connection
|
|
29
|
+
.sendRawTransaction(signedTxSerialized, rawTransactionOptions)
|
|
30
|
+
.catch();
|
|
31
|
+
}
|
|
32
|
+
const abortControllers = [];
|
|
33
|
+
const confirmPromises = connections.map(async (connection) => {
|
|
34
|
+
const abortController = new AbortController();
|
|
35
|
+
abortControllers.push(abortController);
|
|
36
|
+
try {
|
|
37
|
+
const blockhashResult = await connection.getLatestBlockhash('confirmed');
|
|
38
|
+
const confirmTransactionPromise = connection
|
|
39
|
+
.confirmTransaction({
|
|
40
|
+
signature: txSignature,
|
|
41
|
+
blockhash: blockhashResult.blockhash,
|
|
42
|
+
lastValidBlockHeight: blockhashResult.lastValidBlockHeight,
|
|
43
|
+
abortSignal: abortController.signal,
|
|
44
|
+
}, 'confirmed')
|
|
45
|
+
.then((result) => result.value);
|
|
46
|
+
let signatureResult = null;
|
|
47
|
+
let blockHeight = await connection.getBlockHeight('confirmed');
|
|
48
|
+
while (!signatureResult &&
|
|
49
|
+
blockHeight < blockhashResult.lastValidBlockHeight) {
|
|
50
|
+
await connection.sendRawTransaction(signedTxSerialized, rawTransactionOptions);
|
|
51
|
+
signatureResult = await Promise.race([
|
|
52
|
+
confirmTransactionPromise,
|
|
53
|
+
sleep(1000),
|
|
54
|
+
]);
|
|
55
|
+
if (signatureResult || abortController.signal.aborted) {
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
blockHeight = await connection.getBlockHeight('confirmed');
|
|
59
|
+
}
|
|
60
|
+
abortController.abort();
|
|
61
|
+
return signatureResult;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (abortController.signal.aborted) {
|
|
65
|
+
return Promise.reject(new Error('Confirmation aborted.'));
|
|
66
|
+
}
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
const signatureResult = await Promise.any(confirmPromises).catch(() => null);
|
|
71
|
+
for (const abortController of abortControllers) {
|
|
72
|
+
abortController.abort();
|
|
73
|
+
}
|
|
74
|
+
return { signatureResult, txSignature };
|
|
75
|
+
}
|
|
76
|
+
//# 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":"AAAA;;;;GAIG;AACH,MAAM,OAAO,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;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,MAAM,CAAe,IAAI,CAAC,CAAA;AAOxE,uCAAuC;AACvC,MAAM,UAAU,UAAU,CACxB,
|
|
1
|
+
{"version":3,"file":"withDedupe.js","sourceRoot":"","sources":["../../utils/withDedupe.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,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;AAED,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,MAAM,CAAe,IAAI,CAAC,CAAA;AAOxE,uCAAuC;AACvC,MAAM,UAAU,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,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QACzB,OAAO,YAAY,CAAC,GAAG,CAAC,EAAE,CAAE,CAAA;IAC9B,CAAC;IACD,MAAM,OAAO,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3D,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
package/src/_esm/version.js
CHANGED
package/src/_types/config.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { ChainId, type ExtendedChain } from '@lifi/types';
|
|
2
2
|
import type { SDKProvider } from './core/types.js';
|
|
3
3
|
import type { RPCUrls, SDKBaseConfig, SDKConfig } from './types/internal.js';
|
|
4
4
|
export declare const config: {
|
|
@@ -9,7 +9,7 @@ export declare const config: {
|
|
|
9
9
|
setChains(chains: ExtendedChain[]): void;
|
|
10
10
|
getChains(): Promise<ExtendedChain[]>;
|
|
11
11
|
getChainById(chainId: ChainId): Promise<ExtendedChain>;
|
|
12
|
-
setRPCUrls(rpcUrls: RPCUrls): void;
|
|
12
|
+
setRPCUrls(rpcUrls: RPCUrls, skipChains?: ChainId[]): void;
|
|
13
13
|
getRPCUrls(): Promise<Partial<Record<ChainId, string[]>>>;
|
|
14
14
|
};
|
|
15
15
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE5E,eAAO,MAAM,MAAM;;;iBAkBF,SAAS;4BAcE,WAAW,EAAE;sBASnB,aAAa,EAAE;;0BAiBL,OAAO;wBAUf,OAAO,eAAe,OAAO,EAAE;;CAwBnD,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolanaStepExecutor.d.ts","sourceRoot":"","sources":["../../../core/Solana/SolanaStepExecutor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"SolanaStepExecutor.d.ts","sourceRoot":"","sources":["../../../core/Solana/SolanaStepExecutor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAStE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAIzD,OAAO,KAAK,EACV,gBAAgB,EAChB,mBAAmB,EAEpB,MAAM,aAAa,CAAA;AAMpB,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IACpE,aAAa,EAAE,mBAAmB,CAAA;CACnC;AAED,qBAAa,kBAAmB,SAAQ,gBAAgB;IACtD,OAAO,CAAC,aAAa,CAAqB;gBAE9B,OAAO,EAAE,yBAAyB;IAK9C,kBAAkB,SAAU,gBAAgB,UAQ3C;IAED,WAAW,SAAgB,gBAAgB,KAAG,OAAO,CAAC,gBAAgB,CAAC,CAsPtE;CACF"}
|
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
import { Connection } from '@solana/web3.js';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
* @returns -
|
|
3
|
+
* Initializes the Solana connections if they haven't been initialized yet.
|
|
4
|
+
* @returns - Promise that resolves when connections are initialized.
|
|
5
5
|
*/
|
|
6
|
-
export declare const
|
|
6
|
+
export declare const ensureConnections: () => Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Wrapper around getting the connection (RPC provider) for Solana
|
|
9
|
+
* @returns - Solana RPC connections
|
|
10
|
+
*/
|
|
11
|
+
export declare const getSolanaConnections: () => Promise<Connection[]>;
|
|
12
|
+
/**
|
|
13
|
+
* Calls a function on the Connection instances with retry logic.
|
|
14
|
+
* @param fn - The function to call, which receives a Connection instance.
|
|
15
|
+
* @returns - The result of the function call.
|
|
16
|
+
*/
|
|
17
|
+
export declare function callSolanaWithRetry<R>(fn: (connection: Connection) => Promise<R>): Promise<R>;
|
|
7
18
|
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../core/Solana/connection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAK5C;;;GAGG;AACH,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../core/Solana/connection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAK5C;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,IAAI,CAQtD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,QAAa,OAAO,CAAC,UAAU,EAAE,CAGjE,CAAA;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,CAAC,EACzC,EAAE,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC,CAcZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getSolanaBalance.d.ts","sourceRoot":"","sources":["../../../core/Solana/getSolanaBalance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"getSolanaBalance.d.ts","sourceRoot":"","sources":["../../../core/Solana/getSolanaBalance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAO9D,eAAO,MAAM,gBAAgB,kBACZ,MAAM,UACb,KAAK,EAAE,KACd,OAAO,CAAC,WAAW,EAAE,CAYvB,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SignatureResult, VersionedTransaction } from '@solana/web3.js';
|
|
2
|
+
export type ConfirmedTransactionResult = {
|
|
3
|
+
signatureResult: SignatureResult | null;
|
|
4
|
+
txSignature: string;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Sends a Solana transaction to multiple RPC endpoints and returns the confirmation
|
|
8
|
+
* as soon as any of them confirm the transaction.
|
|
9
|
+
* @param signedTx - The signed transaction to send.
|
|
10
|
+
* @returns - The confirmation result of the transaction.
|
|
11
|
+
*/
|
|
12
|
+
export declare function sendAndConfirmTransaction(signedTx: VersionedTransaction): Promise<ConfirmedTransactionResult>;
|
|
13
|
+
//# sourceMappingURL=sendAndConfirmTransaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendAndConfirmTransaction.d.ts","sourceRoot":"","sources":["../../../core/Solana/sendAndConfirmTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,eAAe,EACf,oBAAoB,EACrB,MAAM,iBAAiB,CAAA;AAKxB,MAAM,MAAM,0BAA0B,GAAG;IACvC,eAAe,EAAE,eAAe,GAAG,IAAI,CAAA;IACvC,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,0BAA0B,CAAC,CAwFrC"}
|
|
@@ -15,6 +15,6 @@ type WithDedupeOptions = {
|
|
|
15
15
|
id?: string | undefined;
|
|
16
16
|
};
|
|
17
17
|
/** Deduplicates in-flight promises. */
|
|
18
|
-
export declare function withDedupe<
|
|
18
|
+
export declare function withDedupe<T>(fn: () => Promise<T>, { enabled, id }: WithDedupeOptions): Promise<T>;
|
|
19
19
|
export {};
|
|
20
20
|
//# sourceMappingURL=withDedupe.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"withDedupe.d.ts","sourceRoot":"","sources":["../../utils/withDedupe.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,MAAM,CAAC,KAAK,GAAG,OAAO,CAAE,SAAQ,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;IAC7D,OAAO,EAAE,MAAM,CAAA;gBAEH,IAAI,EAAE,MAAM;IAKf,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAOvC;AAED,gBAAgB;AAChB,eAAO,MAAM,YAAY,sBAA+C,CAAA;AAExE,KAAK,iBAAiB,GAAG;IACvB,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC7B,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACxB,CAAA;AAED,uCAAuC;AACvC,wBAAgB,UAAU,CAAC,
|
|
1
|
+
{"version":3,"file":"withDedupe.d.ts","sourceRoot":"","sources":["../../utils/withDedupe.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,MAAM,CAAC,KAAK,GAAG,OAAO,CAAE,SAAQ,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC;IAC7D,OAAO,EAAE,MAAM,CAAA;gBAEH,IAAI,EAAE,MAAM;IAKf,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK;CAOvC;AAED,gBAAgB;AAChB,eAAO,MAAM,YAAY,sBAA+C,CAAA;AAExE,KAAK,iBAAiB,GAAG;IACvB,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC7B,EAAE,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACxB,CAAA;AAED,uCAAuC;AACvC,wBAAgB,UAAU,CAAC,CAAC,EAC1B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,EAAE,OAAc,EAAE,EAAE,EAAE,EAAE,iBAAiB,GACxC,OAAO,CAAC,CAAC,CAAC,CAUZ"}
|
package/src/_types/version.d.ts
CHANGED
package/src/config.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { ChainId, type ExtendedChain } from '@lifi/types'
|
|
2
2
|
import type { SDKProvider } from './core/types.js'
|
|
3
3
|
import type { RPCUrls, SDKBaseConfig, SDKConfig } from './types/internal.js'
|
|
4
4
|
|
|
@@ -50,7 +50,7 @@ export const config = (() => {
|
|
|
50
50
|
}
|
|
51
51
|
return rpcUrls
|
|
52
52
|
}, {} as RPCUrls)
|
|
53
|
-
this.setRPCUrls(rpcUrls)
|
|
53
|
+
this.setRPCUrls(rpcUrls, [ChainId.SOL])
|
|
54
54
|
_config.chains = chains
|
|
55
55
|
_loading = undefined
|
|
56
56
|
},
|
|
@@ -70,20 +70,20 @@ export const config = (() => {
|
|
|
70
70
|
}
|
|
71
71
|
return chain
|
|
72
72
|
},
|
|
73
|
-
setRPCUrls(rpcUrls: RPCUrls) {
|
|
73
|
+
setRPCUrls(rpcUrls: RPCUrls, skipChains?: ChainId[]) {
|
|
74
74
|
for (const rpcUrlsKey in rpcUrls) {
|
|
75
|
-
const chainId = rpcUrlsKey as
|
|
75
|
+
const chainId = Number(rpcUrlsKey) as ChainId
|
|
76
76
|
const urls = rpcUrls[chainId]
|
|
77
77
|
if (!urls?.length) {
|
|
78
78
|
continue
|
|
79
79
|
}
|
|
80
80
|
if (!_config.rpcUrls[chainId]?.length) {
|
|
81
81
|
_config.rpcUrls[chainId] = Array.from(urls)
|
|
82
|
-
} else {
|
|
82
|
+
} else if (!skipChains?.includes(chainId)) {
|
|
83
83
|
const filteredUrls = urls.filter(
|
|
84
84
|
(url) => !_config.rpcUrls[chainId]?.includes(url)
|
|
85
85
|
)
|
|
86
|
-
_config.rpcUrls[chainId]
|
|
86
|
+
_config.rpcUrls[chainId].push(...filteredUrls)
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
},
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import type { ExtendedTransactionInfo, FullStatusData } from '@lifi/types'
|
|
2
2
|
import type { SignerWalletAdapter } from '@solana/wallet-adapter-base'
|
|
3
|
-
import {
|
|
4
|
-
type SendOptions,
|
|
5
|
-
type SignatureResult,
|
|
6
|
-
VersionedTransaction,
|
|
7
|
-
} from '@solana/web3.js'
|
|
8
|
-
import bs58 from 'bs58'
|
|
3
|
+
import { VersionedTransaction } from '@solana/web3.js'
|
|
9
4
|
import { withTimeout } from 'viem'
|
|
10
5
|
import { config } from '../../config.js'
|
|
11
6
|
import { LiFiErrorCode } from '../../errors/constants.js'
|
|
@@ -13,7 +8,6 @@ import { TransactionError } from '../../errors/errors.js'
|
|
|
13
8
|
import { getStepTransaction } from '../../services/api.js'
|
|
14
9
|
import { base64ToUint8Array } from '../../utils/base64ToUint8Array.js'
|
|
15
10
|
import { getTransactionFailedMessage } from '../../utils/getTransactionMessage.js'
|
|
16
|
-
import { sleep } from '../../utils/sleep.js'
|
|
17
11
|
import { BaseStepExecutor } from '../BaseStepExecutor.js'
|
|
18
12
|
import { checkBalance } from '../checkBalance.js'
|
|
19
13
|
import { getSubstatusMessage } from '../processMessages.js'
|
|
@@ -24,8 +18,9 @@ import type {
|
|
|
24
18
|
TransactionParameters,
|
|
25
19
|
} from '../types.js'
|
|
26
20
|
import { waitForReceivingTransaction } from '../waitForReceivingTransaction.js'
|
|
27
|
-
import {
|
|
21
|
+
import { callSolanaWithRetry } from './connection.js'
|
|
28
22
|
import { parseSolanaErrors } from './parseSolanaErrors.js'
|
|
23
|
+
import { sendAndConfirmTransaction } from './sendAndConfirmTransaction.js'
|
|
29
24
|
|
|
30
25
|
export interface SolanaStepExecutorOptions extends StepExecutorOptions {
|
|
31
26
|
walletAdapter: SignerWalletAdapter
|
|
@@ -66,8 +61,6 @@ export class SolanaStepExecutor extends BaseStepExecutor {
|
|
|
66
61
|
|
|
67
62
|
if (process.status !== 'DONE') {
|
|
68
63
|
try {
|
|
69
|
-
const connection = await getSolanaConnection()
|
|
70
|
-
|
|
71
64
|
process = this.statusManager.updateProcess(
|
|
72
65
|
step,
|
|
73
66
|
process.type,
|
|
@@ -115,10 +108,6 @@ export class SolanaStepExecutor extends BaseStepExecutor {
|
|
|
115
108
|
data: step.transactionRequest.data,
|
|
116
109
|
}
|
|
117
110
|
|
|
118
|
-
const blockhashResult = await connection.getLatestBlockhash({
|
|
119
|
-
commitment: 'confirmed',
|
|
120
|
-
})
|
|
121
|
-
|
|
122
111
|
if (this.executionOptions?.updateTransactionRequestHook) {
|
|
123
112
|
const customizedTransactionRequest: TransactionParameters =
|
|
124
113
|
await this.executionOptions.updateTransactionRequestHook({
|
|
@@ -159,30 +148,17 @@ export class SolanaStepExecutor extends BaseStepExecutor {
|
|
|
159
148
|
}
|
|
160
149
|
)
|
|
161
150
|
|
|
162
|
-
async function bufferToBase64(buffer: any) {
|
|
163
|
-
const base64url = (await new Promise((r) => {
|
|
164
|
-
const reader = new FileReader()
|
|
165
|
-
reader.onload = () => r(reader.result)
|
|
166
|
-
reader.readAsDataURL(new Blob([buffer]))
|
|
167
|
-
})) as any
|
|
168
|
-
return base64url.slice(base64url.indexOf(',') + 1)
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const _s = await bufferToBase64(signedTx.serialize())
|
|
172
|
-
console.log(_s)
|
|
173
|
-
|
|
174
151
|
process = this.statusManager.updateProcess(
|
|
175
152
|
step,
|
|
176
153
|
process.type,
|
|
177
154
|
'PENDING'
|
|
178
155
|
)
|
|
179
156
|
|
|
180
|
-
const simulationResult = await connection
|
|
181
|
-
signedTx,
|
|
182
|
-
|
|
183
|
-
commitment: 'processed',
|
|
157
|
+
const simulationResult = await callSolanaWithRetry((connection) =>
|
|
158
|
+
connection.simulateTransaction(signedTx, {
|
|
159
|
+
commitment: 'confirmed',
|
|
184
160
|
replaceRecentBlockhash: true,
|
|
185
|
-
}
|
|
161
|
+
})
|
|
186
162
|
)
|
|
187
163
|
|
|
188
164
|
if (simulationResult.value.err) {
|
|
@@ -192,79 +168,20 @@ export class SolanaStepExecutor extends BaseStepExecutor {
|
|
|
192
168
|
)
|
|
193
169
|
}
|
|
194
170
|
|
|
195
|
-
|
|
196
|
-
const txSignature = bs58.encode(signedTx.signatures[0])
|
|
197
|
-
|
|
198
|
-
// A known weirdness - MAX_RECENT_BLOCKHASHES is 300
|
|
199
|
-
// https://github.com/solana-labs/solana/blob/master/sdk/program/src/clock.rs#L123
|
|
200
|
-
// but MAX_PROCESSING_AGE is 150
|
|
201
|
-
// https://github.com/solana-labs/solana/blob/master/sdk/program/src/clock.rs#L129
|
|
202
|
-
// the blockhash queue in the bank tells you 300 + current slot, but it won't be accepted 150 blocks later.
|
|
203
|
-
// https://solana.com/docs/advanced/confirmation#transaction-expiration
|
|
204
|
-
const lastValidBlockHeight = blockhashResult.lastValidBlockHeight - 150
|
|
205
|
-
|
|
206
|
-
// In the following section, we wait and constantly check for the transaction to be confirmed
|
|
207
|
-
// and resend the transaction if it is not confirmed within a certain time interval
|
|
208
|
-
// thus handling tx retries on the client side rather than relying on the RPC
|
|
209
|
-
const abortController = new AbortController()
|
|
210
|
-
const confirmTransactionPromise = connection
|
|
211
|
-
.confirmTransaction(
|
|
212
|
-
{
|
|
213
|
-
signature: txSignature,
|
|
214
|
-
blockhash: blockhashResult.blockhash,
|
|
215
|
-
lastValidBlockHeight: lastValidBlockHeight,
|
|
216
|
-
abortSignal: abortController.signal,
|
|
217
|
-
},
|
|
218
|
-
'confirmed'
|
|
219
|
-
)
|
|
220
|
-
.then((result) => result.value)
|
|
221
|
-
|
|
222
|
-
let confirmedTx: SignatureResult | null = null
|
|
223
|
-
let blockHeight = await connection.getBlockHeight()
|
|
224
|
-
|
|
225
|
-
const rawTransactionOptions: SendOptions = {
|
|
226
|
-
// We can skip preflight check after the first transaction has been sent
|
|
227
|
-
// https://solana.com/docs/advanced/retry#the-cost-of-skipping-preflight
|
|
228
|
-
skipPreflight: true,
|
|
229
|
-
// Setting max retries to 0 as we are handling retries manually
|
|
230
|
-
maxRetries: 0,
|
|
231
|
-
// https://solana.com/docs/advanced/confirmation#use-an-appropriate-preflight-commitment-level
|
|
232
|
-
preflightCommitment: 'confirmed',
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
const signedTxSerialized = signedTx.serialize()
|
|
236
|
-
|
|
237
|
-
// https://solana.com/docs/advanced/retry#customizing-rebroadcast-logic
|
|
238
|
-
while (!confirmedTx && blockHeight < lastValidBlockHeight) {
|
|
239
|
-
await connection.sendRawTransaction(
|
|
240
|
-
signedTxSerialized,
|
|
241
|
-
rawTransactionOptions
|
|
242
|
-
)
|
|
243
|
-
confirmedTx = await Promise.race([
|
|
244
|
-
confirmTransactionPromise,
|
|
245
|
-
sleep(1000),
|
|
246
|
-
])
|
|
247
|
-
if (confirmedTx) {
|
|
248
|
-
break
|
|
249
|
-
}
|
|
250
|
-
blockHeight = await connection.getBlockHeight()
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
// Stop waiting for tx confirmation
|
|
254
|
-
abortController.abort()
|
|
171
|
+
const confirmedTx = await sendAndConfirmTransaction(signedTx)
|
|
255
172
|
|
|
256
|
-
if (!confirmedTx) {
|
|
173
|
+
if (!confirmedTx.signatureResult) {
|
|
257
174
|
throw new TransactionError(
|
|
258
175
|
LiFiErrorCode.TransactionExpired,
|
|
259
176
|
'Transaction has expired: The block height has exceeded the maximum allowed limit.'
|
|
260
177
|
)
|
|
261
178
|
}
|
|
262
179
|
|
|
263
|
-
if (confirmedTx
|
|
180
|
+
if (confirmedTx.signatureResult.err) {
|
|
264
181
|
const reason =
|
|
265
|
-
typeof confirmedTx.err === 'object'
|
|
266
|
-
? JSON.stringify(confirmedTx.err)
|
|
267
|
-
: confirmedTx.err
|
|
182
|
+
typeof confirmedTx.signatureResult.err === 'object'
|
|
183
|
+
? JSON.stringify(confirmedTx.signatureResult.err)
|
|
184
|
+
: confirmedTx.signatureResult.err
|
|
268
185
|
throw new TransactionError(
|
|
269
186
|
LiFiErrorCode.TransactionFailed,
|
|
270
187
|
`Transaction failed: ${reason}`
|
|
@@ -277,8 +194,8 @@ export class SolanaStepExecutor extends BaseStepExecutor {
|
|
|
277
194
|
process.type,
|
|
278
195
|
'PENDING',
|
|
279
196
|
{
|
|
280
|
-
txHash: txSignature,
|
|
281
|
-
txLink: `${fromChain.metamask.blockExplorerUrls[0]}tx/${txSignature}`,
|
|
197
|
+
txHash: confirmedTx.txSignature,
|
|
198
|
+
txLink: `${fromChain.metamask.blockExplorerUrls[0]}tx/${confirmedTx.txSignature}`,
|
|
282
199
|
}
|
|
283
200
|
)
|
|
284
201
|
|