@metamask/transaction-pay-controller 22.4.0 → 22.6.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 (128) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/dist/TransactionPayController-method-action-types.cjs.map +1 -1
  3. package/dist/TransactionPayController-method-action-types.d.cts +23 -1
  4. package/dist/TransactionPayController-method-action-types.d.cts.map +1 -1
  5. package/dist/TransactionPayController-method-action-types.d.mts +23 -1
  6. package/dist/TransactionPayController-method-action-types.d.mts.map +1 -1
  7. package/dist/TransactionPayController-method-action-types.mjs.map +1 -1
  8. package/dist/TransactionPayController.cjs +36 -4
  9. package/dist/TransactionPayController.cjs.map +1 -1
  10. package/dist/TransactionPayController.d.cts +18 -2
  11. package/dist/TransactionPayController.d.cts.map +1 -1
  12. package/dist/TransactionPayController.d.mts +18 -2
  13. package/dist/TransactionPayController.d.mts.map +1 -1
  14. package/dist/TransactionPayController.mjs +36 -4
  15. package/dist/TransactionPayController.mjs.map +1 -1
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +2 -2
  18. package/dist/index.d.cts.map +1 -1
  19. package/dist/index.d.mts +2 -2
  20. package/dist/index.d.mts.map +1 -1
  21. package/dist/index.mjs.map +1 -1
  22. package/dist/strategy/across/across-quotes.cjs +127 -31
  23. package/dist/strategy/across/across-quotes.cjs.map +1 -1
  24. package/dist/strategy/across/across-quotes.d.cts.map +1 -1
  25. package/dist/strategy/across/across-quotes.d.mts.map +1 -1
  26. package/dist/strategy/across/across-quotes.mjs +127 -31
  27. package/dist/strategy/across/across-quotes.mjs.map +1 -1
  28. package/dist/strategy/across/across-submit.cjs +219 -18
  29. package/dist/strategy/across/across-submit.cjs.map +1 -1
  30. package/dist/strategy/across/across-submit.d.cts.map +1 -1
  31. package/dist/strategy/across/across-submit.d.mts.map +1 -1
  32. package/dist/strategy/across/across-submit.mjs +221 -20
  33. package/dist/strategy/across/across-submit.mjs.map +1 -1
  34. package/dist/strategy/across/transactions.cjs +21 -1
  35. package/dist/strategy/across/transactions.cjs.map +1 -1
  36. package/dist/strategy/across/transactions.d.cts +8 -0
  37. package/dist/strategy/across/transactions.d.cts.map +1 -1
  38. package/dist/strategy/across/transactions.d.mts +8 -0
  39. package/dist/strategy/across/transactions.d.mts.map +1 -1
  40. package/dist/strategy/across/transactions.mjs +19 -0
  41. package/dist/strategy/across/transactions.mjs.map +1 -1
  42. package/dist/strategy/relay/polymarket/calldata.cjs +28 -0
  43. package/dist/strategy/relay/polymarket/calldata.cjs.map +1 -0
  44. package/dist/strategy/relay/polymarket/calldata.d.cts +14 -0
  45. package/dist/strategy/relay/polymarket/calldata.d.cts.map +1 -0
  46. package/dist/strategy/relay/polymarket/calldata.d.mts +14 -0
  47. package/dist/strategy/relay/polymarket/calldata.d.mts.map +1 -0
  48. package/dist/strategy/relay/polymarket/calldata.mjs +21 -0
  49. package/dist/strategy/relay/polymarket/calldata.mjs.map +1 -0
  50. package/dist/strategy/relay/polymarket/constants.cjs +9 -0
  51. package/dist/strategy/relay/polymarket/constants.cjs.map +1 -0
  52. package/dist/strategy/relay/polymarket/constants.d.cts +6 -0
  53. package/dist/strategy/relay/polymarket/constants.d.cts.map +1 -0
  54. package/dist/strategy/relay/polymarket/constants.d.mts +6 -0
  55. package/dist/strategy/relay/polymarket/constants.d.mts.map +1 -0
  56. package/dist/strategy/relay/polymarket/constants.mjs +6 -0
  57. package/dist/strategy/relay/polymarket/constants.mjs.map +1 -0
  58. package/dist/strategy/relay/polymarket/withdraw.cjs +170 -0
  59. package/dist/strategy/relay/polymarket/withdraw.cjs.map +1 -0
  60. package/dist/strategy/relay/polymarket/withdraw.d.cts +13 -0
  61. package/dist/strategy/relay/polymarket/withdraw.d.cts.map +1 -0
  62. package/dist/strategy/relay/polymarket/withdraw.d.mts +13 -0
  63. package/dist/strategy/relay/polymarket/withdraw.d.mts.map +1 -0
  64. package/dist/strategy/relay/polymarket/withdraw.mjs +164 -0
  65. package/dist/strategy/relay/polymarket/withdraw.mjs.map +1 -0
  66. package/dist/strategy/relay/relay-quotes.cjs +8 -2
  67. package/dist/strategy/relay/relay-quotes.cjs.map +1 -1
  68. package/dist/strategy/relay/relay-quotes.d.cts.map +1 -1
  69. package/dist/strategy/relay/relay-quotes.d.mts.map +1 -1
  70. package/dist/strategy/relay/relay-quotes.mjs +8 -2
  71. package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
  72. package/dist/strategy/relay/relay-submit.cjs +52 -18
  73. package/dist/strategy/relay/relay-submit.cjs.map +1 -1
  74. package/dist/strategy/relay/relay-submit.d.cts.map +1 -1
  75. package/dist/strategy/relay/relay-submit.d.mts.map +1 -1
  76. package/dist/strategy/relay/relay-submit.mjs +52 -18
  77. package/dist/strategy/relay/relay-submit.mjs.map +1 -1
  78. package/dist/strategy/relay/types.cjs.map +1 -1
  79. package/dist/strategy/relay/types.d.cts +2 -1
  80. package/dist/strategy/relay/types.d.cts.map +1 -1
  81. package/dist/strategy/relay/types.d.mts +2 -1
  82. package/dist/strategy/relay/types.d.mts.map +1 -1
  83. package/dist/strategy/relay/types.mjs.map +1 -1
  84. package/dist/tests/messenger-mock.cjs +6 -0
  85. package/dist/tests/messenger-mock.cjs.map +1 -1
  86. package/dist/tests/messenger-mock.d.cts +14 -0
  87. package/dist/tests/messenger-mock.d.cts.map +1 -1
  88. package/dist/tests/messenger-mock.d.mts +14 -0
  89. package/dist/tests/messenger-mock.d.mts.map +1 -1
  90. package/dist/tests/messenger-mock.mjs +6 -0
  91. package/dist/tests/messenger-mock.mjs.map +1 -1
  92. package/dist/types.cjs.map +1 -1
  93. package/dist/types.d.cts +27 -0
  94. package/dist/types.d.cts.map +1 -1
  95. package/dist/types.d.mts +27 -0
  96. package/dist/types.d.mts.map +1 -1
  97. package/dist/types.mjs.map +1 -1
  98. package/dist/utils/feature-flags.cjs +1 -1
  99. package/dist/utils/feature-flags.cjs.map +1 -1
  100. package/dist/utils/feature-flags.d.cts +0 -1
  101. package/dist/utils/feature-flags.d.cts.map +1 -1
  102. package/dist/utils/feature-flags.d.mts +0 -1
  103. package/dist/utils/feature-flags.d.mts.map +1 -1
  104. package/dist/utils/feature-flags.mjs +1 -1
  105. package/dist/utils/feature-flags.mjs.map +1 -1
  106. package/dist/utils/gas-station.cjs +1 -1
  107. package/dist/utils/gas-station.cjs.map +1 -1
  108. package/dist/utils/gas-station.mjs +1 -1
  109. package/dist/utils/gas-station.mjs.map +1 -1
  110. package/dist/utils/quotes.cjs +8 -3
  111. package/dist/utils/quotes.cjs.map +1 -1
  112. package/dist/utils/quotes.d.cts.map +1 -1
  113. package/dist/utils/quotes.d.mts.map +1 -1
  114. package/dist/utils/quotes.mjs +8 -3
  115. package/dist/utils/quotes.mjs.map +1 -1
  116. package/dist/utils/source-amounts.cjs +10 -8
  117. package/dist/utils/source-amounts.cjs.map +1 -1
  118. package/dist/utils/source-amounts.d.cts.map +1 -1
  119. package/dist/utils/source-amounts.d.mts.map +1 -1
  120. package/dist/utils/source-amounts.mjs +10 -8
  121. package/dist/utils/source-amounts.mjs.map +1 -1
  122. package/dist/utils/token.cjs +9 -6
  123. package/dist/utils/token.cjs.map +1 -1
  124. package/dist/utils/token.d.cts.map +1 -1
  125. package/dist/utils/token.d.mts.map +1 -1
  126. package/dist/utils/token.mjs +9 -6
  127. package/dist/utils/token.mjs.map +1 -1
  128. package/package.json +4 -4
