@metamask-previews/transaction-pay-controller 22.4.0-preview-fe92f4bb3 → 22.4.0-preview-ea54cecca

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 (124) hide show
  1. package/CHANGELOG.md +0 -9
  2. package/dist/TransactionPayController-method-action-types.cjs.map +1 -1
  3. package/dist/TransactionPayController-method-action-types.d.cts +1 -23
  4. package/dist/TransactionPayController-method-action-types.d.cts.map +1 -1
  5. package/dist/TransactionPayController-method-action-types.d.mts +1 -23
  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 +4 -36
  9. package/dist/TransactionPayController.cjs.map +1 -1
  10. package/dist/TransactionPayController.d.cts +2 -18
  11. package/dist/TransactionPayController.d.cts.map +1 -1
  12. package/dist/TransactionPayController.d.mts +2 -18
  13. package/dist/TransactionPayController.d.mts.map +1 -1
  14. package/dist/TransactionPayController.mjs +4 -36
  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 +13 -1
  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 +13 -1
  27. package/dist/strategy/across/across-quotes.mjs.map +1 -1
  28. package/dist/strategy/across/across-submit.cjs +18 -217
  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 +20 -219
  33. package/dist/strategy/across/across-submit.mjs.map +1 -1
  34. package/dist/strategy/across/transactions.cjs +1 -21
  35. package/dist/strategy/across/transactions.cjs.map +1 -1
  36. package/dist/strategy/across/transactions.d.cts +0 -8
  37. package/dist/strategy/across/transactions.d.cts.map +1 -1
  38. package/dist/strategy/across/transactions.d.mts +0 -8
  39. package/dist/strategy/across/transactions.d.mts.map +1 -1
  40. package/dist/strategy/across/transactions.mjs +0 -19
  41. package/dist/strategy/across/transactions.mjs.map +1 -1
  42. package/dist/strategy/relay/relay-quotes.cjs +2 -8
  43. package/dist/strategy/relay/relay-quotes.cjs.map +1 -1
  44. package/dist/strategy/relay/relay-quotes.d.cts.map +1 -1
  45. package/dist/strategy/relay/relay-quotes.d.mts.map +1 -1
  46. package/dist/strategy/relay/relay-quotes.mjs +2 -8
  47. package/dist/strategy/relay/relay-quotes.mjs.map +1 -1
  48. package/dist/strategy/relay/relay-submit.cjs +18 -50
  49. package/dist/strategy/relay/relay-submit.cjs.map +1 -1
  50. package/dist/strategy/relay/relay-submit.d.cts.map +1 -1
  51. package/dist/strategy/relay/relay-submit.d.mts.map +1 -1
  52. package/dist/strategy/relay/relay-submit.mjs +18 -50
  53. package/dist/strategy/relay/relay-submit.mjs.map +1 -1
  54. package/dist/strategy/relay/types.cjs.map +1 -1
  55. package/dist/strategy/relay/types.d.cts +1 -2
  56. package/dist/strategy/relay/types.d.cts.map +1 -1
  57. package/dist/strategy/relay/types.d.mts +1 -2
  58. package/dist/strategy/relay/types.d.mts.map +1 -1
  59. package/dist/strategy/relay/types.mjs.map +1 -1
  60. package/dist/tests/messenger-mock.cjs +0 -6
  61. package/dist/tests/messenger-mock.cjs.map +1 -1
  62. package/dist/tests/messenger-mock.d.cts +0 -14
  63. package/dist/tests/messenger-mock.d.cts.map +1 -1
  64. package/dist/tests/messenger-mock.d.mts +0 -14
  65. package/dist/tests/messenger-mock.d.mts.map +1 -1
  66. package/dist/tests/messenger-mock.mjs +0 -6
  67. package/dist/tests/messenger-mock.mjs.map +1 -1
  68. package/dist/types.cjs.map +1 -1
  69. package/dist/types.d.cts +0 -27
  70. package/dist/types.d.cts.map +1 -1
  71. package/dist/types.d.mts +0 -27
  72. package/dist/types.d.mts.map +1 -1
  73. package/dist/types.mjs.map +1 -1
  74. package/dist/utils/feature-flags.cjs +1 -1
  75. package/dist/utils/feature-flags.cjs.map +1 -1
  76. package/dist/utils/feature-flags.d.cts +1 -1
  77. package/dist/utils/feature-flags.d.cts.map +1 -1
  78. package/dist/utils/feature-flags.d.mts +1 -1
  79. package/dist/utils/feature-flags.d.mts.map +1 -1
  80. package/dist/utils/feature-flags.mjs +1 -1
  81. package/dist/utils/feature-flags.mjs.map +1 -1
  82. package/dist/utils/quotes.cjs +3 -8
  83. package/dist/utils/quotes.cjs.map +1 -1
  84. package/dist/utils/quotes.d.cts.map +1 -1
  85. package/dist/utils/quotes.d.mts.map +1 -1
  86. package/dist/utils/quotes.mjs +3 -8
  87. package/dist/utils/quotes.mjs.map +1 -1
  88. package/dist/utils/source-amounts.cjs +8 -10
  89. package/dist/utils/source-amounts.cjs.map +1 -1
  90. package/dist/utils/source-amounts.d.cts.map +1 -1
  91. package/dist/utils/source-amounts.d.mts.map +1 -1
  92. package/dist/utils/source-amounts.mjs +8 -10
  93. package/dist/utils/source-amounts.mjs.map +1 -1
  94. package/dist/utils/token.cjs +2 -5
  95. package/dist/utils/token.cjs.map +1 -1
  96. package/dist/utils/token.d.cts.map +1 -1
  97. package/dist/utils/token.d.mts.map +1 -1
  98. package/dist/utils/token.mjs +2 -5
  99. package/dist/utils/token.mjs.map +1 -1
  100. package/package.json +1 -1
  101. package/dist/strategy/relay/polymarket/calldata.cjs +0 -28
  102. package/dist/strategy/relay/polymarket/calldata.cjs.map +0 -1
  103. package/dist/strategy/relay/polymarket/calldata.d.cts +0 -14
  104. package/dist/strategy/relay/polymarket/calldata.d.cts.map +0 -1
  105. package/dist/strategy/relay/polymarket/calldata.d.mts +0 -14
  106. package/dist/strategy/relay/polymarket/calldata.d.mts.map +0 -1
  107. package/dist/strategy/relay/polymarket/calldata.mjs +0 -21
  108. package/dist/strategy/relay/polymarket/calldata.mjs.map +0 -1
  109. package/dist/strategy/relay/polymarket/constants.cjs +0 -9
  110. package/dist/strategy/relay/polymarket/constants.cjs.map +0 -1
  111. package/dist/strategy/relay/polymarket/constants.d.cts +0 -6
  112. package/dist/strategy/relay/polymarket/constants.d.cts.map +0 -1
  113. package/dist/strategy/relay/polymarket/constants.d.mts +0 -6
  114. package/dist/strategy/relay/polymarket/constants.d.mts.map +0 -1
  115. package/dist/strategy/relay/polymarket/constants.mjs +0 -6
  116. package/dist/strategy/relay/polymarket/constants.mjs.map +0 -1
  117. package/dist/strategy/relay/polymarket/withdraw.cjs +0 -170
  118. package/dist/strategy/relay/polymarket/withdraw.cjs.map +0 -1
  119. package/dist/strategy/relay/polymarket/withdraw.d.cts +0 -13
  120. package/dist/strategy/relay/polymarket/withdraw.d.cts.map +0 -1
  121. package/dist/strategy/relay/polymarket/withdraw.d.mts +0 -13
  122. package/dist/strategy/relay/polymarket/withdraw.d.mts.map +0 -1
  123. package/dist/strategy/relay/polymarket/withdraw.mjs +0 -164
  124. package/dist/strategy/relay/polymarket/withdraw.mjs.map +0 -1
