@metamask-previews/transaction-pay-controller 31.2.1-preview-1ae799a5c → 31.2.1-preview-e80304db4

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 (100) hide show
  1. package/CHANGELOG.md +1 -20
  2. package/dist/TransactionPayController.d.ts.map +1 -1
  3. package/dist/TransactionPayController.js +5 -4
  4. package/dist/TransactionPayController.js.map +1 -1
  5. package/dist/actions/update-payment-token.d.ts.map +1 -1
  6. package/dist/actions/update-payment-token.js +22 -51
  7. package/dist/actions/update-payment-token.js.map +1 -1
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/strategy/across/AcrossStrategy.d.ts.map +1 -1
  12. package/dist/strategy/across/AcrossStrategy.js +1 -6
  13. package/dist/strategy/across/AcrossStrategy.js.map +1 -1
  14. package/dist/strategy/across/across-quotes.js +4 -7
  15. package/dist/strategy/across/across-quotes.js.map +1 -1
  16. package/dist/strategy/across/across-submit.d.ts.map +1 -1
  17. package/dist/strategy/across/across-submit.js +1 -3
  18. package/dist/strategy/across/across-submit.js.map +1 -1
  19. package/dist/strategy/fiat/FiatStrategy.d.ts +0 -1
  20. package/dist/strategy/fiat/FiatStrategy.d.ts.map +1 -1
  21. package/dist/strategy/fiat/FiatStrategy.js +0 -4
  22. package/dist/strategy/fiat/FiatStrategy.js.map +1 -1
  23. package/dist/strategy/fiat/fiat-direct-musd.d.ts.map +1 -1
  24. package/dist/strategy/fiat/fiat-direct-musd.js +2 -4
  25. package/dist/strategy/fiat/fiat-direct-musd.js.map +1 -1
  26. package/dist/strategy/fiat/fiat-quotes.d.ts.map +1 -1
  27. package/dist/strategy/fiat/fiat-quotes.js +2 -4
  28. package/dist/strategy/fiat/fiat-quotes.js.map +1 -1
  29. package/dist/strategy/fiat/fiat-submit.d.ts.map +1 -1
  30. package/dist/strategy/fiat/fiat-submit.js +2 -5
  31. package/dist/strategy/fiat/fiat-submit.js.map +1 -1
  32. package/dist/strategy/fiat/fiat-test-funding.d.ts.map +1 -1
  33. package/dist/strategy/fiat/fiat-test-funding.js +5 -3
  34. package/dist/strategy/fiat/fiat-test-funding.js.map +1 -1
  35. package/dist/strategy/relay/RelayStrategy.d.ts +0 -4
  36. package/dist/strategy/relay/RelayStrategy.d.ts.map +1 -1
  37. package/dist/strategy/relay/RelayStrategy.js +1 -6
  38. package/dist/strategy/relay/RelayStrategy.js.map +1 -1
  39. package/dist/strategy/relay/relay-quotes.d.ts.map +1 -1
  40. package/dist/strategy/relay/relay-quotes.js +6 -10
  41. package/dist/strategy/relay/relay-quotes.js.map +1 -1
  42. package/dist/strategy/relay/relay-submit-execute.d.ts.map +1 -1
  43. package/dist/strategy/relay/relay-submit-execute.js +1 -3
  44. package/dist/strategy/relay/relay-submit-execute.js.map +1 -1
  45. package/dist/strategy/relay/relay-submit.d.ts.map +1 -1
  46. package/dist/strategy/relay/relay-submit.js +6 -8
  47. package/dist/strategy/relay/relay-submit.js.map +1 -1
  48. package/dist/strategy/relay/relay-validation.d.ts.map +1 -1
  49. package/dist/strategy/relay/relay-validation.js +2 -5
  50. package/dist/strategy/relay/relay-validation.js.map +1 -1
  51. package/dist/strategy/server/ServerStrategy.d.ts.map +1 -1
  52. package/dist/strategy/server/ServerStrategy.js +0 -4
  53. package/dist/strategy/server/ServerStrategy.js.map +1 -1
  54. package/dist/strategy/server/server-quotes.js +4 -7
  55. package/dist/strategy/server/server-quotes.js.map +1 -1
  56. package/dist/strategy/server/server-submit.d.ts.map +1 -1
  57. package/dist/strategy/server/server-submit.js +6 -9
  58. package/dist/strategy/server/server-submit.js.map +1 -1
  59. package/dist/strategy/server/server-validation.d.ts.map +1 -1
  60. package/dist/strategy/server/server-validation.js +1 -3
  61. package/dist/strategy/server/server-validation.js.map +1 -1
  62. package/dist/types.d.ts +25 -60
  63. package/dist/types.d.ts.map +1 -1
  64. package/dist/types.js.map +1 -1
  65. package/dist/utils/account.d.ts +0 -54
  66. package/dist/utils/account.d.ts.map +1 -1
  67. package/dist/utils/account.js +0 -124
  68. package/dist/utils/account.js.map +1 -1
  69. package/dist/utils/gas-payment.d.ts +3 -12
  70. package/dist/utils/gas-payment.d.ts.map +1 -1
  71. package/dist/utils/gas-payment.js +2 -2
  72. package/dist/utils/gas-payment.js.map +1 -1
  73. package/dist/utils/max-gas-station.d.ts.map +1 -1
  74. package/dist/utils/max-gas-station.js +5 -9
  75. package/dist/utils/max-gas-station.js.map +1 -1
  76. package/dist/utils/max-quote.js +2 -3
  77. package/dist/utils/max-quote.js.map +1 -1
  78. package/dist/utils/no-op-quote.d.ts +3 -3
  79. package/dist/utils/no-op-quote.d.ts.map +1 -1
  80. package/dist/utils/no-op-quote.js +3 -4
  81. package/dist/utils/no-op-quote.js.map +1 -1
  82. package/dist/utils/perps.d.ts.map +1 -1
  83. package/dist/utils/perps.js +2 -5
  84. package/dist/utils/perps.js.map +1 -1
  85. package/dist/utils/post-quote.js +3 -4
  86. package/dist/utils/post-quote.js.map +1 -1
  87. package/dist/utils/quotes.d.ts.map +1 -1
  88. package/dist/utils/quotes.js +25 -99
  89. package/dist/utils/quotes.js.map +1 -1
  90. package/dist/utils/source-amounts.d.ts.map +1 -1
  91. package/dist/utils/source-amounts.js +4 -25
  92. package/dist/utils/source-amounts.js.map +1 -1
  93. package/dist/utils/token.d.ts +1 -84
  94. package/dist/utils/token.d.ts.map +1 -1
  95. package/dist/utils/token.js +13 -144
  96. package/dist/utils/token.js.map +1 -1
  97. package/dist/utils/validation.d.ts.map +1 -1
  98. package/dist/utils/validation.js +11 -14
  99. package/dist/utils/validation.js.map +1 -1
  100. package/package.json +1 -2
