@metamask-previews/transaction-pay-controller 31.2.1-preview-e80304db4 → 31.2.1-preview-1d88b8ba5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -1
- package/dist/TransactionPayController.d.ts.map +1 -1
- package/dist/TransactionPayController.js +4 -5
- package/dist/TransactionPayController.js.map +1 -1
- package/dist/actions/update-payment-token.d.ts.map +1 -1
- package/dist/actions/update-payment-token.js +51 -22
- package/dist/actions/update-payment-token.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/strategy/across/AcrossStrategy.d.ts.map +1 -1
- package/dist/strategy/across/AcrossStrategy.js +6 -1
- package/dist/strategy/across/AcrossStrategy.js.map +1 -1
- package/dist/strategy/across/across-quotes.js +7 -4
- package/dist/strategy/across/across-quotes.js.map +1 -1
- package/dist/strategy/across/across-submit.d.ts.map +1 -1
- package/dist/strategy/across/across-submit.js +3 -1
- package/dist/strategy/across/across-submit.js.map +1 -1
- package/dist/strategy/fiat/FiatStrategy.d.ts +1 -0
- package/dist/strategy/fiat/FiatStrategy.d.ts.map +1 -1
- package/dist/strategy/fiat/FiatStrategy.js +4 -0
- package/dist/strategy/fiat/FiatStrategy.js.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.d.ts.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.js +4 -2
- package/dist/strategy/fiat/fiat-direct-musd.js.map +1 -1
- package/dist/strategy/fiat/fiat-quotes.d.ts.map +1 -1
- package/dist/strategy/fiat/fiat-quotes.js +4 -2
- package/dist/strategy/fiat/fiat-quotes.js.map +1 -1
- package/dist/strategy/fiat/fiat-submit.d.ts.map +1 -1
- package/dist/strategy/fiat/fiat-submit.js +5 -2
- package/dist/strategy/fiat/fiat-submit.js.map +1 -1
- package/dist/strategy/fiat/fiat-test-funding.d.ts.map +1 -1
- package/dist/strategy/fiat/fiat-test-funding.js +3 -5
- package/dist/strategy/fiat/fiat-test-funding.js.map +1 -1
- package/dist/strategy/relay/RelayStrategy.d.ts +4 -0
- package/dist/strategy/relay/RelayStrategy.d.ts.map +1 -1
- package/dist/strategy/relay/RelayStrategy.js +6 -1
- package/dist/strategy/relay/RelayStrategy.js.map +1 -1
- package/dist/strategy/relay/relay-quotes.d.ts.map +1 -1
- package/dist/strategy/relay/relay-quotes.js +10 -6
- package/dist/strategy/relay/relay-quotes.js.map +1 -1
- package/dist/strategy/relay/relay-submit-execute.d.ts.map +1 -1
- package/dist/strategy/relay/relay-submit-execute.js +3 -1
- package/dist/strategy/relay/relay-submit-execute.js.map +1 -1
- package/dist/strategy/relay/relay-submit.d.ts.map +1 -1
- package/dist/strategy/relay/relay-submit.js +8 -6
- package/dist/strategy/relay/relay-submit.js.map +1 -1
- package/dist/strategy/relay/relay-validation.d.ts.map +1 -1
- package/dist/strategy/relay/relay-validation.js +5 -2
- package/dist/strategy/relay/relay-validation.js.map +1 -1
- package/dist/strategy/server/ServerStrategy.d.ts.map +1 -1
- package/dist/strategy/server/ServerStrategy.js +4 -0
- package/dist/strategy/server/ServerStrategy.js.map +1 -1
- package/dist/strategy/server/server-quotes.d.ts.map +1 -1
- package/dist/strategy/server/server-quotes.js +54 -11
- package/dist/strategy/server/server-quotes.js.map +1 -1
- package/dist/strategy/server/server-submit.d.ts.map +1 -1
- package/dist/strategy/server/server-submit.js +9 -6
- package/dist/strategy/server/server-submit.js.map +1 -1
- package/dist/strategy/server/server-support.d.ts +1 -3
- package/dist/strategy/server/server-support.d.ts.map +1 -1
- package/dist/strategy/server/server-support.js +0 -5
- package/dist/strategy/server/server-support.js.map +1 -1
- package/dist/strategy/server/server-validation.d.ts.map +1 -1
- package/dist/strategy/server/server-validation.js +3 -1
- package/dist/strategy/server/server-validation.js.map +1 -1
- package/dist/types.d.ts +60 -25
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/account.d.ts +54 -0
- package/dist/utils/account.d.ts.map +1 -1
- package/dist/utils/account.js +124 -0
- package/dist/utils/account.js.map +1 -1
- package/dist/utils/gas-payment.d.ts +12 -3
- package/dist/utils/gas-payment.d.ts.map +1 -1
- package/dist/utils/gas-payment.js +2 -2
- package/dist/utils/gas-payment.js.map +1 -1
- package/dist/utils/max-gas-station.d.ts.map +1 -1
- package/dist/utils/max-gas-station.js +9 -5
- package/dist/utils/max-gas-station.js.map +1 -1
- package/dist/utils/max-quote.js +3 -2
- package/dist/utils/max-quote.js.map +1 -1
- package/dist/utils/no-op-quote.d.ts +3 -3
- package/dist/utils/no-op-quote.d.ts.map +1 -1
- package/dist/utils/no-op-quote.js +4 -3
- package/dist/utils/no-op-quote.js.map +1 -1
- package/dist/utils/perps.d.ts.map +1 -1
- package/dist/utils/perps.js +5 -2
- package/dist/utils/perps.js.map +1 -1
- package/dist/utils/post-quote.js +4 -3
- package/dist/utils/post-quote.js.map +1 -1
- package/dist/utils/quotes.d.ts.map +1 -1
- package/dist/utils/quotes.js +99 -25
- package/dist/utils/quotes.js.map +1 -1
- package/dist/utils/source-amounts.d.ts.map +1 -1
- package/dist/utils/source-amounts.js +25 -4
- package/dist/utils/source-amounts.js.map +1 -1
- package/dist/utils/token.d.ts +84 -1
- package/dist/utils/token.d.ts.map +1 -1
- package/dist/utils/token.js +144 -13
- package/dist/utils/token.js.map +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +14 -11
- package/dist/utils/validation.js.map +1 -1
- package/package.json +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-submit.js","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"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","sourcesContent":["import { ORIGIN_METAMASK, toHex } from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type {\n AuthorizationList,\n BatchTransactionParams,\n TransactionBatchRequest,\n TransactionBatchSingleRequest,\n TransactionMeta,\n TransactionParams,\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 PayStrategyExecuteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types.js';\nimport { accountSupports7702 } from '../../utils/account.js';\nimport { prefixError } from '../../utils/error-prefix.js';\nimport {\n getFeatureFlags,\n getRelayPollingInterval,\n getRelayPollingTimeout,\n} from '../../utils/feature-flags.js';\nimport type { GasPayment } from '../../utils/gas-payment.js';\nimport {\n logGasPaymentOutcome,\n resolveGasPayment,\n} from '../../utils/gas-payment.js';\nimport {\n submitPolymarketWithdraw,\n sweepPolymarketDepositWallet,\n} from '../../utils/polymarket/withdraw.js';\nimport { getNetworkClientId } from '../../utils/provider.js';\nimport { submitSecondLeg } from '../../utils/second-leg.js';\nimport {\n getLiveTokenBalanceOrUndefined,\n normalizeTokenAddress,\n TokenAddressTarget,\n} from '../../utils/token.js';\nimport {\n collectTransactionIds,\n getTransaction,\n updateTransaction,\n waitForTransactionConfirmed,\n} from '../../utils/transaction.js';\nimport {\n FALLBACK_HASH,\n RELAY_DEPOSIT_TYPES,\n RELAY_FAILURE_STATUSES,\n RELAY_PENDING_STATUSES,\n} from './constants.js';\nimport { getRelayDepositData } from './deposit-step.js';\nimport { submitHyperliquidWithdraw } from './hyperliquid-withdraw.js';\nimport { getRelayStatus } from './relay-api.js';\nimport { submitViaRelayExecute } from './relay-submit-execute.js';\nimport type {\n RelayCompletionOutcome,\n RelayQuote,\n RelayStatus,\n RelayStatusResponse,\n RelayTransactionStep,\n} from './types.js';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\nconst RELAY_ERROR_PREFIX = 'Relay: ';\n\ntype RelaySubmitParams = {\n allParams: TransactionParams[];\n normalizedParams: TransactionParams[];\n};\n\nexport type RelaySubmitCalls = { calls: TransactionParams[] };\n\n/**\n * Submits Relay quotes.\n *\n * @param request - Request object.\n * @returns An object containing the transaction hash if available.\n */\nexport async function submitRelayQuotes(\n request: PayStrategyExecuteRequest<RelayQuote>,\n): Promise<{ transactionHash?: Hex }> {\n try {\n return await submitRelayQuotesInternal(request);\n } catch (error) {\n throw prefixError(error, RELAY_ERROR_PREFIX);\n }\n}\n\nexport async function getRelaySubmitCalls({\n messenger,\n quote,\n transaction,\n}: {\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelayQuote>;\n transaction: TransactionMeta;\n}): Promise<RelaySubmitCalls> {\n const { allParams } = await buildRelaySubmitParams({\n messenger,\n quote,\n transaction,\n });\n return { calls: allParams };\n}\n\nasync function submitRelayQuotesInternal(\n request: PayStrategyExecuteRequest<RelayQuote>,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing quotes', request);\n\n const { quotes, messenger, transaction } = request;\n\n if (!quotes.length) {\n throw new Error('No quotes to submit');\n }\n\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 /* istanbul ignore if: concrete Relay submit paths return a hash/fallback or throw. */\n if (transactionHash === undefined) {\n throw new Error('Missing transaction hash');\n }\n\n return { transactionHash };\n}\n\n/**\n * Executes a single Relay quote.\n *\n * @param quote - Relay quote to execute.\n * @param messenger - Controller messenger.\n * @param transaction - Original transaction meta.\n * @returns An object containing the transaction hash if available.\n */\nasync function executeSingleQuote(\n quote: TransactionPayQuote<RelayQuote>,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing single quote', quote);\n\n const isPolymarket = Boolean(quote.request.isPolymarketDepositWallet);\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 let polymarketPreSubmitUsdceBalance = 0n;\n let submittedSourceHash: Hex | undefined;\n\n // Shallow clone so the server-returned requestId can be written back (state is frozen by Immer).\n const mutableOriginal: RelayQuote = { ...quote.original };\n\n if (quote.request.isHyperliquidSource) {\n await submitHyperliquidWithdraw(quote, quote.request.from, messenger);\n } else if (isPolymarket) {\n const { sourceHash, preSubmitUsdceBalance } =\n await submitPolymarketWithdraw({\n depositData: getRelayDepositData(quote.original),\n from: quote.request.from,\n messenger,\n sourceAmountRaw: quote.sourceAmount.raw,\n });\n polymarketPreSubmitUsdceBalance = preSubmitUsdceBalance;\n setRelaySourceHash(transaction, messenger, sourceHash);\n } else {\n submittedSourceHash = await submitTransactions(\n { ...quote, original: mutableOriginal },\n transaction,\n messenger,\n );\n }\n\n const completion = await waitForRelayCompletion(mutableOriginal, messenger, {\n onSourceHash: (hash) => {\n log('Source hash received', hash);\n setRelaySourceHash(transaction, messenger, hash);\n },\n tolerateFailure: isPolymarket,\n });\n\n log('Relay request completed', completion);\n\n if (isPolymarket) {\n await sweepPolymarketDepositWallet({\n from: quote.request.from,\n isRefund:\n completion.status === 'refund' || completion.status === 'refunded',\n messenger,\n preSubmitUsdceBalance: polymarketPreSubmitUsdceBalance,\n });\n\n if (completion.status !== 'success') {\n throw new Error(`Request failed with status: ${completion.status}`);\n }\n }\n\n // Non-atomic flow: the quote bridged funds to `recipient` without embedding\n // the second leg. Now that Relay has settled, resolve the settled amount from\n // the on-chain Transfer log and submit the second-leg batch (approve + vault\n // deposit) sponsored from `recipient`.\n const { transactionHash: secondLegHash } =\n quote.request.atomic === false && completion.status === 'success'\n ? await submitPostNonAtomic({\n completion,\n messenger,\n quote,\n submittedSourceHash,\n transaction,\n })\n : {};\n\n // Only complete once every leg has landed, so a failed second leg does not\n // leave the parent transaction flagged as achieved.\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Intent complete after Relay completion',\n },\n (tx) => {\n tx.isIntentComplete = true;\n },\n );\n\n return { transactionHash: secondLegHash ?? completion.targetHash };\n}\n\n/**\n * Runs the second leg of a non-atomic Relay quote on the target chain from\n * `quote.request.recipient`, where the funds settled (derived at quote time by\n * `resolveNonAtomicRecipient`). Post-quote flows build their calls via the\n * client `getPaymentOverrideData` callback; non-post-quote flows fall through\n * to the transaction's own nested calls re-encoded via `getAmountData`.\n *\n * @param options - Submit options.\n * @param options.completion - Outcome of `waitForRelayCompletion`.\n * @param options.messenger - Controller messenger.\n * @param options.quote - The Relay quote that was submitted.\n * @param options.submittedSourceHash - Hash of the submitted source\n * transaction, used as the settlement hash when Relay skips polling on\n * same-chain flows.\n * @param options.transaction - Original transaction meta.\n * @returns Hash of the final submitted child transaction, if available.\n */\nasync function submitPostNonAtomic({\n completion,\n messenger,\n quote,\n submittedSourceHash,\n transaction,\n}: {\n completion: RelayCompletionOutcome;\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelayQuote>;\n submittedSourceHash?: Hex;\n transaction: TransactionMeta;\n}): Promise<{ transactionHash?: Hex }> {\n const { from, isPostQuote, recipient, targetChainId, targetTokenAddress } =\n quote.request;\n\n return await submitSecondLeg({\n chainId: targetChainId,\n from: recipient ?? from,\n getCalls: isPostQuote\n ? async (sourceAmountRaw): Promise<BatchTransactionParams[]> =>\n await buildPostQuoteDepositCalls({\n messenger,\n quote,\n sourceAmountRaw,\n transaction,\n })\n : undefined,\n messenger,\n settlementHash: getSettlementHash({\n completion,\n quote,\n submittedSourceHash,\n }),\n tokenAddress: targetTokenAddress,\n transaction,\n });\n}\n\n/**\n * Builds the second-leg batch for a post-quote flow whose parent transaction\n * carries no vault calls, via the client `getPaymentOverrideData` callback.\n *\n * @param options - Build options.\n * @param options.messenger - Controller messenger.\n * @param options.quote - The Relay quote that was submitted.\n * @param options.sourceAmountRaw - Settled amount in raw units.\n * @param options.transaction - Original transaction meta.\n * @returns The batch calls.\n */\nasync function buildPostQuoteDepositCalls({\n messenger,\n quote,\n sourceAmountRaw,\n transaction,\n}: {\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelayQuote>;\n sourceAmountRaw: string;\n transaction: TransactionMeta;\n}): Promise<BatchTransactionParams[]> {\n const { transactionData } = messenger.call(\n 'TransactionPayController:getState',\n );\n\n const { decimals } = quote.original.details.currencyOut.currency;\n const amountHuman = new BigNumber(sourceAmountRaw)\n .shiftedBy(-decimals)\n .toFixed();\n\n const { calls } = await messenger.call(\n 'TransactionPayController:getPaymentOverrideData',\n {\n amount: amountHuman,\n transaction,\n transactionData: transactionData[transaction.id],\n },\n );\n\n return calls;\n}\n\n/**\n * Resolves the hash of the transaction that delivered the funds to the\n * recipient.\n *\n * Cross-chain relays surface the target-chain hash from polling. Same-chain\n * relays skip polling, but the submitted source transaction itself moved the\n * funds, so its hash is used instead. Relay execute submissions return\n * `FALLBACK_HASH` rather than a real hash, leaving nothing to read.\n *\n * @param options - Resolution options.\n * @param options.completion - Outcome of `waitForRelayCompletion`.\n * @param options.quote - The Relay quote that was submitted.\n * @param options.submittedSourceHash - Hash of the submitted source\n * transaction.\n * @returns The settlement hash, or `undefined` when none is available.\n */\nfunction getSettlementHash({\n completion,\n quote,\n submittedSourceHash,\n}: {\n completion: RelayCompletionOutcome;\n quote: TransactionPayQuote<RelayQuote>;\n submittedSourceHash?: Hex;\n}): Hex | undefined {\n if (completion.targetHash && completion.targetHash !== FALLBACK_HASH) {\n return completion.targetHash;\n }\n\n const isSameChain =\n quote.request.sourceChainId === quote.request.targetChainId;\n\n if (isSameChain && submittedSourceHash !== FALLBACK_HASH) {\n return submittedSourceHash;\n }\n\n return undefined;\n}\n\nfunction setRelaySourceHash(\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n sourceHash: Hex,\n): void {\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Add source hash from Relay status',\n },\n (tx) => {\n tx.metamaskPay ??= {};\n tx.metamaskPay.sourceHash = sourceHash;\n },\n );\n}\n\nasync function waitForRelayCompletion(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n options: {\n onSourceHash?: (hash: Hex) => void;\n tolerateFailure?: boolean;\n },\n): Promise<RelayCompletionOutcome> {\n const { onSourceHash, tolerateFailure } = options;\n\n const isSameChain =\n quote.details.currencyIn.currency.chainId ===\n quote.details.currencyOut.currency.chainId;\n\n const isSingleDepositStep =\n quote.steps.length === 1 && quote.steps[0].id === 'deposit';\n\n if (isSameChain && !isSingleDepositStep) {\n log('Skipping polling as same chain');\n return { status: 'success', targetHash: FALLBACK_HASH };\n }\n\n const { requestId } = quote.steps[0];\n\n const pollingInterval = getRelayPollingInterval(messenger);\n const pollingTimeout = getRelayPollingTimeout(messenger);\n const hasTimeout = pollingTimeout !== undefined && pollingTimeout > 0;\n\n log('Polling config', { pollingInterval, pollingTimeout });\n const startTime = Date.now();\n\n let sourceHashEmitted = false;\n let lastStatus: RelayStatus | undefined;\n\n while (true) {\n let status: RelayStatusResponse | undefined;\n\n try {\n status = await getRelayStatus(messenger, requestId);\n } catch (error) {\n log('Polling network error', error);\n }\n\n if (status) {\n log('Polled status', status.status, status);\n lastStatus = status.status;\n\n if (!sourceHashEmitted && status.inTxHashes?.length) {\n sourceHashEmitted = true;\n onSourceHash?.(status.inTxHashes[0] as Hex);\n }\n\n if (status.status === 'success') {\n const targetHash =\n (status.txHashes?.slice(-1)[0] as Hex | undefined) ?? FALLBACK_HASH;\n return { status: 'success', targetHash };\n }\n\n if (!RELAY_PENDING_STATUSES.includes(status.status)) {\n if (RELAY_FAILURE_STATUSES.includes(status.status)) {\n if (tolerateFailure) {\n log('Relay ended in failure status (tolerated)', status.status);\n return { status: status.status };\n }\n throw new Error(`Request failed with status: ${status.status}`);\n }\n throw new Error(`Unrecognized status: ${status.status}`);\n }\n }\n\n if (hasTimeout && Date.now() - startTime >= pollingTimeout) {\n const statusDetail = lastStatus ? ` (last status: ${lastStatus})` : '';\n if (tolerateFailure) {\n log('Relay polling timed out (tolerated)', statusDetail);\n return { status: 'timeout' };\n }\n throw new Error(`Polling timed out${statusDetail}`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollingInterval));\n }\n}\n\n/**\n * Normalize the parameters from a relay quote step to match TransactionParams.\n *\n * @param params - Parameters from a relay quote step.\n * @param messenger - Controller messenger.\n * @returns Normalized transaction parameters.\n */\nfunction normalizeParams(\n params: RelayTransactionStep['items'][0]['data'],\n messenger: TransactionPayControllerMessenger,\n): TransactionParams {\n const featureFlags = getFeatureFlags(messenger);\n\n return {\n data: params.data,\n from: params.from,\n gas: toHex(params.gas ?? featureFlags.relayFallbackGas.max),\n maxFeePerGas:\n params.maxFeePerGas === undefined\n ? undefined\n : toHex(params.maxFeePerGas),\n maxPriorityFeePerGas:\n params.maxPriorityFeePerGas === undefined\n ? undefined\n : toHex(params.maxPriorityFeePerGas),\n to: params.to,\n value: toHex(params.value ?? '0'),\n };\n}\n\n/**\n * Validate the source token balance is sufficient for the relay deposit.\n *\n * Reads the live balance from the network and compares it against the quote's\n * required source amount to prevent submitting transactions that will revert\n * on-chain due to insufficient balance.\n *\n * This is a fast-fail optimisation, not a safety net: if the balance cannot be\n * read the check is skipped and submission proceeds, since the Relay and the\n * chain still reject an underfunded transaction.\n *\n * @param quote - Relay quote containing the required source amount.\n * @param messenger - Controller messenger.\n */\nasync function validateSourceBalance(\n quote: TransactionPayQuote<RelayQuote>,\n messenger: TransactionPayControllerMessenger,\n): Promise<void> {\n const { from, sourceChainId, sourceTokenAddress } = quote.request;\n\n const normalizedSourceTokenAddress = normalizeTokenAddress(\n sourceTokenAddress,\n sourceChainId,\n TokenAddressTarget.MetaMask,\n );\n\n const currentBalance = await getLiveTokenBalanceOrUndefined(\n messenger,\n from,\n sourceChainId,\n normalizedSourceTokenAddress,\n );\n\n // An unreadable balance is unknown, not insufficient. Submit anyway and let\n // the Relay and the chain reject a genuinely underfunded transaction.\n if (currentBalance === undefined) {\n log('Skipping source balance check: live balance unavailable', {\n from,\n sourceChainId,\n sourceTokenAddress,\n });\n return;\n }\n\n const requiredAmount = new BigNumber(quote.sourceAmount.raw);\n const balance = new BigNumber(currentBalance);\n\n log('Validating source balance', {\n from,\n sourceChainId,\n sourceTokenAddress,\n currentBalance,\n requiredAmount: requiredAmount.toString(10),\n });\n\n if (balance.isLessThan(requiredAmount)) {\n throw new Error(\n `Insufficient source token balance for relay deposit. ` +\n `Required: ${requiredAmount.toString(10)}, ` +\n `Available: ${balance.toString(10)}`,\n );\n }\n}\n\n/**\n * Submit transactions for a relay quote.\n *\n * On EIP-7702 supported chains, combines the source calls via\n * getDelegationTransaction and submits through Relay's /execute endpoint\n * (gasless — Relay's relayer pays origin gas).\n *\n * On other chains, adds the transactions directly via the\n * TransactionController and waits for on-chain confirmation.\n *\n * @param quote - Relay quote.\n * @param transaction - Original transaction meta.\n * @param messenger - Controller messenger.\n * @returns Hash of the last submitted transaction.\n */\nasync function submitTransactions(\n quote: TransactionPayQuote<RelayQuote>,\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n): Promise<Hex> {\n // In post-quote flows (e.g. Predict withdraw), the source tokens are held in\n // the Safe — not the EOA — and only become available after the original tx\n // executes as part of the batch. Skip the EOA balance check here.\n if (!quote.request.isPostQuote && !quote.request.paymentOverride) {\n await validateSourceBalance(quote, messenger);\n }\n\n const { allParams, normalizedParams } = await buildRelaySubmitParams({\n messenger,\n quote,\n transaction,\n });\n\n if (quote.original.metamask.isExecute) {\n return await submitViaRelayExecute(\n quote,\n transaction,\n messenger,\n allParams,\n );\n }\n\n return await submitViaTransactionController(\n quote,\n transaction,\n messenger,\n normalizedParams,\n allParams,\n );\n}\n\nfunction getRelayTransactionStepData(\n quote: TransactionPayQuote<RelayQuote>,\n): RelayTransactionStep['items'][0]['data'][] {\n const { steps } = quote.original;\n const supportedStepKinds = ['transaction', 'signature'];\n const invalidKind = steps.find(\n (step) => !supportedStepKinds.includes(step.kind),\n )?.kind;\n\n if (invalidKind) {\n throw new Error(`Unsupported step kind: ${invalidKind}`);\n }\n\n const txSteps = steps.filter(\n (step): step is RelayTransactionStep => step.kind === 'transaction',\n );\n\n return txSteps\n .flatMap((step) => step.items)\n .map((item) => item.data)\n .filter((data): data is RelayTransactionStep['items'][0]['data'] =>\n isRelayTransactionStepData(data),\n );\n}\n\nasync function buildRelaySubmitParams({\n messenger,\n quote,\n transaction,\n}: {\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelayQuote>;\n transaction: TransactionMeta;\n}): Promise<RelaySubmitParams> {\n const params = getRelayTransactionStepData(quote);\n const normalizedParams = params.map((singleParams) =>\n normalizeParams(singleParams, messenger),\n );\n\n // For post-quote flows, prepend the original transaction so it gets\n // included in the batch alongside the relay deposit(s).\n // This always results in multiple params, so it takes the batch path.\n // When an accountOverride is set (detected by `from` divergence between the\n // quote and the original tx), the override account does not directly hold\n // the funds for the original call, so the prepended tx is replaced with a\n // delegation tx that redeems the original call on its behalf.\n const { isPostQuote } = quote.request;\n const hasAccountOverride =\n quote.request.from.toLowerCase() !==\n (transaction.txParams.from as Hex).toLowerCase();\n\n // Non-atomic flows are excluded from the paymentOverride prepend: their\n // second leg is submitted separately by `submitPostNonAtomic` after\n // Relay completion, so prepending here would double-embed the vault deposit.\n // Cross-chain atomic flows (e.g. `moneyAccountWithdraw` on Monad settling\n // USDC on Arbitrum for Perps) still need the source-side vault withdraw +\n // transfer prepended here so Relay has funds to bridge.\n const isNonAtomic = quote.request.atomic === false;\n\n let allParams = normalizedParams;\n\n if (quote.request.paymentOverride && !isNonAtomic) {\n const { transactionData } = messenger.call(\n 'TransactionPayController:getState',\n );\n\n const { calls: overrideTxs } = await messenger.call(\n 'TransactionPayController:getPaymentOverrideData',\n {\n amount: quote.sourceAmount.human,\n transaction,\n transactionData: transactionData[transaction.id],\n },\n );\n\n if (overrideTxs.length > 0) {\n allParams = [\n ...(overrideTxs as TransactionParams[]),\n ...normalizedParams,\n ];\n }\n } else if (isPostQuote && transaction.txParams.to) {\n const prependedParams = hasAccountOverride\n ? await buildDelegatedOriginalParams(\n transaction,\n messenger,\n normalizedParams[0],\n )\n : ({\n data: transaction.txParams.data as Hex | undefined,\n from: transaction.txParams.from,\n maxFeePerGas: normalizedParams[0]?.maxFeePerGas,\n maxPriorityFeePerGas: normalizedParams[0]?.maxPriorityFeePerGas,\n to: transaction.txParams.to,\n value: transaction.txParams.value as Hex | undefined,\n } as TransactionParams);\n\n allParams = [prependedParams, ...normalizedParams];\n }\n\n return { allParams, normalizedParams };\n}\n\nfunction isRelayTransactionStepData(\n data: RelayTransactionStep['items'][0]['data'],\n): data is RelayTransactionStep['items'][0]['data'] {\n const maybeStepData = data as { to?: unknown };\n return maybeStepData.to !== undefined;\n}\n\n/**\n * Build TransactionParams for a delegation that redeems the original\n * post-quote transaction on behalf of the override account. Used when the\n * override account cannot execute the original call directly.\n *\n * The original tx is already on the correct chain and from the money\n * account, so it can be passed through to `getDelegationTransaction`\n * unchanged.\n *\n * @param transaction - Original transaction meta to be redeemed.\n * @param messenger - Controller messenger.\n * @param relayParams - Optional relay params to copy gas fee fields from.\n * @returns Transaction params for the delegation tx.\n */\nasync function buildDelegatedOriginalParams(\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n relayParams?: TransactionParams,\n): Promise<TransactionParams> {\n const delegation = await messenger.call(\n 'TransactionPayController:getDelegationTransaction',\n { transaction },\n );\n\n log('Delegation result for prepended original tx', delegation);\n\n return {\n data: delegation.data,\n from: transaction.txParams.from,\n maxFeePerGas: relayParams?.maxFeePerGas,\n maxPriorityFeePerGas: relayParams?.maxPriorityFeePerGas,\n to: delegation.to,\n value: delegation.value,\n };\n}\n\n/**\n * Submit source transactions via the TransactionController.\n *\n * Uses addTransaction for single params or addTransactionBatch for\n * multiple params. Waits for all transactions to be confirmed on-chain.\n *\n * @param quote - Relay quote.\n * @param transaction - Original transaction meta.\n * @param messenger - Controller messenger.\n * @param normalizedParams - Normalized relay-only params (without prepended original tx).\n * @param allParams - All params including any prepended original tx for post-quote flows.\n * @returns Hash of the last submitted transaction.\n */\nasync function submitViaTransactionController(\n quote: TransactionPayQuote<RelayQuote>,\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n normalizedParams: TransactionParams[],\n allParams: TransactionParams[],\n): Promise<Hex> {\n const transactionIds: string[] = [];\n const { from, sourceChainId, sourceTokenAddress } = quote.request;\n const { isPostQuote } = quote.request;\n\n const networkClientId = getNetworkClientId(messenger, sourceChainId);\n\n log('Adding transactions', {\n normalizedParams: allParams,\n sourceChainId,\n from,\n networkClientId,\n });\n\n const { end } = collectTransactionIds(\n sourceChainId,\n from,\n messenger,\n (transactionId) => {\n transactionIds.push(transactionId);\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Add required transaction ID from Relay 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\n const gasPayment = resolveGasPayment({\n isSourceGasFeeToken: quote.fees.isSourceGasFeeToken,\n sourceTokenAddress,\n sponsorship: {\n accountSupports7702: accountSupports7702(messenger, from),\n request: quote.request,\n transaction,\n },\n });\n\n const { excludeNativeTokenForFee, gasFeeToken } = gasPayment;\n\n log('Submitting transactions', {\n isPostQuote,\n gasFeeToken,\n allParamsCount: allParams.length,\n gasPaymentMode: gasPayment.mode,\n });\n\n const isSameChain =\n quote.original.details.currencyIn.currency.chainId ===\n quote.original.details.currencyOut.currency.chainId;\n\n // Single-tx keeps address/chainId only — TransactionController re-signs with\n // `from`. Batch may need a different signer (Money Account) than the batch\n // payer (EOA account override), so preserve the full pre-signed list.\n const authorizationList: AuthorizationList | undefined =\n isSameChain && quote.original.request.authorizationList?.length\n ? quote.original.request.authorizationList.map((a) => ({\n address: a.address,\n chainId: toHex(a.chainId),\n }))\n : undefined;\n\n const hasAccountOverride =\n quote.request.from.toLowerCase() !==\n (transaction.txParams.from as Hex).toLowerCase();\n\n const batchAuthorizationList =\n isSameChain &&\n hasAccountOverride &&\n quote.original.request.authorizationList?.length\n ? mapSignedQuoteAuthorizationList(\n quote.original.request.authorizationList,\n )\n : undefined;\n\n const { metamask } = quote.original;\n const { gasLimits } = metamask;\n\n if (allParams.length === 1) {\n const transactionParams = {\n ...allParams[0],\n authorizationList,\n gas: toHex(gasLimits[0]),\n };\n\n result = await messenger.call(\n 'TransactionController:addTransaction',\n transactionParams,\n {\n excludeNativeTokenForFee,\n gasFeeToken,\n networkClientId,\n origin: ORIGIN_METAMASK,\n isInternal: true,\n isGasFeeSponsored: gasPayment.isGasFeeSponsored,\n requireApproval: false,\n type: getRelayDepositType(getEffectiveTransactionType(transaction)),\n },\n );\n } else {\n await messenger.call(\n 'TransactionController:addTransactionBatch',\n buildRelayTransactionBatchRequest({\n allParams,\n authorizationList: batchAuthorizationList,\n gasPayment,\n messenger,\n normalizedParams,\n quote,\n transaction,\n }),\n );\n }\n\n end();\n\n log('Added transactions', transactionIds);\n\n if (!transactionIds.length) {\n throw new Error('No transactions submitted');\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 log('All transactions confirmed', transactionIds);\n\n logGasPaymentOutcome(\n gasPayment,\n transactionIds.map((txId) => getTransaction(txId, messenger)),\n );\n\n const hash = getTransaction(transactionIds.slice(-1)[0], messenger)?.hash;\n\n if (!hash) {\n throw new Error('Missing transaction hash');\n }\n\n return hash as Hex;\n}\n\nfunction mapSignedQuoteAuthorizationList(\n authorizationList: NonNullable<RelayQuote['request']['authorizationList']>,\n): AuthorizationList {\n return authorizationList.map((a) => ({\n address: a.address,\n chainId: toHex(a.chainId),\n nonce: toHex(a.nonce),\n r: a.r,\n s: a.s,\n yParity: toHex(a.yParity),\n }));\n}\n\nfunction buildRelayTransactionBatchRequest({\n allParams,\n authorizationList,\n gasPayment,\n messenger,\n normalizedParams,\n quote,\n transaction,\n}: {\n allParams: TransactionParams[];\n authorizationList?: AuthorizationList;\n gasPayment: GasPayment;\n messenger: TransactionPayControllerMessenger;\n normalizedParams: TransactionParams[];\n quote: TransactionPayQuote<RelayQuote>;\n transaction: TransactionMeta;\n}): TransactionBatchRequest {\n const { from, sourceChainId } = quote.request;\n const { metamask } = quote.original;\n const networkClientId = getNetworkClientId(messenger, sourceChainId);\n const gasLimit7702 = getGasLimit7702(quote);\n\n return {\n from,\n ...(authorizationList?.length ? { authorizationList } : {}),\n disable7702: !gasLimit7702,\n disableHook: Boolean(gasLimit7702),\n disableSequential: Boolean(gasLimit7702),\n excludeNativeTokenForFee: gasPayment.excludeNativeTokenForFee,\n gasFeeToken: gasPayment.gasFeeToken,\n gasLimit7702,\n networkClientId,\n origin: ORIGIN_METAMASK,\n isInternal: true,\n isGasFeeSponsored: gasPayment.isGasFeeSponsored,\n overwriteUpgrade: true,\n requireApproval: false,\n transactions: buildRelayBatchTransactions({\n allParams,\n gasLimit7702,\n gasLimits: metamask.gasLimits,\n normalizedParams,\n transaction,\n }),\n };\n}\n\nfunction buildRelayBatchTransactions({\n allParams,\n gasLimit7702,\n gasLimits,\n normalizedParams,\n transaction,\n}: {\n allParams: TransactionParams[];\n gasLimit7702?: Hex;\n gasLimits: number[];\n normalizedParams: TransactionParams[];\n transaction: TransactionMeta;\n}): TransactionBatchSingleRequest[] {\n const prependCount = allParams.length - normalizedParams.length;\n\n return allParams.map((singleParams, index) => {\n const gasLimit = gasLimits[index];\n const gas =\n gasLimit === undefined || gasLimit7702 ? undefined : toHex(gasLimit);\n\n return {\n params: {\n data: singleParams.data as Hex,\n gas,\n maxFeePerGas: singleParams.maxFeePerGas as Hex,\n maxPriorityFeePerGas: singleParams.maxPriorityFeePerGas as Hex,\n to: singleParams.to as Hex,\n value: singleParams.value as Hex,\n },\n type: getTransactionType(\n prependCount,\n index,\n getEffectiveTransactionType(transaction),\n normalizedParams.length,\n ),\n };\n });\n}\n\nfunction getGasLimit7702(\n quote: TransactionPayQuote<RelayQuote>,\n): Hex | undefined {\n const { gasLimits, is7702 } = quote.original.metamask;\n const gasLimit = gasLimits[0];\n\n return is7702 && gasLimit !== undefined ? toHex(gasLimit) : undefined;\n}\n\n/**\n * Determine the transaction type for a given index in the batch.\n *\n * @param prependCount - Number of non-relay txs prepended to the batch.\n * @param index - Index of the transaction in the batch.\n * @param originalType - Type of the original transaction (used for prepended indices).\n * @param relayParamCount - Number of relay-only params (excludes prepended txs).\n * @returns The transaction type.\n */\nfunction getTransactionType(\n prependCount: number,\n index: number,\n originalType: TransactionMeta['type'],\n relayParamCount: number,\n): TransactionMeta['type'] {\n if (prependCount > 0 && index < prependCount) {\n return originalType;\n }\n\n const relayIndex = index - prependCount;\n\n const depositType = getRelayDepositType(originalType);\n\n // Single relay step is always a deposit (no approval needed)\n if (relayParamCount === 1) {\n return depositType;\n }\n\n return relayIndex === 0 ? TransactionType.tokenMethodApprove : depositType;\n}\n\n/**\n * Get the relay deposit transaction type based on the parent transaction type.\n *\n * @param originalType - Type of the parent transaction.\n * @returns The mapped relay deposit type, or `relayDeposit` as a fallback.\n */\nfunction getRelayDepositType(\n originalType: TransactionMeta['type'],\n): TransactionType {\n return (\n (originalType && RELAY_DEPOSIT_TYPES[originalType]) ??\n TransactionType.relayDeposit\n );\n}\n\n/**\n * Get the effective transaction type, resolving through nested transactions\n * when the top-level type is `batch`.\n *\n * @param transaction - The transaction metadata.\n * @returns The resolved type from nested transactions, or the top-level type.\n */\nfunction getEffectiveTransactionType(\n transaction: TransactionMeta,\n): TransactionMeta['type'] {\n if (transaction.type !== TransactionType.batch) {\n return transaction.type;\n }\n\n const nestedType = transaction.nestedTransactions?.find(\n (tx) => tx.type && RELAY_DEPOSIT_TYPES[tx.type] !== undefined,\n )?.type;\n\n return nestedType ?? transaction.type;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"relay-submit.js","sourceRoot":"","sources":["../../../src/strategy/relay/relay-submit.ts"],"names":[],"mappings":"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","sourcesContent":["import { ORIGIN_METAMASK, toHex } from '@metamask/controller-utils';\nimport { TransactionType } from '@metamask/transaction-controller';\nimport type {\n AuthorizationList,\n BatchTransactionParams,\n TransactionBatchRequest,\n TransactionBatchSingleRequest,\n TransactionMeta,\n TransactionParams,\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 PayStrategyExecuteRequest,\n TransactionPayControllerMessenger,\n TransactionPayQuote,\n} from '../../types.js';\nimport { accountSupports7702 } from '../../utils/account.js';\nimport { prefixError } from '../../utils/error-prefix.js';\nimport {\n getFeatureFlags,\n getRelayPollingInterval,\n getRelayPollingTimeout,\n} from '../../utils/feature-flags.js';\nimport type { GasPayment } from '../../utils/gas-payment.js';\nimport {\n logGasPaymentOutcome,\n resolveGasPayment,\n} from '../../utils/gas-payment.js';\nimport {\n submitPolymarketWithdraw,\n sweepPolymarketDepositWallet,\n} from '../../utils/polymarket/withdraw.js';\nimport { getNetworkClientId } from '../../utils/provider.js';\nimport { submitSecondLeg } from '../../utils/second-leg.js';\nimport {\n getEvmQuoteSource,\n getLiveTokenBalanceOrUndefined,\n normalizeTokenAddress,\n TokenAddressTarget,\n} from '../../utils/token.js';\nimport {\n collectTransactionIds,\n getTransaction,\n updateTransaction,\n waitForTransactionConfirmed,\n} from '../../utils/transaction.js';\nimport {\n FALLBACK_HASH,\n RELAY_DEPOSIT_TYPES,\n RELAY_FAILURE_STATUSES,\n RELAY_PENDING_STATUSES,\n} from './constants.js';\nimport { getRelayDepositData } from './deposit-step.js';\nimport { submitHyperliquidWithdraw } from './hyperliquid-withdraw.js';\nimport { getRelayStatus } from './relay-api.js';\nimport { submitViaRelayExecute } from './relay-submit-execute.js';\nimport type {\n RelayCompletionOutcome,\n RelayQuote,\n RelayStatus,\n RelayStatusResponse,\n RelayTransactionStep,\n} from './types.js';\n\nconst log = createModuleLogger(projectLogger, 'relay-strategy');\nconst RELAY_ERROR_PREFIX = 'Relay: ';\n\ntype RelaySubmitParams = {\n allParams: TransactionParams[];\n normalizedParams: TransactionParams[];\n};\n\nexport type RelaySubmitCalls = { calls: TransactionParams[] };\n\n/**\n * Submits Relay quotes.\n *\n * @param request - Request object.\n * @returns An object containing the transaction hash if available.\n */\nexport async function submitRelayQuotes(\n request: PayStrategyExecuteRequest<RelayQuote>,\n): Promise<{ transactionHash?: Hex }> {\n try {\n return await submitRelayQuotesInternal(request);\n } catch (error) {\n throw prefixError(error, RELAY_ERROR_PREFIX);\n }\n}\n\nexport async function getRelaySubmitCalls({\n messenger,\n quote,\n transaction,\n}: {\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelayQuote>;\n transaction: TransactionMeta;\n}): Promise<RelaySubmitCalls> {\n const { allParams } = await buildRelaySubmitParams({\n messenger,\n quote,\n transaction,\n });\n return { calls: allParams };\n}\n\nasync function submitRelayQuotesInternal(\n request: PayStrategyExecuteRequest<RelayQuote>,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing quotes', request);\n\n const { quotes, messenger, transaction } = request;\n\n if (!quotes.length) {\n throw new Error('No quotes to submit');\n }\n\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 /* istanbul ignore if: concrete Relay submit paths return a hash/fallback or throw. */\n if (transactionHash === undefined) {\n throw new Error('Missing transaction hash');\n }\n\n return { transactionHash };\n}\n\n/**\n * Executes a single Relay quote.\n *\n * @param quote - Relay quote to execute.\n * @param messenger - Controller messenger.\n * @param transaction - Original transaction meta.\n * @returns An object containing the transaction hash if available.\n */\nasync function executeSingleQuote(\n quote: TransactionPayQuote<RelayQuote>,\n messenger: TransactionPayControllerMessenger,\n transaction: TransactionMeta,\n): Promise<{ transactionHash?: Hex }> {\n log('Executing single quote', quote);\n\n const isPolymarket = Boolean(quote.request.isPolymarketDepositWallet);\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 let polymarketPreSubmitUsdceBalance = 0n;\n let submittedSourceHash: Hex | undefined;\n\n // Shallow clone so the server-returned requestId can be written back (state is frozen by Immer).\n const mutableOriginal: RelayQuote = { ...quote.original };\n\n if (quote.request.isHyperliquidSource) {\n await submitHyperliquidWithdraw(quote, quote.request.from, messenger);\n } else if (isPolymarket) {\n const { sourceHash, preSubmitUsdceBalance } =\n await submitPolymarketWithdraw({\n depositData: getRelayDepositData(quote.original),\n from: quote.request.from,\n messenger,\n sourceAmountRaw: quote.sourceAmount.raw,\n });\n polymarketPreSubmitUsdceBalance = preSubmitUsdceBalance;\n setRelaySourceHash(transaction, messenger, sourceHash);\n } else {\n submittedSourceHash = await submitTransactions(\n { ...quote, original: mutableOriginal },\n transaction,\n messenger,\n );\n }\n\n const completion = await waitForRelayCompletion(mutableOriginal, messenger, {\n onSourceHash: (hash) => {\n log('Source hash received', hash);\n setRelaySourceHash(transaction, messenger, hash);\n },\n tolerateFailure: isPolymarket,\n });\n\n log('Relay request completed', completion);\n\n if (isPolymarket) {\n await sweepPolymarketDepositWallet({\n from: quote.request.from,\n isRefund:\n completion.status === 'refund' || completion.status === 'refunded',\n messenger,\n preSubmitUsdceBalance: polymarketPreSubmitUsdceBalance,\n });\n\n if (completion.status !== 'success') {\n throw new Error(`Request failed with status: ${completion.status}`);\n }\n }\n\n // Non-atomic flow: the quote bridged funds to `recipient` without embedding\n // the second leg. Now that Relay has settled, resolve the settled amount from\n // the on-chain Transfer log and submit the second-leg batch (approve + vault\n // deposit) sponsored from `recipient`.\n const { transactionHash: secondLegHash } =\n quote.request.atomic === false && completion.status === 'success'\n ? await submitPostNonAtomic({\n completion,\n messenger,\n quote,\n submittedSourceHash,\n transaction,\n })\n : {};\n\n // Only complete once every leg has landed, so a failed second leg does not\n // leave the parent transaction flagged as achieved.\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Intent complete after Relay completion',\n },\n (tx) => {\n tx.isIntentComplete = true;\n },\n );\n\n return { transactionHash: secondLegHash ?? completion.targetHash };\n}\n\n/**\n * Runs the second leg of a non-atomic Relay quote on the target chain from\n * `quote.request.recipient`, where the funds settled (derived at quote time by\n * `resolveNonAtomicRecipient`). Post-quote flows build their calls via the\n * client `getPaymentOverrideData` callback; non-post-quote flows fall through\n * to the transaction's own nested calls re-encoded via `getAmountData`.\n *\n * @param options - Submit options.\n * @param options.completion - Outcome of `waitForRelayCompletion`.\n * @param options.messenger - Controller messenger.\n * @param options.quote - The Relay quote that was submitted.\n * @param options.submittedSourceHash - Hash of the submitted source\n * transaction, used as the settlement hash when Relay skips polling on\n * same-chain flows.\n * @param options.transaction - Original transaction meta.\n * @returns Hash of the final submitted child transaction, if available.\n */\nasync function submitPostNonAtomic({\n completion,\n messenger,\n quote,\n submittedSourceHash,\n transaction,\n}: {\n completion: RelayCompletionOutcome;\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelayQuote>;\n submittedSourceHash?: Hex;\n transaction: TransactionMeta;\n}): Promise<{ transactionHash?: Hex }> {\n const { from, isPostQuote, recipient, targetChainId, targetTokenAddress } =\n quote.request;\n\n return await submitSecondLeg({\n chainId: targetChainId,\n from: recipient ?? from,\n getCalls: isPostQuote\n ? async (sourceAmountRaw): Promise<BatchTransactionParams[]> =>\n await buildPostQuoteDepositCalls({\n messenger,\n quote,\n sourceAmountRaw,\n transaction,\n })\n : undefined,\n messenger,\n settlementHash: getSettlementHash({\n completion,\n quote,\n submittedSourceHash,\n }),\n tokenAddress: targetTokenAddress,\n transaction,\n });\n}\n\n/**\n * Builds the second-leg batch for a post-quote flow whose parent transaction\n * carries no vault calls, via the client `getPaymentOverrideData` callback.\n *\n * @param options - Build options.\n * @param options.messenger - Controller messenger.\n * @param options.quote - The Relay quote that was submitted.\n * @param options.sourceAmountRaw - Settled amount in raw units.\n * @param options.transaction - Original transaction meta.\n * @returns The batch calls.\n */\nasync function buildPostQuoteDepositCalls({\n messenger,\n quote,\n sourceAmountRaw,\n transaction,\n}: {\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelayQuote>;\n sourceAmountRaw: string;\n transaction: TransactionMeta;\n}): Promise<BatchTransactionParams[]> {\n const { transactionData } = messenger.call(\n 'TransactionPayController:getState',\n );\n\n const { decimals } = quote.original.details.currencyOut.currency;\n const amountHuman = new BigNumber(sourceAmountRaw)\n .shiftedBy(-decimals)\n .toFixed();\n\n const { calls } = await messenger.call(\n 'TransactionPayController:getPaymentOverrideData',\n {\n amount: amountHuman,\n transaction,\n transactionData: transactionData[transaction.id],\n },\n );\n\n return calls;\n}\n\n/**\n * Resolves the hash of the transaction that delivered the funds to the\n * recipient.\n *\n * Cross-chain relays surface the target-chain hash from polling. Same-chain\n * relays skip polling, but the submitted source transaction itself moved the\n * funds, so its hash is used instead. Relay execute submissions return\n * `FALLBACK_HASH` rather than a real hash, leaving nothing to read.\n *\n * @param options - Resolution options.\n * @param options.completion - Outcome of `waitForRelayCompletion`.\n * @param options.quote - The Relay quote that was submitted.\n * @param options.submittedSourceHash - Hash of the submitted source\n * transaction.\n * @returns The settlement hash, or `undefined` when none is available.\n */\nfunction getSettlementHash({\n completion,\n quote,\n submittedSourceHash,\n}: {\n completion: RelayCompletionOutcome;\n quote: TransactionPayQuote<RelayQuote>;\n submittedSourceHash?: Hex;\n}): Hex | undefined {\n if (completion.targetHash && completion.targetHash !== FALLBACK_HASH) {\n return completion.targetHash;\n }\n\n const isSameChain =\n getEvmQuoteSource(quote.request).chainId === quote.request.targetChainId;\n\n if (isSameChain && submittedSourceHash !== FALLBACK_HASH) {\n return submittedSourceHash;\n }\n\n return undefined;\n}\n\nfunction setRelaySourceHash(\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n sourceHash: Hex,\n): void {\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Add source hash from Relay status',\n },\n (tx) => {\n tx.metamaskPay ??= {};\n tx.metamaskPay.sourceHash = sourceHash;\n },\n );\n}\n\nasync function waitForRelayCompletion(\n quote: RelayQuote,\n messenger: TransactionPayControllerMessenger,\n options: {\n onSourceHash?: (hash: Hex) => void;\n tolerateFailure?: boolean;\n },\n): Promise<RelayCompletionOutcome> {\n const { onSourceHash, tolerateFailure } = options;\n\n const isSameChain =\n quote.details.currencyIn.currency.chainId ===\n quote.details.currencyOut.currency.chainId;\n\n const isSingleDepositStep =\n quote.steps.length === 1 && quote.steps[0].id === 'deposit';\n\n if (isSameChain && !isSingleDepositStep) {\n log('Skipping polling as same chain');\n return { status: 'success', targetHash: FALLBACK_HASH };\n }\n\n const { requestId } = quote.steps[0];\n\n const pollingInterval = getRelayPollingInterval(messenger);\n const pollingTimeout = getRelayPollingTimeout(messenger);\n const hasTimeout = pollingTimeout !== undefined && pollingTimeout > 0;\n\n log('Polling config', { pollingInterval, pollingTimeout });\n const startTime = Date.now();\n\n let sourceHashEmitted = false;\n let lastStatus: RelayStatus | undefined;\n\n while (true) {\n let status: RelayStatusResponse | undefined;\n\n try {\n status = await getRelayStatus(messenger, requestId);\n } catch (error) {\n log('Polling network error', error);\n }\n\n if (status) {\n log('Polled status', status.status, status);\n lastStatus = status.status;\n\n if (!sourceHashEmitted && status.inTxHashes?.length) {\n sourceHashEmitted = true;\n onSourceHash?.(status.inTxHashes[0] as Hex);\n }\n\n if (status.status === 'success') {\n const targetHash =\n (status.txHashes?.slice(-1)[0] as Hex | undefined) ?? FALLBACK_HASH;\n return { status: 'success', targetHash };\n }\n\n if (!RELAY_PENDING_STATUSES.includes(status.status)) {\n if (RELAY_FAILURE_STATUSES.includes(status.status)) {\n if (tolerateFailure) {\n log('Relay ended in failure status (tolerated)', status.status);\n return { status: status.status };\n }\n throw new Error(`Request failed with status: ${status.status}`);\n }\n throw new Error(`Unrecognized status: ${status.status}`);\n }\n }\n\n if (hasTimeout && Date.now() - startTime >= pollingTimeout) {\n const statusDetail = lastStatus ? ` (last status: ${lastStatus})` : '';\n if (tolerateFailure) {\n log('Relay polling timed out (tolerated)', statusDetail);\n return { status: 'timeout' };\n }\n throw new Error(`Polling timed out${statusDetail}`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, pollingInterval));\n }\n}\n\n/**\n * Normalize the parameters from a relay quote step to match TransactionParams.\n *\n * @param params - Parameters from a relay quote step.\n * @param messenger - Controller messenger.\n * @returns Normalized transaction parameters.\n */\nfunction normalizeParams(\n params: RelayTransactionStep['items'][0]['data'],\n messenger: TransactionPayControllerMessenger,\n): TransactionParams {\n const featureFlags = getFeatureFlags(messenger);\n\n return {\n data: params.data,\n from: params.from,\n gas: toHex(params.gas ?? featureFlags.relayFallbackGas.max),\n maxFeePerGas:\n params.maxFeePerGas === undefined\n ? undefined\n : toHex(params.maxFeePerGas),\n maxPriorityFeePerGas:\n params.maxPriorityFeePerGas === undefined\n ? undefined\n : toHex(params.maxPriorityFeePerGas),\n to: params.to,\n value: toHex(params.value ?? '0'),\n };\n}\n\n/**\n * Validate the source token balance is sufficient for the relay deposit.\n *\n * Reads the live balance from the network and compares it against the quote's\n * required source amount to prevent submitting transactions that will revert\n * on-chain due to insufficient balance.\n *\n * This is a fast-fail optimisation, not a safety net: if the balance cannot be\n * read the check is skipped and submission proceeds, since the Relay and the\n * chain still reject an underfunded transaction.\n *\n * @param quote - Relay quote containing the required source amount.\n * @param messenger - Controller messenger.\n */\nasync function validateSourceBalance(\n quote: TransactionPayQuote<RelayQuote>,\n messenger: TransactionPayControllerMessenger,\n): Promise<void> {\n const { from } = quote.request;\n const { chainId: sourceChainId, tokenAddress: sourceTokenAddress } =\n getEvmQuoteSource(quote.request);\n\n const normalizedSourceTokenAddress = normalizeTokenAddress(\n sourceTokenAddress,\n sourceChainId,\n TokenAddressTarget.MetaMask,\n );\n\n const currentBalance = await getLiveTokenBalanceOrUndefined(\n messenger,\n from,\n sourceChainId,\n normalizedSourceTokenAddress,\n );\n\n // An unreadable balance is unknown, not insufficient. Submit anyway and let\n // the Relay and the chain reject a genuinely underfunded transaction.\n if (currentBalance === undefined) {\n log('Skipping source balance check: live balance unavailable', {\n from,\n sourceChainId,\n sourceTokenAddress,\n });\n return;\n }\n\n const requiredAmount = new BigNumber(quote.sourceAmount.raw);\n const balance = new BigNumber(currentBalance);\n\n log('Validating source balance', {\n from,\n sourceChainId,\n sourceTokenAddress,\n currentBalance,\n requiredAmount: requiredAmount.toString(10),\n });\n\n if (balance.isLessThan(requiredAmount)) {\n throw new Error(\n `Insufficient source token balance for relay deposit. ` +\n `Required: ${requiredAmount.toString(10)}, ` +\n `Available: ${balance.toString(10)}`,\n );\n }\n}\n\n/**\n * Submit transactions for a relay quote.\n *\n * On EIP-7702 supported chains, combines the source calls via\n * getDelegationTransaction and submits through Relay's /execute endpoint\n * (gasless — Relay's relayer pays origin gas).\n *\n * On other chains, adds the transactions directly via the\n * TransactionController and waits for on-chain confirmation.\n *\n * @param quote - Relay quote.\n * @param transaction - Original transaction meta.\n * @param messenger - Controller messenger.\n * @returns Hash of the last submitted transaction.\n */\nasync function submitTransactions(\n quote: TransactionPayQuote<RelayQuote>,\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n): Promise<Hex> {\n // In post-quote flows (e.g. Predict withdraw), the source tokens are held in\n // the Safe — not the EOA — and only become available after the original tx\n // executes as part of the batch. Skip the EOA balance check here.\n if (!quote.request.isPostQuote && !quote.request.paymentOverride) {\n await validateSourceBalance(quote, messenger);\n }\n\n const { allParams, normalizedParams } = await buildRelaySubmitParams({\n messenger,\n quote,\n transaction,\n });\n\n if (quote.original.metamask.isExecute) {\n return await submitViaRelayExecute(\n quote,\n transaction,\n messenger,\n allParams,\n );\n }\n\n return await submitViaTransactionController(\n quote,\n transaction,\n messenger,\n normalizedParams,\n allParams,\n );\n}\n\nfunction getRelayTransactionStepData(\n quote: TransactionPayQuote<RelayQuote>,\n): RelayTransactionStep['items'][0]['data'][] {\n const { steps } = quote.original;\n const supportedStepKinds = ['transaction', 'signature'];\n const invalidKind = steps.find(\n (step) => !supportedStepKinds.includes(step.kind),\n )?.kind;\n\n if (invalidKind) {\n throw new Error(`Unsupported step kind: ${invalidKind}`);\n }\n\n const txSteps = steps.filter(\n (step): step is RelayTransactionStep => step.kind === 'transaction',\n );\n\n return txSteps\n .flatMap((step) => step.items)\n .map((item) => item.data)\n .filter((data): data is RelayTransactionStep['items'][0]['data'] =>\n isRelayTransactionStepData(data),\n );\n}\n\nasync function buildRelaySubmitParams({\n messenger,\n quote,\n transaction,\n}: {\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelayQuote>;\n transaction: TransactionMeta;\n}): Promise<RelaySubmitParams> {\n const params = getRelayTransactionStepData(quote);\n const normalizedParams = params.map((singleParams) =>\n normalizeParams(singleParams, messenger),\n );\n\n // For post-quote flows, prepend the original transaction so it gets\n // included in the batch alongside the relay deposit(s).\n // This always results in multiple params, so it takes the batch path.\n // When an accountOverride is set (detected by `from` divergence between the\n // quote and the original tx), the override account does not directly hold\n // the funds for the original call, so the prepended tx is replaced with a\n // delegation tx that redeems the original call on its behalf.\n const { isPostQuote } = quote.request;\n const hasAccountOverride =\n quote.request.from.toLowerCase() !==\n (transaction.txParams.from as Hex).toLowerCase();\n\n // Non-atomic flows are excluded from the paymentOverride prepend: their\n // second leg is submitted separately by `submitPostNonAtomic` after\n // Relay completion, so prepending here would double-embed the vault deposit.\n // Cross-chain atomic flows (e.g. `moneyAccountWithdraw` on Monad settling\n // USDC on Arbitrum for Perps) still need the source-side vault withdraw +\n // transfer prepended here so Relay has funds to bridge.\n const isNonAtomic = quote.request.atomic === false;\n\n let allParams = normalizedParams;\n\n if (quote.request.paymentOverride && !isNonAtomic) {\n const { transactionData } = messenger.call(\n 'TransactionPayController:getState',\n );\n\n const { calls: overrideTxs } = await messenger.call(\n 'TransactionPayController:getPaymentOverrideData',\n {\n amount: quote.sourceAmount.human,\n transaction,\n transactionData: transactionData[transaction.id],\n },\n );\n\n if (overrideTxs.length > 0) {\n allParams = [\n ...(overrideTxs as TransactionParams[]),\n ...normalizedParams,\n ];\n }\n } else if (isPostQuote && transaction.txParams.to) {\n const prependedParams = hasAccountOverride\n ? await buildDelegatedOriginalParams(\n transaction,\n messenger,\n normalizedParams[0],\n )\n : ({\n data: transaction.txParams.data as Hex | undefined,\n from: transaction.txParams.from,\n maxFeePerGas: normalizedParams[0]?.maxFeePerGas,\n maxPriorityFeePerGas: normalizedParams[0]?.maxPriorityFeePerGas,\n to: transaction.txParams.to,\n value: transaction.txParams.value as Hex | undefined,\n } as TransactionParams);\n\n allParams = [prependedParams, ...normalizedParams];\n }\n\n return { allParams, normalizedParams };\n}\n\nfunction isRelayTransactionStepData(\n data: RelayTransactionStep['items'][0]['data'],\n): data is RelayTransactionStep['items'][0]['data'] {\n const maybeStepData = data as { to?: unknown };\n return maybeStepData.to !== undefined;\n}\n\n/**\n * Build TransactionParams for a delegation that redeems the original\n * post-quote transaction on behalf of the override account. Used when the\n * override account cannot execute the original call directly.\n *\n * The original tx is already on the correct chain and from the money\n * account, so it can be passed through to `getDelegationTransaction`\n * unchanged.\n *\n * @param transaction - Original transaction meta to be redeemed.\n * @param messenger - Controller messenger.\n * @param relayParams - Optional relay params to copy gas fee fields from.\n * @returns Transaction params for the delegation tx.\n */\nasync function buildDelegatedOriginalParams(\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n relayParams?: TransactionParams,\n): Promise<TransactionParams> {\n const delegation = await messenger.call(\n 'TransactionPayController:getDelegationTransaction',\n { transaction },\n );\n\n log('Delegation result for prepended original tx', delegation);\n\n return {\n data: delegation.data,\n from: transaction.txParams.from,\n maxFeePerGas: relayParams?.maxFeePerGas,\n maxPriorityFeePerGas: relayParams?.maxPriorityFeePerGas,\n to: delegation.to,\n value: delegation.value,\n };\n}\n\n/**\n * Submit source transactions via the TransactionController.\n *\n * Uses addTransaction for single params or addTransactionBatch for\n * multiple params. Waits for all transactions to be confirmed on-chain.\n *\n * @param quote - Relay quote.\n * @param transaction - Original transaction meta.\n * @param messenger - Controller messenger.\n * @param normalizedParams - Normalized relay-only params (without prepended original tx).\n * @param allParams - All params including any prepended original tx for post-quote flows.\n * @returns Hash of the last submitted transaction.\n */\nasync function submitViaTransactionController(\n quote: TransactionPayQuote<RelayQuote>,\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n normalizedParams: TransactionParams[],\n allParams: TransactionParams[],\n): Promise<Hex> {\n const transactionIds: string[] = [];\n const { from, isPostQuote } = quote.request;\n const { chainId: sourceChainId, tokenAddress: sourceTokenAddress } =\n getEvmQuoteSource(quote.request);\n\n const networkClientId = getNetworkClientId(messenger, sourceChainId);\n\n log('Adding transactions', {\n normalizedParams: allParams,\n sourceChainId,\n from,\n networkClientId,\n });\n\n const { end } = collectTransactionIds(\n sourceChainId,\n from,\n messenger,\n (transactionId) => {\n transactionIds.push(transactionId);\n\n updateTransaction(\n {\n transactionId: transaction.id,\n messenger,\n note: 'Add required transaction ID from Relay 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\n const gasPayment = resolveGasPayment({\n isSourceGasFeeToken: quote.fees.isSourceGasFeeToken,\n sourceTokenAddress,\n sponsorship: {\n accountSupports7702: accountSupports7702(messenger, from),\n request: quote.request,\n transaction,\n },\n });\n\n const { excludeNativeTokenForFee, gasFeeToken } = gasPayment;\n\n log('Submitting transactions', {\n isPostQuote,\n gasFeeToken,\n allParamsCount: allParams.length,\n gasPaymentMode: gasPayment.mode,\n });\n\n const isSameChain =\n quote.original.details.currencyIn.currency.chainId ===\n quote.original.details.currencyOut.currency.chainId;\n\n // Single-tx keeps address/chainId only — TransactionController re-signs with\n // `from`. Batch may need a different signer (Money Account) than the batch\n // payer (EOA account override), so preserve the full pre-signed list.\n const authorizationList: AuthorizationList | undefined =\n isSameChain && quote.original.request.authorizationList?.length\n ? quote.original.request.authorizationList.map((a) => ({\n address: a.address,\n chainId: toHex(a.chainId),\n }))\n : undefined;\n\n const hasAccountOverride =\n quote.request.from.toLowerCase() !==\n (transaction.txParams.from as Hex).toLowerCase();\n\n const batchAuthorizationList =\n isSameChain &&\n hasAccountOverride &&\n quote.original.request.authorizationList?.length\n ? mapSignedQuoteAuthorizationList(\n quote.original.request.authorizationList,\n )\n : undefined;\n\n const { metamask } = quote.original;\n const { gasLimits } = metamask;\n\n if (allParams.length === 1) {\n const transactionParams = {\n ...allParams[0],\n authorizationList,\n gas: toHex(gasLimits[0]),\n };\n\n result = await messenger.call(\n 'TransactionController:addTransaction',\n transactionParams,\n {\n excludeNativeTokenForFee,\n gasFeeToken,\n networkClientId,\n origin: ORIGIN_METAMASK,\n isInternal: true,\n isGasFeeSponsored: gasPayment.isGasFeeSponsored,\n requireApproval: false,\n type: getRelayDepositType(getEffectiveTransactionType(transaction)),\n },\n );\n } else {\n await messenger.call(\n 'TransactionController:addTransactionBatch',\n buildRelayTransactionBatchRequest({\n allParams,\n authorizationList: batchAuthorizationList,\n gasPayment,\n messenger,\n normalizedParams,\n quote,\n transaction,\n }),\n );\n }\n\n end();\n\n log('Added transactions', transactionIds);\n\n if (!transactionIds.length) {\n throw new Error('No transactions submitted');\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 log('All transactions confirmed', transactionIds);\n\n logGasPaymentOutcome(\n gasPayment,\n transactionIds.map((txId) => getTransaction(txId, messenger)),\n );\n\n const hash = getTransaction(transactionIds.slice(-1)[0], messenger)?.hash;\n\n if (!hash) {\n throw new Error('Missing transaction hash');\n }\n\n return hash as Hex;\n}\n\nfunction mapSignedQuoteAuthorizationList(\n authorizationList: NonNullable<RelayQuote['request']['authorizationList']>,\n): AuthorizationList {\n return authorizationList.map((a) => ({\n address: a.address,\n chainId: toHex(a.chainId),\n nonce: toHex(a.nonce),\n r: a.r,\n s: a.s,\n yParity: toHex(a.yParity),\n }));\n}\n\nfunction buildRelayTransactionBatchRequest({\n allParams,\n authorizationList,\n gasPayment,\n messenger,\n normalizedParams,\n quote,\n transaction,\n}: {\n allParams: TransactionParams[];\n authorizationList?: AuthorizationList;\n gasPayment: GasPayment;\n messenger: TransactionPayControllerMessenger;\n normalizedParams: TransactionParams[];\n quote: TransactionPayQuote<RelayQuote>;\n transaction: TransactionMeta;\n}): TransactionBatchRequest {\n const { from } = quote.request;\n const { chainId: sourceChainId } = getEvmQuoteSource(quote.request);\n const { metamask } = quote.original;\n const networkClientId = getNetworkClientId(messenger, sourceChainId);\n const gasLimit7702 = getGasLimit7702(quote);\n\n return {\n from,\n ...(authorizationList?.length ? { authorizationList } : {}),\n disable7702: !gasLimit7702,\n disableHook: Boolean(gasLimit7702),\n disableSequential: Boolean(gasLimit7702),\n excludeNativeTokenForFee: gasPayment.excludeNativeTokenForFee,\n gasFeeToken: gasPayment.gasFeeToken,\n gasLimit7702,\n networkClientId,\n origin: ORIGIN_METAMASK,\n isInternal: true,\n isGasFeeSponsored: gasPayment.isGasFeeSponsored,\n overwriteUpgrade: true,\n requireApproval: false,\n transactions: buildRelayBatchTransactions({\n allParams,\n gasLimit7702,\n gasLimits: metamask.gasLimits,\n normalizedParams,\n transaction,\n }),\n };\n}\n\nfunction buildRelayBatchTransactions({\n allParams,\n gasLimit7702,\n gasLimits,\n normalizedParams,\n transaction,\n}: {\n allParams: TransactionParams[];\n gasLimit7702?: Hex;\n gasLimits: number[];\n normalizedParams: TransactionParams[];\n transaction: TransactionMeta;\n}): TransactionBatchSingleRequest[] {\n const prependCount = allParams.length - normalizedParams.length;\n\n return allParams.map((singleParams, index) => {\n const gasLimit = gasLimits[index];\n const gas =\n gasLimit === undefined || gasLimit7702 ? undefined : toHex(gasLimit);\n\n return {\n params: {\n data: singleParams.data as Hex,\n gas,\n maxFeePerGas: singleParams.maxFeePerGas as Hex,\n maxPriorityFeePerGas: singleParams.maxPriorityFeePerGas as Hex,\n to: singleParams.to as Hex,\n value: singleParams.value as Hex,\n },\n type: getTransactionType(\n prependCount,\n index,\n getEffectiveTransactionType(transaction),\n normalizedParams.length,\n ),\n };\n });\n}\n\nfunction getGasLimit7702(\n quote: TransactionPayQuote<RelayQuote>,\n): Hex | undefined {\n const { gasLimits, is7702 } = quote.original.metamask;\n const gasLimit = gasLimits[0];\n\n return is7702 && gasLimit !== undefined ? toHex(gasLimit) : undefined;\n}\n\n/**\n * Determine the transaction type for a given index in the batch.\n *\n * @param prependCount - Number of non-relay txs prepended to the batch.\n * @param index - Index of the transaction in the batch.\n * @param originalType - Type of the original transaction (used for prepended indices).\n * @param relayParamCount - Number of relay-only params (excludes prepended txs).\n * @returns The transaction type.\n */\nfunction getTransactionType(\n prependCount: number,\n index: number,\n originalType: TransactionMeta['type'],\n relayParamCount: number,\n): TransactionMeta['type'] {\n if (prependCount > 0 && index < prependCount) {\n return originalType;\n }\n\n const relayIndex = index - prependCount;\n\n const depositType = getRelayDepositType(originalType);\n\n // Single relay step is always a deposit (no approval needed)\n if (relayParamCount === 1) {\n return depositType;\n }\n\n return relayIndex === 0 ? TransactionType.tokenMethodApprove : depositType;\n}\n\n/**\n * Get the relay deposit transaction type based on the parent transaction type.\n *\n * @param originalType - Type of the parent transaction.\n * @returns The mapped relay deposit type, or `relayDeposit` as a fallback.\n */\nfunction getRelayDepositType(\n originalType: TransactionMeta['type'],\n): TransactionType {\n return (\n (originalType && RELAY_DEPOSIT_TYPES[originalType]) ??\n TransactionType.relayDeposit\n );\n}\n\n/**\n * Get the effective transaction type, resolving through nested transactions\n * when the top-level type is `batch`.\n *\n * @param transaction - The transaction metadata.\n * @returns The resolved type from nested transactions, or the top-level type.\n */\nfunction getEffectiveTransactionType(\n transaction: TransactionMeta,\n): TransactionMeta['type'] {\n if (transaction.type !== TransactionType.batch) {\n return transaction.type;\n }\n\n const nestedType = transaction.nestedTransactions?.find(\n (tx) => tx.type && RELAY_DEPOSIT_TYPES[tx.type] !== undefined,\n )?.type;\n\n return nestedType ?? transaction.type;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-validation.d.ts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,kCAAkC,CAAC;AAM1C,OAAO,KAAK,EACV,iCAAiC,EACjC,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"relay-validation.d.ts","sourceRoot":"","sources":["../../../src/strategy/relay/relay-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,kCAAkC,CAAC;AAM1C,OAAO,KAAK,EACV,iCAAiC,EACjC,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAqBxB,OAAO,KAAK,EAAuB,UAAU,EAAE,MAAM,YAAY,CAAC;AAIlE,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,EAAE,iCAAiC,CAAC;IAC7C,MAAM,EAAE,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;IAC1C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,eAAe,CAAC;CAC9B,CAAC;AAEF,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,IAAI,CAAC,CAcf"}
|
|
@@ -5,6 +5,7 @@ import { isMpcMoneyAccountPayer } from '../../utils/account.js';
|
|
|
5
5
|
import { getEIP7702UpgradeContractAddress, isRelayValidationEnabled, } from '../../utils/feature-flags.js';
|
|
6
6
|
import { buildPolymarketDepositWalletSimulation, isPredictWithdraw, } from '../../utils/polymarket/withdraw.js';
|
|
7
7
|
import { build7702BatchSimulation, buildCallsSimulation, buildDelegationSimulation, } from '../../utils/simulation.js';
|
|
8
|
+
import { getEvmQuoteSource } from '../../utils/token.js';
|
|
8
9
|
import { validateQuotes } from '../../utils/validation.js';
|
|
9
10
|
import { getRelayDepositData } from './deposit-step.js';
|
|
10
11
|
import { getRelayExecuteRequest } from './relay-submit-execute.js';
|
|
@@ -78,7 +79,8 @@ async function buildValidationSimulation(request, quote) {
|
|
|
78
79
|
return buildRelayValidationSimulation(request.messenger, quote, calls, executeRequest);
|
|
79
80
|
}
|
|
80
81
|
function buildRelayValidationSimulation(messenger, quote, calls, executeRequest) {
|
|
81
|
-
const { from,
|
|
82
|
+
const { from, targetChainId } = quote.request;
|
|
83
|
+
const { chainId: sourceChainId } = getEvmQuoteSource(quote.request);
|
|
82
84
|
const context = { from, sourceChainId, targetChainId };
|
|
83
85
|
if (executeRequest) {
|
|
84
86
|
log('Building execute simulation', context);
|
|
@@ -103,7 +105,8 @@ function buildRelayExecuteSimulation(quote, executeRequest) {
|
|
|
103
105
|
});
|
|
104
106
|
}
|
|
105
107
|
function buildRelay7702BatchSimulation(messenger, quote, calls) {
|
|
106
|
-
const { from
|
|
108
|
+
const { from } = quote.request;
|
|
109
|
+
const { chainId: sourceChainId } = getEvmQuoteSource(quote.request);
|
|
107
110
|
// The batch call is an ERC-7821 `execute` on the sender's own account, so the
|
|
108
111
|
// account must appear upgraded for the simulation to succeed. The quote does
|
|
109
112
|
// not always carry an authorization, and there is no fast way to check the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-validation.js","sourceRoot":"","sources":["../../../src/strategy/relay/relay-validation.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n TransactionMeta,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport { createModuleLogger } from '@metamask/utils';\nimport type { Hex } 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 { isMpcMoneyAccountPayer } from '../../utils/account.js';\nimport {\n getEIP7702UpgradeContractAddress,\n isRelayValidationEnabled,\n} from '../../utils/feature-flags.js';\nimport {\n buildPolymarketDepositWalletSimulation,\n isPredictWithdraw,\n} from '../../utils/polymarket/withdraw.js';\nimport {\n build7702BatchSimulation,\n buildCallsSimulation,\n buildDelegationSimulation,\n} from '../../utils/simulation.js';\nimport type { QuoteSimulation } from '../../utils/simulation.js';\nimport { validateQuotes } from '../../utils/validation.js';\nimport { getRelayDepositData } from './deposit-step.js';\nimport { getRelayExecuteRequest } from './relay-submit-execute.js';\nimport { getRelaySubmitCalls } from './relay-submit.js';\nimport type { RelayExecuteRequest, RelayQuote } from './types.js';\n\nconst log = createModuleLogger(projectLogger, 'relay-validation');\n\nexport type ValidateRelayQuotesRequest = {\n messenger: TransactionPayControllerMessenger;\n quotes: TransactionPayQuote<RelayQuote>[];\n signal?: AbortSignal;\n transaction: TransactionMeta;\n};\n\nexport async function validateRelayQuotes(\n request: ValidateRelayQuotesRequest,\n): Promise<void> {\n if (!isRelayValidationEnabled(request.messenger, request.transaction)) {\n return;\n }\n\n await validateQuotes({\n buildSimulation: async (quote) =>\n shouldSkipValidation(quote, request.transaction, request.messenger)\n ? undefined\n : await buildValidationSimulation(request, quote),\n messenger: request.messenger,\n quotes: request.quotes,\n signal: request.signal,\n });\n}\n\nfunction shouldSkipValidation(\n quote: TransactionPayQuote<RelayQuote>,\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n): boolean {\n const { request } = quote;\n\n if (request.isHyperliquidSource) {\n log('Skipping quote validation: Hyperliquid source', {\n from: request.from,\n });\n return true;\n }\n\n // Legacy Safe Predict withdraws convert USDC.e to pUSD outside the calls the\n // controller can see, so they cannot be faithfully simulated and are skipped.\n if (\n isPredictWithdraw(request, transaction) &&\n !request.isPolymarketDepositWallet\n ) {\n log('Skipping quote validation: legacy Safe Predict withdraw', {\n from: request.from,\n });\n return true;\n }\n\n // Simulation rebuilds the submit calls, which signs a delegation through the\n // client payment-override callback. Skip that for an MPC Money payer so\n // quote refresh does not prompt for MFA ahead of the real submit.\n if (isMpcMoneyAccountPayer(messenger, request)) {\n log('Skipping quote validation: MPC Money account payer', {\n from: request.from,\n refundTo: request.refundTo,\n });\n return true;\n }\n\n return false;\n}\n\nasync function buildValidationSimulation(\n request: ValidateRelayQuotesRequest,\n quote: TransactionPayQuote<RelayQuote>,\n): Promise<QuoteSimulation> {\n if (quote.request.isPolymarketDepositWallet) {\n return await buildPolymarketDepositWalletSimulation({\n depositData: getRelayDepositData(quote.original),\n from: quote.request.from,\n messenger: request.messenger,\n sourceAmountRaw: quote.sourceAmount.raw,\n });\n }\n\n const { calls } = await getRelaySubmitCalls({\n messenger: request.messenger,\n quote,\n transaction: request.transaction,\n });\n\n const executeRequest = quote.original.metamask.isExecute\n ? await getRelayExecuteRequest({\n allParams: calls,\n messenger: request.messenger,\n quote,\n requestId: quote.original.steps[0].requestId,\n transaction: request.transaction,\n })\n : undefined;\n\n return buildRelayValidationSimulation(\n request.messenger,\n quote,\n calls,\n executeRequest,\n );\n}\n\nfunction buildRelayValidationSimulation(\n messenger: TransactionPayControllerMessenger,\n quote: TransactionPayQuote<RelayQuote>,\n calls: TransactionParams[],\n executeRequest?: Omit<RelayExecuteRequest, 'metamask'>,\n): QuoteSimulation {\n const { from, sourceChainId, targetChainId } = quote.request;\n const context = { from, sourceChainId, targetChainId };\n\n if (executeRequest) {\n log('Building execute simulation', context);\n return buildRelayExecuteSimulation(quote, executeRequest);\n }\n if (quote.original.metamask.is7702) {\n log('Building 7702 batch simulation', context);\n return buildRelay7702BatchSimulation(messenger, quote, calls);\n }\n log('Building normal simulation', context);\n return buildCallsSimulation(calls);\n}\n\nfunction buildRelayExecuteSimulation(\n quote: TransactionPayQuote<RelayQuote>,\n executeRequest: Omit<RelayExecuteRequest, 'metamask'>,\n): QuoteSimulation {\n const { authorizationList, data, to, value } = executeRequest.data;\n const valueHex = new BigNumber(value).toString(16).replace(/^/u, '0x') as Hex;\n\n return buildDelegationSimulation({\n authorizationList,\n data,\n from: quote.request.from,\n to,\n value: valueHex,\n });\n}\n\nfunction buildRelay7702BatchSimulation(\n messenger: TransactionPayControllerMessenger,\n quote: TransactionPayQuote<RelayQuote>,\n calls: TransactionParams[],\n): QuoteSimulation {\n const { from, sourceChainId } = quote.request;\n\n // The batch call is an ERC-7821 `execute` on the sender's own account, so the\n // account must appear upgraded for the simulation to succeed. The quote does\n // not always carry an authorization, and there is no fast way to check the\n // live upgrade state, so an authorization is always included: the delegator\n // address comes from the quote when present, otherwise from the configured\n // EIP-7702 upgrade contract for the chain.\n const authorizationAddress =\n quote.original.request.authorizationList?.[0]?.address ??\n getEIP7702UpgradeContractAddress(messenger, sourceChainId);\n\n return build7702BatchSimulation({\n authorizationAddress,\n calls,\n from,\n gas: quote.original.metamask.gasLimits[0],\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"relay-validation.js","sourceRoot":"","sources":["../../../src/strategy/relay/relay-validation.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EACL,gCAAgC,EAChC,wBAAwB,GACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,sCAAsC,EACtC,iBAAiB,GAClB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAGxD,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;AASlE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAmC;IAEnC,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACtE,OAAO;IACT,CAAC;IAED,MAAM,cAAc,CAAC;QACnB,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAC/B,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC;YACjE,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,MAAM,yBAAyB,CAAC,OAAO,EAAE,KAAK,CAAC;QACrD,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAsC,EACtC,WAA4B,EAC5B,SAA4C;IAE5C,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAE1B,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAChC,GAAG,CAAC,+CAA+C,EAAE;YACnD,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6EAA6E;IAC7E,8EAA8E;IAC9E,IACE,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC;QACvC,CAAC,OAAO,CAAC,yBAAyB,EAClC,CAAC;QACD,GAAG,CAAC,yDAAyD,EAAE;YAC7D,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6EAA6E;IAC7E,wEAAwE;IACxE,kEAAkE;IAClE,IAAI,sBAAsB,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,oDAAoD,EAAE;YACxD,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,OAAmC,EACnC,KAAsC;IAEtC,IAAI,KAAK,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC;QAC5C,OAAO,MAAM,sCAAsC,CAAC;YAClD,WAAW,EAAE,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC;YAChD,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,eAAe,EAAE,KAAK,CAAC,YAAY,CAAC,GAAG;SACxC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,mBAAmB,CAAC;QAC1C,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,KAAK;QACL,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS;QACtD,CAAC,CAAC,MAAM,sBAAsB,CAAC;YAC3B,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,KAAK;YACL,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;YAC5C,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC;QACJ,CAAC,CAAC,SAAS,CAAC;IAEd,OAAO,8BAA8B,CACnC,OAAO,CAAC,SAAS,EACjB,KAAK,EACL,KAAK,EACL,cAAc,CACf,CAAC;AACJ,CAAC;AAED,SAAS,8BAA8B,CACrC,SAA4C,EAC5C,KAAsC,EACtC,KAA0B,EAC1B,cAAsD;IAEtD,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9C,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;IAEvD,IAAI,cAAc,EAAE,CAAC;QACnB,GAAG,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,2BAA2B,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;IAC5D,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACnC,GAAG,CAAC,gCAAgC,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,6BAA6B,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAChE,CAAC;IACD,GAAG,CAAC,4BAA4B,EAAE,OAAO,CAAC,CAAC;IAC3C,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,2BAA2B,CAClC,KAAsC,EACtC,cAAqD;IAErD,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC;IACnE,MAAM,QAAQ,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAQ,CAAC;IAE9E,OAAO,yBAAyB,CAAC;QAC/B,iBAAiB;QACjB,IAAI;QACJ,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI;QACxB,EAAE;QACF,KAAK,EAAE,QAAQ;KAChB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,6BAA6B,CACpC,SAA4C,EAC5C,KAAsC,EACtC,KAA0B;IAE1B,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC;IAC/B,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEpE,8EAA8E;IAC9E,6EAA6E;IAC7E,2EAA2E;IAC3E,4EAA4E;IAC5E,2EAA2E;IAC3E,2CAA2C;IAC3C,MAAM,oBAAoB,GACxB,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO;QACtD,gCAAgC,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAE7D,OAAO,wBAAwB,CAAC;QAC9B,oBAAoB;QACpB,KAAK;QACL,IAAI;QACJ,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;KAC1C,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type {\n TransactionMeta,\n TransactionParams,\n} from '@metamask/transaction-controller';\nimport { createModuleLogger } from '@metamask/utils';\nimport type { Hex } 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 { isMpcMoneyAccountPayer } from '../../utils/account.js';\nimport {\n getEIP7702UpgradeContractAddress,\n isRelayValidationEnabled,\n} from '../../utils/feature-flags.js';\nimport {\n buildPolymarketDepositWalletSimulation,\n isPredictWithdraw,\n} from '../../utils/polymarket/withdraw.js';\nimport {\n build7702BatchSimulation,\n buildCallsSimulation,\n buildDelegationSimulation,\n} from '../../utils/simulation.js';\nimport type { QuoteSimulation } from '../../utils/simulation.js';\nimport { getEvmQuoteSource } from '../../utils/token.js';\nimport { validateQuotes } from '../../utils/validation.js';\nimport { getRelayDepositData } from './deposit-step.js';\nimport { getRelayExecuteRequest } from './relay-submit-execute.js';\nimport { getRelaySubmitCalls } from './relay-submit.js';\nimport type { RelayExecuteRequest, RelayQuote } from './types.js';\n\nconst log = createModuleLogger(projectLogger, 'relay-validation');\n\nexport type ValidateRelayQuotesRequest = {\n messenger: TransactionPayControllerMessenger;\n quotes: TransactionPayQuote<RelayQuote>[];\n signal?: AbortSignal;\n transaction: TransactionMeta;\n};\n\nexport async function validateRelayQuotes(\n request: ValidateRelayQuotesRequest,\n): Promise<void> {\n if (!isRelayValidationEnabled(request.messenger, request.transaction)) {\n return;\n }\n\n await validateQuotes({\n buildSimulation: async (quote) =>\n shouldSkipValidation(quote, request.transaction, request.messenger)\n ? undefined\n : await buildValidationSimulation(request, quote),\n messenger: request.messenger,\n quotes: request.quotes,\n signal: request.signal,\n });\n}\n\nfunction shouldSkipValidation(\n quote: TransactionPayQuote<RelayQuote>,\n transaction: TransactionMeta,\n messenger: TransactionPayControllerMessenger,\n): boolean {\n const { request } = quote;\n\n if (request.isHyperliquidSource) {\n log('Skipping quote validation: Hyperliquid source', {\n from: request.from,\n });\n return true;\n }\n\n // Legacy Safe Predict withdraws convert USDC.e to pUSD outside the calls the\n // controller can see, so they cannot be faithfully simulated and are skipped.\n if (\n isPredictWithdraw(request, transaction) &&\n !request.isPolymarketDepositWallet\n ) {\n log('Skipping quote validation: legacy Safe Predict withdraw', {\n from: request.from,\n });\n return true;\n }\n\n // Simulation rebuilds the submit calls, which signs a delegation through the\n // client payment-override callback. Skip that for an MPC Money payer so\n // quote refresh does not prompt for MFA ahead of the real submit.\n if (isMpcMoneyAccountPayer(messenger, request)) {\n log('Skipping quote validation: MPC Money account payer', {\n from: request.from,\n refundTo: request.refundTo,\n });\n return true;\n }\n\n return false;\n}\n\nasync function buildValidationSimulation(\n request: ValidateRelayQuotesRequest,\n quote: TransactionPayQuote<RelayQuote>,\n): Promise<QuoteSimulation> {\n if (quote.request.isPolymarketDepositWallet) {\n return await buildPolymarketDepositWalletSimulation({\n depositData: getRelayDepositData(quote.original),\n from: quote.request.from,\n messenger: request.messenger,\n sourceAmountRaw: quote.sourceAmount.raw,\n });\n }\n\n const { calls } = await getRelaySubmitCalls({\n messenger: request.messenger,\n quote,\n transaction: request.transaction,\n });\n\n const executeRequest = quote.original.metamask.isExecute\n ? await getRelayExecuteRequest({\n allParams: calls,\n messenger: request.messenger,\n quote,\n requestId: quote.original.steps[0].requestId,\n transaction: request.transaction,\n })\n : undefined;\n\n return buildRelayValidationSimulation(\n request.messenger,\n quote,\n calls,\n executeRequest,\n );\n}\n\nfunction buildRelayValidationSimulation(\n messenger: TransactionPayControllerMessenger,\n quote: TransactionPayQuote<RelayQuote>,\n calls: TransactionParams[],\n executeRequest?: Omit<RelayExecuteRequest, 'metamask'>,\n): QuoteSimulation {\n const { from, targetChainId } = quote.request;\n const { chainId: sourceChainId } = getEvmQuoteSource(quote.request);\n const context = { from, sourceChainId, targetChainId };\n\n if (executeRequest) {\n log('Building execute simulation', context);\n return buildRelayExecuteSimulation(quote, executeRequest);\n }\n if (quote.original.metamask.is7702) {\n log('Building 7702 batch simulation', context);\n return buildRelay7702BatchSimulation(messenger, quote, calls);\n }\n log('Building normal simulation', context);\n return buildCallsSimulation(calls);\n}\n\nfunction buildRelayExecuteSimulation(\n quote: TransactionPayQuote<RelayQuote>,\n executeRequest: Omit<RelayExecuteRequest, 'metamask'>,\n): QuoteSimulation {\n const { authorizationList, data, to, value } = executeRequest.data;\n const valueHex = new BigNumber(value).toString(16).replace(/^/u, '0x') as Hex;\n\n return buildDelegationSimulation({\n authorizationList,\n data,\n from: quote.request.from,\n to,\n value: valueHex,\n });\n}\n\nfunction buildRelay7702BatchSimulation(\n messenger: TransactionPayControllerMessenger,\n quote: TransactionPayQuote<RelayQuote>,\n calls: TransactionParams[],\n): QuoteSimulation {\n const { from } = quote.request;\n const { chainId: sourceChainId } = getEvmQuoteSource(quote.request);\n\n // The batch call is an ERC-7821 `execute` on the sender's own account, so the\n // account must appear upgraded for the simulation to succeed. The quote does\n // not always carry an authorization, and there is no fast way to check the\n // live upgrade state, so an authorization is always included: the delegator\n // address comes from the quote when present, otherwise from the configured\n // EIP-7702 upgrade contract for the chain.\n const authorizationAddress =\n quote.original.request.authorizationList?.[0]?.address ??\n getEIP7702UpgradeContractAddress(messenger, sourceChainId);\n\n return build7702BatchSimulation({\n authorizationAddress,\n calls,\n from,\n gas: quote.original.metamask.gasLimits[0],\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerStrategy.d.ts","sourceRoot":"","sources":["../../../src/strategy/server/ServerStrategy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,yBAAyB,EACzB,2BAA2B,EAC3B,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"ServerStrategy.d.ts","sourceRoot":"","sources":["../../../src/strategy/server/ServerStrategy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,yBAAyB,EACzB,2BAA2B,EAC3B,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAMxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C;;;;;;GAMG;AACH,qBAAa,cAAe,YAAW,WAAW,CAAC,WAAW,CAAC;IAC7D,QAAQ,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CA2BtD;IAEK,SAAS,CACb,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC,CAE7C;IAEK,oBAAoB,IAAI,OAAO,CAAC,EAAE,CAAC,CAExC;IAEK,OAAO,CACX,OAAO,EAAE,yBAAyB,CAAC,WAAW,CAAC,GAC9C,UAAU,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,CAOjD;CACF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createModuleLogger } from '@metamask/utils';
|
|
2
2
|
import { projectLogger } from '../../logger.js';
|
|
3
3
|
import { getPayStrategiesConfig } from '../../utils/feature-flags.js';
|
|
4
|
+
import { isEvmQuoteRequest } from '../../utils/token.js';
|
|
4
5
|
import { getServerQuotes } from './server-quotes.js';
|
|
5
6
|
import { submitServerQuotes } from './server-submit.js';
|
|
6
7
|
import { getServerUnsupportedReason } from './server-support.js';
|
|
@@ -18,6 +19,9 @@ export class ServerStrategy {
|
|
|
18
19
|
if (!config.server.enabled) {
|
|
19
20
|
return false;
|
|
20
21
|
}
|
|
22
|
+
if (!request.requests.every(isEvmQuoteRequest)) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
21
25
|
const reason = getServerUnsupportedReason({
|
|
22
26
|
enabledTransactionTypes: config.server.enabledTransactionTypes,
|
|
23
27
|
requests: request.requests,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerStrategy.js","sourceRoot":"","sources":["../../../src/strategy/server/ServerStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAOhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAGjE,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;AAEjE;;;;;;GAMG;AACH,MAAM,OAAO,cAAc;IACzB,QAAQ,CAAC,OAAoC;QAC3C,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAG,0BAA0B,CAAC;YACxC,uBAAuB,EAAE,MAAM,CAAC,MAAM,CAAC,uBAAuB;YAC9D,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QAEH,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,CAAC,qBAAqB,EAAE;gBACzB,MAAM;gBACN,eAAe,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI;aAC3C,CAAC,CAAC;YAEH,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,SAAS,CACb,OAAoC;QAEpC,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAA+C;QAE/C,IAAI,CAAC;YACH,OAAO,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;CACF","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\n\nimport { projectLogger } from '../../logger.js';\nimport type {\n PayStrategy,\n PayStrategyExecuteRequest,\n PayStrategyGetQuotesRequest,\n TransactionPayQuote,\n} from '../../types.js';\nimport { getPayStrategiesConfig } from '../../utils/feature-flags.js';\nimport { getServerQuotes } from './server-quotes.js';\nimport { submitServerQuotes } from './server-submit.js';\nimport { getServerUnsupportedReason } from './server-support.js';\nimport type { ServerQuote } from './types.js';\n\nconst log = createModuleLogger(projectLogger, 'server-strategy');\n\n/**\n * Pay strategy that routes quote, submit, and status requests through the\n * MetaMask intents API. Supports both gasless (delegated server-execute) and\n * non-gasless (TransactionController-submitted) execution paths. Gated by the\n * `payStrategies.server.enabled` remote feature flag, then narrowed per flow by\n * `payStrategies.server.enabledTransactionTypes`.\n */\nexport class ServerStrategy implements PayStrategy<ServerQuote> {\n supports(request: PayStrategyGetQuotesRequest): boolean {\n const config = getPayStrategiesConfig(request.messenger);\n\n if (!config.server.enabled) {\n return false;\n }\n\n const reason = getServerUnsupportedReason({\n enabledTransactionTypes: config.server.enabledTransactionTypes,\n requests: request.requests,\n transaction: request.transaction,\n });\n\n if (reason) {\n log('Unsupported request', {\n reason,\n transactionType: request.transaction?.type,\n });\n\n return false;\n }\n\n return true;\n }\n\n async getQuotes(\n request: PayStrategyGetQuotesRequest,\n ): Promise<TransactionPayQuote<ServerQuote>[]> {\n return getServerQuotes(request);\n }\n\n async getBatchTransactions(): Promise<[]> {\n return [];\n }\n\n async execute(\n request: PayStrategyExecuteRequest<ServerQuote>,\n ): ReturnType<PayStrategy<ServerQuote>['execute']> {\n try {\n return await submitServerQuotes(request);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Server submit: ${message}`);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ServerStrategy.js","sourceRoot":"","sources":["../../../src/strategy/server/ServerStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAOhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAGjE,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;AAEjE;;;;;;GAMG;AACH,MAAM,OAAO,cAAc;IACzB,QAAQ,CAAC,OAAoC;QAC3C,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEzD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAG,0BAA0B,CAAC;YACxC,uBAAuB,EAAE,MAAM,CAAC,MAAM,CAAC,uBAAuB;YAC9D,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC,CAAC;QAEH,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,CAAC,qBAAqB,EAAE;gBACzB,MAAM;gBACN,eAAe,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI;aAC3C,CAAC,CAAC;YAEH,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,SAAS,CACb,OAAoC;QAEpC,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAA+C;QAE/C,IAAI,CAAC;YACH,OAAO,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;CACF","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\n\nimport { projectLogger } from '../../logger.js';\nimport type {\n PayStrategy,\n PayStrategyExecuteRequest,\n PayStrategyGetQuotesRequest,\n TransactionPayQuote,\n} from '../../types.js';\nimport { getPayStrategiesConfig } from '../../utils/feature-flags.js';\nimport { isEvmQuoteRequest } from '../../utils/token.js';\nimport { getServerQuotes } from './server-quotes.js';\nimport { submitServerQuotes } from './server-submit.js';\nimport { getServerUnsupportedReason } from './server-support.js';\nimport type { ServerQuote } from './types.js';\n\nconst log = createModuleLogger(projectLogger, 'server-strategy');\n\n/**\n * Pay strategy that routes quote, submit, and status requests through the\n * MetaMask intents API. Supports both gasless (delegated server-execute) and\n * non-gasless (TransactionController-submitted) execution paths. Gated by the\n * `payStrategies.server.enabled` remote feature flag, then narrowed per flow by\n * `payStrategies.server.enabledTransactionTypes`.\n */\nexport class ServerStrategy implements PayStrategy<ServerQuote> {\n supports(request: PayStrategyGetQuotesRequest): boolean {\n const config = getPayStrategiesConfig(request.messenger);\n\n if (!config.server.enabled) {\n return false;\n }\n\n if (!request.requests.every(isEvmQuoteRequest)) {\n return false;\n }\n\n const reason = getServerUnsupportedReason({\n enabledTransactionTypes: config.server.enabledTransactionTypes,\n requests: request.requests,\n transaction: request.transaction,\n });\n\n if (reason) {\n log('Unsupported request', {\n reason,\n transactionType: request.transaction?.type,\n });\n\n return false;\n }\n\n return true;\n }\n\n async getQuotes(\n request: PayStrategyGetQuotesRequest,\n ): Promise<TransactionPayQuote<ServerQuote>[]> {\n return getServerQuotes(request);\n }\n\n async getBatchTransactions(): Promise<[]> {\n return [];\n }\n\n async execute(\n request: PayStrategyExecuteRequest<ServerQuote>,\n ): ReturnType<PayStrategy<ServerQuote>['execute']> {\n try {\n return await submitServerQuotes(request);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Server submit: ${message}`);\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-quotes.d.ts","sourceRoot":"","sources":["../../../src/strategy/server/server-quotes.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,2BAA2B,EAI3B,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"server-quotes.d.ts","sourceRoot":"","sources":["../../../src/strategy/server/server-quotes.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,2BAA2B,EAI3B,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AA+BxB,OAAO,KAAK,EACV,WAAW,EAKZ,MAAM,YAAY,CAAC;AA6CpB;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC,CAuB7C"}
|
|
@@ -8,12 +8,13 @@ import { getFiatValueFromUsd } from '../../utils/amounts.js';
|
|
|
8
8
|
import { getSlippage, isEIP7702Chain, isServerGaslessEnabled, } from '../../utils/feature-flags.js';
|
|
9
9
|
import { GasPaymentMode, resolveGasPayment, resolveGasStationCost, } from '../../utils/gas-payment.js';
|
|
10
10
|
import { calculateGasCost, getGasFee } from '../../utils/gas.js';
|
|
11
|
+
import { getMaxQuotes, isAtomicMaxSupported } from '../../utils/max-quote.js';
|
|
11
12
|
import { getPolymarketDepositWalletOverrides, getPredictWithdrawFeeTokenAccount, getPredictWithdrawSafeAddress, } from '../../utils/polymarket/withdraw.js';
|
|
12
13
|
import { processPostQuotePaymentOverride } from '../../utils/post-quote-payment-override.js';
|
|
13
14
|
import { reservePostQuoteGas } from '../../utils/post-quote.js';
|
|
14
15
|
import { estimateSourceGas } from '../../utils/quote-gas.js';
|
|
15
16
|
import { resolveQuoteRecipient } from '../../utils/quote-recipient.js';
|
|
16
|
-
import { getTokenFiatRate } from '../../utils/token.js';
|
|
17
|
+
import { getEvmQuoteSource, getTokenFiatRate } from '../../utils/token.js';
|
|
17
18
|
import { getQuotePricing, TradeType } from '../../utils/trade-type.js';
|
|
18
19
|
import { hasServerDepositStep } from './deposit-step.js';
|
|
19
20
|
import { normalizeServerPerpsRequest } from './perps.js';
|
|
@@ -52,6 +53,15 @@ export async function getServerQuotes(request) {
|
|
|
52
53
|
}
|
|
53
54
|
async function getQuotesForRequest(quoteRequest, fullRequest) {
|
|
54
55
|
try {
|
|
56
|
+
if (quoteRequest.isMaxAmount) {
|
|
57
|
+
return await getMaxQuotes({
|
|
58
|
+
fullRequest,
|
|
59
|
+
getQuoteDetails: getServerMaxQuoteDetails,
|
|
60
|
+
getQuotes: (request, transaction) => fetchQuotes(request, { ...fullRequest, transaction }),
|
|
61
|
+
request: quoteRequest,
|
|
62
|
+
requote: (quote, request, transaction) => requoteProvider(request, { ...fullRequest, transaction }, quote.original),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
55
65
|
const quotes = await fetchQuotes(quoteRequest, fullRequest);
|
|
56
66
|
if (!quoteRequest.isPostQuote) {
|
|
57
67
|
return quotes;
|
|
@@ -93,7 +103,8 @@ async function fetchQuotes(quoteRequest, fullRequest, provider) {
|
|
|
93
103
|
}
|
|
94
104
|
async function buildServerQuoteRequest(quoteRequest, transaction, messenger, accountSupports7702) {
|
|
95
105
|
const normalizedRequest = normalizeServerPerpsRequest(quoteRequest, transaction);
|
|
96
|
-
const { atomic, from, isMaxAmount, isPolymarketDepositWallet, isPostQuote, refundTo,
|
|
106
|
+
const { atomic, from, isMaxAmount, isPolymarketDepositWallet, isPostQuote, refundTo, sourceTokenAmount, targetAmountMinimum, targetChainId, targetTokenAddress, } = normalizedRequest;
|
|
107
|
+
const { chainId: sourceChainId, tokenAddress: sourceTokenAddress } = getEvmQuoteSource(normalizedRequest);
|
|
97
108
|
const singleData = getSingleTransactionData(transaction);
|
|
98
109
|
const isHypercore = targetChainId === CHAIN_ID_HYPERCORE;
|
|
99
110
|
const isTokenTransfer = !isHypercore &&
|
|
@@ -149,7 +160,14 @@ async function buildServerQuoteRequest(quoteRequest, transaction, messenger, acc
|
|
|
149
160
|
// they must not be embedded in the quote.
|
|
150
161
|
atomic === false ||
|
|
151
162
|
(isPostQuote ?? false) ||
|
|
152
|
-
|
|
163
|
+
// Max requests only embed calls when quoted atomically, as the calls must
|
|
164
|
+
// be re-encoded for the amount the max quote delivers.
|
|
165
|
+
(isMaxAmount === true &&
|
|
166
|
+
!isAtomicMaxSupported({
|
|
167
|
+
messenger,
|
|
168
|
+
request: normalizedRequest,
|
|
169
|
+
transaction,
|
|
170
|
+
})) ||
|
|
153
171
|
// The deposit wallet funds the quote with a plain token transfer, so there
|
|
154
172
|
// are no calls to embed.
|
|
155
173
|
(isPolymarketDepositWallet ?? false);
|
|
@@ -177,12 +195,15 @@ async function buildServerQuoteRequest(quoteRequest, transaction, messenger, acc
|
|
|
177
195
|
// Prefer atomic execution, but let providers that cannot run the calls
|
|
178
196
|
// still quote for the funds. The response determines whether execution is
|
|
179
197
|
// deferred. Post-quote flows submit their own calls and must not opt in.
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
198
|
+
// Atomic max quotes are only valid when the calls are executed by the
|
|
199
|
+
// provider, so they must not opt in either.
|
|
200
|
+
if (!isMaxAmount &&
|
|
201
|
+
canDeferCalls({
|
|
202
|
+
accountSupports7702,
|
|
203
|
+
messenger,
|
|
204
|
+
targetChainId,
|
|
205
|
+
transaction,
|
|
206
|
+
})) {
|
|
186
207
|
body.supportsDeferredCalls = true;
|
|
187
208
|
}
|
|
188
209
|
if (delegation.authorizationList?.length) {
|
|
@@ -342,7 +363,8 @@ async function normalizeQuote(result, quoteRequest, messenger, body, transaction
|
|
|
342
363
|
steps: transactionSteps,
|
|
343
364
|
transaction,
|
|
344
365
|
});
|
|
345
|
-
const
|
|
366
|
+
const { chainId: sourceChainId, tokenAddress: sourceTokenAddress } = getEvmQuoteSource(quoteRequest);
|
|
367
|
+
const sourceFiatRate = getTokenFiatRate(messenger, sourceTokenAddress, sourceChainId);
|
|
346
368
|
const usdToFiatRate = sourceFiatRate
|
|
347
369
|
? new BigNumber(sourceFiatRate.fiatRate).dividedBy(sourceFiatRate.usdRate)
|
|
348
370
|
: new BigNumber(1);
|
|
@@ -421,7 +443,8 @@ async function calculateSourceNetworkCost({ accountSupports7702, gasless, messen
|
|
|
421
443
|
maxFeePerGas: undefined,
|
|
422
444
|
maxPriorityFeePerGas: undefined,
|
|
423
445
|
};
|
|
424
|
-
const { from, isPolymarketDepositWallet
|
|
446
|
+
const { from, isPolymarketDepositWallet } = quoteRequest;
|
|
447
|
+
const { chainId: sourceChainId, tokenAddress: sourceTokenAddress } = getEvmQuoteSource(quoteRequest);
|
|
425
448
|
// A deposit wallet withdraw is broadcast by the Polymarket relayer, which
|
|
426
449
|
// pays the gas, so the user only signs.
|
|
427
450
|
const gasPayment = resolveGasPayment({
|
|
@@ -519,6 +542,26 @@ async function calculateSourceNetworkCost({ accountSupports7702, gasless, messen
|
|
|
519
542
|
...fees,
|
|
520
543
|
};
|
|
521
544
|
}
|
|
545
|
+
function getServerMaxQuoteDetails({ original, }) {
|
|
546
|
+
const transactionSteps = original.steps.filter(isTransactionStep);
|
|
547
|
+
const [firstStep] = transactionSteps;
|
|
548
|
+
return {
|
|
549
|
+
gasLimits: original.client.gasLimits,
|
|
550
|
+
gasStationTransactions: firstStep
|
|
551
|
+
? {
|
|
552
|
+
firstStepData: {
|
|
553
|
+
data: firstStep.data,
|
|
554
|
+
to: firstStep.to,
|
|
555
|
+
value: firstStep.value,
|
|
556
|
+
},
|
|
557
|
+
totalItemCount: transactionSteps.length,
|
|
558
|
+
}
|
|
559
|
+
: undefined,
|
|
560
|
+
isGasless: original.gasless || !firstStep,
|
|
561
|
+
isSubsidized: original.fees.subsidized,
|
|
562
|
+
targetAmountRaw: original.output.raw,
|
|
563
|
+
};
|
|
564
|
+
}
|
|
522
565
|
function stepToGasTransaction(step, from) {
|
|
523
566
|
return {
|
|
524
567
|
chainId: toHex(step.chainId),
|