@@ -5,7 +5,9 @@ const controller_utils_1 = require("@metamask/controller-utils");
5
5
  const transaction_controller_1 = require("@metamask/transaction-controller");
6
6
  const utils_1 = require("@metamask/utils");
7
7
  const logger_1 = require("../../logger.cjs");
8
+ const _7702_1 = require("../../utils/7702.cjs");
8
9
  const feature_flags_1 = require("../../utils/feature-flags.cjs");
10
+ const feature_flags_2 = require("../../utils/feature-flags.cjs");
9
11
  const transaction_1 = require("../../utils/transaction.cjs");
10
12
  const transactions_1 = require("./transactions.cjs");
11
13
  const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'across-strategy');
@@ -35,8 +37,8 @@ async function executeSingleQuote(quote, messenger, transaction) {
35
37
  }, (tx) => {
36
38
  tx.txParams.nonce = undefined;
37
39
  });
38
- const acrossDepositType = getAcrossDepositType(transaction.type);
39
- const transactionHash = await submitTransactions(quote, transaction.id, acrossDepositType, messenger);
40
+ const acrossDepositType = getAcrossDepositType(transaction);
41
+ const transactionHash = await submitTransactions(quote, transaction, acrossDepositType, messenger);
40
42
  (0, transaction_1.updateTransaction)({
41
43
  transactionId: transaction.id,
42
44
  messenger,
@@ -50,12 +52,12 @@ async function executeSingleQuote(quote, messenger, transaction) {
50
52
  * Submit transactions for an Across quote.
51
53
  *
52
54
  * @param quote - Across quote.
53
- * @param parentTransactionId - ID of the parent transaction.
55
+ * @param parentTransaction - Parent transaction.
54
56
  * @param acrossDepositType - Transaction type used for the swap/deposit step.
55
57
  * @param messenger - Controller messenger.
56
58
  * @returns Hash of the last submitted transaction, if available.
57
59
  */
58
- async function submitTransactions(quote, parentTransactionId, acrossDepositType, messenger) {
60
+ async function submitTransactions(quote, parentTransaction, acrossDepositType, messenger) {
59
61
  const { swapTx } = quote.original.quote;
60
62
  const { gasLimits: quoteGasLimits, is7702 } = quote.original.metamask;
61
63
  const { from } = quote.request;
@@ -64,19 +66,56 @@ async function submitTransactions(quote, parentTransactionId, acrossDepositType,
64
66
  quote: quote.original.quote,
65
67
  swapType: acrossDepositType,
66
68
  });
69
+ const shouldPrependOriginalTransaction = quote.request.isPostQuote === true &&
70
+ parentTransaction.txParams.to !== undefined;
71
+ const hasPrependedOriginalGasLimit = shouldPrependOriginalTransaction &&
72
+ !is7702 &&
73
+ quoteGasLimits.length > orderedTransactions.length;
74
+ const gasLimitOffset = hasPrependedOriginalGasLimit ? 1 : 0;
75
+ const transactionCount = orderedTransactions.length + (shouldPrependOriginalTransaction ? 1 : 0);
67
76
  const networkClientId = messenger.call('NetworkController:findNetworkClientIdByChainId', chainId);
68
- const batchGasLimit = is7702 && orderedTransactions.length > 1
77
+ const is7702Batch = is7702 && transactionCount > 1;
78
+ const canUseQuotedBatchGasLimit = is7702Batch &&
79
+ (!shouldPrependOriginalTransaction ||
80
+ hasOriginalTransactionGas(parentTransaction));
81
+ const batchGasLimit = canUseQuotedBatchGasLimit
69
82
  ? quoteGasLimits[0]?.max
70
83
  : undefined;
71
- if (is7702 && orderedTransactions.length > 1 && batchGasLimit === undefined) {
84
+ if (canUseQuotedBatchGasLimit && batchGasLimit === undefined) {
72
85
  throw new Error('Missing quote gas limit for Across 7702 batch');
73
86
  }
74
- const gasLimit7702 = batchGasLimit === undefined ? undefined : (0, controller_utils_1.toHex)(batchGasLimit);
75
- const transactions = orderedTransactions.map((transaction, index) => {
76
- const gasLimit = gasLimit7702 ? undefined : quoteGasLimits[index]?.max;
77
- if (gasLimit === undefined && !gasLimit7702) {
87
+ const quotedGasLimit7702 = batchGasLimit === undefined ? undefined : (0, controller_utils_1.toHex)(batchGasLimit);
88
+ const parentHasAuthorizationList = Boolean(parentTransaction.txParams.authorizationList?.length);
89
+ const shouldUseGasFeeToken7702Submit = shouldEstimate7702SubmitBatch(parentTransaction, quote)
90
+ ? (0, _7702_1.accountSupports7702)(messenger, from)
91
+ : false;
92
+ const shouldUse7702Submit = [
93
+ Boolean(quotedGasLimit7702),
94
+ is7702Batch,
95
+ parentHasAuthorizationList,
96
+ shouldUseGasFeeToken7702Submit,
97
+ ].some(Boolean);
98
+ const shouldEstimateGasLimit7702 = !quotedGasLimit7702 && shouldUse7702Submit;
99
+ const estimatedGasLimit7702 = shouldEstimateGasLimit7702
100
+ ? await estimateSubmitBatchGasLimit7702({
101
+ chainId,
102
+ from,
103
+ messenger,
104
+ orderedTransactions,
105
+ parentTransaction,
106
+ shouldPrependOriginalTransaction,
107
+ })
108
+ : undefined;
109
+ const gasLimit7702 = quotedGasLimit7702 ?? estimatedGasLimit7702;
110
+ const submitAs7702 = shouldUse7702Submit || Boolean(gasLimit7702);
111
+ const acrossTransactions = orderedTransactions.map((transaction, index) => {
112
+ const gasLimit = submitAs7702
113
+ ? undefined
114
+ : quoteGasLimits[index + gasLimitOffset]?.max;
115
+ if (gasLimit === undefined && !submitAs7702) {
116
+ const quoteGasIndex = index + gasLimitOffset;
78
117
  const errorMessage = transaction.kind === 'approval'
79
- ? `Missing quote gas limit for Across approval transaction at index ${index}`
118
+ ? `Missing quote gas limit for Across approval transaction at index ${quoteGasIndex}`
80
119
  : 'Missing quote gas limit for Across swap transaction';
81
120
  throw new Error(errorMessage);
82
121
  }
@@ -93,11 +132,19 @@ async function submitTransactions(quote, parentTransactionId, acrossDepositType,
93
132
  type: transaction.type ?? acrossDepositType,
94
133
  };
95
134
  });
135
+ const originalTransaction = shouldPrependOriginalTransaction
136
+ ? [
137
+ buildOriginalTransaction(parentTransaction, submitAs7702 || !hasPrependedOriginalGasLimit
138
+ ? undefined
139
+ : quoteGasLimits[0]?.max),
140
+ ]
141
+ : [];
142
+ const transactions = [...originalTransaction, ...acrossTransactions];
96
143
  const transactionIds = [];
97
144
  const { end } = (0, transaction_1.collectTransactionIds)(chainId, from, messenger, (transactionId) => {
98
145
  transactionIds.push(transactionId);
99
146
  (0, transaction_1.updateTransaction)({
100
- transactionId: parentTransactionId,
147
+ transactionId: parentTransaction.id,
101
148
  messenger,
102
149
  note: 'Add required transaction ID from Across submission',
103
150
  }, (tx) => {
@@ -109,12 +156,15 @@ async function submitTransactions(quote, parentTransactionId, acrossDepositType,
109
156
  const gasFeeToken = quote.fees.isSourceGasFeeToken
110
157
  ? quote.request.sourceTokenAddress
111
158
  : undefined;
159
+ const excludeNativeTokenForFee = gasFeeToken ? true : undefined;
112
160
  try {
113
161
  if (transactions.length === 1) {
114
162
  result = await messenger.call('TransactionController:addTransaction', transactions[0].params, {
163
+ excludeNativeTokenForFee,
115
164
  gasFeeToken,
116
165
  networkClientId,
117
166
  origin: controller_utils_1.ORIGIN_METAMASK,
167
+ isInternal: true,
118
168
  requireApproval: false,
119
169
  type: transactions[0].type,
120
170
  });
@@ -125,14 +175,16 @@ async function submitTransactions(quote, parentTransactionId, acrossDepositType,
125
175
  type,
126
176
  }));
127
177
  await messenger.call('TransactionController:addTransactionBatch', {
128
- disable7702: !gasLimit7702,
129
- disableHook: Boolean(gasLimit7702),
130
- disableSequential: Boolean(gasLimit7702),
178
+ disable7702: !submitAs7702,
179
+ disableHook: submitAs7702,
180
+ disableSequential: submitAs7702,
181
+ excludeNativeTokenForFee,
131
182
  from,
132
183
  gasFeeToken,
133
184
  gasLimit7702,
134
185
  networkClientId,
135
186
  origin: controller_utils_1.ORIGIN_METAMASK,
187
+ isInternal: true,
136
188
  requireApproval: false,
137
189
  transactions: batchTransactions,
138
190
  });
@@ -151,6 +203,13 @@ async function submitTransactions(quote, parentTransactionId, acrossDepositType,
151
203
  : undefined;
152
204
  return await waitForAcrossCompletion(hash, messenger);
153
205
  }
206
+ /**
207
+ * Poll Across until a submitted deposit reaches a terminal status.
208
+ *
209
+ * @param transactionHash - Source-chain deposit transaction hash.
210
+ * @param messenger - Controller messenger.
211
+ * @returns Destination/fill transaction hash when available, otherwise the source hash.
212
+ */
154
213
  async function waitForAcrossCompletion(transactionHash, messenger) {
155
214
  if (!transactionHash) {
156
215
  return transactionHash;
@@ -203,8 +262,124 @@ async function waitForAcrossCompletion(transactionHash, messenger) {
203
262
  await new Promise((resolve) => setTimeout(resolve, ACROSS_STATUS_POLL_INTERVAL));
204
263
  }
205
264
  }
206
- function getAcrossDepositType(transactionType) {
207
- switch (transactionType) {
265
+ /**
266
+ * Check whether submit should estimate a 7702 batch gas limit.
267
+ *
268
+ * This is needed for Predict withdraw post-quote flows that pay source-chain
269
+ * gas with the source token, because the final submit batch can differ from the
270
+ * batch shape that Across quoted.
271
+ *
272
+ * @param parentTransaction - Original transaction metadata.
273
+ * @param quote - Across quote selected for execution.
274
+ * @returns Whether submit should try to estimate the final 7702 batch gas.
275
+ */
276
+ function shouldEstimate7702SubmitBatch(parentTransaction, quote) {
277
+ return ((0, transaction_1.isPredictWithdrawTransaction)(parentTransaction) &&
278
+ quote.request.isPostQuote === true &&
279
+ quote.fees.isSourceGasFeeToken === true);
280
+ }
281
+ /**
282
+ * Estimate the 7702 batch gas limit for the actual submit payload.
283
+ *
284
+ * Quotes can contain a combined 7702 gas limit that only covered the Across
285
+ * approval/swap legs. When submit prepends the original transaction, estimate
286
+ * the final batch shape so the gas limit covers every submitted leg.
287
+ *
288
+ * @param args - Estimation arguments.
289
+ * @param args.chainId - Source chain ID.
290
+ * @param args.from - Sender address.
291
+ * @param args.messenger - Controller messenger.
292
+ * @param args.orderedTransactions - Across approval/swap legs in submission order.
293
+ * @param args.parentTransaction - Original transaction that may be prepended.
294
+ * @param args.shouldPrependOriginalTransaction - Whether to include the original transaction in the estimate.
295
+ * @returns Hex gas limit, or `undefined` when estimation is unavailable.
296
+ */
297
+ async function estimateSubmitBatchGasLimit7702({ chainId, from, messenger, orderedTransactions, parentTransaction, shouldPrependOriginalTransaction, }) {
298
+ if (!(0, _7702_1.accountSupports7702)(messenger, from)) {
299
+ return undefined;
300
+ }
301
+ const originalTransaction = shouldPrependOriginalTransaction
302
+ ? [buildOriginalTransaction(parentTransaction)]
303
+ : [];
304
+ const acrossTransactions = orderedTransactions.map((transaction) => ({
305
+ params: buildTransactionParams(from, {
306
+ chainId: transaction.chainId,
307
+ data: transaction.data,
308
+ maxFeePerGas: transaction.maxFeePerGas,
309
+ maxPriorityFeePerGas: transaction.maxPriorityFeePerGas,
310
+ to: transaction.to,
311
+ value: transaction.value,
312
+ }),
313
+ type: transaction.type,
314
+ }));
315
+ const transactions = [...originalTransaction, ...acrossTransactions];
316
+ try {
317
+ const result = await messenger.call('TransactionController:estimateGasBatch', {
318
+ chainId,
319
+ from,
320
+ transactions: transactions.map(({ params }) => toBatchTransactionParams(params)),
321
+ });
322
+ if (result.gasLimits.length !== 1) {
323
+ return undefined;
324
+ }
325
+ const gasLimit = Math.ceil(result.gasLimits[0] * (0, feature_flags_2.getGasBuffer)(messenger, chainId));
326
+ return (0, controller_utils_1.toHex)(gasLimit);
327
+ }
328
+ catch {
329
+ return undefined;
330
+ }
331
+ }
332
+ /**
333
+ * Build the original parent transaction as a prepared batch leg.
334
+ *
335
+ * @param transaction - Original transaction metadata.
336
+ * @param gasLimit - Optional gas limit to pin on the original leg.
337
+ * @returns Prepared transaction params and transaction type for the original leg.
338
+ */
339
+ function buildOriginalTransaction(transaction, gasLimit) {
340
+ return {
341
+ params: {
342
+ data: transaction.txParams.data,
343
+ from: transaction.txParams.from,
344
+ gas: gasLimit === undefined ? undefined : (0, controller_utils_1.toHex)(gasLimit),
345
+ to: transaction.txParams.to,
346
+ value: transaction.txParams.value,
347
+ },
348
+ type: getOriginalTransactionType(transaction),
349
+ };
350
+ }
351
+ /**
352
+ * Get the transaction type to use for the original batch leg.
353
+ *
354
+ * @param transaction - Original transaction metadata.
355
+ * @returns `predictWithdraw` for Predict withdrawals; otherwise the original type.
356
+ */
357
+ function getOriginalTransactionType(transaction) {
358
+ if ((0, transaction_1.isPredictWithdrawTransaction)(transaction)) {
359
+ return transaction_controller_1.TransactionType.predictWithdraw;
360
+ }
361
+ return transaction.type;
362
+ }
363
+ /**
364
+ * Check whether the original transaction already has a usable gas limit.
365
+ *
366
+ * @param transaction - Original transaction metadata.
367
+ * @returns Whether the original or nested transaction gas is a positive integer.
368
+ */
369
+ function hasOriginalTransactionGas(transaction) {
370
+ return (0, transactions_1.getOriginalTransactionGas)(transaction) !== undefined;
371
+ }
372
+ /**
373
+ * Get the transaction type for the Across bridge/deposit leg.
374
+ *
375
+ * @param transaction - Original parent transaction.
376
+ * @returns Across-specific transaction type for known flows, or the original type.
377
+ */
378
+ function getAcrossDepositType(transaction) {
379
+ if ((0, transaction_1.isPredictWithdrawTransaction)(transaction)) {
380
+ return transaction_controller_1.TransactionType.predictAcrossWithdraw;
381
+ }
382
+ switch (transaction.type) {
208
383
  case transaction_controller_1.TransactionType.perpsDeposit:
209
384
  return transaction_controller_1.TransactionType.perpsAcrossDeposit;
210
385
  case transaction_controller_1.TransactionType.predictDeposit:
@@ -212,9 +387,23 @@ function getAcrossDepositType(transactionType) {
212
387
  case undefined:
213
388
  return transaction_controller_1.TransactionType.perpsAcrossDeposit;
214
389
  default:
215
- return transactionType;
390
+ return transaction.type;
216
391
  }
217
392
  }
393
+ /**
394
+ * Build TransactionController params for an Across approval or swap leg.
395
+ *
396
+ * @param from - Sender address.
397
+ * @param params - Across transaction fields.
398
+ * @param params.chainId - Source chain ID.
399
+ * @param params.data - Transaction calldata.
400
+ * @param params.gasLimit - Optional gas limit.
401
+ * @param params.to - Recipient contract address.
402
+ * @param params.value - Optional native value.
403
+ * @param params.maxFeePerGas - Optional EIP-1559 max fee.
404
+ * @param params.maxPriorityFeePerGas - Optional EIP-1559 priority fee.
405
+ * @returns TransactionController params.
406
+ */
218
407
  function buildTransactionParams(from, params) {
219
408
  const value = (0, controller_utils_1.toHex)(params.value ?? '0x0');
220
409
  return {
@@ -227,12 +416,24 @@ function buildTransactionParams(from, params) {
227
416
  value,
228
417
  };
229
418
  }
419
+ /**
420
+ * Normalize an optional numeric string or hex string into a hex value.
421
+ *
422
+ * @param value - Optional value to normalize.
423
+ * @returns Hex value, or `undefined` when no value is provided.
424
+ */
230
425
  function normalizeOptionalHex(value) {
231
426
  if (value === undefined) {
232
427
  return undefined;
233
428
  }
234
429
  return (0, controller_utils_1.toHex)(value);
235
430
  }
431
+ /**
432
+ * Convert full TransactionController params into batch transaction params.
433
+ *
434
+ * @param params - Transaction params.
435
+ * @returns Batch-compatible transaction params.
436
+ */
236
437
  function toBatchTransactionParams(params) {
237
438
  return {
238
439
  data: params.data,
@@ -1 +1 @@
1
- {"version":3,"file":"across-submit.cjs","sourceRoot":"","sources":["../../../src/strategy/across/across-submit.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ORIGIN_METAMASK,\n successfulFetch,\n toHex,\n} from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type {\n BatchTransactionParams,\n TransactionMeta,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { projectLogger } from '../../logger';\nimport type {\n PayStrategyExecuteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { getPayStrategiesConfig } from '../../utils/feature-flags';\nimport {\n collectTransactionIds,\n getTransaction,\n updateTransaction,\n waitForTransactionConfirmed,\n} from '../../utils/transaction';\nimport { getAcrossOrderedTransactions } from './transactions';\nimport type { AcrossQuote } from './types';\n\nconst log = createModuleLogger(projectLogger, 'across-strategy');\nconst ACROSS_STATUS_POLL_INTERVAL = 1000;\n\ntype PreparedAcrossTransaction = {\n params: TransactionParams;\n type: TransactionType;\n};\n\n/**\n * Submit Across quotes.\n *\n * @param request - Request object.\n * @returns An object containing the transaction hash if available.\n */\nexport async function submitAcrossQuotes(\n request: PayStrategyExecuteRequest<AcrossQuote>,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing quotes', request);\n\n const { quotes, messenger, transaction } = request;\n let transactionHash: Hex | undefined;\n\n for (const quote of quotes) {\n ({ transactionHash } = await executeSingleQuote(\n quote,\n messenger,\n transaction,\n ));\n }\n\n return { transactionHash };\n}\n\nasync function executeSingleQuote(\n quote: TransactionPayQuote<AcrossQuote>,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing single quote', quote);\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Remove nonce from skipped transaction',\n },\n (tx) => {\n tx.txParams.nonce = undefined;\n },\n );\n\n const acrossDepositType = getAcrossDepositType(transaction.type);\n const transactionHash = await submitTransactions(\n quote,\n transaction.id,\n acrossDepositType,\n messenger,\n );\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Intent complete after Across submission',\n },\n (tx) => {\n tx.isIntentComplete = true;\n },\n );\n\n return { transactionHash };\n}\n\n/**\n * Submit transactions for an Across quote.\n *\n * @param quote - Across quote.\n * @param parentTransactionId - ID of the parent transaction.\n * @param acrossDepositType - Transaction type used for the swap/deposit step.\n * @param messenger - Controller messenger.\n * @returns Hash of the last submitted transaction, if available.\n */\nasync function submitTransactions(\n quote: TransactionPayQuote<AcrossQuote>,\n parentTransactionId: string,\n acrossDepositType: TransactionType,\n messenger: TransactionPayControllerMessenger,\n): Promise<Hex | undefined> {\n const { swapTx } = quote.original.quote;\n const { gasLimits: quoteGasLimits, is7702 } = quote.original.metamask;\n const { from } = quote.request;\n const chainId = toHex(swapTx.chainId);\n const orderedTransactions = getAcrossOrderedTransactions({\n quote: quote.original.quote,\n swapType: acrossDepositType,\n });\n\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n const batchGasLimit =\n is7702 && orderedTransactions.length > 1\n ? quoteGasLimits[0]?.max\n : undefined;\n\n if (is7702 && orderedTransactions.length > 1 && batchGasLimit === undefined) {\n throw new Error('Missing quote gas limit for Across 7702 batch');\n }\n\n const gasLimit7702 =\n batchGasLimit === undefined ? undefined : toHex(batchGasLimit);\n\n const transactions: PreparedAcrossTransaction[] = orderedTransactions.map(\n (transaction, index) => {\n const gasLimit = gasLimit7702 ? undefined : quoteGasLimits[index]?.max;\n\n if (gasLimit === undefined && !gasLimit7702) {\n const errorMessage =\n transaction.kind === 'approval'\n ? `Missing quote gas limit for Across approval transaction at index ${index}`\n : 'Missing quote gas limit for Across swap transaction';\n\n throw new Error(errorMessage);\n }\n\n return {\n params: buildTransactionParams(from, {\n chainId: transaction.chainId,\n data: transaction.data,\n gasLimit,\n maxFeePerGas: transaction.maxFeePerGas,\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas,\n to: transaction.to,\n value: transaction.value,\n }),\n type: transaction.type ?? acrossDepositType,\n };\n },\n );\n\n const transactionIds: string[] = [];\n\n const { end } = collectTransactionIds(\n chainId,\n from,\n messenger,\n (transactionId) => {\n transactionIds.push(transactionId);\n\n updateTransaction(\n {\n transactionId: parentTransactionId,\n messenger,\n note: 'Add required transaction ID from Across submission',\n },\n (tx) => {\n tx.requiredTransactionIds ??= [];\n tx.requiredTransactionIds.push(transactionId);\n },\n );\n },\n );\n\n let result: { result: Promise<string> } | undefined;\n const gasFeeToken = quote.fees.isSourceGasFeeToken\n ? quote.request.sourceTokenAddress\n : undefined;\n\n try {\n if (transactions.length === 1) {\n result = await messenger.call(\n 'TransactionController:addTransaction',\n transactions[0].params,\n {\n gasFeeToken,\n networkClientId,\n origin: ORIGIN_METAMASK,\n requireApproval: false,\n type: transactions[0].type,\n },\n );\n } else {\n const batchTransactions = transactions.map(({ params, type }) => ({\n params: toBatchTransactionParams(params),\n type,\n }));\n\n await messenger.call('TransactionController:addTransactionBatch', {\n disable7702: !gasLimit7702,\n disableHook: Boolean(gasLimit7702),\n disableSequential: Boolean(gasLimit7702),\n from,\n gasFeeToken,\n gasLimit7702,\n networkClientId,\n origin: ORIGIN_METAMASK,\n requireApproval: false,\n transactions: batchTransactions,\n });\n }\n } finally {\n end();\n }\n\n if (result) {\n const txHash = await result.result;\n log('Submitted transaction', txHash);\n }\n\n await Promise.all(\n transactionIds.map((txId) => waitForTransactionConfirmed(txId, messenger)),\n );\n\n const hash = transactionIds.length\n ? getTransaction(transactionIds.slice(-1)[0], messenger)?.hash\n : undefined;\n\n return await waitForAcrossCompletion(hash as Hex | undefined, messenger);\n}\n\ntype AcrossStatusResponse = {\n depositId?: number | string;\n depositTxnRef?: Hex;\n status?: string;\n destinationTxHash?: Hex;\n fillTxnRef?: Hex;\n fillTxHash?: Hex;\n txHash?: Hex;\n};\n\nasync function waitForAcrossCompletion(\n transactionHash: Hex | undefined,\n messenger: TransactionPayControllerMessenger,\n): Promise<Hex | undefined> {\n if (!transactionHash) {\n return transactionHash;\n }\n\n const config = getPayStrategiesConfig(messenger);\n const params = new URLSearchParams({\n depositTxnRef: transactionHash,\n });\n const url = `${config.across.apiBase}/deposit/status?${params.toString()}`;\n\n let attempt = 0;\n\n while (true) {\n attempt += 1;\n let status: AcrossStatusResponse;\n\n try {\n const response = await successfulFetch(url, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n });\n status = (await response.json()) as AcrossStatusResponse;\n } catch (error) {\n log('Across status polling request failed', {\n attempt,\n error: String(error),\n transactionHash,\n });\n\n await new Promise((resolve) =>\n setTimeout(resolve, ACROSS_STATUS_POLL_INTERVAL),\n );\n continue;\n }\n\n const normalizedStatus = status.status?.toLowerCase();\n\n log('Polled Across status', {\n attempt,\n status: normalizedStatus,\n transactionHash,\n });\n\n if (\n normalizedStatus &&\n ['completed', 'filled', 'success'].includes(normalizedStatus)\n ) {\n return (\n status.destinationTxHash ??\n status.fillTxnRef ??\n status.fillTxHash ??\n status.txHash ??\n transactionHash\n );\n }\n\n if (\n normalizedStatus &&\n ['error', 'failed', 'refund', 'refunded'].includes(normalizedStatus)\n ) {\n throw new Error(`Across request failed with status: ${normalizedStatus}`);\n }\n\n await new Promise((resolve) =>\n setTimeout(resolve, ACROSS_STATUS_POLL_INTERVAL),\n );\n }\n}\n\nfunction getAcrossDepositType(\n transactionType?: TransactionType,\n): TransactionType {\n switch (transactionType) {\n case TransactionType.perpsDeposit:\n return TransactionType.perpsAcrossDeposit;\n case TransactionType.predictDeposit:\n return TransactionType.predictAcrossDeposit;\n case undefined:\n return TransactionType.perpsAcrossDeposit;\n default:\n return transactionType;\n }\n}\n\nfunction buildTransactionParams(\n from: Hex,\n params: {\n chainId: number;\n data: Hex;\n gasLimit?: number;\n to: Hex;\n value?: Hex;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n },\n): TransactionParams {\n const value = toHex(params.value ?? '0x0');\n\n return {\n data: params.data,\n from,\n gas: params.gasLimit === undefined ? undefined : toHex(params.gasLimit),\n maxFeePerGas: normalizeOptionalHex(params.maxFeePerGas),\n maxPriorityFeePerGas: normalizeOptionalHex(params.maxPriorityFeePerGas),\n to: params.to,\n value,\n };\n}\n\nfunction normalizeOptionalHex(value?: string): Hex | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n return toHex(value);\n}\n\nfunction toBatchTransactionParams(\n params: TransactionParams,\n): BatchTransactionParams {\n return {\n data: params.data as Hex | undefined,\n gas: params.gas as Hex | undefined,\n maxFeePerGas: params.maxFeePerGas as Hex | undefined,\n maxPriorityFeePerGas: params.maxPriorityFeePerGas as Hex | undefined,\n to: params.to as Hex | undefined,\n value: params.value as Hex | undefined,\n };\n}\n"]}
1
+ {"version":3,"file":"across-submit.cjs","sourceRoot":"","sources":["../../../src/strategy/across/across-submit.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ORIGIN_METAMASK,\n successfulFetch,\n toHex,\n} from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type {\n BatchTransactionParams,\n TransactionMeta,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { projectLogger } from '../../logger';\nimport type {\n PayStrategyExecuteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types';\nimport { accountSupports7702 } from '../../utils/7702';\nimport { getPayStrategiesConfig } from '../../utils/feature-flags';\nimport { getGasBuffer } from '../../utils/feature-flags';\nimport {\n collectTransactionIds,\n getTransaction,\n updateTransaction,\n isPredictWithdrawTransaction,\n waitForTransactionConfirmed,\n} from '../../utils/transaction';\nimport {\n getAcrossOrderedTransactions,\n getOriginalTransactionGas,\n} from './transactions';\nimport type { AcrossQuote } from './types';\n\nconst log = createModuleLogger(projectLogger, 'across-strategy');\nconst ACROSS_STATUS_POLL_INTERVAL = 1000;\n\ntype PreparedAcrossTransaction = {\n params: TransactionParams;\n type: TransactionMeta['type'];\n};\n\n/**\n * Submit Across quotes.\n *\n * @param request - Request object.\n * @returns An object containing the transaction hash if available.\n */\nexport async function submitAcrossQuotes(\n request: PayStrategyExecuteRequest<AcrossQuote>,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing quotes', request);\n\n const { quotes, messenger, transaction } = request;\n let transactionHash: Hex | undefined;\n\n for (const quote of quotes) {\n ({ transactionHash } = await executeSingleQuote(\n quote,\n messenger,\n transaction,\n ));\n }\n\n return { transactionHash };\n}\n\nasync function executeSingleQuote(\n quote: TransactionPayQuote<AcrossQuote>,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing single quote', quote);\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Remove nonce from skipped transaction',\n },\n (tx) => {\n tx.txParams.nonce = undefined;\n },\n );\n\n const acrossDepositType = getAcrossDepositType(transaction);\n const transactionHash = await submitTransactions(\n quote,\n transaction,\n acrossDepositType,\n messenger,\n );\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Intent complete after Across submission',\n },\n (tx) => {\n tx.isIntentComplete = true;\n },\n );\n\n return { transactionHash };\n}\n\n/**\n * Submit transactions for an Across quote.\n *\n * @param quote - Across quote.\n * @param parentTransaction - Parent transaction.\n * @param acrossDepositType - Transaction type used for the swap/deposit step.\n * @param messenger - Controller messenger.\n * @returns Hash of the last submitted transaction, if available.\n */\nasync function submitTransactions(\n quote: TransactionPayQuote<AcrossQuote>,\n parentTransaction: TransactionMeta,\n acrossDepositType: TransactionType,\n messenger: TransactionPayControllerMessenger,\n): Promise<Hex | undefined> {\n const { swapTx } = quote.original.quote;\n const { gasLimits: quoteGasLimits, is7702 } = quote.original.metamask;\n const { from } = quote.request;\n const chainId = toHex(swapTx.chainId);\n const orderedTransactions = getAcrossOrderedTransactions({\n quote: quote.original.quote,\n swapType: acrossDepositType,\n });\n const shouldPrependOriginalTransaction =\n quote.request.isPostQuote === true &&\n parentTransaction.txParams.to !== undefined;\n const hasPrependedOriginalGasLimit =\n shouldPrependOriginalTransaction &&\n !is7702 &&\n quoteGasLimits.length > orderedTransactions.length;\n const gasLimitOffset = hasPrependedOriginalGasLimit ? 1 : 0;\n const transactionCount =\n orderedTransactions.length + (shouldPrependOriginalTransaction ? 1 : 0);\n\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n const is7702Batch = is7702 && transactionCount > 1;\n const canUseQuotedBatchGasLimit =\n is7702Batch &&\n (!shouldPrependOriginalTransaction ||\n hasOriginalTransactionGas(parentTransaction));\n const batchGasLimit = canUseQuotedBatchGasLimit\n ? quoteGasLimits[0]?.max\n : undefined;\n\n if (canUseQuotedBatchGasLimit && batchGasLimit === undefined) {\n throw new Error('Missing quote gas limit for Across 7702 batch');\n }\n\n const quotedGasLimit7702 =\n batchGasLimit === undefined ? undefined : toHex(batchGasLimit);\n const parentHasAuthorizationList = Boolean(\n parentTransaction.txParams.authorizationList?.length,\n );\n\n const shouldUseGasFeeToken7702Submit = shouldEstimate7702SubmitBatch(\n parentTransaction,\n quote,\n )\n ? accountSupports7702(messenger, from)\n : false;\n const shouldUse7702Submit = [\n Boolean(quotedGasLimit7702),\n is7702Batch,\n parentHasAuthorizationList,\n shouldUseGasFeeToken7702Submit,\n ].some(Boolean);\n\n const shouldEstimateGasLimit7702 = !quotedGasLimit7702 && shouldUse7702Submit;\n\n const estimatedGasLimit7702 = shouldEstimateGasLimit7702\n ? await estimateSubmitBatchGasLimit7702({\n chainId,\n from,\n messenger,\n orderedTransactions,\n parentTransaction,\n shouldPrependOriginalTransaction,\n })\n : undefined;\n\n const gasLimit7702 = quotedGasLimit7702 ?? estimatedGasLimit7702;\n const submitAs7702 = shouldUse7702Submit || Boolean(gasLimit7702);\n\n const acrossTransactions: PreparedAcrossTransaction[] =\n orderedTransactions.map((transaction, index) => {\n const gasLimit = submitAs7702\n ? undefined\n : quoteGasLimits[index + gasLimitOffset]?.max;\n\n if (gasLimit === undefined && !submitAs7702) {\n const quoteGasIndex = index + gasLimitOffset;\n const errorMessage =\n transaction.kind === 'approval'\n ? `Missing quote gas limit for Across approval transaction at index ${quoteGasIndex}`\n : 'Missing quote gas limit for Across swap transaction';\n\n throw new Error(errorMessage);\n }\n\n return {\n params: buildTransactionParams(from, {\n chainId: transaction.chainId,\n data: transaction.data,\n gasLimit,\n maxFeePerGas: transaction.maxFeePerGas,\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas,\n to: transaction.to,\n value: transaction.value,\n }),\n type: transaction.type ?? acrossDepositType,\n };\n });\n const originalTransaction = shouldPrependOriginalTransaction\n ? [\n buildOriginalTransaction(\n parentTransaction,\n submitAs7702 || !hasPrependedOriginalGasLimit\n ? undefined\n : quoteGasLimits[0]?.max,\n ),\n ]\n : [];\n const transactions = [...originalTransaction, ...acrossTransactions];\n\n const transactionIds: string[] = [];\n\n const { end } = collectTransactionIds(\n chainId,\n from,\n messenger,\n (transactionId) => {\n transactionIds.push(transactionId);\n\n updateTransaction(\n {\n transactionId: parentTransaction.id,\n messenger,\n note: 'Add required transaction ID from Across submission',\n },\n (tx) => {\n tx.requiredTransactionIds ??= [];\n tx.requiredTransactionIds.push(transactionId);\n },\n );\n },\n );\n\n let result: { result: Promise<string> } | undefined;\n const gasFeeToken = quote.fees.isSourceGasFeeToken\n ? quote.request.sourceTokenAddress\n : undefined;\n const excludeNativeTokenForFee = gasFeeToken ? true : undefined;\n\n try {\n if (transactions.length === 1) {\n result = await messenger.call(\n 'TransactionController:addTransaction',\n transactions[0].params,\n {\n excludeNativeTokenForFee,\n gasFeeToken,\n networkClientId,\n origin: ORIGIN_METAMASK,\n isInternal: true,\n requireApproval: false,\n type: transactions[0].type,\n },\n );\n } else {\n const batchTransactions = transactions.map(({ params, type }) => ({\n params: toBatchTransactionParams(params),\n type,\n }));\n\n await messenger.call('TransactionController:addTransactionBatch', {\n disable7702: !submitAs7702,\n disableHook: submitAs7702,\n disableSequential: submitAs7702,\n excludeNativeTokenForFee,\n from,\n gasFeeToken,\n gasLimit7702,\n networkClientId,\n origin: ORIGIN_METAMASK,\n isInternal: true,\n requireApproval: false,\n transactions: batchTransactions,\n });\n }\n } finally {\n end();\n }\n\n if (result) {\n const txHash = await result.result;\n log('Submitted transaction', txHash);\n }\n\n await Promise.all(\n transactionIds.map((txId) => waitForTransactionConfirmed(txId, messenger)),\n );\n\n const hash = transactionIds.length\n ? getTransaction(transactionIds.slice(-1)[0], messenger)?.hash\n : undefined;\n\n return await waitForAcrossCompletion(hash as Hex | undefined, messenger);\n}\n\ntype AcrossStatusResponse = {\n depositId?: number | string;\n depositTxnRef?: Hex;\n status?: string;\n destinationTxHash?: Hex;\n fillTxnRef?: Hex;\n fillTxHash?: Hex;\n txHash?: Hex;\n};\n\n/**\n * Poll Across until a submitted deposit reaches a terminal status.\n *\n * @param transactionHash - Source-chain deposit transaction hash.\n * @param messenger - Controller messenger.\n * @returns Destination/fill transaction hash when available, otherwise the source hash.\n */\nasync function waitForAcrossCompletion(\n transactionHash: Hex | undefined,\n messenger: TransactionPayControllerMessenger,\n): Promise<Hex | undefined> {\n if (!transactionHash) {\n return transactionHash;\n }\n\n const config = getPayStrategiesConfig(messenger);\n const params = new URLSearchParams({\n depositTxnRef: transactionHash,\n });\n const url = `${config.across.apiBase}/deposit/status?${params.toString()}`;\n\n let attempt = 0;\n\n while (true) {\n attempt += 1;\n let status: AcrossStatusResponse;\n\n try {\n const response = await successfulFetch(url, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n });\n status = (await response.json()) as AcrossStatusResponse;\n } catch (error) {\n log('Across status polling request failed', {\n attempt,\n error: String(error),\n transactionHash,\n });\n\n await new Promise((resolve) =>\n setTimeout(resolve, ACROSS_STATUS_POLL_INTERVAL),\n );\n continue;\n }\n\n const normalizedStatus = status.status?.toLowerCase();\n\n log('Polled Across status', {\n attempt,\n status: normalizedStatus,\n transactionHash,\n });\n\n if (\n normalizedStatus &&\n ['completed', 'filled', 'success'].includes(normalizedStatus)\n ) {\n return (\n status.destinationTxHash ??\n status.fillTxnRef ??\n status.fillTxHash ??\n status.txHash ??\n transactionHash\n );\n }\n\n if (\n normalizedStatus &&\n ['error', 'failed', 'refund', 'refunded'].includes(normalizedStatus)\n ) {\n throw new Error(`Across request failed with status: ${normalizedStatus}`);\n }\n\n await new Promise((resolve) =>\n setTimeout(resolve, ACROSS_STATUS_POLL_INTERVAL),\n );\n }\n}\n\n/**\n * Check whether submit should estimate a 7702 batch gas limit.\n *\n * This is needed for Predict withdraw post-quote flows that pay source-chain\n * gas with the source token, because the final submit batch can differ from the\n * batch shape that Across quoted.\n *\n * @param parentTransaction - Original transaction metadata.\n * @param quote - Across quote selected for execution.\n * @returns Whether submit should try to estimate the final 7702 batch gas.\n */\nfunction shouldEstimate7702SubmitBatch(\n parentTransaction: TransactionMeta,\n quote: TransactionPayQuote<AcrossQuote>,\n): boolean {\n return (\n isPredictWithdrawTransaction(parentTransaction) &&\n quote.request.isPostQuote === true &&\n quote.fees.isSourceGasFeeToken === true\n );\n}\n\n/**\n * Estimate the 7702 batch gas limit for the actual submit payload.\n *\n * Quotes can contain a combined 7702 gas limit that only covered the Across\n * approval/swap legs. When submit prepends the original transaction, estimate\n * the final batch shape so the gas limit covers every submitted leg.\n *\n * @param args - Estimation arguments.\n * @param args.chainId - Source chain ID.\n * @param args.from - Sender address.\n * @param args.messenger - Controller messenger.\n * @param args.orderedTransactions - Across approval/swap legs in submission order.\n * @param args.parentTransaction - Original transaction that may be prepended.\n * @param args.shouldPrependOriginalTransaction - Whether to include the original transaction in the estimate.\n * @returns Hex gas limit, or `undefined` when estimation is unavailable.\n */\nasync function estimateSubmitBatchGasLimit7702({\n chainId,\n from,\n messenger,\n orderedTransactions,\n parentTransaction,\n shouldPrependOriginalTransaction,\n}: {\n chainId: Hex;\n from: Hex;\n messenger: TransactionPayControllerMessenger;\n orderedTransactions: ReturnType<typeof getAcrossOrderedTransactions>;\n parentTransaction: TransactionMeta;\n shouldPrependOriginalTransaction: boolean;\n}): Promise<Hex | undefined> {\n if (!accountSupports7702(messenger, from)) {\n return undefined;\n }\n\n const originalTransaction = shouldPrependOriginalTransaction\n ? [buildOriginalTransaction(parentTransaction)]\n : [];\n\n const acrossTransactions = orderedTransactions.map((transaction) => ({\n params: buildTransactionParams(from, {\n chainId: transaction.chainId,\n data: transaction.data,\n maxFeePerGas: transaction.maxFeePerGas,\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas,\n to: transaction.to,\n value: transaction.value,\n }),\n type: transaction.type,\n }));\n\n const transactions = [...originalTransaction, ...acrossTransactions];\n\n try {\n const result = await messenger.call(\n 'TransactionController:estimateGasBatch',\n {\n chainId,\n from,\n transactions: transactions.map(({ params }) =>\n toBatchTransactionParams(params),\n ),\n },\n );\n\n if (result.gasLimits.length !== 1) {\n return undefined;\n }\n\n const gasLimit = Math.ceil(\n result.gasLimits[0] * getGasBuffer(messenger, chainId),\n );\n\n return toHex(gasLimit);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Build the original parent transaction as a prepared batch leg.\n *\n * @param transaction - Original transaction metadata.\n * @param gasLimit - Optional gas limit to pin on the original leg.\n * @returns Prepared transaction params and transaction type for the original leg.\n */\nfunction buildOriginalTransaction(\n transaction: TransactionMeta,\n gasLimit?: number,\n): PreparedAcrossTransaction {\n return {\n params: {\n data: transaction.txParams.data,\n from: transaction.txParams.from,\n gas: gasLimit === undefined ? undefined : toHex(gasLimit),\n to: transaction.txParams.to,\n value: transaction.txParams.value,\n } as TransactionParams,\n type: getOriginalTransactionType(transaction),\n };\n}\n\n/**\n * Get the transaction type to use for the original batch leg.\n *\n * @param transaction - Original transaction metadata.\n * @returns `predictWithdraw` for Predict withdrawals; otherwise the original type.\n */\nfunction getOriginalTransactionType(\n transaction: TransactionMeta,\n): TransactionMeta['type'] {\n if (isPredictWithdrawTransaction(transaction)) {\n return TransactionType.predictWithdraw;\n }\n\n return transaction.type;\n}\n\n/**\n * Check whether the original transaction already has a usable gas limit.\n *\n * @param transaction - Original transaction metadata.\n * @returns Whether the original or nested transaction gas is a positive integer.\n */\nfunction hasOriginalTransactionGas(transaction: TransactionMeta): boolean {\n return getOriginalTransactionGas(transaction) !== undefined;\n}\n\n/**\n * Get the transaction type for the Across bridge/deposit leg.\n *\n * @param transaction - Original parent transaction.\n * @returns Across-specific transaction type for known flows, or the original type.\n */\nfunction getAcrossDepositType(transaction: TransactionMeta): TransactionType {\n if (isPredictWithdrawTransaction(transaction)) {\n return TransactionType.predictAcrossWithdraw;\n }\n\n switch (transaction.type) {\n case TransactionType.perpsDeposit:\n return TransactionType.perpsAcrossDeposit;\n case TransactionType.predictDeposit:\n return TransactionType.predictAcrossDeposit;\n case undefined:\n return TransactionType.perpsAcrossDeposit;\n default:\n return transaction.type as TransactionType;\n }\n}\n\n/**\n * Build TransactionController params for an Across approval or swap leg.\n *\n * @param from - Sender address.\n * @param params - Across transaction fields.\n * @param params.chainId - Source chain ID.\n * @param params.data - Transaction calldata.\n * @param params.gasLimit - Optional gas limit.\n * @param params.to - Recipient contract address.\n * @param params.value - Optional native value.\n * @param params.maxFeePerGas - Optional EIP-1559 max fee.\n * @param params.maxPriorityFeePerGas - Optional EIP-1559 priority fee.\n * @returns TransactionController params.\n */\nfunction buildTransactionParams(\n from: Hex,\n params: {\n chainId: number;\n data: Hex;\n gasLimit?: number;\n to: Hex;\n value?: Hex;\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n },\n): TransactionParams {\n const value = toHex(params.value ?? '0x0');\n\n return {\n data: params.data,\n from,\n gas: params.gasLimit === undefined ? undefined : toHex(params.gasLimit),\n maxFeePerGas: normalizeOptionalHex(params.maxFeePerGas),\n maxPriorityFeePerGas: normalizeOptionalHex(params.maxPriorityFeePerGas),\n to: params.to,\n value,\n };\n}\n\n/**\n * Normalize an optional numeric string or hex string into a hex value.\n *\n * @param value - Optional value to normalize.\n * @returns Hex value, or `undefined` when no value is provided.\n */\nfunction normalizeOptionalHex(value?: string): Hex | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n return toHex(value);\n}\n\n/**\n * Convert full TransactionController params into batch transaction params.\n *\n * @param params - Transaction params.\n * @returns Batch-compatible transaction params.\n */\nfunction toBatchTransactionParams(\n params: TransactionParams,\n): BatchTransactionParams {\n return {\n data: params.data as Hex | undefined,\n gas: params.gas as Hex | undefined,\n maxFeePerGas: params.maxFeePerGas as Hex | undefined,\n maxPriorityFeePerGas: params.maxPriorityFeePerGas as Hex | undefined,\n to: params.to as Hex | undefined,\n value: params.value as Hex | undefined,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"across-submit.d.cts","sourceRoot":"","sources":["../../../src/strategy/across/across-submit.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EACV,yBAAyB,EAG1B,wBAAoB;AASrB,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAgB;AAU3C;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,CAAC,WAAW,CAAC,GAC9C,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAepC"}
1
+ {"version":3,"file":"across-submit.d.cts","sourceRoot":"","sources":["../../../src/strategy/across/across-submit.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EACV,yBAAyB,EAG1B,wBAAoB;AAerB,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAgB;AAU3C;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,CAAC,WAAW,CAAC,GAC9C,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAepC"}
@@ -1 +1 @@
1
- {"version":3,"file":"across-submit.d.mts","sourceRoot":"","sources":["../../../src/strategy/across/across-submit.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EACV,yBAAyB,EAG1B,wBAAoB;AASrB,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAgB;AAU3C;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,CAAC,WAAW,CAAC,GAC9C,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAepC"}
1
+ {"version":3,"file":"across-submit.d.mts","sourceRoot":"","sources":["../../../src/strategy/across/across-submit.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EACV,yBAAyB,EAG1B,wBAAoB;AAerB,OAAO,KAAK,EAAE,WAAW,EAAE,oBAAgB;AAU3C;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,CAAC,WAAW,CAAC,GAC9C,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAepC"}