@lifi/sdk 3.13.7 → 3.14.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 +3 -3
- package/src/_cjs/core/Solana/SolanaStepExecutor.js +65 -19
- package/src/_cjs/core/Solana/SolanaStepExecutor.js.map +1 -1
- package/src/_cjs/core/Solana/connection.js +12 -4
- package/src/_cjs/core/Solana/connection.js.map +1 -1
- package/src/_cjs/core/Solana/jito/JitoConnection.js +97 -0
- package/src/_cjs/core/Solana/jito/JitoConnection.js.map +1 -0
- package/src/_cjs/core/Solana/jito/constants.js +14 -0
- package/src/_cjs/core/Solana/jito/constants.js.map +1 -0
- package/src/_cjs/core/Solana/jito/sendAndConfirmBundle.js +70 -0
- package/src/_cjs/core/Solana/jito/sendAndConfirmBundle.js.map +1 -0
- package/src/_cjs/index.js.map +1 -1
- package/src/_cjs/request.js +7 -3
- package/src/_cjs/request.js.map +1 -1
- package/src/_cjs/services/api.js +8 -1
- package/src/_cjs/services/api.js.map +1 -1
- package/src/_cjs/utils/uint8ArrayToBase64.js +11 -0
- package/src/_cjs/utils/uint8ArrayToBase64.js.map +1 -0
- package/src/_cjs/version.js +1 -1
- package/src/_esm/core/Solana/SolanaStepExecutor.js +91 -19
- package/src/_esm/core/Solana/SolanaStepExecutor.js.map +1 -1
- package/src/_esm/core/Solana/connection.js +16 -4
- package/src/_esm/core/Solana/connection.js.map +1 -1
- package/src/_esm/core/Solana/jito/JitoConnection.js +139 -0
- package/src/_esm/core/Solana/jito/JitoConnection.js.map +1 -0
- package/src/_esm/core/Solana/jito/constants.js +12 -0
- package/src/_esm/core/Solana/jito/constants.js.map +1 -0
- package/src/_esm/core/Solana/jito/sendAndConfirmBundle.js +81 -0
- package/src/_esm/core/Solana/jito/sendAndConfirmBundle.js.map +1 -0
- package/src/_esm/index.js.map +1 -1
- package/src/_esm/request.js +7 -3
- package/src/_esm/request.js.map +1 -1
- package/src/_esm/services/api.js +10 -2
- package/src/_esm/services/api.js.map +1 -1
- package/src/_esm/utils/uint8ArrayToBase64.js +10 -0
- package/src/_esm/utils/uint8ArrayToBase64.js.map +1 -0
- package/src/_esm/version.js +1 -1
- package/src/_types/core/Solana/SolanaStepExecutor.d.ts +18 -0
- package/src/_types/core/Solana/SolanaStepExecutor.d.ts.map +1 -1
- package/src/_types/core/Solana/connection.d.ts +8 -1
- package/src/_types/core/Solana/connection.d.ts.map +1 -1
- package/src/_types/core/Solana/jito/JitoConnection.d.ts +85 -0
- package/src/_types/core/Solana/jito/JitoConnection.d.ts.map +1 -0
- package/src/_types/core/Solana/jito/constants.d.ts +2 -0
- package/src/_types/core/Solana/jito/constants.d.ts.map +1 -0
- package/src/_types/core/Solana/jito/sendAndConfirmBundle.d.ts +15 -0
- package/src/_types/core/Solana/jito/sendAndConfirmBundle.d.ts.map +1 -0
- package/src/_types/index.d.ts +1 -1
- package/src/_types/index.d.ts.map +1 -1
- package/src/_types/request.d.ts.map +1 -1
- package/src/_types/services/api.d.ts +1 -1
- package/src/_types/services/api.d.ts.map +1 -1
- package/src/_types/types/internal.d.ts +3 -0
- package/src/_types/types/internal.d.ts.map +1 -1
- package/src/_types/utils/uint8ArrayToBase64.d.ts +2 -0
- package/src/_types/utils/uint8ArrayToBase64.d.ts.map +1 -0
- package/src/_types/version.d.ts +1 -1
- package/src/core/Solana/SolanaStepExecutor.ts +130 -29
- package/src/core/Solana/connection.ts +23 -5
- package/src/core/Solana/jito/JitoConnection.ts +190 -0
- package/src/core/Solana/jito/constants.ts +11 -0
- package/src/core/Solana/jito/sendAndConfirmBundle.ts +110 -0
- package/src/index.ts +6 -1
- package/src/request.ts +9 -3
- package/src/services/api.ts +19 -12
- package/src/types/internal.ts +6 -0
- package/src/utils/uint8ArrayToBase64.ts +12 -0
- package/src/version.ts +1 -1
|
@@ -10,6 +10,7 @@ import { checkBalance } from '../checkBalance.js';
|
|
|
10
10
|
import { stepComparison } from '../stepComparison.js';
|
|
11
11
|
import { waitForDestinationChainTransaction } from '../waitForDestinationChainTransaction.js';
|
|
12
12
|
import { callSolanaWithRetry } from './connection.js';
|
|
13
|
+
import { sendAndConfirmBundle } from './jito/sendAndConfirmBundle.js';
|
|
13
14
|
import { parseSolanaErrors } from './parseSolanaErrors.js';
|
|
14
15
|
import { sendAndConfirmTransaction } from './sendAndConfirmTransaction.js';
|
|
15
16
|
export class SolanaStepExecutor extends BaseStepExecutor {
|
|
@@ -24,6 +25,44 @@ export class SolanaStepExecutor extends BaseStepExecutor {
|
|
|
24
25
|
throw new TransactionError(LiFiErrorCode.WalletChangedDuringExecution, 'The wallet address that requested the quote does not match the wallet address attempting to sign the transaction.');
|
|
25
26
|
}
|
|
26
27
|
};
|
|
28
|
+
/**
|
|
29
|
+
* Deserializes base64-encoded transaction data into VersionedTransaction objects.
|
|
30
|
+
* Handles both single transactions and arrays of transactions.
|
|
31
|
+
*
|
|
32
|
+
* @param transactionRequest - Transaction parameters containing base64-encoded transaction data
|
|
33
|
+
* @returns {VersionedTransaction[]} Array of deserialized VersionedTransaction objects
|
|
34
|
+
* @throws {TransactionError} If transaction data is missing or empty
|
|
35
|
+
*/
|
|
36
|
+
deserializeTransactions(transactionRequest) {
|
|
37
|
+
if (!transactionRequest.data?.length) {
|
|
38
|
+
throw new TransactionError(LiFiErrorCode.TransactionUnprepared, 'Unable to prepare transaction.');
|
|
39
|
+
}
|
|
40
|
+
if (Array.isArray(transactionRequest.data)) {
|
|
41
|
+
return transactionRequest.data.map((tx) => VersionedTransaction.deserialize(base64ToUint8Array(tx)));
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
return [
|
|
45
|
+
VersionedTransaction.deserialize(base64ToUint8Array(transactionRequest.data)),
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Determines whether to use Jito bundle submission for the given transactions.
|
|
51
|
+
* Multiple transactions require Jito bundle support to be enabled in config.
|
|
52
|
+
*
|
|
53
|
+
* @param transactions - Array of transactions to evaluate
|
|
54
|
+
* @returns {Boolean} True if Jito bundle should be used (multiple transactions + Jito enabled), false otherwise
|
|
55
|
+
* @throws {TransactionError} If multiple transactions are provided but Jito bundle is not enabled
|
|
56
|
+
*/
|
|
57
|
+
shouldUseJitoBundle(transactions) {
|
|
58
|
+
const isJitoBundleEnabled = Boolean(config.get().routeOptions?.jitoBundle);
|
|
59
|
+
// If we received multiple transactions but Jito is not enabled,
|
|
60
|
+
// this indicates an unexpected state (possibly an API error or misconfiguration)
|
|
61
|
+
if (transactions.length > 1 && !isJitoBundleEnabled) {
|
|
62
|
+
throw new TransactionError(LiFiErrorCode.TransactionUnprepared, `Received ${transactions.length} transactions but Jito bundle is not enabled. Multiple transactions require Jito bundle support. Please enable jitoBundle in routeOptions.`);
|
|
63
|
+
}
|
|
64
|
+
return transactions.length > 1 && isJitoBundleEnabled;
|
|
65
|
+
}
|
|
27
66
|
executeStep = async (step) => {
|
|
28
67
|
step.execution = this.statusManager.initExecutionObject(step);
|
|
29
68
|
const fromChain = await config.getChainById(step.action.fromChainId);
|
|
@@ -71,40 +110,73 @@ export class SolanaStepExecutor extends BaseStepExecutor {
|
|
|
71
110
|
...customizedTransactionRequest,
|
|
72
111
|
};
|
|
73
112
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
const versionedTransaction = VersionedTransaction.deserialize(base64ToUint8Array(transactionRequest.data));
|
|
113
|
+
const transactions = this.deserializeTransactions(transactionRequest);
|
|
114
|
+
const shouldUseJitoBundle = this.shouldUseJitoBundle(transactions);
|
|
78
115
|
this.checkWalletAdapter(step);
|
|
79
116
|
// We give users 2 minutes to sign the transaction or it should be considered expired
|
|
80
|
-
const
|
|
117
|
+
const signedTransactions = await withTimeout(() => this.walletAdapter.signAllTransactions(transactions), {
|
|
81
118
|
// https://solana.com/docs/advanced/confirmation#transaction-expiration
|
|
82
119
|
// Use 2 minutes to account for fluctuations
|
|
83
120
|
timeout: 120_000,
|
|
84
121
|
errorInstance: new TransactionError(LiFiErrorCode.TransactionExpired, 'Transaction has expired: blockhash is no longer recent enough.'),
|
|
85
122
|
});
|
|
86
123
|
process = this.statusManager.updateProcess(step, process.type, 'PENDING');
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
|
|
124
|
+
// Verify wallet adapter returned signed transactions
|
|
125
|
+
if (!signedTransactions.length) {
|
|
126
|
+
throw new TransactionError(LiFiErrorCode.TransactionUnprepared, 'There was a problem signing the transactions. Wallet adapter did not return any signed transactions.');
|
|
127
|
+
}
|
|
128
|
+
let confirmedTransaction;
|
|
129
|
+
if (shouldUseJitoBundle) {
|
|
130
|
+
// Use Jito bundle for multiple transactions
|
|
131
|
+
const bundleResult = await sendAndConfirmBundle(signedTransactions);
|
|
132
|
+
// Check if all transactions in the bundle were confirmed
|
|
133
|
+
// All transactions must succeed for the bundle to be considered successful
|
|
134
|
+
const allConfirmed = bundleResult.signatureResults.every((result) => result !== null);
|
|
135
|
+
if (!allConfirmed) {
|
|
136
|
+
throw new TransactionError(LiFiErrorCode.TransactionExpired, 'One or more bundle transactions were not confirmed within the expected time frame.');
|
|
137
|
+
}
|
|
138
|
+
// Check if any transaction in the bundle has an error
|
|
139
|
+
const failedResult = bundleResult.signatureResults.find((result) => result?.err !== null);
|
|
140
|
+
if (failedResult) {
|
|
141
|
+
const reason = typeof failedResult.err === 'object'
|
|
142
|
+
? JSON.stringify(failedResult.err)
|
|
143
|
+
: failedResult.err;
|
|
144
|
+
throw new TransactionError(LiFiErrorCode.TransactionFailed, `Bundle transaction failed: ${reason}`);
|
|
145
|
+
}
|
|
146
|
+
// Use the first transaction's signature result for reporting
|
|
147
|
+
// (all transactions succeeded if we reach here)
|
|
148
|
+
confirmedTransaction = {
|
|
149
|
+
signatureResult: bundleResult.signatureResults[0],
|
|
150
|
+
txSignature: bundleResult.txSignatures[0],
|
|
151
|
+
bundleId: bundleResult.bundleId,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
// Use regular transaction for single transaction
|
|
156
|
+
const signedTransaction = signedTransactions[0];
|
|
157
|
+
const simulationResult = await callSolanaWithRetry((connection) => connection.simulateTransaction(signedTransaction, {
|
|
158
|
+
commitment: 'confirmed',
|
|
159
|
+
replaceRecentBlockhash: true,
|
|
160
|
+
}));
|
|
161
|
+
if (simulationResult.value.err) {
|
|
162
|
+
throw new TransactionError(LiFiErrorCode.TransactionSimulationFailed, 'Transaction simulation failed');
|
|
163
|
+
}
|
|
164
|
+
confirmedTransaction =
|
|
165
|
+
await sendAndConfirmTransaction(signedTransaction);
|
|
93
166
|
}
|
|
94
|
-
|
|
95
|
-
if (!confirmedTx.signatureResult) {
|
|
167
|
+
if (!confirmedTransaction.signatureResult) {
|
|
96
168
|
throw new TransactionError(LiFiErrorCode.TransactionExpired, 'Transaction has expired: The block height has exceeded the maximum allowed limit.');
|
|
97
169
|
}
|
|
98
|
-
if (
|
|
99
|
-
const reason = typeof
|
|
100
|
-
? JSON.stringify(
|
|
101
|
-
:
|
|
170
|
+
if (confirmedTransaction.signatureResult.err) {
|
|
171
|
+
const reason = typeof confirmedTransaction.signatureResult.err === 'object'
|
|
172
|
+
? JSON.stringify(confirmedTransaction.signatureResult.err)
|
|
173
|
+
: confirmedTransaction.signatureResult.err;
|
|
102
174
|
throw new TransactionError(LiFiErrorCode.TransactionFailed, `Transaction failed: ${reason}`);
|
|
103
175
|
}
|
|
104
176
|
// Transaction has been confirmed and we can update the process
|
|
105
177
|
process = this.statusManager.updateProcess(step, process.type, 'PENDING', {
|
|
106
|
-
txHash:
|
|
107
|
-
txLink: `${fromChain.metamask.blockExplorerUrls[0]}tx/${
|
|
178
|
+
txHash: confirmedTransaction.txSignature,
|
|
179
|
+
txLink: `${fromChain.metamask.blockExplorerUrls[0]}tx/${confirmedTransaction.txSignature}`,
|
|
108
180
|
});
|
|
109
181
|
if (isBridgeExecution) {
|
|
110
182
|
process = this.statusManager.updateProcess(step, process.type, 'DONE');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolanaStepExecutor.js","sourceRoot":"","sources":["../../../core/Solana/SolanaStepExecutor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"SolanaStepExecutor.js","sourceRoot":"","sources":["../../../core/Solana/SolanaStepExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ChainId } from '@lifi/types';
|
|
2
2
|
import { Connection } from '@solana/web3.js';
|
|
3
3
|
import { getRpcUrls } from '../rpc.js';
|
|
4
|
+
import { JitoConnection } from './jito/JitoConnection.js';
|
|
4
5
|
const connections = new Map();
|
|
5
6
|
/**
|
|
6
7
|
* Initializes the Solana connections if they haven't been initialized yet.
|
|
@@ -10,18 +11,29 @@ const ensureConnections = async () => {
|
|
|
10
11
|
const rpcUrls = await getRpcUrls(ChainId.SOL);
|
|
11
12
|
for (const rpcUrl of rpcUrls) {
|
|
12
13
|
if (!connections.get(rpcUrl)) {
|
|
13
|
-
const connection =
|
|
14
|
+
const connection = (await JitoConnection.isJitoRpc(rpcUrl))
|
|
15
|
+
? new JitoConnection(rpcUrl)
|
|
16
|
+
: new Connection(rpcUrl);
|
|
14
17
|
connections.set(rpcUrl, connection);
|
|
15
18
|
}
|
|
16
19
|
}
|
|
17
20
|
};
|
|
18
21
|
/**
|
|
19
22
|
* Wrapper around getting the connection (RPC provider) for Solana
|
|
20
|
-
*
|
|
23
|
+
* Returns only non-Jito RPC connections (excludes JitoConnection instances)
|
|
24
|
+
* @returns - Solana RPC connections (excluding Jito connections)
|
|
21
25
|
*/
|
|
22
26
|
export const getSolanaConnections = async () => {
|
|
23
27
|
await ensureConnections();
|
|
24
|
-
return Array.from(connections.values());
|
|
28
|
+
return Array.from(connections.values()).filter((conn) => conn instanceof Connection && !(conn instanceof JitoConnection));
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Get Jito-enabled connections only.
|
|
32
|
+
* @returns - Array of JitoConnection instances
|
|
33
|
+
*/
|
|
34
|
+
export const getJitoConnections = async () => {
|
|
35
|
+
await ensureConnections();
|
|
36
|
+
return Array.from(connections.values()).filter((conn) => conn instanceof JitoConnection);
|
|
25
37
|
};
|
|
26
38
|
/**
|
|
27
39
|
* Calls a function on the Connection instances with retry logic.
|
|
@@ -42,6 +54,6 @@ export async function callSolanaWithRetry(fn) {
|
|
|
42
54
|
}
|
|
43
55
|
}
|
|
44
56
|
// Throw the last encountered error
|
|
45
|
-
throw lastError;
|
|
57
|
+
throw lastError || new Error('No Solana RPC connections available');
|
|
46
58
|
}
|
|
47
59
|
//# 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,UAAU,EAAE,MAAM,WAAW,CAAA;
|
|
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;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAuC,CAAA;AAElE;;;GAGG;AACH,MAAM,iBAAiB,GAAG,KAAK,IAAmB,EAAE;IAClD,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,CAAC,MAAM,cAAc,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;gBACzD,CAAC,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC;gBAC5B,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAA;YAC1B,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAED;;;;GAIG;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,CAAC,MAAM,CAC5C,CAAC,IAAI,EAAsB,EAAE,CAC3B,IAAI,YAAY,UAAU,IAAI,CAAC,CAAC,IAAI,YAAY,cAAc,CAAC,CAClE,CAAA;AACH,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,IAA+B,EAAE;IACtE,MAAM,iBAAiB,EAAE,CAAA;IACzB,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAC5C,CAAC,IAAI,EAA0B,EAAE,CAAC,IAAI,YAAY,cAAc,CACjE,CAAA;AACH,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,IAAI,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;AACrE,CAAC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { Connection } from '@solana/web3.js';
|
|
2
|
+
import { uint8ArrayToBase64 } from '../../../utils/uint8ArrayToBase64.js';
|
|
3
|
+
import { JITO_TIP_ACCOUNTS } from './constants.js';
|
|
4
|
+
/**
|
|
5
|
+
* Makes a direct RPC request to an endpoint
|
|
6
|
+
*
|
|
7
|
+
*/
|
|
8
|
+
async function rpcRequest(endpoint, method, params) {
|
|
9
|
+
const response = await fetch(endpoint, {
|
|
10
|
+
method: 'POST',
|
|
11
|
+
headers: {
|
|
12
|
+
'Content-Type': 'application/json',
|
|
13
|
+
},
|
|
14
|
+
body: JSON.stringify({
|
|
15
|
+
jsonrpc: '2.0',
|
|
16
|
+
id: 1,
|
|
17
|
+
method,
|
|
18
|
+
params,
|
|
19
|
+
}),
|
|
20
|
+
});
|
|
21
|
+
if (!response.ok) {
|
|
22
|
+
throw new Error(`Jito RPC Error: ${response.status} ${response.statusText}`);
|
|
23
|
+
}
|
|
24
|
+
const data = await response.json();
|
|
25
|
+
if (data.error) {
|
|
26
|
+
throw new Error(`Jito RPC Error: ${data.error.message}`);
|
|
27
|
+
}
|
|
28
|
+
return data.result;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Extended Connection class with Jito bundle support
|
|
32
|
+
* Adds simulateBundle, sendBundle, and getTipAccounts methods
|
|
33
|
+
*/
|
|
34
|
+
export class JitoConnection extends Connection {
|
|
35
|
+
tipAccountsCache = null;
|
|
36
|
+
/**
|
|
37
|
+
* Check if an RPC endpoint supports Jito bundles
|
|
38
|
+
* @param rpcUrl - The RPC endpoint URL to check
|
|
39
|
+
* @returns true if the endpoint supports Jito bundle methods
|
|
40
|
+
*/
|
|
41
|
+
static async isJitoRpc(rpcUrl) {
|
|
42
|
+
try {
|
|
43
|
+
// method exists if the request is successfull and doesn't throw an error
|
|
44
|
+
await rpcRequest(rpcUrl, 'getTipAccounts', []);
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Makes a direct RPC request to the Jito-enabled endpoint
|
|
53
|
+
*/
|
|
54
|
+
async rpcRequest(method, params) {
|
|
55
|
+
try {
|
|
56
|
+
return await rpcRequest(this.rpcEndpoint, method, params);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.error(`Jito RPC request failed: ${method}`, {
|
|
60
|
+
endpoint: this.rpcEndpoint,
|
|
61
|
+
params,
|
|
62
|
+
error,
|
|
63
|
+
});
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Serialize a transaction to base64 for RPC submission
|
|
69
|
+
*/
|
|
70
|
+
serializeTransaction(transaction) {
|
|
71
|
+
return uint8ArrayToBase64(transaction.serialize());
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get the tip accounts from the Jito endpoint, using fallbacks if results are empty
|
|
75
|
+
* Results are cached to avoid repeated RPC calls
|
|
76
|
+
*/
|
|
77
|
+
async getTipAccounts() {
|
|
78
|
+
if (this.tipAccountsCache) {
|
|
79
|
+
return this.tipAccountsCache;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const accounts = await this.rpcRequest('getTipAccounts', []);
|
|
83
|
+
if (!accounts.length) {
|
|
84
|
+
throw new Error('RPC has no tip accounts');
|
|
85
|
+
}
|
|
86
|
+
this.tipAccountsCache = accounts;
|
|
87
|
+
return accounts;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
const fallbackAccounts = JITO_TIP_ACCOUNTS;
|
|
91
|
+
console.warn(`Failed to fetch tip accounts from RPC, using fallback`, error);
|
|
92
|
+
return fallbackAccounts;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get a random Jito tip account to reduce contention
|
|
97
|
+
*/
|
|
98
|
+
async getRandomTipAccount() {
|
|
99
|
+
const accounts = await this.getTipAccounts();
|
|
100
|
+
return accounts[Math.floor(Math.random() * accounts.length)];
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Manually refresh the tip accounts cache
|
|
104
|
+
* Useful for long-running processes that may need updated tip accounts
|
|
105
|
+
*/
|
|
106
|
+
async refreshTipAccounts() {
|
|
107
|
+
this.tipAccountsCache = null;
|
|
108
|
+
return this.getTipAccounts();
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Simulate a bundle before sending it
|
|
112
|
+
* @param bundle - Array of signed transactions
|
|
113
|
+
* @returns Simulation result
|
|
114
|
+
*/
|
|
115
|
+
async simulateBundle(bundle) {
|
|
116
|
+
const encodedTransactions = bundle.map((tx) => this.serializeTransaction(tx));
|
|
117
|
+
return this.rpcRequest('simulateBundle', [
|
|
118
|
+
{ encodedTransactions },
|
|
119
|
+
]);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Send a bundle to the Jito block engine
|
|
123
|
+
* @param bundle - Array of signed transactions
|
|
124
|
+
* @returns Bundle UUID
|
|
125
|
+
*/
|
|
126
|
+
async sendBundle(bundle) {
|
|
127
|
+
const encodedTransactions = bundle.map((tx) => this.serializeTransaction(tx));
|
|
128
|
+
return this.rpcRequest('sendBundle', [encodedTransactions]);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get the status of submitted bundles
|
|
132
|
+
* @param bundleIds - Array of bundle UUIDs to check
|
|
133
|
+
* @returns Bundle status information
|
|
134
|
+
*/
|
|
135
|
+
async getBundleStatuses(bundleIds) {
|
|
136
|
+
return this.rpcRequest('getBundleStatuses', [bundleIds]);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=JitoConnection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JitoConnection.js","sourceRoot":"","sources":["../../../../core/Solana/jito/JitoConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Jito Tip accounts gotten from https://jito-foundation.gitbook.io/mev/mev-payment-and-distribution/on-chain-addresses
|
|
2
|
+
export const JITO_TIP_ACCOUNTS = [
|
|
3
|
+
'Cw8CFyM9FkoMi7K7Crf6HNQqf4uEMzpKw6QNghXLvLkY',
|
|
4
|
+
'DttWaMuVvTiduZRnguLF7jNxTgiMBZ1hyAumKUiL2KRL',
|
|
5
|
+
'96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5',
|
|
6
|
+
'3AVi9Tg9Uo68tJfuvoKvqKNWKkC5wPdSSdeBnizKZ6jT',
|
|
7
|
+
'HFqU5x63VTqvQss8hp11i4wVV8bD44PvwucfZ2bU7gRe',
|
|
8
|
+
'ADaUMid9yfUytqMBgopwjb2DTLSokTSzL1zt6iGPaS49',
|
|
9
|
+
'ADuUkR4vqLUMWXxW9gh6D6L8pMSawimctcNZ5pGwDcEt',
|
|
10
|
+
'DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh',
|
|
11
|
+
];
|
|
12
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../core/Solana/jito/constants.ts"],"names":[],"mappings":"AAAA,uHAAuH;AACvH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,8CAA8C;IAC9C,8CAA8C;IAC9C,8CAA8C;IAC9C,8CAA8C;IAC9C,8CAA8C;IAC9C,8CAA8C;IAC9C,8CAA8C;IAC9C,8CAA8C;CAC/C,CAAA"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { sleep } from '../../../utils/sleep.js';
|
|
2
|
+
import { getJitoConnections } from '../connection.js';
|
|
3
|
+
/**
|
|
4
|
+
* Send and confirm a bundle of transactions using Jito
|
|
5
|
+
* Automatically selects a Jito-enabled RPC connection and polls for confirmation
|
|
6
|
+
* across multiple Jito RPCs in parallel
|
|
7
|
+
* @param signedTransactions - an Array of signed transactions
|
|
8
|
+
* @returns - {@link BundleResult} object containing Bundle ID, transaction signatures, and confirmation results
|
|
9
|
+
*/
|
|
10
|
+
export async function sendAndConfirmBundle(signedTransactions) {
|
|
11
|
+
const jitoConnections = await getJitoConnections();
|
|
12
|
+
if (jitoConnections.length === 0) {
|
|
13
|
+
throw new Error('No Jito-enabled RPC connection available for bundle submission');
|
|
14
|
+
}
|
|
15
|
+
const abortController = new AbortController();
|
|
16
|
+
const confirmPromises = jitoConnections.map(async (jitoConnection) => {
|
|
17
|
+
try {
|
|
18
|
+
// Send initial bundle for this connection
|
|
19
|
+
let bundleId;
|
|
20
|
+
try {
|
|
21
|
+
bundleId = await jitoConnection.sendBundle(signedTransactions);
|
|
22
|
+
}
|
|
23
|
+
catch (_) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const [blockhashResult, initialBlockHeight] = await Promise.all([
|
|
27
|
+
jitoConnection.getLatestBlockhash('confirmed'),
|
|
28
|
+
jitoConnection.getBlockHeight('confirmed'),
|
|
29
|
+
]);
|
|
30
|
+
let currentBlockHeight = initialBlockHeight;
|
|
31
|
+
while (currentBlockHeight < blockhashResult.lastValidBlockHeight &&
|
|
32
|
+
!abortController.signal.aborted) {
|
|
33
|
+
const statusResponse = await jitoConnection.getBundleStatuses([
|
|
34
|
+
bundleId,
|
|
35
|
+
]);
|
|
36
|
+
const bundleStatus = statusResponse.value[0];
|
|
37
|
+
// Check if bundle is confirmed or finalized
|
|
38
|
+
if (bundleStatus &&
|
|
39
|
+
(bundleStatus.confirmation_status === 'confirmed' ||
|
|
40
|
+
bundleStatus.confirmation_status === 'finalized')) {
|
|
41
|
+
// Bundle confirmed! Extract transaction signatures from bundle status
|
|
42
|
+
const txSignatures = bundleStatus.transactions;
|
|
43
|
+
// Fetch individual signature results
|
|
44
|
+
const sigResponse = await jitoConnection.getSignatureStatuses(txSignatures);
|
|
45
|
+
if (!sigResponse?.value || !Array.isArray(sigResponse.value)) {
|
|
46
|
+
// Keep polling, if can't find signature results.
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
// Immediately abort all other connections when we find a result
|
|
50
|
+
abortController.abort();
|
|
51
|
+
return {
|
|
52
|
+
bundleId,
|
|
53
|
+
txSignatures,
|
|
54
|
+
signatureResults: sigResponse.value,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
await sleep(400);
|
|
58
|
+
if (!abortController.signal.aborted) {
|
|
59
|
+
currentBlockHeight = await jitoConnection.getBlockHeight('confirmed');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
if (abortController.signal.aborted) {
|
|
66
|
+
return null; // Don't treat abortion as an error
|
|
67
|
+
}
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
// Wait for first successful confirmation
|
|
72
|
+
const result = await Promise.any(confirmPromises).catch(() => null);
|
|
73
|
+
if (!abortController.signal.aborted) {
|
|
74
|
+
abortController.abort();
|
|
75
|
+
}
|
|
76
|
+
if (!result) {
|
|
77
|
+
throw new Error('Failed to send and confirm bundle');
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=sendAndConfirmBundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sendAndConfirmBundle.js","sourceRoot":"","sources":["../../../../core/Solana/jito/sendAndConfirmBundle.ts"],"names":[],"mappings":"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"}
|
package/src/_esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,qDAAqD;AACrD,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACvC,OAAO,EACL,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAA;AACvE,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,GAClB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,aAAa,EACb,aAAa,GACd,MAAM,0BAA0B,CAAA;AAMjC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,YAAY,EACZ,cAAc,EACd,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EACL,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAKhD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AA6B3C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAEjD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC9E,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EACL,SAAS,EACT,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,QAAQ,EACR,2BAA2B,EAC3B,eAAe,EACf,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,qDAAqD;AACrD,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAA;AACrE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACvC,OAAO,EACL,iBAAiB,EACjB,0BAA0B,GAC3B,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAA;AACvE,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,iBAAiB,GAClB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,aAAa,EACb,aAAa,GACd,MAAM,0BAA0B,CAAA;AAMjC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,YAAY,EACZ,cAAc,EACd,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EACL,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAKhD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AA6B3C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAEjD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC9E,OAAO,EACL,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EACL,SAAS,EACT,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,QAAQ,EACR,2BAA2B,EAC3B,eAAe,EACf,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAA;AAa3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA"}
|
package/src/_esm/request.js
CHANGED
|
@@ -13,7 +13,7 @@ const stripExtendRequestInitProperties = ({ retries, ...rest }) => ({
|
|
|
13
13
|
export const request = async (url, options = {
|
|
14
14
|
retries: requestSettings.retries,
|
|
15
15
|
}) => {
|
|
16
|
-
const { userId, integrator, widgetVersion, apiKey } = config.get();
|
|
16
|
+
const { userId, integrator, widgetVersion, apiKey, requestInterceptor } = config.get();
|
|
17
17
|
if (!integrator) {
|
|
18
18
|
throw new SDKError(new ValidationError('You need to provide the Integrator property. Please see documentation https://docs.li.fi/integrate-li.fi-js-sdk/set-up-the-sdk'));
|
|
19
19
|
}
|
|
@@ -48,6 +48,9 @@ export const request = async (url, options = {
|
|
|
48
48
|
...options.headers,
|
|
49
49
|
'x-lifi-integrator': integrator,
|
|
50
50
|
};
|
|
51
|
+
if (requestInterceptor) {
|
|
52
|
+
options = await requestInterceptor(options);
|
|
53
|
+
}
|
|
51
54
|
const response = await fetch(url, stripExtendRequestInitProperties(options));
|
|
52
55
|
if (!response.ok) {
|
|
53
56
|
throw new HTTPError(response, url, options);
|
|
@@ -55,9 +58,10 @@ export const request = async (url, options = {
|
|
|
55
58
|
return await response.json();
|
|
56
59
|
}
|
|
57
60
|
catch (error) {
|
|
58
|
-
|
|
61
|
+
const retries = options.retries ?? 0;
|
|
62
|
+
if (retries > 0 && error.status === 500) {
|
|
59
63
|
await sleep(500);
|
|
60
|
-
return request(url, { ...options, retries:
|
|
64
|
+
return request(url, { ...options, retries: retries - 1 });
|
|
61
65
|
}
|
|
62
66
|
await error.buildAdditionalDetails?.();
|
|
63
67
|
throw new SDKError(error);
|
package/src/_esm/request.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sourceRoot":"","sources":["../request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAE/C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,CAAC;CACX,CAAA;AAED,MAAM,gCAAgC,GAAG,CAAC,EACxC,OAAO,EACP,GAAG,IAAI,EACa,EAAe,EAAE,CAAC,CAAC;IACvC,GAAG,IAAI;CACR,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,GAAsB,EACtB,UAA+B;IAC7B,OAAO,EAAE,eAAe,CAAC,OAAO;CACjC,EACW,EAAE;IACd,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../request.ts"],"names":[],"mappings":"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"}
|
package/src/_esm/services/api.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isContractCallsRequestWithFromAmount, isContractCallsRequestWithToAmount, } from '@lifi/types';
|
|
1
|
+
import { ChainId, isContractCallsRequestWithFromAmount, isContractCallsRequestWithToAmount, } from '@lifi/types';
|
|
2
2
|
import { config } from '../config.js';
|
|
3
3
|
import { BaseError } from '../errors/baseError.js';
|
|
4
4
|
import { ErrorName } from '../errors/constants.js';
|
|
@@ -139,7 +139,15 @@ export const getStepTransaction = async (step, options) => {
|
|
|
139
139
|
// While the validation fails for some users we should not enforce it
|
|
140
140
|
console.warn('SDK Validation: Invalid Step', step);
|
|
141
141
|
}
|
|
142
|
-
|
|
142
|
+
const _config = config.get();
|
|
143
|
+
let requestUrl = `${_config.apiUrl}/advanced/stepTransaction`;
|
|
144
|
+
const isJitoBundleEnabled = Boolean(_config.routeOptions?.jitoBundle);
|
|
145
|
+
if (isJitoBundleEnabled && step.action.fromChainId === ChainId.SOL) {
|
|
146
|
+
// add jitoBundle param to url if from chain is SVM and jitoBundle is enabled in config
|
|
147
|
+
const queryParams = new URLSearchParams({ jitoBundle: 'true' });
|
|
148
|
+
requestUrl = `${requestUrl}?${queryParams}`;
|
|
149
|
+
}
|
|
150
|
+
return await request(requestUrl, {
|
|
143
151
|
method: 'POST',
|
|
144
152
|
headers: {
|
|
145
153
|
'Content-Type': 'application/json',
|