@@ -1 +1 @@
1
- {"version":3,"file":"relay-quotes.js","sourceRoot":"","sources":["../../../src/strategy/relay/relay-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable require-atomic-updates */\n\nimport { Interface } from '@ethersproject/abi';\nimport { toHex } from '@metamask/controller-utils';\nimport type {\n AuthorizationList,\n TransactionMeta,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport {\n ARBITRUM_USDC_ADDRESS,\n CHAIN_ID_ARBITRUM,\n CHAIN_ID_HYPERCORE,\n CHAIN_ID_POLYGON,\n HYPERCORE_USDC_ADDRESS,\n NATIVE_TOKEN_ADDRESS,\n} from '../../constants.js';\nimport { TransactionPayStrategy } from '../../index.js';\nimport { projectLogger } from '../../logger.js';\nimport type {\n Amount,\n FiatRates,\n PayStrategyGetQuotesRequest,\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types.js';\nimport { getFiatValueFromUsd } from '../../utils/amounts.js';\nimport {\n getRelayOriginGasOverhead,\n getSlippage,\n getStablecoins,\n isEIP7702Chain,\n isRelayExecuteEnabled,\n} from '../../utils/feature-flags.js';\nimport {\n GasPaymentMode,\n resolveGasPayment,\n resolveGasStationCost,\n} from '../../utils/gas-payment.js';\nimport { calculateGasCost } from '../../utils/gas.js';\nimport {\n getMaxQuotes,\n isAtomicMaxQuote,\n isAtomicMaxSupported,\n} from '../../utils/max-quote.js';\nimport type { MaxQuoteDetails } from '../../utils/max-quote.js';\nimport {\n normalizePerpsDepositRequest,\n normalizePerpsWithdrawRequest,\n} from '../../utils/perps.js';\nimport {\n getPolymarketDepositWalletOverrides,\n getPredictWithdrawFeeTokenAccount,\n getPredictWithdrawSafeAddress,\n} from '../../utils/polymarket/withdraw.js';\nimport { processPostQuotePaymentOverride } from '../../utils/post-quote-payment-override.js';\nimport { reservePostQuoteGas } from '../../utils/post-quote.js';\nimport { estimateSourceGas } from '../../utils/quote-gas.js';\nimport type { QuoteGasTransaction } from '../../utils/quote-gas.js';\nimport { resolveQuoteRecipient } from '../../utils/quote-recipient.js';\nimport {\n buildCaipAssetType,\n getEvmQuoteSource,\n getNativeToken,\n getTokenFiatRate,\n normalizeTokenAddress,\n TokenAddressTarget,\n} from '../../utils/token.js';\nimport { getQuotePricing } from '../../utils/trade-type.js';\nimport { TOKEN_TRANSFER_FOUR_BYTE } from './constants.js';\nimport { hasRelayDepositStep } from './deposit-step.js';\nimport { applyHyperliquidActivationFee } from './hyperliquid-activation.js';\nimport { fetchRelayQuote } from './relay-api.js';\nimport { isSubsidizedRelayQuote } from './relay-submit-execute.js';\nimport { validateRelayQuotes } from './relay-validation.js';\nimport type {\n RelayQuote,\n RelayQuoteMetamask,\n RelayQuoteRequest,\n RelayTransactionStep,\n} from './types.js';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\n\nconst ZERO_AMOUNT = { fiat: '0', human: '0', raw: '0', usd: '0' };\n\ntype RelayQuoteRequestDraft = Omit<RelayQuoteRequest, 'amount' | 'tradeType'> &\n Partial<Pick<RelayQuoteRequest, 'amount'>>;\n\n/**\n * Fetches Relay quotes.\n *\n * @param request - Request object.\n * @returns Array of quotes.\n */\nexport async function getRelayQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>[]> {\n const { requests } = request;\n\n log('Fetching quotes', requests);\n\n try {\n const normalizedRequests = await Promise.all(\n requests\n .filter((singleRequest) => {\n const hasTargetMinimum = singleRequest.targetAmountMinimum !== '0';\n const isPostQuote = Boolean(singleRequest.isPostQuote);\n const isExactInputRequest =\n Boolean(singleRequest.isMaxAmount) &&\n new BigNumber(singleRequest.sourceTokenAmount).gt(0);\n\n return hasTargetMinimum || isPostQuote || isExactInputRequest;\n })\n .map((singleRequest) =>\n normalizeRequest(singleRequest, request.transaction),\n )\n .map((normalizedRequest) =>\n applyHyperliquidActivationFee(\n normalizedRequest,\n request.messenger,\n request.transaction,\n request.signal,\n ),\n ),\n );\n\n log('Normalized requests', normalizedRequests);\n\n const quotes = await Promise.all(\n normalizedRequests.map((singleRequest) =>\n getQuoteWithMaxAmountHandling(singleRequest, request),\n ),\n );\n\n // Atomic max quotes are validated as part of the max flow.\n const quotesToValidate = quotes.filter((quote) => !isAtomicMaxQuote(quote));\n\n if (quotesToValidate.length > 0) {\n await validateRelayQuotes({\n messenger: request.messenger,\n quotes: quotesToValidate,\n signal: request.signal,\n transaction: request.transaction,\n });\n }\n\n return quotes;\n } catch (error) {\n log('Error fetching quotes', { error });\n throw error;\n }\n}\n\nasync function getQuoteWithMaxAmountHandling(\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>> {\n const { isMaxAmount } = request;\n\n if (!isMaxAmount) {\n return getQuoteWithPostQuoteGasHandling(request, fullRequest);\n }\n\n const [maxQuote] = await getMaxQuotes({\n fullRequest,\n getQuoteDetails: getRelayMaxQuoteDetails,\n getQuotes: async (maxRequest, transaction) => [\n await getSingleQuote(maxRequest, { ...fullRequest, transaction }),\n ],\n request,\n requote: (_quote, maxRequest, transaction) =>\n getSingleQuote(maxRequest, { ...fullRequest, transaction }),\n validateAtomicQuote: (quote) =>\n validateRelayQuotes({\n messenger: fullRequest.messenger,\n quotes: [quote],\n signal: fullRequest.signal,\n transaction: fullRequest.transaction,\n }),\n });\n\n return maxQuote;\n}\n\n/**\n * For post-quote flows, fetch an initial quote to compute gas cost in source\n * token, then re-quote with the source amount reduced by the gas cost.\n * This ensures Relay reserves enough for the gas fee token payment.\n *\n * For non-post-quote flows, just returns a single quote.\n *\n * @param request - Quote request.\n * @param fullRequest - Full request context.\n * @returns The final quote (phase 2 for post-quote, or phase 1 for normal).\n */\nasync function getQuoteWithPostQuoteGasHandling(\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>> {\n const phase1Quote = await getSingleQuote(request, fullRequest);\n\n if (!request.isPostQuote) {\n return phase1Quote;\n }\n\n if (phase1Quote.original.metamask?.isExecute) {\n return phase1Quote;\n }\n\n return await reservePostQuoteGas({\n quote: phase1Quote,\n requote: (adjustedRequest) => getSingleQuote(adjustedRequest, fullRequest),\n });\n}\n\n/**\n * Fetches a single Relay quote.\n *\n * @param request - Quote request.\n * @param fullRequest - Full quotes request.\n * @returns Single quote.\n */\nasync function getSingleQuote(\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>> {\n const {\n accountSupports7702: supports7702,\n messenger,\n signal,\n transaction,\n } = fullRequest;\n\n const {\n from,\n sourceTokenAmount,\n targetAmountMinimum,\n targetChainId,\n targetTokenAddress,\n } = request;\n const { chainId: sourceChainId, tokenAddress: sourceTokenAddress } =\n getEvmQuoteSource(request);\n\n const slippageDecimal = getSlippage(\n messenger,\n sourceChainId,\n sourceTokenAddress,\n );\n\n const slippageTolerance = new BigNumber(slippageDecimal * 100 * 100).toFixed(\n 0,\n );\n\n try {\n const useExecute =\n supports7702 &&\n isRelayExecuteEnabled(messenger) &&\n isEIP7702Chain(messenger, sourceChainId);\n\n const recipient = await resolveQuoteRecipient({\n messenger,\n request,\n transaction,\n });\n const body: RelayQuoteRequestDraft = {\n destinationChainId: Number(targetChainId),\n destinationCurrency: targetTokenAddress,\n originChainId: Number(sourceChainId),\n originCurrency: sourceTokenAddress,\n ...(useExecute\n ? {\n originGasOverhead: getRelayOriginGasOverhead(messenger),\n metamask: { executeVersion: 2 },\n }\n : {}),\n recipient,\n slippageTolerance,\n user: from,\n };\n\n if (request.isPolymarketDepositWallet) {\n const overrides = await getPolymarketDepositWalletOverrides(\n from,\n messenger,\n );\n const { depositWallet } = overrides;\n\n body.originCurrency = overrides.sourceTokenAddress;\n body.user = depositWallet;\n body.refundTo = depositWallet;\n body.useDepositAddress = true;\n body.strict = true;\n }\n\n const processedTransactions = await processTransactions(\n transaction,\n request,\n body,\n messenger,\n );\n\n if (!processedTransactions) {\n const override = await processPostQuotePaymentOverride({\n messenger,\n request,\n transaction,\n });\n\n if (override) {\n body.amount = override.amount;\n body.authorizationList = normalizeAuthorizationList(\n override.authorizationList,\n );\n body.txs = [\n {\n data: buildTokenTransferData(override.recipient, override.amount),\n to: targetTokenAddress,\n value: '0x0',\n },\n ...override.calls,\n ];\n } else if (request.refundTo) {\n body.refundTo = request.refundTo;\n }\n }\n\n const pricing = getQuotePricing({\n hasCalls: Boolean(body.txs?.length),\n sourceTokenAmount,\n targetAmountMinimum,\n transaction,\n });\n\n const finalBody: RelayQuoteRequest = {\n ...body,\n // A step that bundled its own calls has already pinned the amount those\n // calls consume, so it wins over the derived amount.\n amount: body.amount ?? pricing.amount,\n tradeType: pricing.tradeType,\n };\n\n log('Request body', finalBody);\n\n const quote = await fetchRelayQuote(messenger, finalBody, signal);\n\n log('Fetched relay quote', quote);\n\n return await normalizeQuote(\n quote,\n { ...request, recipient: body.recipient },\n fullRequest,\n );\n } catch (error) {\n log('Error fetching relay quote', error);\n throw error;\n }\n}\n\nfunction normalizeAuthorizationList(\n authorizationList: AuthorizationList | undefined,\n): RelayQuoteRequest['authorizationList'] {\n return authorizationList?.map((a) => ({\n ...a,\n chainId: Number(a.chainId),\n nonce: Number(a.nonce),\n r: a.r as Hex,\n s: a.s as Hex,\n yParity: Number(a.yParity),\n }));\n}\n\n/**\n * Add tranasction data to request body if needed.\n *\n * @param transaction - Transaction metadata.\n * @param request - Quote request.\n * @param requestBody - Request body to populate.\n * @param messenger - Controller messenger.\n * @returns `true` when the transaction was embedded in the quote; `false` when\n * skipped so the caller can route to an alternate handler.\n */\nasync function processTransactions(\n transaction: TransactionMeta,\n request: QuoteRequest,\n requestBody: RelayQuoteRequestDraft,\n messenger: TransactionPayControllerMessenger,\n): Promise<boolean> {\n // Skip when skipProcessTransactions (defaulting to isPostQuote) is set — the\n // original transaction is submitted separately, not embedded in the quote.\n // Skip Polymarket deposit wallet flows — the source is already a bridged\n // token transfer, not a contract call to embed. Skip non-atomic flows — the\n // second leg is submitted after Relay settlement.\n if (\n (request.skipProcessTransactions ?? request.isPostQuote) === true ||\n request.isPolymarketDepositWallet === true ||\n request.atomic === false\n ) {\n return false;\n }\n\n const { nestedTransactions, txParams } = transaction;\n const { isMaxAmount, targetChainId } = request;\n const data = txParams?.data as Hex | undefined;\n\n const singleData =\n nestedTransactions?.length === 1 ? nestedTransactions[0].data : data;\n\n const isHypercore = targetChainId === CHAIN_ID_HYPERCORE;\n\n const isTokenTransfer =\n !isHypercore && Boolean(singleData?.startsWith(TOKEN_TRANSFER_FOUR_BYTE));\n\n if (isTokenTransfer) {\n requestBody.recipient = getTransferRecipient(singleData as Hex);\n\n log('Updating recipient as token transfer', requestBody.recipient);\n }\n\n const hasNoData = singleData === undefined || singleData === '0x';\n const skipDelegation = hasNoData || isTokenTransfer || isHypercore;\n\n if (skipDelegation) {\n log('Skipping delegation as token transfer or Hypercore deposit');\n return true;\n }\n\n // Eligible atomic max requests carry a destination amount, so the calls\n // below use EXACT_OUTPUT rather than the usual max EXACT_INPUT quote.\n if (\n isMaxAmount &&\n !isAtomicMaxSupported({ messenger, request, transaction })\n ) {\n throw new Error('Max amount quotes do not support included transactions');\n }\n\n const delegation = await messenger.call(\n 'TransactionPayController:getDelegationTransaction',\n { transaction },\n );\n\n requestBody.authorizationList = normalizeAuthorizationList(\n delegation.authorizationList,\n );\n\n const tokenTransferData = nestedTransactions?.find((nestedTx) =>\n nestedTx.data?.startsWith(TOKEN_TRANSFER_FOUR_BYTE),\n )?.data;\n\n // If the transactions include a token transfer, change the recipient\n // so any extra dust is also sent to the same address, rather than back to the user.\n if (tokenTransferData) {\n requestBody.recipient = getTransferRecipient(tokenTransferData);\n requestBody.refundTo = request.from;\n }\n\n requestBody.txs = [\n {\n to: request.targetTokenAddress,\n data: buildTokenTransferData(\n transaction.txParams.from as Hex,\n request.targetAmountMinimum,\n ),\n value: '0x0',\n },\n {\n to: delegation.to,\n data: delegation.data,\n value: delegation.value,\n },\n ];\n\n return true;\n}\n\n/**\n * Normalizes requests for Relay.\n *\n * @param request - Quote request to normalize.\n * @param transaction - Parent transaction metadata, inspected to detect\n * Hyperliquid perps deposits.\n * @returns Normalized request.\n */\nfunction normalizeRequest(\n request: QuoteRequest,\n transaction: TransactionMeta,\n): QuoteRequest {\n const { chainId: sourceChainId, tokenAddress: sourceTokenAddress } =\n getEvmQuoteSource(request);\n\n const newRequest = {\n ...request,\n sourceAssetId: buildCaipAssetType(\n sourceChainId,\n normalizeTokenAddress(\n sourceTokenAddress,\n sourceChainId,\n TokenAddressTarget.Relay,\n ),\n ),\n targetTokenAddress: normalizeTokenAddress(\n request.targetTokenAddress,\n request.targetChainId,\n TokenAddressTarget.Relay,\n ),\n };\n\n const depositRequest = normalizePerpsDepositRequest(\n newRequest,\n transaction,\n HYPERCORE_USDC_ADDRESS,\n );\n\n if (depositRequest !== newRequest) {\n log('Converting Arbitrum Hyperliquid deposit to direct deposit', {\n originalRequest: request,\n normalizedRequest: depositRequest,\n });\n }\n\n return normalizePerpsWithdrawRequest(depositRequest, HYPERCORE_USDC_ADDRESS);\n}\n\n/**\n * Normalizes a Relay quote into a TransactionPayQuote.\n *\n * @param quote - Relay quote.\n * @param request - Original quote request.\n * @param fullRequest - Full quotes request.\n * @returns Normalized quote.\n */\nasync function normalizeQuote(\n quote: RelayQuote,\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>> {\n const { messenger } = fullRequest;\n const { details } = quote;\n const { currencyIn, currencyOut } = details;\n\n const { usdToFiatRate } = getFiatRates(messenger, request);\n\n const dust = getFiatValueFromUsd(\n calculateDustUsd(quote, request),\n usdToFiatRate,\n );\n\n const subsidizedFeeUsd = getSubsidizedFeeAmountUsd(messenger, quote);\n\n const appFeeUsd = new BigNumber(quote.fees?.app?.amountUsd ?? '0');\n const metaMaskFee = getFiatValueFromUsd(appFeeUsd, usdToFiatRate);\n\n // Subtract app fee from provider fee since totalImpact.usd already includes\n // it. The relay provider fee is forced to zero when the quote is subsidized,\n // but any reserved HyperLiquid activation fee is withheld from the source\n // send regardless, so it must always be surfaced in the provider fee.\n const activationFeeUsd = new BigNumber(\n request.hyperliquidActivationFeeUsd ?? '0',\n );\n const providerFeeUsd = subsidizedFeeUsd.gt(0)\n ? activationFeeUsd\n : calculateProviderFee(quote).minus(appFeeUsd).plus(activationFeeUsd);\n const provider = getFiatValueFromUsd(providerFeeUsd, usdToFiatRate);\n\n const {\n gasLimits,\n is7702,\n isGasFeeToken: isSourceGasFeeToken,\n ...sourceNetwork\n } = await calculateSourceNetworkCost(\n quote,\n messenger,\n request,\n fullRequest.transaction,\n fullRequest.accountSupports7702,\n );\n\n const targetNetwork = {\n usd: '0',\n fiat: '0',\n };\n\n const sourceAmount: Amount = {\n human: currencyIn.amountFormatted,\n raw: currencyIn.amount,\n ...getFiatValueFromUsd(new BigNumber(currencyIn.amountUsd), usdToFiatRate),\n };\n\n const isTargetStablecoin = isStablecoin(\n messenger,\n request.targetChainId,\n request.targetTokenAddress,\n );\n\n const targetAmountUsd = isTargetStablecoin\n ? new BigNumber(currencyOut.amountFormatted)\n : new BigNumber(currencyOut.amountUsd);\n\n const targetAmount = getFiatValueFromUsd(targetAmountUsd, usdToFiatRate);\n\n const metamask: RelayQuoteMetamask = {\n ...quote.metamask,\n gasLimits: is7702 ? [gasLimits[0]] : gasLimits,\n is7702,\n };\n\n return {\n dust,\n estimatedDuration: details.timeEstimate,\n fees: {\n isSourceGasFeeToken,\n metaMask: metaMaskFee,\n provider,\n sourceNetwork,\n targetNetwork,\n },\n isInputBased: quote.request.tradeType === 'EXACT_INPUT',\n original: {\n ...quote,\n metamask,\n },\n request,\n sourceAmount,\n targetAmount,\n strategy: TransactionPayStrategy.Relay,\n };\n}\n\n/**\n * Calculate dust USD value.\n *\n * @param quote - Relay quote.\n * @param request - Quote request.\n * @returns Dust value in USD and fiat.\n */\nfunction calculateDustUsd(quote: RelayQuote, request: QuoteRequest): BigNumber {\n const { currencyOut } = quote.details;\n const { amountUsd, amountFormatted, minimumAmount } = currencyOut;\n const { decimals: targetDecimals } = currencyOut.currency;\n\n const targetUsdRate = new BigNumber(amountUsd).dividedBy(amountFormatted);\n\n const dustRaw = BigNumber.maximum(\n new BigNumber(minimumAmount).minus(request.targetAmountMinimum),\n 0,\n );\n\n return dustRaw.shiftedBy(-targetDecimals).multipliedBy(targetUsdRate);\n}\n\n/**\n * Calculates USD to fiat rate.\n *\n * @param messenger - Controller messenger.\n * @param request - Quote request.\n * @returns USD to fiat rate.\n */\nfunction getFiatRates(\n messenger: TransactionPayControllerMessenger,\n request: QuoteRequest,\n): {\n sourceFiatRate: FiatRates;\n usdToFiatRate: BigNumber;\n} {\n // For HyperLiquid source, the normalized chain/token (HyperCore + Perps USDC)\n // won't have a fiat rate entry. Use Arbitrum USDC instead since Perps USDC\n // is pegged 1:1.\n const quoteSource = getEvmQuoteSource(request);\n const sourceChainId = request.isHyperliquidSource\n ? CHAIN_ID_ARBITRUM\n : quoteSource.chainId;\n const sourceTokenAddress = request.isHyperliquidSource\n ? ARBITRUM_USDC_ADDRESS\n : quoteSource.tokenAddress;\n\n const finalSourceTokenAddress =\n sourceChainId === CHAIN_ID_POLYGON &&\n sourceTokenAddress === NATIVE_TOKEN_ADDRESS\n ? getNativeToken(sourceChainId)\n : sourceTokenAddress;\n\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n finalSourceTokenAddress,\n sourceChainId,\n );\n\n if (!sourceFiatRate) {\n throw new Error('Source token fiat rate not found');\n }\n\n const usdToFiatRate = new BigNumber(sourceFiatRate.fiatRate).dividedBy(\n sourceFiatRate.usdRate,\n );\n\n return { sourceFiatRate, usdToFiatRate };\n}\n\n/**\n * Calculates source network cost from a Relay quote.\n *\n * For post-quote flows (e.g. predictWithdraw), the cost also includes the\n * original transaction's gas (the user's Polygon USDC.e transfer) in addition\n * to the Relay deposit transaction gas, by appending the original\n * transaction's params so that gas estimation and gas-fee-token logic handle\n * both transactions together.\n *\n * Network fees are zeroed whenever the user does not pay origin gas, either\n * because a relayer covers it or because MetaMask sponsors it.\n *\n * @param quote - Relay quote.\n * @param messenger - Controller messenger.\n * @param request - Quote request.\n * @param transaction - Original transaction metadata.\n * @param accountSupports7702 - Whether the source account supports EIP-7702.\n * @returns Total source network cost in USD and fiat.\n */\nasync function calculateSourceNetworkCost(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n request: QuoteRequest,\n transaction: TransactionMeta,\n accountSupports7702: boolean | undefined,\n): Promise<\n TransactionPayQuote<RelayQuote>['fees']['sourceNetwork'] & {\n gasLimits: number[];\n isGasFeeToken?: boolean;\n is7702: boolean;\n }\n> {\n const { from } = request;\n const { chainId: sourceChainId, tokenAddress: sourceTokenAddress } =\n getEvmQuoteSource(request);\n\n // None of these flows bill origin gas to the user: the execute flow has a\n // relayer redeem a signed delegation, a HyperLiquid withdrawal's \"deposit\"\n // step is an off-chain HL sendAsset signature rather than an on-chain\n // transaction, and a Polymarket deposit-wallet withdraw is submitted by the\n // Polymarket relayer.\n const isExecuteFlow = Boolean(quote.metamask?.isExecute);\n const isHyperliquidWithdrawal = Boolean(request.isHyperliquidSource);\n const isPolymarketDepositWallet = Boolean(request.isPolymarketDepositWallet);\n\n const gasPayment = resolveGasPayment({\n isDelegated:\n isExecuteFlow || isHyperliquidWithdrawal || isPolymarketDepositWallet,\n sourceTokenAddress,\n sponsorship: {\n accountSupports7702,\n request,\n transaction,\n },\n });\n\n if (gasPayment.mode === GasPaymentMode.Delegation) {\n log('Zeroing network fees as the user does not pay origin gas', {\n isExecuteFlow,\n isHyperliquidWithdrawal,\n isPolymarketDepositWallet,\n });\n\n return {\n estimate: ZERO_AMOUNT,\n max: ZERO_AMOUNT,\n gasLimits: [],\n is7702: false,\n };\n }\n\n if (gasPayment.mode === GasPaymentMode.Sponsored) {\n log('Zeroing source network fees for sponsored same-chain Relay route');\n\n // Gas limit is zero as sponsored transactions go through the EIP-7702\n // gas station hook and do not require user-paid gas.\n return {\n estimate: ZERO_AMOUNT,\n max: ZERO_AMOUNT,\n gasLimits: [0],\n is7702: true,\n };\n }\n\n const txSteps = quote.steps.filter(\n (step): step is RelayTransactionStep => step.kind === 'transaction',\n );\n const relayParams = txSteps\n .flatMap((step) => step.items)\n .map((item) => item.data);\n\n const { chainId, data, maxFeePerGas, maxPriorityFeePerGas, to, value } =\n relayParams[0];\n\n // `fromOverride = Safe proxy` is only valid for deposit-style Relay routes\n // where the deposit contract reads the user's source-token balance directly.\n // Same-chain destinations route through DEX swap aggregators that frequently\n // reject contract callers (anti-MEV `msg.sender == tx.origin` checks,\n // ERC777-style callback interfaces, native wrap/unwrap requiring caller\n // native balance). Simulating those from the Safe proxy reverts and breaks\n // gas estimation. For swap-only routes, fall back to the relay params'\n // EOA `from` so simulation succeeds.\n const fromOverride = getPredictWithdrawSafeAddress(\n request,\n transaction,\n hasRelayDepositStep(quote.steps),\n );\n\n const { gasLimits, is7702, totalGasEstimate, totalGasLimit } =\n await estimateSourceGas({\n fromOverride,\n messenger,\n request,\n transaction,\n transactions: relayParams.map(toQuoteGasTransaction),\n });\n\n log('Gas limit', {\n is7702,\n totalGasEstimate,\n totalGasLimit,\n gasLimits,\n });\n\n const estimate = calculateGasCost({\n chainId,\n gas: totalGasEstimate,\n maxFeePerGas,\n maxPriorityFeePerGas,\n messenger,\n });\n\n const max = calculateGasCost({\n chainId,\n gas: totalGasLimit,\n maxFeePerGas,\n maxPriorityFeePerGas,\n messenger,\n isMax: true,\n });\n\n const result = { estimate, max, gasLimits, is7702 };\n\n // Gas-fee-token lookup must use the Safe proxy for ALL Predict withdraws,\n // not only deposit-style routes. The user's source token (pUSD) lives in\n // the Safe; the EOA is empty until the Safe.execTransaction sub-call runs\n // mid-batch. Querying the EOA for gas-fee-token availability would always\n // return nothing and force users to hold POL.\n // (`useFromOverride` only governs the gas-estimation `from` address, where\n // swap-style routes need EOA because DEX routers reject contract callers.)\n const proxyFeeTokenAccount = getPredictWithdrawFeeTokenAccount(\n request,\n transaction,\n );\n\n const gasStationCost = await resolveGasStationCost({\n accountSupports7702,\n feeTokenAccount: proxyFeeTokenAccount,\n firstStepData: {\n data,\n to,\n value,\n },\n messenger,\n nativeGasCostRaw: max.raw,\n request: {\n from,\n sourceChainId,\n sourceTokenAddress,\n },\n totalGasEstimate,\n totalItemCount: proxyFeeTokenAccount\n ? relayParams.length + 1\n : Math.max(relayParams.length, gasLimits.length),\n });\n\n if (!gasStationCost.amount) {\n return result;\n }\n\n log('Using gas fee token for source network', {\n gasFeeTokenCost: gasStationCost.amount,\n proxyFeeTokenAccount,\n });\n\n return {\n isGasFeeToken: true,\n estimate: gasStationCost.amount,\n max: gasStationCost.amount,\n gasLimits,\n is7702,\n };\n}\n\nfunction toQuoteGasTransaction(\n singleParams: RelayTransactionStep['items'][0]['data'],\n): QuoteGasTransaction {\n return {\n chainId: toHex(singleParams.chainId),\n data: singleParams.data,\n from: singleParams.from,\n gas: singleParams.gas,\n to: singleParams.to,\n value: singleParams.value ?? '0',\n };\n}\n\n/**\n * Calculate the provider fee for a Relay quote.\n *\n * @param quote - Relay quote.\n * @returns - Provider fee in USD.\n */\nfunction calculateProviderFee(quote: RelayQuote): BigNumber {\n return new BigNumber(quote.details.totalImpact.usd).abs();\n}\n\n/**\n * Build token transfer data.\n *\n * @param recipient - Recipient address.\n * @param amountRaw - Amount in raw format.\n * @returns Token transfer data.\n */\nfunction buildTokenTransferData(recipient: Hex, amountRaw: string): Hex {\n return new Interface([\n 'function transfer(address to, uint256 amount)',\n ]).encodeFunctionData('transfer', [recipient, amountRaw]) as Hex;\n}\n\n/**\n * Get transfer recipient from token transfer data.\n *\n * @param data - Token transfer data.\n * @returns Transfer recipient.\n */\nfunction getTransferRecipient(data: Hex): Hex {\n return new Interface(['function transfer(address to, uint256 amount)'])\n .decodeFunctionData('transfer', data)\n .to.toLowerCase();\n}\nfunction getSubsidizedFeeAmountUsd(\n messenger: TransactionPayControllerMessenger,\n quote: RelayQuote,\n): BigNumber {\n const subsidizedFee = quote.fees?.subsidized;\n const amountUsd = new BigNumber(subsidizedFee?.amountUsd ?? '0');\n const amountFormatted = new BigNumber(subsidizedFee?.amountFormatted ?? '0');\n\n if (!subsidizedFee || amountUsd.isZero()) {\n return new BigNumber(0);\n }\n\n const isSubsidizedStablecoin = isStablecoin(\n messenger,\n toHex(subsidizedFee.currency.chainId),\n subsidizedFee.currency.address,\n );\n\n return isSubsidizedStablecoin ? amountFormatted : amountUsd;\n}\n\nfunction isStablecoin(\n messenger: TransactionPayControllerMessenger,\n chainId: string,\n tokenAddress: string,\n): boolean {\n return Boolean(\n getStablecoins(messenger)[chainId as Hex]?.includes(\n tokenAddress.toLowerCase() as Hex,\n ),\n );\n}\n\nfunction getRelayMaxQuoteDetails({\n original,\n}: TransactionPayQuote<RelayQuote>): MaxQuoteDetails {\n const firstTransactionStep = original.steps.find(\n (step): step is RelayTransactionStep => step.kind === 'transaction',\n );\n const firstStepData = firstTransactionStep?.items[0]?.data;\n\n return {\n gasLimits: original.metamask.gasLimits,\n gasStationTransactions: firstStepData\n ? {\n firstStepData,\n totalItemCount: original.steps.reduce(\n (count, step) => count + step.items.length,\n 0,\n ),\n }\n : undefined,\n isGasless: original.metamask.isExecute === true,\n isSubsidized: isSubsidizedRelayQuote(original),\n targetAmountRaw: original.details.currencyOut.amount,\n };\n}\n"]}
1
+ {"version":3,"file":"relay-quotes.js","sourceRoot":"","sources":["../../../src/strategy/relay/relay-quotes.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable require-atomic-updates */\n\nimport { Interface } from '@ethersproject/abi';\nimport { toHex } from '@metamask/controller-utils';\nimport type {\n AuthorizationList,\n TransactionMeta,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport {\n ARBITRUM_USDC_ADDRESS,\n CHAIN_ID_ARBITRUM,\n CHAIN_ID_HYPERCORE,\n CHAIN_ID_POLYGON,\n HYPERCORE_USDC_ADDRESS,\n NATIVE_TOKEN_ADDRESS,\n} from '../../constants.js';\nimport { TransactionPayStrategy } from '../../index.js';\nimport { projectLogger } from '../../logger.js';\nimport type {\n Amount,\n FiatRates,\n PayStrategyGetQuotesRequest,\n QuoteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types.js';\nimport { getFiatValueFromUsd } from '../../utils/amounts.js';\nimport {\n getRelayOriginGasOverhead,\n getSlippage,\n getStablecoins,\n isEIP7702Chain,\n isRelayExecuteEnabled,\n} from '../../utils/feature-flags.js';\nimport {\n GasPaymentMode,\n resolveGasPayment,\n resolveGasStationCost,\n} from '../../utils/gas-payment.js';\nimport { calculateGasCost } from '../../utils/gas.js';\nimport {\n getMaxQuotes,\n isAtomicMaxQuote,\n isAtomicMaxSupported,\n} from '../../utils/max-quote.js';\nimport type { MaxQuoteDetails } from '../../utils/max-quote.js';\nimport {\n normalizePerpsDepositRequest,\n normalizePerpsWithdrawRequest,\n} from '../../utils/perps.js';\nimport {\n getPolymarketDepositWalletOverrides,\n getPredictWithdrawFeeTokenAccount,\n getPredictWithdrawSafeAddress,\n} from '../../utils/polymarket/withdraw.js';\nimport { processPostQuotePaymentOverride } from '../../utils/post-quote-payment-override.js';\nimport { reservePostQuoteGas } from '../../utils/post-quote.js';\nimport { estimateSourceGas } from '../../utils/quote-gas.js';\nimport type { QuoteGasTransaction } from '../../utils/quote-gas.js';\nimport { resolveQuoteRecipient } from '../../utils/quote-recipient.js';\nimport {\n getNativeToken,\n getTokenFiatRate,\n normalizeTokenAddress,\n TokenAddressTarget,\n} from '../../utils/token.js';\nimport { getQuotePricing } from '../../utils/trade-type.js';\nimport { TOKEN_TRANSFER_FOUR_BYTE } from './constants.js';\nimport { hasRelayDepositStep } from './deposit-step.js';\nimport { applyHyperliquidActivationFee } from './hyperliquid-activation.js';\nimport { fetchRelayQuote } from './relay-api.js';\nimport { isSubsidizedRelayQuote } from './relay-submit-execute.js';\nimport { validateRelayQuotes } from './relay-validation.js';\nimport type {\n RelayQuote,\n RelayQuoteMetamask,\n RelayQuoteRequest,\n RelayTransactionStep,\n} from './types.js';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\n\nconst ZERO_AMOUNT = { fiat: '0', human: '0', raw: '0', usd: '0' };\n\ntype RelayQuoteRequestDraft = Omit<RelayQuoteRequest, 'amount' | 'tradeType'> &\n Partial<Pick<RelayQuoteRequest, 'amount'>>;\n\n/**\n * Fetches Relay quotes.\n *\n * @param request - Request object.\n * @returns Array of quotes.\n */\nexport async function getRelayQuotes(\n request: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>[]> {\n const { requests } = request;\n\n log('Fetching quotes', requests);\n\n try {\n const normalizedRequests = await Promise.all(\n requests\n .filter((singleRequest) => {\n const hasTargetMinimum = singleRequest.targetAmountMinimum !== '0';\n const isPostQuote = Boolean(singleRequest.isPostQuote);\n const isExactInputRequest =\n Boolean(singleRequest.isMaxAmount) &&\n new BigNumber(singleRequest.sourceTokenAmount).gt(0);\n\n return hasTargetMinimum || isPostQuote || isExactInputRequest;\n })\n .map((singleRequest) =>\n normalizeRequest(singleRequest, request.transaction),\n )\n .map((normalizedRequest) =>\n applyHyperliquidActivationFee(\n normalizedRequest,\n request.messenger,\n request.transaction,\n request.signal,\n ),\n ),\n );\n\n log('Normalized requests', normalizedRequests);\n\n const quotes = await Promise.all(\n normalizedRequests.map((singleRequest) =>\n getQuoteWithMaxAmountHandling(singleRequest, request),\n ),\n );\n\n // Atomic max quotes are validated as part of the max flow.\n const quotesToValidate = quotes.filter((quote) => !isAtomicMaxQuote(quote));\n\n if (quotesToValidate.length > 0) {\n await validateRelayQuotes({\n messenger: request.messenger,\n quotes: quotesToValidate,\n signal: request.signal,\n transaction: request.transaction,\n });\n }\n\n return quotes;\n } catch (error) {\n log('Error fetching quotes', { error });\n throw error;\n }\n}\n\nasync function getQuoteWithMaxAmountHandling(\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>> {\n const { isMaxAmount } = request;\n\n if (!isMaxAmount) {\n return getQuoteWithPostQuoteGasHandling(request, fullRequest);\n }\n\n const [maxQuote] = await getMaxQuotes({\n fullRequest,\n getQuoteDetails: getRelayMaxQuoteDetails,\n getQuotes: async (maxRequest, transaction) => [\n await getSingleQuote(maxRequest, { ...fullRequest, transaction }),\n ],\n request,\n requote: (_quote, maxRequest, transaction) =>\n getSingleQuote(maxRequest, { ...fullRequest, transaction }),\n validateAtomicQuote: (quote) =>\n validateRelayQuotes({\n messenger: fullRequest.messenger,\n quotes: [quote],\n signal: fullRequest.signal,\n transaction: fullRequest.transaction,\n }),\n });\n\n return maxQuote;\n}\n\n/**\n * For post-quote flows, fetch an initial quote to compute gas cost in source\n * token, then re-quote with the source amount reduced by the gas cost.\n * This ensures Relay reserves enough for the gas fee token payment.\n *\n * For non-post-quote flows, just returns a single quote.\n *\n * @param request - Quote request.\n * @param fullRequest - Full request context.\n * @returns The final quote (phase 2 for post-quote, or phase 1 for normal).\n */\nasync function getQuoteWithPostQuoteGasHandling(\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>> {\n const phase1Quote = await getSingleQuote(request, fullRequest);\n\n if (!request.isPostQuote) {\n return phase1Quote;\n }\n\n if (phase1Quote.original.metamask?.isExecute) {\n return phase1Quote;\n }\n\n return await reservePostQuoteGas({\n quote: phase1Quote,\n requote: (adjustedRequest) => getSingleQuote(adjustedRequest, fullRequest),\n });\n}\n\n/**\n * Fetches a single Relay quote.\n *\n * @param request - Quote request.\n * @param fullRequest - Full quotes request.\n * @returns Single quote.\n */\nasync function getSingleQuote(\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>> {\n const {\n accountSupports7702: supports7702,\n messenger,\n signal,\n transaction,\n } = fullRequest;\n\n const {\n from,\n sourceChainId,\n sourceTokenAddress,\n sourceTokenAmount,\n targetAmountMinimum,\n targetChainId,\n targetTokenAddress,\n } = request;\n\n const slippageDecimal = getSlippage(\n messenger,\n sourceChainId,\n sourceTokenAddress,\n );\n\n const slippageTolerance = new BigNumber(slippageDecimal * 100 * 100).toFixed(\n 0,\n );\n\n try {\n const useExecute =\n supports7702 &&\n isRelayExecuteEnabled(messenger) &&\n isEIP7702Chain(messenger, sourceChainId);\n\n const recipient = await resolveQuoteRecipient({\n messenger,\n request,\n transaction,\n });\n const body: RelayQuoteRequestDraft = {\n destinationChainId: Number(targetChainId),\n destinationCurrency: targetTokenAddress,\n originChainId: Number(sourceChainId),\n originCurrency: sourceTokenAddress,\n ...(useExecute\n ? {\n originGasOverhead: getRelayOriginGasOverhead(messenger),\n metamask: { executeVersion: 2 },\n }\n : {}),\n recipient,\n slippageTolerance,\n user: from,\n };\n\n if (request.isPolymarketDepositWallet) {\n const overrides = await getPolymarketDepositWalletOverrides(\n from,\n messenger,\n );\n const { depositWallet } = overrides;\n\n body.originCurrency = overrides.sourceTokenAddress;\n body.user = depositWallet;\n body.refundTo = depositWallet;\n body.useDepositAddress = true;\n body.strict = true;\n }\n\n const processedTransactions = await processTransactions(\n transaction,\n request,\n body,\n messenger,\n );\n\n if (!processedTransactions) {\n const override = await processPostQuotePaymentOverride({\n messenger,\n request,\n transaction,\n });\n\n if (override) {\n body.amount = override.amount;\n body.authorizationList = normalizeAuthorizationList(\n override.authorizationList,\n );\n body.txs = [\n {\n data: buildTokenTransferData(override.recipient, override.amount),\n to: targetTokenAddress,\n value: '0x0',\n },\n ...override.calls,\n ];\n } else if (request.refundTo) {\n body.refundTo = request.refundTo;\n }\n }\n\n const pricing = getQuotePricing({\n hasCalls: Boolean(body.txs?.length),\n sourceTokenAmount,\n targetAmountMinimum,\n transaction,\n });\n\n const finalBody: RelayQuoteRequest = {\n ...body,\n // A step that bundled its own calls has already pinned the amount those\n // calls consume, so it wins over the derived amount.\n amount: body.amount ?? pricing.amount,\n tradeType: pricing.tradeType,\n };\n\n log('Request body', finalBody);\n\n const quote = await fetchRelayQuote(messenger, finalBody, signal);\n\n log('Fetched relay quote', quote);\n\n return await normalizeQuote(\n quote,\n { ...request, recipient: body.recipient },\n fullRequest,\n );\n } catch (error) {\n log('Error fetching relay quote', error);\n throw error;\n }\n}\n\nfunction normalizeAuthorizationList(\n authorizationList: AuthorizationList | undefined,\n): RelayQuoteRequest['authorizationList'] {\n return authorizationList?.map((a) => ({\n ...a,\n chainId: Number(a.chainId),\n nonce: Number(a.nonce),\n r: a.r as Hex,\n s: a.s as Hex,\n yParity: Number(a.yParity),\n }));\n}\n\n/**\n * Add tranasction data to request body if needed.\n *\n * @param transaction - Transaction metadata.\n * @param request - Quote request.\n * @param requestBody - Request body to populate.\n * @param messenger - Controller messenger.\n * @returns `true` when the transaction was embedded in the quote; `false` when\n * skipped so the caller can route to an alternate handler.\n */\nasync function processTransactions(\n transaction: TransactionMeta,\n request: QuoteRequest,\n requestBody: RelayQuoteRequestDraft,\n messenger: TransactionPayControllerMessenger,\n): Promise<boolean> {\n // Skip when skipProcessTransactions (defaulting to isPostQuote) is set — the\n // original transaction is submitted separately, not embedded in the quote.\n // Skip Polymarket deposit wallet flows — the source is already a bridged\n // token transfer, not a contract call to embed. Skip non-atomic flows — the\n // second leg is submitted after Relay settlement.\n if (\n (request.skipProcessTransactions ?? request.isPostQuote) === true ||\n request.isPolymarketDepositWallet === true ||\n request.atomic === false\n ) {\n return false;\n }\n\n const { nestedTransactions, txParams } = transaction;\n const { isMaxAmount, targetChainId } = request;\n const data = txParams?.data as Hex | undefined;\n\n const singleData =\n nestedTransactions?.length === 1 ? nestedTransactions[0].data : data;\n\n const isHypercore = targetChainId === CHAIN_ID_HYPERCORE;\n\n const isTokenTransfer =\n !isHypercore && Boolean(singleData?.startsWith(TOKEN_TRANSFER_FOUR_BYTE));\n\n if (isTokenTransfer) {\n requestBody.recipient = getTransferRecipient(singleData as Hex);\n\n log('Updating recipient as token transfer', requestBody.recipient);\n }\n\n const hasNoData = singleData === undefined || singleData === '0x';\n const skipDelegation = hasNoData || isTokenTransfer || isHypercore;\n\n if (skipDelegation) {\n log('Skipping delegation as token transfer or Hypercore deposit');\n return true;\n }\n\n // Eligible atomic max requests carry a destination amount, so the calls\n // below use EXACT_OUTPUT rather than the usual max EXACT_INPUT quote.\n if (\n isMaxAmount &&\n !isAtomicMaxSupported({ messenger, request, transaction })\n ) {\n throw new Error('Max amount quotes do not support included transactions');\n }\n\n const delegation = await messenger.call(\n 'TransactionPayController:getDelegationTransaction',\n { transaction },\n );\n\n requestBody.authorizationList = normalizeAuthorizationList(\n delegation.authorizationList,\n );\n\n const tokenTransferData = nestedTransactions?.find((nestedTx) =>\n nestedTx.data?.startsWith(TOKEN_TRANSFER_FOUR_BYTE),\n )?.data;\n\n // If the transactions include a token transfer, change the recipient\n // so any extra dust is also sent to the same address, rather than back to the user.\n if (tokenTransferData) {\n requestBody.recipient = getTransferRecipient(tokenTransferData);\n requestBody.refundTo = request.from;\n }\n\n requestBody.txs = [\n {\n to: request.targetTokenAddress,\n data: buildTokenTransferData(\n transaction.txParams.from as Hex,\n request.targetAmountMinimum,\n ),\n value: '0x0',\n },\n {\n to: delegation.to,\n data: delegation.data,\n value: delegation.value,\n },\n ];\n\n return true;\n}\n\n/**\n * Normalizes requests for Relay.\n *\n * @param request - Quote request to normalize.\n * @param transaction - Parent transaction metadata, inspected to detect\n * Hyperliquid perps deposits.\n * @returns Normalized request.\n */\nfunction normalizeRequest(\n request: QuoteRequest,\n transaction: TransactionMeta,\n): QuoteRequest {\n const newRequest = {\n ...request,\n sourceTokenAddress: normalizeTokenAddress(\n request.sourceTokenAddress,\n request.sourceChainId,\n TokenAddressTarget.Relay,\n ),\n targetTokenAddress: normalizeTokenAddress(\n request.targetTokenAddress,\n request.targetChainId,\n TokenAddressTarget.Relay,\n ),\n };\n\n const depositRequest = normalizePerpsDepositRequest(\n newRequest,\n transaction,\n HYPERCORE_USDC_ADDRESS,\n );\n\n if (depositRequest !== newRequest) {\n log('Converting Arbitrum Hyperliquid deposit to direct deposit', {\n originalRequest: request,\n normalizedRequest: depositRequest,\n });\n }\n\n return normalizePerpsWithdrawRequest(depositRequest, HYPERCORE_USDC_ADDRESS);\n}\n\n/**\n * Normalizes a Relay quote into a TransactionPayQuote.\n *\n * @param quote - Relay quote.\n * @param request - Original quote request.\n * @param fullRequest - Full quotes request.\n * @returns Normalized quote.\n */\nasync function normalizeQuote(\n quote: RelayQuote,\n request: QuoteRequest,\n fullRequest: PayStrategyGetQuotesRequest,\n): Promise<TransactionPayQuote<RelayQuote>> {\n const { messenger } = fullRequest;\n const { details } = quote;\n const { currencyIn, currencyOut } = details;\n\n const { usdToFiatRate } = getFiatRates(messenger, request);\n\n const dust = getFiatValueFromUsd(\n calculateDustUsd(quote, request),\n usdToFiatRate,\n );\n\n const subsidizedFeeUsd = getSubsidizedFeeAmountUsd(messenger, quote);\n\n const appFeeUsd = new BigNumber(quote.fees?.app?.amountUsd ?? '0');\n const metaMaskFee = getFiatValueFromUsd(appFeeUsd, usdToFiatRate);\n\n // Subtract app fee from provider fee since totalImpact.usd already includes\n // it. The relay provider fee is forced to zero when the quote is subsidized,\n // but any reserved HyperLiquid activation fee is withheld from the source\n // send regardless, so it must always be surfaced in the provider fee.\n const activationFeeUsd = new BigNumber(\n request.hyperliquidActivationFeeUsd ?? '0',\n );\n const providerFeeUsd = subsidizedFeeUsd.gt(0)\n ? activationFeeUsd\n : calculateProviderFee(quote).minus(appFeeUsd).plus(activationFeeUsd);\n const provider = getFiatValueFromUsd(providerFeeUsd, usdToFiatRate);\n\n const {\n gasLimits,\n is7702,\n isGasFeeToken: isSourceGasFeeToken,\n ...sourceNetwork\n } = await calculateSourceNetworkCost(\n quote,\n messenger,\n request,\n fullRequest.transaction,\n fullRequest.accountSupports7702,\n );\n\n const targetNetwork = {\n usd: '0',\n fiat: '0',\n };\n\n const sourceAmount: Amount = {\n human: currencyIn.amountFormatted,\n raw: currencyIn.amount,\n ...getFiatValueFromUsd(new BigNumber(currencyIn.amountUsd), usdToFiatRate),\n };\n\n const isTargetStablecoin = isStablecoin(\n messenger,\n request.targetChainId,\n request.targetTokenAddress,\n );\n\n const targetAmountUsd = isTargetStablecoin\n ? new BigNumber(currencyOut.amountFormatted)\n : new BigNumber(currencyOut.amountUsd);\n\n const targetAmount = getFiatValueFromUsd(targetAmountUsd, usdToFiatRate);\n\n const metamask: RelayQuoteMetamask = {\n ...quote.metamask,\n gasLimits: is7702 ? [gasLimits[0]] : gasLimits,\n is7702,\n };\n\n return {\n dust,\n estimatedDuration: details.timeEstimate,\n fees: {\n isSourceGasFeeToken,\n metaMask: metaMaskFee,\n provider,\n sourceNetwork,\n targetNetwork,\n },\n isInputBased: quote.request.tradeType === 'EXACT_INPUT',\n original: {\n ...quote,\n metamask,\n },\n request,\n sourceAmount,\n targetAmount,\n strategy: TransactionPayStrategy.Relay,\n };\n}\n\n/**\n * Calculate dust USD value.\n *\n * @param quote - Relay quote.\n * @param request - Quote request.\n * @returns Dust value in USD and fiat.\n */\nfunction calculateDustUsd(quote: RelayQuote, request: QuoteRequest): BigNumber {\n const { currencyOut } = quote.details;\n const { amountUsd, amountFormatted, minimumAmount } = currencyOut;\n const { decimals: targetDecimals } = currencyOut.currency;\n\n const targetUsdRate = new BigNumber(amountUsd).dividedBy(amountFormatted);\n\n const dustRaw = BigNumber.maximum(\n new BigNumber(minimumAmount).minus(request.targetAmountMinimum),\n 0,\n );\n\n return dustRaw.shiftedBy(-targetDecimals).multipliedBy(targetUsdRate);\n}\n\n/**\n * Calculates USD to fiat rate.\n *\n * @param messenger - Controller messenger.\n * @param request - Quote request.\n * @returns USD to fiat rate.\n */\nfunction getFiatRates(\n messenger: TransactionPayControllerMessenger,\n request: QuoteRequest,\n): {\n sourceFiatRate: FiatRates;\n usdToFiatRate: BigNumber;\n} {\n // For HyperLiquid source, the normalized chain/token (HyperCore + Perps USDC)\n // won't have a fiat rate entry. Use Arbitrum USDC instead since Perps USDC\n // is pegged 1:1.\n const sourceChainId = request.isHyperliquidSource\n ? CHAIN_ID_ARBITRUM\n : request.sourceChainId;\n const sourceTokenAddress = request.isHyperliquidSource\n ? ARBITRUM_USDC_ADDRESS\n : request.sourceTokenAddress;\n\n const finalSourceTokenAddress =\n sourceChainId === CHAIN_ID_POLYGON &&\n sourceTokenAddress === NATIVE_TOKEN_ADDRESS\n ? getNativeToken(sourceChainId)\n : sourceTokenAddress;\n\n const sourceFiatRate = getTokenFiatRate(\n messenger,\n finalSourceTokenAddress,\n sourceChainId,\n );\n\n if (!sourceFiatRate) {\n throw new Error('Source token fiat rate not found');\n }\n\n const usdToFiatRate = new BigNumber(sourceFiatRate.fiatRate).dividedBy(\n sourceFiatRate.usdRate,\n );\n\n return { sourceFiatRate, usdToFiatRate };\n}\n\n/**\n * Calculates source network cost from a Relay quote.\n *\n * For post-quote flows (e.g. predictWithdraw), the cost also includes the\n * original transaction's gas (the user's Polygon USDC.e transfer) in addition\n * to the Relay deposit transaction gas, by appending the original\n * transaction's params so that gas estimation and gas-fee-token logic handle\n * both transactions together.\n *\n * Network fees are zeroed whenever the user does not pay origin gas, either\n * because a relayer covers it or because MetaMask sponsors it.\n *\n * @param quote - Relay quote.\n * @param messenger - Controller messenger.\n * @param request - Quote request.\n * @param transaction - Original transaction metadata.\n * @param accountSupports7702 - Whether the source account supports EIP-7702.\n * @returns Total source network cost in USD and fiat.\n */\nasync function calculateSourceNetworkCost(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n request: QuoteRequest,\n transaction: TransactionMeta,\n accountSupports7702: boolean | undefined,\n): Promise<\n TransactionPayQuote<RelayQuote>['fees']['sourceNetwork'] & {\n gasLimits: number[];\n isGasFeeToken?: boolean;\n is7702: boolean;\n }\n> {\n const { from, sourceChainId, sourceTokenAddress } = request;\n\n // None of these flows bill origin gas to the user: the execute flow has a\n // relayer redeem a signed delegation, a HyperLiquid withdrawal's \"deposit\"\n // step is an off-chain HL sendAsset signature rather than an on-chain\n // transaction, and a Polymarket deposit-wallet withdraw is submitted by the\n // Polymarket relayer.\n const isExecuteFlow = Boolean(quote.metamask?.isExecute);\n const isHyperliquidWithdrawal = Boolean(request.isHyperliquidSource);\n const isPolymarketDepositWallet = Boolean(request.isPolymarketDepositWallet);\n\n const gasPayment = resolveGasPayment({\n isDelegated:\n isExecuteFlow || isHyperliquidWithdrawal || isPolymarketDepositWallet,\n sourceTokenAddress,\n sponsorship: {\n accountSupports7702,\n request,\n transaction,\n },\n });\n\n if (gasPayment.mode === GasPaymentMode.Delegation) {\n log('Zeroing network fees as the user does not pay origin gas', {\n isExecuteFlow,\n isHyperliquidWithdrawal,\n isPolymarketDepositWallet,\n });\n\n return {\n estimate: ZERO_AMOUNT,\n max: ZERO_AMOUNT,\n gasLimits: [],\n is7702: false,\n };\n }\n\n if (gasPayment.mode === GasPaymentMode.Sponsored) {\n log('Zeroing source network fees for sponsored same-chain Relay route');\n\n // Gas limit is zero as sponsored transactions go through the EIP-7702\n // gas station hook and do not require user-paid gas.\n return {\n estimate: ZERO_AMOUNT,\n max: ZERO_AMOUNT,\n gasLimits: [0],\n is7702: true,\n };\n }\n\n const txSteps = quote.steps.filter(\n (step): step is RelayTransactionStep => step.kind === 'transaction',\n );\n const relayParams = txSteps\n .flatMap((step) => step.items)\n .map((item) => item.data);\n\n const { chainId, data, maxFeePerGas, maxPriorityFeePerGas, to, value } =\n relayParams[0];\n\n // `fromOverride = Safe proxy` is only valid for deposit-style Relay routes\n // where the deposit contract reads the user's source-token balance directly.\n // Same-chain destinations route through DEX swap aggregators that frequently\n // reject contract callers (anti-MEV `msg.sender == tx.origin` checks,\n // ERC777-style callback interfaces, native wrap/unwrap requiring caller\n // native balance). Simulating those from the Safe proxy reverts and breaks\n // gas estimation. For swap-only routes, fall back to the relay params'\n // EOA `from` so simulation succeeds.\n const fromOverride = getPredictWithdrawSafeAddress(\n request,\n transaction,\n hasRelayDepositStep(quote.steps),\n );\n\n const { gasLimits, is7702, totalGasEstimate, totalGasLimit } =\n await estimateSourceGas({\n fromOverride,\n messenger,\n request,\n transaction,\n transactions: relayParams.map(toQuoteGasTransaction),\n });\n\n log('Gas limit', {\n is7702,\n totalGasEstimate,\n totalGasLimit,\n gasLimits,\n });\n\n const estimate = calculateGasCost({\n chainId,\n gas: totalGasEstimate,\n maxFeePerGas,\n maxPriorityFeePerGas,\n messenger,\n });\n\n const max = calculateGasCost({\n chainId,\n gas: totalGasLimit,\n maxFeePerGas,\n maxPriorityFeePerGas,\n messenger,\n isMax: true,\n });\n\n const result = { estimate, max, gasLimits, is7702 };\n\n // Gas-fee-token lookup must use the Safe proxy for ALL Predict withdraws,\n // not only deposit-style routes. The user's source token (pUSD) lives in\n // the Safe; the EOA is empty until the Safe.execTransaction sub-call runs\n // mid-batch. Querying the EOA for gas-fee-token availability would always\n // return nothing and force users to hold POL.\n // (`useFromOverride` only governs the gas-estimation `from` address, where\n // swap-style routes need EOA because DEX routers reject contract callers.)\n const proxyFeeTokenAccount = getPredictWithdrawFeeTokenAccount(\n request,\n transaction,\n );\n\n const gasStationCost = await resolveGasStationCost({\n accountSupports7702,\n feeTokenAccount: proxyFeeTokenAccount,\n firstStepData: {\n data,\n to,\n value,\n },\n messenger,\n nativeGasCostRaw: max.raw,\n request: {\n from,\n sourceChainId,\n sourceTokenAddress,\n },\n totalGasEstimate,\n totalItemCount: proxyFeeTokenAccount\n ? relayParams.length + 1\n : Math.max(relayParams.length, gasLimits.length),\n });\n\n if (!gasStationCost.amount) {\n return result;\n }\n\n log('Using gas fee token for source network', {\n gasFeeTokenCost: gasStationCost.amount,\n proxyFeeTokenAccount,\n });\n\n return {\n isGasFeeToken: true,\n estimate: gasStationCost.amount,\n max: gasStationCost.amount,\n gasLimits,\n is7702,\n };\n}\n\nfunction toQuoteGasTransaction(\n singleParams: RelayTransactionStep['items'][0]['data'],\n): QuoteGasTransaction {\n return {\n chainId: toHex(singleParams.chainId),\n data: singleParams.data,\n from: singleParams.from,\n gas: singleParams.gas,\n to: singleParams.to,\n value: singleParams.value ?? '0',\n };\n}\n\n/**\n * Calculate the provider fee for a Relay quote.\n *\n * @param quote - Relay quote.\n * @returns - Provider fee in USD.\n */\nfunction calculateProviderFee(quote: RelayQuote): BigNumber {\n return new BigNumber(quote.details.totalImpact.usd).abs();\n}\n\n/**\n * Build token transfer data.\n *\n * @param recipient - Recipient address.\n * @param amountRaw - Amount in raw format.\n * @returns Token transfer data.\n */\nfunction buildTokenTransferData(recipient: Hex, amountRaw: string): Hex {\n return new Interface([\n 'function transfer(address to, uint256 amount)',\n ]).encodeFunctionData('transfer', [recipient, amountRaw]) as Hex;\n}\n\n/**\n * Get transfer recipient from token transfer data.\n *\n * @param data - Token transfer data.\n * @returns Transfer recipient.\n */\nfunction getTransferRecipient(data: Hex): Hex {\n return new Interface(['function transfer(address to, uint256 amount)'])\n .decodeFunctionData('transfer', data)\n .to.toLowerCase();\n}\nfunction getSubsidizedFeeAmountUsd(\n messenger: TransactionPayControllerMessenger,\n quote: RelayQuote,\n): BigNumber {\n const subsidizedFee = quote.fees?.subsidized;\n const amountUsd = new BigNumber(subsidizedFee?.amountUsd ?? '0');\n const amountFormatted = new BigNumber(subsidizedFee?.amountFormatted ?? '0');\n\n if (!subsidizedFee || amountUsd.isZero()) {\n return new BigNumber(0);\n }\n\n const isSubsidizedStablecoin = isStablecoin(\n messenger,\n toHex(subsidizedFee.currency.chainId),\n subsidizedFee.currency.address,\n );\n\n return isSubsidizedStablecoin ? amountFormatted : amountUsd;\n}\n\nfunction isStablecoin(\n messenger: TransactionPayControllerMessenger,\n chainId: string,\n tokenAddress: string,\n): boolean {\n return Boolean(\n getStablecoins(messenger)[chainId as Hex]?.includes(\n tokenAddress.toLowerCase() as Hex,\n ),\n );\n}\n\nfunction getRelayMaxQuoteDetails({\n original,\n}: TransactionPayQuote<RelayQuote>): MaxQuoteDetails {\n const firstTransactionStep = original.steps.find(\n (step): step is RelayTransactionStep => step.kind === 'transaction',\n );\n const firstStepData = firstTransactionStep?.items[0]?.data;\n\n return {\n gasLimits: original.metamask.gasLimits,\n gasStationTransactions: firstStepData\n ? {\n firstStepData,\n totalItemCount: original.steps.reduce(\n (count, step) => count + step.items.length,\n 0,\n ),\n }\n : undefined,\n isGasless: original.metamask.isExecute === true,\n isSubsidized: isSubsidizedRelayQuote(original),\n targetAmountRaw: original.details.currencyOut.amount,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"relay-submit-execute.d.ts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit-execute.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAEV,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAK3C,OAAO,KAAK,EACV,iCAAiC,EACjC,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAMxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKlE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAEjE;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,EACtC,WAAW,EAAE,eAAe,EAC5B,SAAS,EAAE,iCAAiC,EAC5C,SAAS,EAAE,iBAAiB,EAAE,GAC7B,OAAO,CAAC,GAAG,CAAC,CAWd;AAiHD,wBAAsB,sBAAsB,CAAC,EAC3C,SAAS,EACT,YAAoB,EACpB,SAAS,EACT,KAAK,EACL,qBAA6B,EAC7B,SAAS,EACT,WAAW,GACZ,EAAE;IACD,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,iCAAiC,CAAC;IAC7C,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACvC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,eAAe,CAAC;CAC9B,GAAG,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC,CA4DjD"}
1
+ {"version":3,"file":"relay-submit-execute.d.ts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit-execute.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,KAAK,EAEV,eAAe,EAChB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAK3C,OAAO,KAAK,EACV,iCAAiC,EACjC,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAKxB,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKlE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAEjE;AAED,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,EACtC,WAAW,EAAE,eAAe,EAC5B,SAAS,EAAE,iCAAiC,EAC5C,SAAS,EAAE,iBAAiB,EAAE,GAC7B,OAAO,CAAC,GAAG,CAAC,CAWd;AAiHD,wBAAsB,sBAAsB,CAAC,EAC3C,SAAS,EACT,YAAoB,EACpB,SAAS,EACT,KAAK,EACL,qBAA6B,EAC7B,SAAS,EACT,WAAW,GACZ,EAAE;IACD,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,iCAAiC,CAAC;IAC7C,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACvC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,eAAe,CAAC;CAC9B,GAAG,OAAO,CAAC,IAAI,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC,CA2DjD"}
@@ -4,7 +4,6 @@ import { BigNumber } from 'bignumber.js';
4
4
  import { projectLogger } from '../../logger.js';
5
5
  import { prefixError } from '../../utils/error-prefix.js';
6
6
  import { getNetworkClientId } from '../../utils/provider.js';
7
- import { getEvmQuoteSource } from '../../utils/token.js';
8
7
  import { FALLBACK_HASH } from './constants.js';
9
8
  import { submitRelayExecute } from './relay-api.js';
10
9
  const log = createModuleLogger(projectLogger, 'relay-strategy');
@@ -92,8 +91,7 @@ function replaceFirstStepRequestId(quote, requestId) {
92
91
  quote.steps = [{ ...existingStep, requestId }, ...remainingSteps];
93
92
  }
94
93
  export async function getRelayExecuteRequest({ allParams, isSubsidized = false, messenger, quote, regenerateBatchParams = false, requestId, transaction, }) {
95
- const { from } = quote.request;
96
- const { chainId: sourceChainId } = getEvmQuoteSource(quote.request);
94
+ const { from, sourceChainId } = quote.request;
97
95
  const networkClientId = getNetworkClientId(messenger, sourceChainId);
98
96
  const nestedTransactions = allParams.map((param) => ({
99
97
  data: (param.data ?? '0x'),
@@ -1 +1 @@
1
- {"version":3,"file":"relay-submit-execute.js","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit-execute.ts"],"names":[],"mappings":"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","sourcesContent":["import { generateEIP7702BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionParams } from '@metamask/transaction-controller';\nimport type {\n AuthorizationList,\n TransactionMeta,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { projectLogger } from '../../logger.js';\nimport type {\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types.js';\nimport { prefixError } from '../../utils/error-prefix.js';\nimport { getNetworkClientId } from '../../utils/provider.js';\nimport { getEvmQuoteSource } from '../../utils/token.js';\nimport { FALLBACK_HASH } from './constants.js';\nimport { submitRelayExecute } from './relay-api.js';\nimport type { RelayExecuteRequest, RelayQuote } from './types.js';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\nconst RELAY_EXECUTE_ERROR_PREFIX = 'Execute: ';\n\nexport function isSubsidizedRelayQuote(quote: RelayQuote): boolean {\n return Number(quote.fees?.subsidized?.amountUsd ?? '0') > 0;\n}\n\nexport async function submitViaRelayExecute(\n quote: TransactionPayQuote<RelayQuote>,\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n allParams: TransactionParams[],\n): Promise<Hex> {\n try {\n return await submitViaRelayExecuteInternal(\n quote,\n transaction,\n messenger,\n allParams,\n );\n } catch (error) {\n throw prefixError(error, RELAY_EXECUTE_ERROR_PREFIX);\n }\n}\n\nasync function submitViaRelayExecuteInternal(\n quote: TransactionPayQuote<RelayQuote>,\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n allParams: TransactionParams[],\n): Promise<Hex> {\n const isSubsidized = isSubsidizedRelayQuote(quote.original);\n const requestId = getRelayExecuteRequestId(quote.original);\n const metamask = getRelayExecuteMetamask(quote.original, isSubsidized);\n\n const core = await getRelayExecuteRequest({\n allParams,\n isSubsidized,\n messenger,\n quote,\n regenerateBatchParams: true,\n requestId,\n transaction,\n });\n\n const executeBody: RelayExecuteRequest = { ...core, metamask };\n\n log('Submitting to Relay execute', { executeBody, from: quote.request.from });\n\n const result = await submitRelayExecute(messenger, executeBody);\n\n log('Relay execute response', result);\n\n // Server may return a different requestId (e.g. after JIT quote for subsidized).\n // Replace the original quote requestId so waitForRelayCompletion polls the correct request.\n replaceFirstStepRequestId(quote.original, result.requestId);\n\n return FALLBACK_HASH;\n}\n\nfunction stripRelayExecuteMarker(requestId: string): string {\n return requestId.includes('#mm')\n ? requestId.slice(0, requestId.indexOf('#mm'))\n : requestId;\n}\n\nfunction getRelayExecuteRequestId(quote: RelayQuote): string {\n const requestId = quote.steps?.[0]?.requestId;\n if (!requestId) {\n throw new Error('Missing requestId in quote step');\n }\n return stripRelayExecuteMarker(requestId);\n}\n\nfunction getRelayExecuteMetamask(\n quote: RelayQuote,\n isSubsidized: boolean,\n): {\n isSubsidized: boolean;\n quoteRequest: RelayQuote['request'];\n signature: string;\n} {\n const signature = quote.metamask?.signature;\n if (!signature) {\n throw new Error(\n 'Missing metamask.signature — cannot submit to /relay/execute without the HMAC token',\n );\n }\n return {\n isSubsidized,\n quoteRequest: quote.request,\n signature,\n };\n}\n\nfunction mapAuthorizationList(\n authorizationList: AuthorizationList | undefined,\n): {\n authorizationList?: {\n chainId: number;\n address: Hex;\n nonce: number;\n yParity: number;\n r: Hex;\n s: Hex;\n }[];\n} {\n if (!authorizationList?.length) {\n return {};\n }\n return {\n authorizationList: authorizationList.map((auth) => ({\n chainId: Number(auth.chainId),\n address: auth.address,\n nonce: Number(auth.nonce),\n yParity: Number(auth.yParity),\n r: auth.r as Hex,\n s: auth.s as Hex,\n })),\n };\n}\n\nfunction replaceFirstStepRequestId(quote: RelayQuote, requestId: string): void {\n /* istanbul ignore next: requestId is read from steps[0] earlier, so steps is non-empty here; defensive guard. */\n const steps = quote.steps ?? [];\n /* istanbul ignore if: requestId is read from steps[0] earlier, so steps is non-empty here; defensive guard. */\n if (steps.length === 0) {\n throw new Error('Cannot update requestId — quote has no steps');\n }\n\n const existingStep = steps[0];\n const remainingSteps = steps.slice(1);\n\n quote.steps = [{ ...existingStep, requestId }, ...remainingSteps];\n}\n\nexport async function getRelayExecuteRequest({\n allParams,\n isSubsidized = false,\n messenger,\n quote,\n regenerateBatchParams = false,\n requestId,\n transaction,\n}: {\n allParams: TransactionParams[];\n isSubsidized?: boolean;\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelayQuote>;\n regenerateBatchParams?: boolean;\n requestId: string;\n transaction: TransactionMeta;\n}): Promise<Omit<RelayExecuteRequest, 'metamask'>> {\n const { from } = quote.request;\n const { chainId: sourceChainId } = getEvmQuoteSource(quote.request);\n const networkClientId = getNetworkClientId(messenger, sourceChainId);\n\n const nestedTransactions = allParams.map((param) => ({\n data: (param.data ?? '0x') as Hex,\n to: param.to as Hex,\n value: (param.value ?? '0x0') as Hex,\n }));\n\n let txParams = { ...transaction.txParams, from };\n\n if (regenerateBatchParams) {\n // Regenerate `txParams` so it matches the current quote's nested transactions.\n // The original `transaction.txParams` may be stale (from a previous quote), and\n // downstream delegation caveats are built from `txParams.data`, so it must reflect\n // the transactions being redeemed. A single nested transaction is used directly;\n // multiple are wrapped into an atomic EIP-7702 (ERC-7821) batch.\n const batchParams =\n nestedTransactions.length === 1\n ? nestedTransactions[0]\n : generateEIP7702BatchTransaction(from, nestedTransactions);\n txParams = {\n ...txParams,\n to: batchParams.to,\n value: batchParams.value ?? '0x0',\n data: batchParams.data,\n };\n }\n\n const executionTransaction: TransactionMeta = {\n ...transaction,\n chainId: sourceChainId,\n networkClientId,\n nestedTransactions,\n txParams,\n };\n\n const delegation = await messenger.call(\n 'TransactionPayController:getDelegationTransaction',\n { transaction: executionTransaction, isSubsidized },\n );\n\n log('Delegation result for execute request', delegation);\n\n return {\n executionKind: 'rawCalls',\n data: {\n chainId: Number(sourceChainId),\n to: delegation.to,\n data: delegation.data,\n value: new BigNumber(delegation.value).toFixed(),\n ...mapAuthorizationList(delegation.authorizationList),\n },\n executionOptions: {\n subsidizeFees: false,\n },\n requestId,\n };\n}\n"]}
1
+ {"version":3,"file":"relay-submit-execute.js","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit-execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,+BAA+B,EAAE,MAAM,kCAAkC,CAAC;AAOnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKhD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGpD,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;AAChE,MAAM,0BAA0B,GAAG,WAAW,CAAC;AAE/C,MAAM,UAAU,sBAAsB,CAAC,KAAiB;IACtD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAsC,EACtC,WAA4B,EAC5B,SAA4C,EAC5C,SAA8B;IAE9B,IAAI,CAAC;QACH,OAAO,MAAM,6BAA6B,CACxC,KAAK,EACL,WAAW,EACX,SAAS,EACT,SAAS,CACV,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,WAAW,CAAC,KAAK,EAAE,0BAA0B,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,6BAA6B,CAC1C,KAAsC,EACtC,WAA4B,EAC5B,SAA4C,EAC5C,SAA8B;IAE9B,MAAM,YAAY,GAAG,sBAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,wBAAwB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAEvE,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC;QACxC,SAAS;QACT,YAAY;QACZ,SAAS;QACT,KAAK;QACL,qBAAqB,EAAE,IAAI;QAC3B,SAAS;QACT,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,WAAW,GAAwB,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC;IAE/D,GAAG,CAAC,6BAA6B,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAE9E,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEhE,GAAG,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC;IAEtC,iFAAiF;IACjF,4FAA4F;IAC5F,yBAAyB,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAE5D,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAS,uBAAuB,CAAC,SAAiB;IAChD,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC9B,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAiB;IACjD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;IAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,uBAAuB,CAAC,SAAS,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,uBAAuB,CAC9B,KAAiB,EACjB,YAAqB;IAMrB,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAC;IACJ,CAAC;IACD,OAAO;QACL,YAAY;QACZ,YAAY,EAAE,KAAK,CAAC,OAAO;QAC3B,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,iBAAgD;IAWhD,IAAI,CAAC,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO;QACL,iBAAiB,EAAE,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAClD,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;YACzB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YAC7B,CAAC,EAAE,IAAI,CAAC,CAAQ;YAChB,CAAC,EAAE,IAAI,CAAC,CAAQ;SACjB,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAiB,EAAE,SAAiB;IACrE,iHAAiH;IACjH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;IAChC,+GAA+G;IAC/G,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEtC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,YAAY,EAAE,SAAS,EAAE,EAAE,GAAG,cAAc,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,EAC3C,SAAS,EACT,YAAY,GAAG,KAAK,EACpB,SAAS,EACT,KAAK,EACL,qBAAqB,GAAG,KAAK,EAC7B,SAAS,EACT,WAAW,GASZ;IACC,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9C,MAAM,eAAe,GAAG,kBAAkB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAErE,MAAM,kBAAkB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnD,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAQ;QACjC,EAAE,EAAE,KAAK,CAAC,EAAS;QACnB,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAQ;KACrC,CAAC,CAAC,CAAC;IAEJ,IAAI,QAAQ,GAAG,EAAE,GAAG,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IAEjD,IAAI,qBAAqB,EAAE,CAAC;QAC1B,+EAA+E;QAC/E,gFAAgF;QAChF,mFAAmF;QACnF,iFAAiF;QACjF,iEAAiE;QACjE,MAAM,WAAW,GACf,kBAAkB,CAAC,MAAM,KAAK,CAAC;YAC7B,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACvB,CAAC,CAAC,+BAA+B,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;QAChE,QAAQ,GAAG;YACT,GAAG,QAAQ;YACX,EAAE,EAAE,WAAW,CAAC,EAAE;YAClB,KAAK,EAAE,WAAW,CAAC,KAAK,IAAI,KAAK;YACjC,IAAI,EAAE,WAAW,CAAC,IAAI;SACvB,CAAC;IACJ,CAAC;IAED,MAAM,oBAAoB,GAAoB;QAC5C,GAAG,WAAW;QACd,OAAO,EAAE,aAAa;QACtB,eAAe;QACf,kBAAkB;QAClB,QAAQ;KACT,CAAC;IAEF,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,IAAI,CACrC,mDAAmD,EACnD,EAAE,WAAW,EAAE,oBAAoB,EAAE,YAAY,EAAE,CACpD,CAAC;IAEF,GAAG,CAAC,uCAAuC,EAAE,UAAU,CAAC,CAAC;IAEzD,OAAO;QACL,aAAa,EAAE,UAAU;QACzB,IAAI,EAAE;YACJ,OAAO,EAAE,MAAM,CAAC,aAAa,CAAC;YAC9B,EAAE,EAAE,UAAU,CAAC,EAAE;YACjB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,KAAK,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;YAChD,GAAG,oBAAoB,CAAC,UAAU,CAAC,iBAAiB,CAAC;SACtD;QACD,gBAAgB,EAAE;YAChB,aAAa,EAAE,KAAK;SACrB;QACD,SAAS;KACV,CAAC;AACJ,CAAC","sourcesContent":["import { generateEIP7702BatchTransaction } from '@metamask/transaction-controller';\nimport type { TransactionParams } from '@metamask/transaction-controller';\nimport type {\n AuthorizationList,\n TransactionMeta,\n} from '@metamask/transaction-controller';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\nimport { BigNumber } from 'bignumber.js';\n\nimport { projectLogger } from '../../logger.js';\nimport type {\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types.js';\nimport { prefixError } from '../../utils/error-prefix.js';\nimport { getNetworkClientId } from '../../utils/provider.js';\nimport { FALLBACK_HASH } from './constants.js';\nimport { submitRelayExecute } from './relay-api.js';\nimport type { RelayExecuteRequest, RelayQuote } from './types.js';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\nconst RELAY_EXECUTE_ERROR_PREFIX = 'Execute: ';\n\nexport function isSubsidizedRelayQuote(quote: RelayQuote): boolean {\n return Number(quote.fees?.subsidized?.amountUsd ?? '0') > 0;\n}\n\nexport async function submitViaRelayExecute(\n quote: TransactionPayQuote<RelayQuote>,\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n allParams: TransactionParams[],\n): Promise<Hex> {\n try {\n return await submitViaRelayExecuteInternal(\n quote,\n transaction,\n messenger,\n allParams,\n );\n } catch (error) {\n throw prefixError(error, RELAY_EXECUTE_ERROR_PREFIX);\n }\n}\n\nasync function submitViaRelayExecuteInternal(\n quote: TransactionPayQuote<RelayQuote>,\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n allParams: TransactionParams[],\n): Promise<Hex> {\n const isSubsidized = isSubsidizedRelayQuote(quote.original);\n const requestId = getRelayExecuteRequestId(quote.original);\n const metamask = getRelayExecuteMetamask(quote.original, isSubsidized);\n\n const core = await getRelayExecuteRequest({\n allParams,\n isSubsidized,\n messenger,\n quote,\n regenerateBatchParams: true,\n requestId,\n transaction,\n });\n\n const executeBody: RelayExecuteRequest = { ...core, metamask };\n\n log('Submitting to Relay execute', { executeBody, from: quote.request.from });\n\n const result = await submitRelayExecute(messenger, executeBody);\n\n log('Relay execute response', result);\n\n // Server may return a different requestId (e.g. after JIT quote for subsidized).\n // Replace the original quote requestId so waitForRelayCompletion polls the correct request.\n replaceFirstStepRequestId(quote.original, result.requestId);\n\n return FALLBACK_HASH;\n}\n\nfunction stripRelayExecuteMarker(requestId: string): string {\n return requestId.includes('#mm')\n ? requestId.slice(0, requestId.indexOf('#mm'))\n : requestId;\n}\n\nfunction getRelayExecuteRequestId(quote: RelayQuote): string {\n const requestId = quote.steps?.[0]?.requestId;\n if (!requestId) {\n throw new Error('Missing requestId in quote step');\n }\n return stripRelayExecuteMarker(requestId);\n}\n\nfunction getRelayExecuteMetamask(\n quote: RelayQuote,\n isSubsidized: boolean,\n): {\n isSubsidized: boolean;\n quoteRequest: RelayQuote['request'];\n signature: string;\n} {\n const signature = quote.metamask?.signature;\n if (!signature) {\n throw new Error(\n 'Missing metamask.signature — cannot submit to /relay/execute without the HMAC token',\n );\n }\n return {\n isSubsidized,\n quoteRequest: quote.request,\n signature,\n };\n}\n\nfunction mapAuthorizationList(\n authorizationList: AuthorizationList | undefined,\n): {\n authorizationList?: {\n chainId: number;\n address: Hex;\n nonce: number;\n yParity: number;\n r: Hex;\n s: Hex;\n }[];\n} {\n if (!authorizationList?.length) {\n return {};\n }\n return {\n authorizationList: authorizationList.map((auth) => ({\n chainId: Number(auth.chainId),\n address: auth.address,\n nonce: Number(auth.nonce),\n yParity: Number(auth.yParity),\n r: auth.r as Hex,\n s: auth.s as Hex,\n })),\n };\n}\n\nfunction replaceFirstStepRequestId(quote: RelayQuote, requestId: string): void {\n /* istanbul ignore next: requestId is read from steps[0] earlier, so steps is non-empty here; defensive guard. */\n const steps = quote.steps ?? [];\n /* istanbul ignore if: requestId is read from steps[0] earlier, so steps is non-empty here; defensive guard. */\n if (steps.length === 0) {\n throw new Error('Cannot update requestId — quote has no steps');\n }\n\n const existingStep = steps[0];\n const remainingSteps = steps.slice(1);\n\n quote.steps = [{ ...existingStep, requestId }, ...remainingSteps];\n}\n\nexport async function getRelayExecuteRequest({\n allParams,\n isSubsidized = false,\n messenger,\n quote,\n regenerateBatchParams = false,\n requestId,\n transaction,\n}: {\n allParams: TransactionParams[];\n isSubsidized?: boolean;\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelayQuote>;\n regenerateBatchParams?: boolean;\n requestId: string;\n transaction: TransactionMeta;\n}): Promise<Omit<RelayExecuteRequest, 'metamask'>> {\n const { from, sourceChainId } = quote.request;\n const networkClientId = getNetworkClientId(messenger, sourceChainId);\n\n const nestedTransactions = allParams.map((param) => ({\n data: (param.data ?? '0x') as Hex,\n to: param.to as Hex,\n value: (param.value ?? '0x0') as Hex,\n }));\n\n let txParams = { ...transaction.txParams, from };\n\n if (regenerateBatchParams) {\n // Regenerate `txParams` so it matches the current quote's nested transactions.\n // The original `transaction.txParams` may be stale (from a previous quote), and\n // downstream delegation caveats are built from `txParams.data`, so it must reflect\n // the transactions being redeemed. A single nested transaction is used directly;\n // multiple are wrapped into an atomic EIP-7702 (ERC-7821) batch.\n const batchParams =\n nestedTransactions.length === 1\n ? nestedTransactions[0]\n : generateEIP7702BatchTransaction(from, nestedTransactions);\n txParams = {\n ...txParams,\n to: batchParams.to,\n value: batchParams.value ?? '0x0',\n data: batchParams.data,\n };\n }\n\n const executionTransaction: TransactionMeta = {\n ...transaction,\n chainId: sourceChainId,\n networkClientId,\n nestedTransactions,\n txParams,\n };\n\n const delegation = await messenger.call(\n 'TransactionPayController:getDelegationTransaction',\n { transaction: executionTransaction, isSubsidized },\n );\n\n log('Delegation result for execute request', delegation);\n\n return {\n executionKind: 'rawCalls',\n data: {\n chainId: Number(sourceChainId),\n to: delegation.to,\n data: delegation.data,\n value: new BigNumber(delegation.value).toFixed(),\n ...mapAuthorizationList(delegation.authorizationList),\n },\n executionOptions: {\n subsidizeFees: false,\n },\n requestId,\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"relay-submit.d.ts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAKV,eAAe,EACf,iBAAiB,EAClB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAK3C,OAAO,KAAK,EACV,yBAAyB,EACzB,iCAAiC,EACjC,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAyCxB,OAAO,KAAK,EAEV,UAAU,EAIX,MAAM,YAAY,CAAC;AAUpB,MAAM,MAAM,gBAAgB,GAAG;IAAE,KAAK,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAAC;AAE9D;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,yBAAyB,CAAC,UAAU,CAAC,GAC7C,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAMpC;AAED,wBAAsB,mBAAmB,CAAC,EACxC,SAAS,EACT,KAAK,EACL,WAAW,GACZ,EAAE;IACD,SAAS,EAAE,iCAAiC,CAAC;IAC7C,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACvC,WAAW,EAAE,eAAe,CAAC;CAC9B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAO5B"}
1
+ {"version":3,"file":"relay-submit.d.ts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAKV,eAAe,EACf,iBAAiB,EAClB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAK3C,OAAO,KAAK,EACV,yBAAyB,EACzB,iCAAiC,EACjC,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAwCxB,OAAO,KAAK,EAEV,UAAU,EAIX,MAAM,YAAY,CAAC;AAUpB,MAAM,MAAM,gBAAgB,GAAG;IAAE,KAAK,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAAC;AAE9D;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,yBAAyB,CAAC,UAAU,CAAC,GAC7C,OAAO,CAAC;IAAE,eAAe,CAAC,EAAE,GAAG,CAAA;CAAE,CAAC,CAMpC;AAED,wBAAsB,mBAAmB,CAAC,EACxC,SAAS,EACT,KAAK,EACL,WAAW,GACZ,EAAE;IACD,SAAS,EAAE,iCAAiC,CAAC;IAC7C,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACvC,WAAW,EAAE,eAAe,CAAC;CAC9B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAO5B"}
@@ -10,7 +10,7 @@ import { logGasPaymentOutcome, resolveGasPayment, } from '../../utils/gas-paymen
10
10
  import { submitPolymarketWithdraw, sweepPolymarketDepositWallet, } from '../../utils/polymarket/withdraw.js';
11
11
  import { getNetworkClientId } from '../../utils/provider.js';
12
12
  import { submitSecondLeg } from '../../utils/second-leg.js';
13
- import { getEvmQuoteSource, getLiveTokenBalanceOrUndefined, normalizeTokenAddress, TokenAddressTarget, } from '../../utils/token.js';
13
+ import { getLiveTokenBalanceOrUndefined, normalizeTokenAddress, TokenAddressTarget, } from '../../utils/token.js';
14
14
  import { collectTransactionIds, getTransaction, updateTransaction, waitForTransactionConfirmed, } from '../../utils/transaction.js';
15
15
  import { FALLBACK_HASH, RELAY_DEPOSIT_TYPES, RELAY_FAILURE_STATUSES, RELAY_PENDING_STATUSES, } from './constants.js';
16
16
  import { getRelayDepositData } from './deposit-step.js';
@@ -222,7 +222,7 @@ function getSettlementHash({ completion, quote, submittedSourceHash, }) {
222
222
  if (completion.targetHash && completion.targetHash !== FALLBACK_HASH) {
223
223
  return completion.targetHash;
224
224
  }
225
- const isSameChain = getEvmQuoteSource(quote.request).chainId === quote.request.targetChainId;
225
+ const isSameChain = quote.request.sourceChainId === quote.request.targetChainId;
226
226
  if (isSameChain && submittedSourceHash !== FALLBACK_HASH) {
227
227
  return submittedSourceHash;
228
228
  }
@@ -334,8 +334,7 @@ function normalizeParams(params, messenger) {
334
334
  * @param messenger - Controller messenger.
335
335
  */
336
336
  async function validateSourceBalance(quote, messenger) {
337
- const { from } = quote.request;
338
- const { chainId: sourceChainId, tokenAddress: sourceTokenAddress } = getEvmQuoteSource(quote.request);
337
+ const { from, sourceChainId, sourceTokenAddress } = quote.request;
339
338
  const normalizedSourceTokenAddress = normalizeTokenAddress(sourceTokenAddress, sourceChainId, TokenAddressTarget.MetaMask);
340
339
  const currentBalance = await getLiveTokenBalanceOrUndefined(messenger, from, sourceChainId, normalizedSourceTokenAddress);
341
340
  // An unreadable balance is unknown, not insufficient. Submit anyway and let
@@ -503,8 +502,8 @@ async function buildDelegatedOriginalParams(transaction, messenger, relayParams)
503
502
  */
504
503
  async function submitViaTransactionController(quote, transaction, messenger, normalizedParams, allParams) {
505
504
  const transactionIds = [];
506
- const { from, isPostQuote } = quote.request;
507
- const { chainId: sourceChainId, tokenAddress: sourceTokenAddress } = getEvmQuoteSource(quote.request);
505
+ const { from, sourceChainId, sourceTokenAddress } = quote.request;
506
+ const { isPostQuote } = quote.request;
508
507
  const networkClientId = getNetworkClientId(messenger, sourceChainId);
509
508
  log('Adding transactions', {
510
509
  normalizedParams: allParams,
@@ -617,8 +616,7 @@ function mapSignedQuoteAuthorizationList(authorizationList) {
617
616
  }));
618
617
  }
619
618
  function buildRelayTransactionBatchRequest({ allParams, authorizationList, gasPayment, messenger, normalizedParams, quote, transaction, }) {
620
- const { from } = quote.request;
621
- const { chainId: sourceChainId } = getEvmQuoteSource(quote.request);
619
+ const { from, sourceChainId } = quote.request;
622
620
  const { metamask } = quote.original;
623
621
  const networkClientId = getNetworkClientId(messenger, sourceChainId);
624
622
  const gasLimit7702 = getGasLimit7702(quote);