@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.
Files changed (68) hide show
  1. package/package.json +3 -3
  2. package/src/_cjs/core/Solana/SolanaStepExecutor.js +65 -19
  3. package/src/_cjs/core/Solana/SolanaStepExecutor.js.map +1 -1
  4. package/src/_cjs/core/Solana/connection.js +12 -4
  5. package/src/_cjs/core/Solana/connection.js.map +1 -1
  6. package/src/_cjs/core/Solana/jito/JitoConnection.js +97 -0
  7. package/src/_cjs/core/Solana/jito/JitoConnection.js.map +1 -0
  8. package/src/_cjs/core/Solana/jito/constants.js +14 -0
  9. package/src/_cjs/core/Solana/jito/constants.js.map +1 -0
  10. package/src/_cjs/core/Solana/jito/sendAndConfirmBundle.js +70 -0
  11. package/src/_cjs/core/Solana/jito/sendAndConfirmBundle.js.map +1 -0
  12. package/src/_cjs/index.js.map +1 -1
  13. package/src/_cjs/request.js +7 -3
  14. package/src/_cjs/request.js.map +1 -1
  15. package/src/_cjs/services/api.js +8 -1
  16. package/src/_cjs/services/api.js.map +1 -1
  17. package/src/_cjs/utils/uint8ArrayToBase64.js +11 -0
  18. package/src/_cjs/utils/uint8ArrayToBase64.js.map +1 -0
  19. package/src/_cjs/version.js +1 -1
  20. package/src/_esm/core/Solana/SolanaStepExecutor.js +91 -19
  21. package/src/_esm/core/Solana/SolanaStepExecutor.js.map +1 -1
  22. package/src/_esm/core/Solana/connection.js +16 -4
  23. package/src/_esm/core/Solana/connection.js.map +1 -1
  24. package/src/_esm/core/Solana/jito/JitoConnection.js +139 -0
  25. package/src/_esm/core/Solana/jito/JitoConnection.js.map +1 -0
  26. package/src/_esm/core/Solana/jito/constants.js +12 -0
  27. package/src/_esm/core/Solana/jito/constants.js.map +1 -0
  28. package/src/_esm/core/Solana/jito/sendAndConfirmBundle.js +81 -0
  29. package/src/_esm/core/Solana/jito/sendAndConfirmBundle.js.map +1 -0
  30. package/src/_esm/index.js.map +1 -1
  31. package/src/_esm/request.js +7 -3
  32. package/src/_esm/request.js.map +1 -1
  33. package/src/_esm/services/api.js +10 -2
  34. package/src/_esm/services/api.js.map +1 -1
  35. package/src/_esm/utils/uint8ArrayToBase64.js +10 -0
  36. package/src/_esm/utils/uint8ArrayToBase64.js.map +1 -0
  37. package/src/_esm/version.js +1 -1
  38. package/src/_types/core/Solana/SolanaStepExecutor.d.ts +18 -0
  39. package/src/_types/core/Solana/SolanaStepExecutor.d.ts.map +1 -1
  40. package/src/_types/core/Solana/connection.d.ts +8 -1
  41. package/src/_types/core/Solana/connection.d.ts.map +1 -1
  42. package/src/_types/core/Solana/jito/JitoConnection.d.ts +85 -0
  43. package/src/_types/core/Solana/jito/JitoConnection.d.ts.map +1 -0
  44. package/src/_types/core/Solana/jito/constants.d.ts +2 -0
  45. package/src/_types/core/Solana/jito/constants.d.ts.map +1 -0
  46. package/src/_types/core/Solana/jito/sendAndConfirmBundle.d.ts +15 -0
  47. package/src/_types/core/Solana/jito/sendAndConfirmBundle.d.ts.map +1 -0
  48. package/src/_types/index.d.ts +1 -1
  49. package/src/_types/index.d.ts.map +1 -1
  50. package/src/_types/request.d.ts.map +1 -1
  51. package/src/_types/services/api.d.ts +1 -1
  52. package/src/_types/services/api.d.ts.map +1 -1
  53. package/src/_types/types/internal.d.ts +3 -0
  54. package/src/_types/types/internal.d.ts.map +1 -1
  55. package/src/_types/utils/uint8ArrayToBase64.d.ts +2 -0
  56. package/src/_types/utils/uint8ArrayToBase64.d.ts.map +1 -0
  57. package/src/_types/version.d.ts +1 -1
  58. package/src/core/Solana/SolanaStepExecutor.ts +130 -29
  59. package/src/core/Solana/connection.ts +23 -5
  60. package/src/core/Solana/jito/JitoConnection.ts +190 -0
  61. package/src/core/Solana/jito/constants.ts +11 -0
  62. package/src/core/Solana/jito/sendAndConfirmBundle.ts +110 -0
  63. package/src/index.ts +6 -1
  64. package/src/request.ts +9 -3
  65. package/src/services/api.ts +19 -12
  66. package/src/types/internal.ts +6 -0
  67. package/src/utils/uint8ArrayToBase64.ts +12 -0
  68. 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