@@ -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 { 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 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 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
+ {"version":3,"file":"across-submit.cjs","sourceRoot":"","sources":["../../../src/strategy/across/across-submit.ts"],"names":[],"mappings":";;;AAAA,iEAIoC;AACpC,6EAAmE;AAOnE,2CAAqD;AAErD,6CAA6C;AAM7C,iEAAmE;AACnE,6DAKiC;AACjC,qDAA8D;AAG9D,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,iBAAiB,CAAC,CAAC;AACjE,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAOzC;;;;;GAKG;AACI,KAAK,UAAU,kBAAkB,CACtC,OAA+C;IAE/C,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAEjC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IACnD,IAAI,eAAgC,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,CAAC,EAAE,eAAe,EAAE,GAAG,MAAM,kBAAkB,CAC7C,KAAK,EACL,SAAS,EACT,WAAW,CACZ,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,eAAe,EAAE,CAAC;AAC7B,CAAC;AAjBD,gDAiBC;AAED,KAAK,UAAU,kBAAkB,CAC/B,KAAuC,EACvC,SAA4C,EAC5C,WAA4B;IAE5B,GAAG,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;IAErC,IAAA,+BAAiB,EACf;QACE,aAAa,EAAE,WAAW,CAAC,EAAE;QAC7B,SAAS;QACT,IAAI,EAAE,uCAAuC;KAC9C,EACD,CAAC,EAAE,EAAE,EAAE;QACL,EAAE,CAAC,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC;IAChC,CAAC,CACF,CAAC;IAEF,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,eAAe,GAAG,MAAM,kBAAkB,CAC9C,KAAK,EACL,WAAW,CAAC,EAAE,EACd,iBAAiB,EACjB,SAAS,CACV,CAAC;IAEF,IAAA,+BAAiB,EACf;QACE,aAAa,EAAE,WAAW,CAAC,EAAE;QAC7B,SAAS;QACT,IAAI,EAAE,yCAAyC;KAChD,EACD,CAAC,EAAE,EAAE,EAAE;QACL,EAAE,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC7B,CAAC,CACF,CAAC;IAEF,OAAO,EAAE,eAAe,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,kBAAkB,CAC/B,KAAuC,EACvC,mBAA2B,EAC3B,iBAAkC,EAClC,SAA4C;IAE5C,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;IACxC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACtE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAA,wBAAK,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,mBAAmB,GAAG,IAAA,2CAA4B,EAAC;QACvD,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK;QAC3B,QAAQ,EAAE,iBAAiB;KAC5B,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CACpC,gDAAgD,EAChD,OAAO,CACR,CAAC;IAEF,MAAM,aAAa,GACjB,MAAM,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC;QACtC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG;QACxB,CAAC,CAAC,SAAS,CAAC;IAEhB,IAAI,MAAM,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,YAAY,GAChB,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,wBAAK,EAAC,aAAa,CAAC,CAAC;IAEjE,MAAM,YAAY,GAAgC,mBAAmB,CAAC,GAAG,CACvE,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;QAEvE,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;YAC5C,MAAM,YAAY,GAChB,WAAW,CAAC,IAAI,KAAK,UAAU;gBAC7B,CAAC,CAAC,oEAAoE,KAAK,EAAE;gBAC7E,CAAC,CAAC,qDAAqD,CAAC;YAE5D,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;QAED,OAAO;YACL,MAAM,EAAE,sBAAsB,CAAC,IAAI,EAAE;gBACnC,OAAO,EAAE,WAAW,CAAC,OAAO;gBAC5B,IAAI,EAAE,WAAW,CAAC,IAAI;gBACtB,QAAQ;gBACR,YAAY,EAAE,WAAW,CAAC,YAAY;gBACtC,oBAAoB,EAAE,WAAW,CAAC,oBAAoB;gBACtD,EAAE,EAAE,WAAW,CAAC,EAAE;gBAClB,KAAK,EAAE,WAAW,CAAC,KAAK;aACzB,CAAC;YACF,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,iBAAiB;SAC5C,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,cAAc,GAAa,EAAE,CAAC;IAEpC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAA,mCAAqB,EACnC,OAAO,EACP,IAAI,EACJ,SAAS,EACT,CAAC,aAAa,EAAE,EAAE;QAChB,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEnC,IAAA,+BAAiB,EACf;YACE,aAAa,EAAE,mBAAmB;YAClC,SAAS;YACT,IAAI,EAAE,oDAAoD;SAC3D,EACD,CAAC,EAAE,EAAE,EAAE;YACL,EAAE,CAAC,sBAAsB,KAAzB,EAAE,CAAC,sBAAsB,GAAK,EAAE,EAAC;YACjC,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChD,CAAC,CACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,IAAI,MAA+C,CAAC;IACpD,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,mBAAmB;QAChD,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,kBAAkB;QAClC,CAAC,CAAC,SAAS,CAAC;IAEd,IAAI,CAAC;QACH,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAC3B,sCAAsC,EACtC,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,EACtB;gBACE,WAAW;gBACX,eAAe;gBACf,MAAM,EAAE,kCAAe;gBACvB,eAAe,EAAE,KAAK;gBACtB,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI;aAC3B,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,iBAAiB,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAChE,MAAM,EAAE,wBAAwB,CAAC,MAAM,CAAC;gBACxC,IAAI;aACL,CAAC,CAAC,CAAC;YAEJ,MAAM,SAAS,CAAC,IAAI,CAAC,2CAA2C,EAAE;gBAChE,WAAW,EAAE,CAAC,YAAY;gBAC1B,WAAW,EAAE,OAAO,CAAC,YAAY,CAAC;gBAClC,iBAAiB,EAAE,OAAO,CAAC,YAAY,CAAC;gBACxC,IAAI;gBACJ,WAAW;gBACX,YAAY;gBACZ,eAAe;gBACf,MAAM,EAAE,kCAAe;gBACvB,eAAe,EAAE,KAAK;gBACtB,YAAY,EAAE,iBAAiB;aAChC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;YAAS,CAAC;QACT,GAAG,EAAE,CAAC;IACR,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;QACnC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CACf,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,yCAA2B,EAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAC3E,CAAC;IAEF,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM;QAChC,CAAC,CAAC,IAAA,4BAAc,EAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,IAAI;QAC9D,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,MAAM,uBAAuB,CAAC,IAAuB,EAAE,SAAS,CAAC,CAAC;AAC3E,CAAC;AAYD,KAAK,UAAU,uBAAuB,CACpC,eAAgC,EAChC,SAA4C;IAE5C,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,sCAAsB,EAAC,SAAS,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,aAAa,EAAE,eAAe;KAC/B,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,mBAAmB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IAE3E,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,OAAO,IAAI,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC,CAAC;QACb,IAAI,MAA4B,CAAC;QAEjC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAA,kCAAe,EAAC,GAAG,EAAE;gBAC1C,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE;oBACP,MAAM,EAAE,kBAAkB;iBAC3B;aACF,CAAC,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAyB,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,sCAAsC,EAAE;gBAC1C,OAAO;gBACP,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;gBACpB,eAAe;aAChB,CAAC,CAAC;YAEH,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5B,UAAU,CAAC,OAAO,EAAE,2BAA2B,CAAC,CACjD,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;QAEtD,GAAG,CAAC,sBAAsB,EAAE;YAC1B,OAAO;YACP,MAAM,EAAE,gBAAgB;YACxB,eAAe;SAChB,CAAC,CAAC;QAEH,IACE,gBAAgB;YAChB,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAC7D,CAAC;YACD,OAAO,CACL,MAAM,CAAC,iBAAiB;gBACxB,MAAM,CAAC,UAAU;gBACjB,MAAM,CAAC,UAAU;gBACjB,MAAM,CAAC,MAAM;gBACb,eAAe,CAChB,CAAC;QACJ,CAAC;QAED,IACE,gBAAgB;YAChB,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EACpE,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,sCAAsC,gBAAgB,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC5B,UAAU,CAAC,OAAO,EAAE,2BAA2B,CAAC,CACjD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAC3B,eAAiC;IAEjC,QAAQ,eAAe,EAAE,CAAC;QACxB,KAAK,wCAAe,CAAC,YAAY;YAC/B,OAAO,wCAAe,CAAC,kBAAkB,CAAC;QAC5C,KAAK,wCAAe,CAAC,cAAc;YACjC,OAAO,wCAAe,CAAC,oBAAoB,CAAC;QAC9C,KAAK,SAAS;YACZ,OAAO,wCAAe,CAAC,kBAAkB,CAAC;QAC5C;YACE,OAAO,eAAe,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAC7B,IAAS,EACT,MAQC;IAED,MAAM,KAAK,GAAG,IAAA,wBAAK,EAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;IAE3C,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI;QACJ,GAAG,EAAE,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,wBAAK,EAAC,MAAM,CAAC,QAAQ,CAAC;QACvE,YAAY,EAAE,oBAAoB,CAAC,MAAM,CAAC,YAAY,CAAC;QACvD,oBAAoB,EAAE,oBAAoB,CAAC,MAAM,CAAC,oBAAoB,CAAC;QACvE,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,IAAA,wBAAK,EAAC,KAAK,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,wBAAwB,CAC/B,MAAyB;IAEzB,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAuB;QACpC,GAAG,EAAE,MAAM,CAAC,GAAsB;QAClC,YAAY,EAAE,MAAM,CAAC,YAA+B;QACpD,oBAAoB,EAAE,MAAM,CAAC,oBAAuC;QACpE,EAAE,EAAE,MAAM,CAAC,EAAqB;QAChC,KAAK,EAAE,MAAM,CAAC,KAAwB;KACvC,CAAC;AACJ,CAAC","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 +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;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
+ {"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 +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;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
+ {"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"}
@@ -2,11 +2,9 @@ import { ORIGIN_METAMASK, successfulFetch, toHex } from "@metamask/controller-ut
2
2
  import { TransactionType } from "@metamask/transaction-controller";
3
3
  import { createModuleLogger } from "@metamask/utils";
4
4
  import { projectLogger } from "../../logger.mjs";
5
- import { accountSupports7702 } from "../../utils/7702.mjs";
6
5
  import { getPayStrategiesConfig } from "../../utils/feature-flags.mjs";
7
- import { getGasBuffer } from "../../utils/feature-flags.mjs";
8
- import { collectTransactionIds, getTransaction, updateTransaction, isPredictWithdrawTransaction, waitForTransactionConfirmed } from "../../utils/transaction.mjs";
9
- import { getAcrossOrderedTransactions, getOriginalTransactionGas } from "./transactions.mjs";
6
+ import { collectTransactionIds, getTransaction, updateTransaction, waitForTransactionConfirmed } from "../../utils/transaction.mjs";
7
+ import { getAcrossOrderedTransactions } from "./transactions.mjs";
10
8
  const log = createModuleLogger(projectLogger, 'across-strategy');
11
9
  const ACROSS_STATUS_POLL_INTERVAL = 1000;
12
10
  /**
@@ -33,8 +31,8 @@ async function executeSingleQuote(quote, messenger, transaction) {
33
31
  }, (tx) => {
34
32
  tx.txParams.nonce = undefined;
35
33
  });
36
- const acrossDepositType = getAcrossDepositType(transaction);
37
- const transactionHash = await submitTransactions(quote, transaction, acrossDepositType, messenger);
34
+ const acrossDepositType = getAcrossDepositType(transaction.type);
35
+ const transactionHash = await submitTransactions(quote, transaction.id, acrossDepositType, messenger);
38
36
  updateTransaction({
39
37
  transactionId: transaction.id,
40
38
  messenger,
@@ -48,12 +46,12 @@ async function executeSingleQuote(quote, messenger, transaction) {
48
46
  * Submit transactions for an Across quote.
49
47
  *
50
48
  * @param quote - Across quote.
51
- * @param parentTransaction - Parent transaction.
49
+ * @param parentTransactionId - ID of the parent transaction.
52
50
  * @param acrossDepositType - Transaction type used for the swap/deposit step.
53
51
  * @param messenger - Controller messenger.
54
52
  * @returns Hash of the last submitted transaction, if available.
55
53
  */
56
- async function submitTransactions(quote, parentTransaction, acrossDepositType, messenger) {
54
+ async function submitTransactions(quote, parentTransactionId, acrossDepositType, messenger) {
57
55
  const { swapTx } = quote.original.quote;
58
56
  const { gasLimits: quoteGasLimits, is7702 } = quote.original.metamask;
59
57
  const { from } = quote.request;
@@ -62,56 +60,19 @@ async function submitTransactions(quote, parentTransaction, acrossDepositType, m
62
60
  quote: quote.original.quote,
63
61
  swapType: acrossDepositType,
64
62
  });
65
- const shouldPrependOriginalTransaction = quote.request.isPostQuote === true &&
66
- parentTransaction.txParams.to !== undefined;
67
- const hasPrependedOriginalGasLimit = shouldPrependOriginalTransaction &&
68
- !is7702 &&
69
- quoteGasLimits.length > orderedTransactions.length;
70
- const gasLimitOffset = hasPrependedOriginalGasLimit ? 1 : 0;
71
- const transactionCount = orderedTransactions.length + (shouldPrependOriginalTransaction ? 1 : 0);
72
63
  const networkClientId = messenger.call('NetworkController:findNetworkClientIdByChainId', chainId);
73
- const is7702Batch = is7702 && transactionCount > 1;
74
- const canUseQuotedBatchGasLimit = is7702Batch &&
75
- (!shouldPrependOriginalTransaction ||
76
- hasOriginalTransactionGas(parentTransaction));
77
- const batchGasLimit = canUseQuotedBatchGasLimit
64
+ const batchGasLimit = is7702 && orderedTransactions.length > 1
78
65
  ? quoteGasLimits[0]?.max
79
66
  : undefined;
80
- if (canUseQuotedBatchGasLimit && batchGasLimit === undefined) {
67
+ if (is7702 && orderedTransactions.length > 1 && batchGasLimit === undefined) {
81
68
  throw new Error('Missing quote gas limit for Across 7702 batch');
82
69
  }
83
- const quotedGasLimit7702 = batchGasLimit === undefined ? undefined : toHex(batchGasLimit);
84
- const parentHasAuthorizationList = Boolean(parentTransaction.txParams.authorizationList?.length);
85
- const shouldUseGasFeeToken7702Submit = shouldEstimate7702SubmitBatch(parentTransaction, quote)
86
- ? accountSupports7702(messenger, from)
87
- : false;
88
- const shouldUse7702Submit = [
89
- Boolean(quotedGasLimit7702),
90
- is7702Batch,
91
- parentHasAuthorizationList,
92
- shouldUseGasFeeToken7702Submit,
93
- ].some(Boolean);
94
- const shouldEstimateGasLimit7702 = !quotedGasLimit7702 && shouldUse7702Submit;
95
- const estimatedGasLimit7702 = shouldEstimateGasLimit7702
96
- ? await estimateSubmitBatchGasLimit7702({
97
- chainId,
98
- from,
99
- messenger,
100
- orderedTransactions,
101
- parentTransaction,
102
- shouldPrependOriginalTransaction,
103
- })
104
- : undefined;
105
- const gasLimit7702 = quotedGasLimit7702 ?? estimatedGasLimit7702;
106
- const submitAs7702 = shouldUse7702Submit || Boolean(gasLimit7702);
107
- const acrossTransactions = orderedTransactions.map((transaction, index) => {
108
- const gasLimit = submitAs7702
109
- ? undefined
110
- : quoteGasLimits[index + gasLimitOffset]?.max;
111
- if (gasLimit === undefined && !submitAs7702) {
112
- const quoteGasIndex = index + gasLimitOffset;
70
+ const gasLimit7702 = batchGasLimit === undefined ? undefined : toHex(batchGasLimit);
71
+ const transactions = orderedTransactions.map((transaction, index) => {
72
+ const gasLimit = gasLimit7702 ? undefined : quoteGasLimits[index]?.max;
73
+ if (gasLimit === undefined && !gasLimit7702) {
113
74
  const errorMessage = transaction.kind === 'approval'
114
- ? `Missing quote gas limit for Across approval transaction at index ${quoteGasIndex}`
75
+ ? `Missing quote gas limit for Across approval transaction at index ${index}`
115
76
  : 'Missing quote gas limit for Across swap transaction';
116
77
  throw new Error(errorMessage);
117
78
  }
@@ -128,19 +89,11 @@ async function submitTransactions(quote, parentTransaction, acrossDepositType, m
128
89
  type: transaction.type ?? acrossDepositType,
129
90
  };
130
91
  });
131
- const originalTransaction = shouldPrependOriginalTransaction
132
- ? [
133
- buildOriginalTransaction(parentTransaction, submitAs7702 || !hasPrependedOriginalGasLimit
134
- ? undefined
135
- : quoteGasLimits[0]?.max),
136
- ]
137
- : [];
138
- const transactions = [...originalTransaction, ...acrossTransactions];
139
92
  const transactionIds = [];
140
93
  const { end } = collectTransactionIds(chainId, from, messenger, (transactionId) => {
141
94
  transactionIds.push(transactionId);
142
95
  updateTransaction({
143
- transactionId: parentTransaction.id,
96
+ transactionId: parentTransactionId,
144
97
  messenger,
145
98
  note: 'Add required transaction ID from Across submission',
146
99
  }, (tx) => {
@@ -152,11 +105,9 @@ async function submitTransactions(quote, parentTransaction, acrossDepositType, m
152
105
  const gasFeeToken = quote.fees.isSourceGasFeeToken
153
106
  ? quote.request.sourceTokenAddress
154
107
  : undefined;
155
- const excludeNativeTokenForFee = gasFeeToken ? true : undefined;
156
108
  try {
157
109
  if (transactions.length === 1) {
158
110
  result = await messenger.call('TransactionController:addTransaction', transactions[0].params, {
159
- excludeNativeTokenForFee,
160
111
  gasFeeToken,
161
112
  networkClientId,
162
113
  origin: ORIGIN_METAMASK,
@@ -170,10 +121,9 @@ async function submitTransactions(quote, parentTransaction, acrossDepositType, m
170
121
  type,
171
122
  }));
172
123
  await messenger.call('TransactionController:addTransactionBatch', {
173
- disable7702: !submitAs7702,
174
- disableHook: submitAs7702,
175
- disableSequential: submitAs7702,
176
- excludeNativeTokenForFee,
124
+ disable7702: !gasLimit7702,
125
+ disableHook: Boolean(gasLimit7702),
126
+ disableSequential: Boolean(gasLimit7702),
177
127
  from,
178
128
  gasFeeToken,
179
129
  gasLimit7702,
@@ -197,13 +147,6 @@ async function submitTransactions(quote, parentTransaction, acrossDepositType, m
197
147
  : undefined;
198
148
  return await waitForAcrossCompletion(hash, messenger);
199
149
  }
200
- /**
201
- * Poll Across until a submitted deposit reaches a terminal status.
202
- *
203
- * @param transactionHash - Source-chain deposit transaction hash.
204
- * @param messenger - Controller messenger.
205
- * @returns Destination/fill transaction hash when available, otherwise the source hash.
206
- */
207
150
  async function waitForAcrossCompletion(transactionHash, messenger) {
208
151
  if (!transactionHash) {
209
152
  return transactionHash;
@@ -256,124 +199,8 @@ async function waitForAcrossCompletion(transactionHash, messenger) {
256
199
  await new Promise((resolve) => setTimeout(resolve, ACROSS_STATUS_POLL_INTERVAL));
257
200
  }
258
201
  }
259
- /**
260
- * Check whether submit should estimate a 7702 batch gas limit.
261
- *
262
- * This is needed for Predict withdraw post-quote flows that pay source-chain
263
- * gas with the source token, because the final submit batch can differ from the
264
- * batch shape that Across quoted.
265
- *
266
- * @param parentTransaction - Original transaction metadata.
267
- * @param quote - Across quote selected for execution.
268
- * @returns Whether submit should try to estimate the final 7702 batch gas.
269
- */
270
- function shouldEstimate7702SubmitBatch(parentTransaction, quote) {
271
- return (isPredictWithdrawTransaction(parentTransaction) &&
272
- quote.request.isPostQuote === true &&
273
- quote.fees.isSourceGasFeeToken === true);
274
- }
275
- /**
276
- * Estimate the 7702 batch gas limit for the actual submit payload.
277
- *
278
- * Quotes can contain a combined 7702 gas limit that only covered the Across
279
- * approval/swap legs. When submit prepends the original transaction, estimate
280
- * the final batch shape so the gas limit covers every submitted leg.
281
- *
282
- * @param args - Estimation arguments.
283
- * @param args.chainId - Source chain ID.
284
- * @param args.from - Sender address.
285
- * @param args.messenger - Controller messenger.
286
- * @param args.orderedTransactions - Across approval/swap legs in submission order.
287
- * @param args.parentTransaction - Original transaction that may be prepended.
288
- * @param args.shouldPrependOriginalTransaction - Whether to include the original transaction in the estimate.
289
- * @returns Hex gas limit, or `undefined` when estimation is unavailable.
290
- */
291
- async function estimateSubmitBatchGasLimit7702({ chainId, from, messenger, orderedTransactions, parentTransaction, shouldPrependOriginalTransaction, }) {
292
- if (!accountSupports7702(messenger, from)) {
293
- return undefined;
294
- }
295
- const originalTransaction = shouldPrependOriginalTransaction
296
- ? [buildOriginalTransaction(parentTransaction)]
297
- : [];
298
- const acrossTransactions = orderedTransactions.map((transaction) => ({
299
- params: buildTransactionParams(from, {
300
- chainId: transaction.chainId,
301
- data: transaction.data,
302
- maxFeePerGas: transaction.maxFeePerGas,
303
- maxPriorityFeePerGas: transaction.maxPriorityFeePerGas,
304
- to: transaction.to,
305
- value: transaction.value,
306
- }),
307
- type: transaction.type,
308
- }));
309
- const transactions = [...originalTransaction, ...acrossTransactions];
310
- try {
311
- const result = await messenger.call('TransactionController:estimateGasBatch', {
312
- chainId,
313
- from,
314
- transactions: transactions.map(({ params }) => toBatchTransactionParams(params)),
315
- });
316
- if (result.gasLimits.length !== 1) {
317
- return undefined;
318
- }
319
- const gasLimit = Math.ceil(result.gasLimits[0] * getGasBuffer(messenger, chainId));
320
- return toHex(gasLimit);
321
- }
322
- catch {
323
- return undefined;
324
- }
325
- }
326
- /**
327
- * Build the original parent transaction as a prepared batch leg.
328
- *
329
- * @param transaction - Original transaction metadata.
330
- * @param gasLimit - Optional gas limit to pin on the original leg.
331
- * @returns Prepared transaction params and transaction type for the original leg.
332
- */
333
- function buildOriginalTransaction(transaction, gasLimit) {
334
- return {
335
- params: {
336
- data: transaction.txParams.data,
337
- from: transaction.txParams.from,
338
- gas: gasLimit === undefined ? undefined : toHex(gasLimit),
339
- to: transaction.txParams.to,
340
- value: transaction.txParams.value,
341
- },
342
- type: getOriginalTransactionType(transaction),
343
- };
344
- }
345
- /**
346
- * Get the transaction type to use for the original batch leg.
347
- *
348
- * @param transaction - Original transaction metadata.
349
- * @returns `predictWithdraw` for Predict withdrawals; otherwise the original type.
350
- */
351
- function getOriginalTransactionType(transaction) {
352
- if (isPredictWithdrawTransaction(transaction)) {
353
- return TransactionType.predictWithdraw;
354
- }
355
- return transaction.type;
356
- }
357
- /**
358
- * Check whether the original transaction already has a usable gas limit.
359
- *
360
- * @param transaction - Original transaction metadata.
361
- * @returns Whether the original or nested transaction gas is a positive integer.
362
- */
363
- function hasOriginalTransactionGas(transaction) {
364
- return getOriginalTransactionGas(transaction) !== undefined;
365
- }
366
- /**
367
- * Get the transaction type for the Across bridge/deposit leg.
368
- *
369
- * @param transaction - Original parent transaction.
370
- * @returns Across-specific transaction type for known flows, or the original type.
371
- */
372
- function getAcrossDepositType(transaction) {
373
- if (isPredictWithdrawTransaction(transaction)) {
374
- return TransactionType.predictAcrossWithdraw;
375
- }
376
- switch (transaction.type) {
202
+ function getAcrossDepositType(transactionType) {
203
+ switch (transactionType) {
377
204
  case TransactionType.perpsDeposit:
378
205
  return TransactionType.perpsAcrossDeposit;
379
206
  case TransactionType.predictDeposit:
@@ -381,23 +208,9 @@ function getAcrossDepositType(transaction) {
381
208
  case undefined:
382
209
  return TransactionType.perpsAcrossDeposit;
383
210
  default:
384
- return transaction.type;
211
+ return transactionType;
385
212
  }
386
213
  }
387
- /**
388
- * Build TransactionController params for an Across approval or swap leg.
389
- *
390
- * @param from - Sender address.
391
- * @param params - Across transaction fields.
392
- * @param params.chainId - Source chain ID.
393
- * @param params.data - Transaction calldata.
394
- * @param params.gasLimit - Optional gas limit.
395
- * @param params.to - Recipient contract address.
396
- * @param params.value - Optional native value.
397
- * @param params.maxFeePerGas - Optional EIP-1559 max fee.
398
- * @param params.maxPriorityFeePerGas - Optional EIP-1559 priority fee.
399
- * @returns TransactionController params.
400
- */
401
214
  function buildTransactionParams(from, params) {
402
215
  const value = toHex(params.value ?? '0x0');
403
216
  return {
@@ -410,24 +223,12 @@ function buildTransactionParams(from, params) {
410
223
  value,
411
224
  };
412
225
  }
413
- /**
414
- * Normalize an optional numeric string or hex string into a hex value.
415
- *
416
- * @param value - Optional value to normalize.
417
- * @returns Hex value, or `undefined` when no value is provided.
418
- */
419
226
  function normalizeOptionalHex(value) {
420
227
  if (value === undefined) {
421
228
  return undefined;
422
229
  }
423
230
  return toHex(value);
424
231
  }
425
- /**
426
- * Convert full TransactionController params into batch transaction params.
427
- *
428
- * @param params - Transaction params.
429
- * @returns Batch-compatible transaction params.
430
- */
431
232
  function toBatchTransactionParams(params) {
432
233
  return {
433
234
  data: params.data,
@@ -1 +1 @@
1
- {"version":3,"file":"across-submit.mjs","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 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 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
+ {"version":3,"file":"across-submit.mjs","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,8 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getOriginalTransactionGas = exports.getAcrossOrderedTransactions = void 0;
3
+ exports.getAcrossOrderedTransactions = void 0;
4
4
  const transaction_controller_1 = require("@metamask/transaction-controller");
5
- const bignumber_js_1 = require("bignumber.js");
6
5
  function getAcrossOrderedTransactions({ quote, swapType, }) {
7
6
  const swapChainId = quote.swapTx.chainId;
8
7
  const approvalTransactions = (quote.approvalTxns ?? []).map((approval) => ({
@@ -21,23 +20,4 @@ function getAcrossOrderedTransactions({ quote, swapType, }) {
21
20
  ];
22
21
  }
23
22
  exports.getAcrossOrderedTransactions = getAcrossOrderedTransactions;
24
- /**
25
- * Get a usable gas limit from the original or nested transaction.
26
- *
27
- * @param transaction - Original transaction metadata.
28
- * @returns Positive integer gas limit if present, otherwise undefined.
29
- */
30
- function getOriginalTransactionGas(transaction) {
31
- const nestedGas = transaction.nestedTransactions?.find((tx) => tx.gas)?.gas;
32
- const rawGas = nestedGas ?? transaction.txParams.gas;
33
- if (rawGas === undefined) {
34
- return undefined;
35
- }
36
- const gas = new bignumber_js_1.BigNumber(rawGas);
37
- if (!gas.isFinite() || gas.isNaN() || !gas.isInteger() || gas.lte(0)) {
38
- return undefined;
39
- }
40
- return gas.toNumber();
41
- }
42
- exports.getOriginalTransactionGas = getOriginalTransactionGas;
43
23
  //# sourceMappingURL=transactions.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"transactions.cjs","sourceRoot":"","sources":["../../../src/strategy/across/transactions.ts"],"names":[],"mappings":";;;AAAA,6EAAmE;AAEnE,+CAAyC;AAgBzC,SAAgB,4BAA4B,CAAC,EAC3C,KAAK,EACL,QAAQ,GAIT;IACC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;IACzC,MAAM,oBAAoB,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzE,GAAG,QAAQ;QACX,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,WAAW;QACxC,IAAI,EAAE,UAAmB;QACzB,IAAI,EAAE,wCAAe,CAAC,kBAAkB;KACzC,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,GAAG,oBAAoB;QACvB;YACE,GAAG,KAAK,CAAC,MAAM;YACf,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;SACf;KACF,CAAC;AACJ,CAAC;AAvBD,oEAuBC;AAED;;;;;GAKG;AACH,SAAgB,yBAAyB,CACvC,WAA4B;IAE5B,MAAM,SAAS,GAAG,WAAW,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAC5E,MAAM,MAAM,GAAG,SAAS,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC;IAErD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,wBAAS,CAAC,MAAM,CAAC,CAAC;IAElC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAjBD,8DAiBC","sourcesContent":["import { TransactionType } from '@metamask/transaction-controller';\nimport type { TransactionMeta } from '@metamask/transaction-controller';\nimport { BigNumber } from 'bignumber.js';\n\nimport type { AcrossSwapApprovalResponse } from './types';\n\nexport type AcrossOrderedTransaction = {\n chainId: number;\n data: `0x${string}`;\n gas?: string;\n kind: 'approval' | 'swap';\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n to: `0x${string}`;\n type?: TransactionType;\n value?: `0x${string}`;\n};\n\nexport function getAcrossOrderedTransactions({\n quote,\n swapType,\n}: {\n quote: AcrossSwapApprovalResponse;\n swapType?: TransactionType;\n}): AcrossOrderedTransaction[] {\n const swapChainId = quote.swapTx.chainId;\n const approvalTransactions = (quote.approvalTxns ?? []).map((approval) => ({\n ...approval,\n chainId: approval.chainId ?? swapChainId,\n kind: 'approval' as const,\n type: TransactionType.tokenMethodApprove,\n }));\n\n return [\n ...approvalTransactions,\n {\n ...quote.swapTx,\n kind: 'swap',\n type: swapType,\n },\n ];\n}\n\n/**\n * Get a usable gas limit from the original or nested transaction.\n *\n * @param transaction - Original transaction metadata.\n * @returns Positive integer gas limit if present, otherwise undefined.\n */\nexport function getOriginalTransactionGas(\n transaction: TransactionMeta,\n): number | undefined {\n const nestedGas = transaction.nestedTransactions?.find((tx) => tx.gas)?.gas;\n const rawGas = nestedGas ?? transaction.txParams.gas;\n\n if (rawGas === undefined) {\n return undefined;\n }\n\n const gas = new BigNumber(rawGas);\n\n if (!gas.isFinite() || gas.isNaN() || !gas.isInteger() || gas.lte(0)) {\n return undefined;\n }\n\n return gas.toNumber();\n}\n"]}
1
+ {"version":3,"file":"transactions.cjs","sourceRoot":"","sources":["../../../src/strategy/across/transactions.ts"],"names":[],"mappings":";;;AAAA,6EAAmE;AAgBnE,SAAgB,4BAA4B,CAAC,EAC3C,KAAK,EACL,QAAQ,GAIT;IACC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;IACzC,MAAM,oBAAoB,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzE,GAAG,QAAQ;QACX,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,WAAW;QACxC,IAAI,EAAE,UAAmB;QACzB,IAAI,EAAE,wCAAe,CAAC,kBAAkB;KACzC,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,GAAG,oBAAoB;QACvB;YACE,GAAG,KAAK,CAAC,MAAM;YACf,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;SACf;KACF,CAAC;AACJ,CAAC;AAvBD,oEAuBC","sourcesContent":["import { TransactionType } from '@metamask/transaction-controller';\n\nimport type { AcrossSwapApprovalResponse } from './types';\n\nexport type AcrossOrderedTransaction = {\n chainId: number;\n data: `0x${string}`;\n gas?: string;\n kind: 'approval' | 'swap';\n maxFeePerGas?: string;\n maxPriorityFeePerGas?: string;\n to: `0x${string}`;\n type?: TransactionType;\n value?: `0x${string}`;\n};\n\nexport function getAcrossOrderedTransactions({\n quote,\n swapType,\n}: {\n quote: AcrossSwapApprovalResponse;\n swapType?: TransactionType;\n}): AcrossOrderedTransaction[] {\n const swapChainId = quote.swapTx.chainId;\n const approvalTransactions = (quote.approvalTxns ?? []).map((approval) => ({\n ...approval,\n chainId: approval.chainId ?? swapChainId,\n kind: 'approval' as const,\n type: TransactionType.tokenMethodApprove,\n }));\n\n return [\n ...approvalTransactions,\n {\n ...quote.swapTx,\n kind: 'swap',\n type: swapType,\n },\n ];\n}\n"]}