- if (!transactionRequest.data) {
75
- throw new TransactionError(LiFiErrorCode.TransactionUnprepared, 'Unable to prepare transaction.');
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 signedTx = await withTimeout(() => this.walletAdapter.signTransaction(versionedTransaction), {
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
- const simulationResult = await callSolanaWithRetry((connection) => connection.simulateTransaction(signedTx, {
88
- commitment: 'confirmed',
89
- replaceRecentBlockhash: true,
90
- }));
91
- if (simulationResult.value.err) {
92
- throw new TransactionError(LiFiErrorCode.TransactionSimulationFailed, 'Transaction simulation failed');
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
- const confirmedTx = await sendAndConfirmTransaction(signedTx);
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 (confirmedTx.signatureResult.err) {
99
- const reason = typeof confirmedTx.signatureResult.err === 'object'
100
- ? JSON.stringify(confirmedTx.signatureResult.err)
101
- : confirmedTx.signatureResult.err;
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: confirmedTx.txSignature,
107
- txLink: `${fromChain.metamask.blockExplorerUrls[0]}tx/${confirmedTx.txSignature}`,
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 = new Connection(rpcUrl);
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
- * @returns - Solana RPC connections
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;AAEtC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAsB,CAAA;AAEjD;;;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,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
+ {"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":"AAAA,OAAO,EAAE,UAAU,EAA6B,MAAM,iBAAiB,CAAA;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAgClD;;;GAGG;AACH,KAAK,UAAU,UAAU,CACvB,QAAgB,EAChB,MAAc,EACd,MAAa;IAEb,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;QACrC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,OAAO,EAAE,KAAK;YACd,EAAE,EAAE,CAAC;YACL,MAAM;YACN,MAAM;SACP,CAAC;KACH,CAAC,CAAA;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;IAC9E,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAClC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IAC1D,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAA;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,UAAU;IACpC,gBAAgB,GAAoB,IAAI,CAAA;IAEhD;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAc;QACnC,IAAI,CAAC;YACH,yEAAyE;YACzE,MAAM,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAA;YAC9C,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,UAAU,CAAI,MAAc,EAAE,MAAa;QACzD,IAAI,CAAC;YACH,OAAO,MAAM,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,MAAM,EAAE,EAAE;gBAClD,QAAQ,EAAE,IAAI,CAAC,WAAW;gBAC1B,MAAM;gBACN,KAAK;aACN,CAAC,CAAA;YACF,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,WAAiC;QAC5D,OAAO,kBAAkB,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAA;IACpD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc;QAClB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAA;QAC9B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAW,gBAAgB,EAAE,EAAE,CAAC,CAAA;YACtE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;YAC5C,CAAC;YACD,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAA;YAChC,OAAO,QAAQ,CAAA;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,gBAAgB,GAAG,iBAAiB,CAAA;YAC1C,OAAO,CAAC,IAAI,CACV,wDAAwD,EACxD,KAAK,CACN,CAAA;YACD,OAAO,gBAAgB,CAAA;QACzB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB;QACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAA;QAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IAC9D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,kBAAkB;QACtB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAA;QAC5B,OAAO,IAAI,CAAC,cAAc,EAAE,CAAA;IAC9B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,cAAc,CAClB,MAA8B;QAE9B,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAC5C,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAC9B,CAAA;QACD,OAAO,IAAI,CAAC,UAAU,CAAuB,gBAAgB,EAAE;YAC7D,EAAE,mBAAmB,EAAE;SACxB,CAAC,CAAA;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAC,MAA8B;QAC7C,MAAM,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAC5C,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAC9B,CAAA;QACD,OAAO,IAAI,CAAC,UAAU,CAAS,YAAY,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAA;IACrE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAmB;QACzC,OAAO,IAAI,CAAC,UAAU,CAAqB,mBAAmB,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAC9E,CAAC;CACF"}
@@ -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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"}
@@ -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;AAQ3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,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"}
@@ -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
- if (options.retries > 0 && error.status === 500) {
61
+ const retries = options.retries ?? 0;
62
+ if (retries > 0 && error.status === 500) {
59
63
  await sleep(500);
60
- return request(url, { ...options, retries: options.retries - 1 });
64
+ return request(url, { ...options, retries: retries - 1 });
61
65
  }
62
66
  await error.buildAdditionalDetails?.();
63
67
  throw new SDKError(error);
@@ -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,GAAG,MAAM,CAAC,GAAG,EAAE,CAAA;IAElE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,QAAQ,CAChB,IAAI,eAAe,CACjB,gIAAgI,CACjI,CACF,CAAA;IACH,CAAC;IAED,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,CAAC,OAAO,CAAA;IAE5D,IAAI,CAAC;QACH,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,OAAO,GAAG;gBAChB,GAAG,OAAO,CAAC,OAAO;gBAClB,gBAAgB,EAAE,MAAM;aACzB,CAAA;QACH,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,OAAO,GAAG;gBAChB,GAAG,OAAO,CAAC,OAAO;gBAClB,eAAe,EAAE,MAAM;aACxB,CAAA;QACH,CAAC;QAED,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,CAAC,OAAO,GAAG;gBAChB,GAAG,OAAO,CAAC,OAAO;gBAClB,eAAe,EAAE,aAAa;aAC/B,CAAA;QACH,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,OAAO,GAAG;gBAChB,GAAG,OAAO,CAAC,OAAO;gBAClB,YAAY,EAAE,OAAO;aACtB,CAAA;QACH,CAAC;QAED,oDAAoD;QACpD,OAAO,CAAC,OAAO,GAAG;YAChB,GAAG,OAAO,CAAC,OAAO;YAClB,mBAAmB,EAAE,UAAU;SAChC,CAAA;QAED,MAAM,QAAQ,GAAa,MAAM,KAAK,CACpC,GAAG,EACH,gCAAgC,CAAC,OAAO,CAAC,CAC1C,CAAA;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;QAC7C,CAAC;QAED,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,OAAO,GAAG,CAAC,IAAK,KAAmB,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC/D,MAAM,KAAK,CAAC,GAAG,CAAC,CAAA;YAChB,OAAO,OAAO,CAAI,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,CAAA;QACtE,CAAC;QAED,MAAO,KAAmB,CAAC,sBAAsB,EAAE,EAAE,CAAA;QAErD,MAAM,IAAI,QAAQ,CAAC,KAAkB,CAAC,CAAA;IACxC,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../request.ts"],"names":[],"mappings":"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"}
@@ -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
- return await request(`${config.get().apiUrl}/advanced/stepTransaction`, {
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',