@metamask-previews/transaction-pay-controller 30.0.3-preview-44b7ded21 → 30.1.0-preview-2750df1dc
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 +18 -1
- package/dist/strategy/fiat/fiat-direct-musd.d.ts.map +1 -1
- package/dist/strategy/fiat/fiat-direct-musd.js +17 -12
- package/dist/strategy/fiat/fiat-direct-musd.js.map +1 -1
- package/dist/strategy/fiat/fiat-submit.js +1 -1
- package/dist/strategy/fiat/fiat-submit.js.map +1 -1
- package/dist/strategy/fiat/utils.d.ts +6 -24
- package/dist/strategy/fiat/utils.d.ts.map +1 -1
- package/dist/strategy/fiat/utils.js +21 -37
- package/dist/strategy/fiat/utils.js.map +1 -1
- package/dist/strategy/relay/relay-quotes.d.ts.map +1 -1
- package/dist/strategy/relay/relay-quotes.js +10 -40
- package/dist/strategy/relay/relay-quotes.js.map +1 -1
- package/dist/strategy/relay/relay-submit.d.ts.map +1 -1
- package/dist/strategy/relay/relay-submit.js +59 -110
- package/dist/strategy/relay/relay-submit.js.map +1 -1
- package/dist/strategy/server/server-api.d.ts +2 -2
- package/dist/strategy/server/server-api.d.ts.map +1 -1
- package/dist/strategy/server/server-api.js.map +1 -1
- package/dist/strategy/server/server-quotes.d.ts.map +1 -1
- package/dist/strategy/server/server-quotes.js +122 -21
- 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 +38 -2
- package/dist/strategy/server/server-submit.js.map +1 -1
- package/dist/strategy/server/server-support.d.ts +0 -2
- 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/types.d.ts +6 -9
- package/dist/strategy/server/types.d.ts.map +1 -1
- package/dist/strategy/server/types.js +0 -6
- package/dist/strategy/server/types.js.map +1 -1
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/chomp.d.ts +32 -0
- package/dist/utils/chomp.d.ts.map +1 -1
- package/dist/utils/chomp.js +73 -0
- package/dist/utils/chomp.js.map +1 -1
- package/dist/utils/second-leg.d.ts +71 -0
- package/dist/utils/second-leg.d.ts.map +1 -0
- package/dist/utils/second-leg.js +281 -0
- package/dist/utils/second-leg.js.map +1 -0
- package/package.json +2 -2
- package/dist/utils/ma-vault-deposit.d.ts +0 -40
- package/dist/utils/ma-vault-deposit.d.ts.map +0 -1
- package/dist/utils/ma-vault-deposit.js +0 -230
- package/dist/utils/ma-vault-deposit.js.map +0 -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/7702.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 { submitMoneyAccountVaultDeposit } from '../../utils/ma-vault-deposit.js';\nimport { getNetworkClientId } from '../../utils/provider.js';\nimport {\n getLiveTokenBalance,\n normalizeTokenAddress,\n TokenAddressTarget,\n} from '../../utils/token.js';\nimport {\n collectTransactionIds,\n getTransaction,\n getTransferredAmountFromTxHash,\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 { submitHyperliquidWithdraw } from './hyperliquid-withdraw.js';\nimport {\n sweepPolymarketDepositWallet,\n submitPolymarketWithdraw,\n} from './polymarket/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(quote, quote.request.from, messenger);\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(quote.request.from, messenger, {\n relayStatus: completion.status,\n preSubmitUsdceBalance: polymarketPreSubmitUsdceBalance,\n });\n\n if (completion.status !== 'success') {\n throw new Error(`Request failed with status: ${completion.status}`);\n }\n }\n\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 // 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 if (quote.request.atomic === false && completion.status === 'success') {\n const { transactionHash } = await submitPostNonAtomic({\n completion,\n messenger,\n quote,\n submittedSourceHash,\n transaction,\n });\n\n return { transactionHash: transactionHash ?? completion.targetHash };\n }\n\n return { transactionHash: completion.targetHash };\n}\n\n/**\n * Runs the second leg of a non-atomic Relay quote. Resolves the settled amount\n * from the on-chain Transfer log, then submits the batch via\n * `submitMoneyAccountVaultDeposit`. Post-quote flows fetch pre-built calls via\n * the client `getPaymentOverrideData` callback; non-post-quote flows fall\n * through to the transaction's own nested calls re-encoded via\n * `getAmountData`. Funds settled on `quote.request.recipient`, derived at\n * quote time by `resolveNonAtomicRecipient`.\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 to read the settled amount 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 sourceAmountRaw = await resolveSettledAmount({\n completion,\n messenger,\n quote,\n submittedSourceHash,\n });\n\n const override = quote.request.isPostQuote\n ? await buildPostQuoteDepositCalls({\n messenger,\n sourceAmountRaw,\n transaction,\n quote,\n })\n : undefined;\n\n const recipient =\n override?.recipient ?? quote.request.recipient ?? quote.request.from;\n\n return submitMoneyAccountVaultDeposit({\n messenger,\n moneyAccountAddress: recipient,\n depositCalls: override?.calls,\n sourceAmountRaw,\n transaction,\n vaultDisabled: false,\n });\n}\n\n/**\n * Builds the post-completion batch for a post-quote flow whose parent\n * transaction carries no vault calls. Delegates to the client\n * `getPaymentOverrideData` callback with the settled amount.\n *\n * The callback MUST return a non-empty batch. Post-quote parent metas (e.g.\n * Perps/Predict withdraws) carry no vault-side nested calls, so falling back\n * to `getAmountData` in `resolveVaultDepositBatch` cannot recover the second\n * leg once Relay has already settled funds to the recipient. Throw eagerly so\n * the failure surfaces at the correct call site with an actionable message.\n *\n * The callback may also return the `recipient` that funds settled on, which the\n * caller prefers as the source of truth for the second-leg account.\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 and optional recipient.\n * @throws If the callback returns an empty batch.\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<{ calls: BatchTransactionParams[]; recipient?: Hex }> {\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, recipient } = await messenger.call(\n 'TransactionPayController:getPaymentOverrideData',\n {\n amount: amountHuman,\n transaction,\n transactionData: transactionData[transaction.id],\n },\n );\n\n if (!calls.length) {\n throw new Error('Missing post-quote deposit calls');\n }\n\n return { calls, recipient };\n}\n\n/**\n * Resolves the actual amount that landed on the recipient after a Relay bridge.\n *\n * Cross-chain relays surface a real target-chain hash from polling; same-chain\n * relays skip polling (the `FALLBACK_HASH` placeholder) but the submitted\n * source transaction itself moved the funds, so its hash is read instead. In\n * both cases the exact settled amount comes from the on-chain Transfer log; a\n * read failure or missing amount throws rather than guessing, since using the\n * quote minimum would knowingly strand dust and defeat an EXACT_INPUT quote.\n *\n * Relay execute submissions return `FALLBACK_HASH` instead of a real source\n * hash, leaving nothing to read; only then is the quote's minimum output used\n * as the last available source.\n *\n * @param options - Resolution 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 when polling was skipped on same-chain flows.\n * @returns The raw (atomic) settled amount as a decimal string.\n */\nasync function resolveSettledAmount({\n completion,\n messenger,\n quote,\n submittedSourceHash,\n}: {\n completion: RelayCompletionOutcome;\n messenger: TransactionPayControllerMessenger;\n quote: TransactionPayQuote<RelayQuote>;\n submittedSourceHash?: Hex;\n}): Promise<string> {\n const recipient = (quote.request.recipient ?? quote.request.from) as\n | Hex\n | undefined;\n\n const isSameChain =\n quote.request.sourceChainId === quote.request.targetChainId;\n\n const hasPolledTargetHash = Boolean(\n completion.targetHash && completion.targetHash !== FALLBACK_HASH,\n );\n\n let settlementHash: Hex | undefined;\n\n if (hasPolledTargetHash) {\n settlementHash = completion.targetHash;\n } else if (isSameChain && submittedSourceHash !== FALLBACK_HASH) {\n settlementHash = submittedSourceHash;\n }\n\n if (recipient && settlementHash) {\n const { amountRaw: onChainAmount } = await getTransferredAmountFromTxHash({\n messenger,\n txHash: settlementHash,\n chainId: quote.request.targetChainId,\n tokenAddress: quote.request.targetTokenAddress,\n walletAddress: recipient,\n });\n\n if (!onChainAmount) {\n throw new Error(\n 'Cannot resolve settled amount from on-chain transaction',\n );\n }\n\n log('Resolved settled amount from on-chain transaction', {\n settlementHash,\n onChainAmount,\n });\n\n return onChainAmount;\n }\n\n const fallback = quote.original.details.currencyOut.minimumAmount;\n\n if (!fallback) {\n throw new Error('Cannot resolve post-completion amount');\n }\n\n log('Resolved settled amount from quote minimum output', {\n fallback,\n targetHash: completion.targetHash,\n });\n\n return fallback;\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(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 * @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 let currentBalance: string;\n\n try {\n currentBalance = await getLiveTokenBalance(\n messenger,\n from,\n sourceChainId,\n normalizedSourceTokenAddress,\n );\n } catch (error) {\n throw new Error(\n `Cannot validate payment token balance - ${(error as Error).message}`,\n );\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/7702.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 { getNetworkClientId } from '../../utils/provider.js';\nimport { submitSecondLeg } from '../../utils/second-leg.js';\nimport {\n getLiveTokenBalance,\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 { submitHyperliquidWithdraw } from './hyperliquid-withdraw.js';\nimport {\n sweepPolymarketDepositWallet,\n submitPolymarketWithdraw,\n} from './polymarket/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(quote, quote.request.from, messenger);\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(quote.request.from, messenger, {\n relayStatus: completion.status,\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(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 * @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 let currentBalance: string;\n\n try {\n currentBalance = await getLiveTokenBalance(\n messenger,\n from,\n sourceChainId,\n normalizedSourceTokenAddress,\n );\n } catch (error) {\n throw new Error(\n `Cannot validate payment token balance - ${(error as Error).message}`,\n );\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,5 +1,5 @@
|
|
|
1
1
|
import type { TransactionPayControllerMessenger } from '../../types.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ServerQuoteRequest, ServerQuoteResponse, ServerStatusResponse, ServerSubmitRequest, ServerSubmitResponse } from './types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Fetch a quote from the server intents API.
|
|
5
5
|
*
|
|
@@ -28,7 +28,7 @@ export declare function submitServerIntent(messenger: TransactionPayControllerMe
|
|
|
28
28
|
* @returns The current status of the intent.
|
|
29
29
|
*/
|
|
30
30
|
export declare function getServerStatus(messenger: TransactionPayControllerMessenger, params: {
|
|
31
|
-
provider:
|
|
31
|
+
provider: string;
|
|
32
32
|
id: string;
|
|
33
33
|
hash?: string;
|
|
34
34
|
}): Promise<ServerStatusResponse>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-api.d.ts","sourceRoot":"","sources":["../../../src/strategy/server/server-api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,KAAK,EACV,kBAAkB,EAClB,
|
|
1
|
+
{"version":3,"file":"server-api.d.ts","sourceRoot":"","sources":["../../../src/strategy/server/server-api.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iCAAiC,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAIpB;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,iCAAiC,EAC5C,IAAI,EAAE,kBAAkB,EACxB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,mBAAmB,CAAC,CAc9B;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,iCAAiC,EAC5C,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,oBAAoB,CAAC,CAa/B;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,iCAAiC,EAC5C,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD,OAAO,CAAC,oBAAoB,CAAC,CAgB/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-api.js","sourceRoot":"","sources":["../../../src/strategy/server/server-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"server-api.js","sourceRoot":"","sources":["../../../src/strategy/server/server-api.ts"],"names":[],"mappings":"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","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\n\nimport { projectLogger } from '../../logger.js';\nimport type { TransactionPayControllerMessenger } from '../../types.js';\nimport { getPayStrategiesConfig } from '../../utils/feature-flags.js';\nimport type {\n ServerQuoteRequest,\n ServerQuoteResponse,\n ServerStatusResponse,\n ServerSubmitRequest,\n ServerSubmitResponse,\n} from './types.js';\n\nconst log = createModuleLogger(projectLogger, 'server-api');\n\n/**\n * Fetch a quote from the server intents API.\n *\n * @param messenger - Controller messenger.\n * @param body - Quote request parameters.\n * @param signal - Optional abort signal that cancels the underlying fetch.\n * @returns The server quote response.\n */\nexport async function fetchServerQuote(\n messenger: TransactionPayControllerMessenger,\n body: ServerQuoteRequest,\n signal?: AbortSignal,\n): Promise<ServerQuoteResponse> {\n const { server } = getPayStrategiesConfig(messenger);\n const quoteUrl = `${server.baseUrl}/quote`;\n\n log('Fetching quote', { url: quoteUrl });\n\n const response = await serverFetch(quoteUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal,\n });\n\n return (await response.json()) as ServerQuoteResponse;\n}\n\n/**\n * Submit a gasless intent via the server intents API.\n *\n * @param messenger - Controller messenger.\n * @param body - Submit request parameters.\n * @returns The submit response.\n */\nexport async function submitServerIntent(\n messenger: TransactionPayControllerMessenger,\n body: ServerSubmitRequest,\n): Promise<ServerSubmitResponse> {\n const { server } = getPayStrategiesConfig(messenger);\n const submitUrl = `${server.baseUrl}/submit`;\n\n log('Submitting intent', { url: submitUrl });\n\n const response = await serverFetch(submitUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n return (await response.json()) as ServerSubmitResponse;\n}\n\n/**\n * Fetch the status of a server intent.\n *\n * @param messenger - Controller messenger.\n * @param params - Status query parameters.\n * @param params.provider - The provider that the intent was submitted to.\n * @param params.id - The intent ID.\n * @param params.hash - Optional transaction hash to include in the status query.\n * @returns The current status of the intent.\n */\nexport async function getServerStatus(\n messenger: TransactionPayControllerMessenger,\n params: { provider: string; id: string; hash?: string },\n): Promise<ServerStatusResponse> {\n const { server } = getPayStrategiesConfig(messenger);\n const query = new URLSearchParams({\n provider: params.provider,\n id: params.id,\n });\n if (params.hash) {\n query.set('hash', params.hash);\n }\n const url = `${server.baseUrl}/status?${query.toString()}`;\n\n log('Fetching status', { url });\n\n const response = await serverFetch(url, { method: 'GET' });\n\n return (await response.json()) as ServerStatusResponse;\n}\n\n/**\n * Fetch a server intents-api endpoint, throwing an error containing the\n * response body's `message` or `error` field (or status code) on non-OK\n * responses so the server's actual reason is preserved without leaking the\n * request URL.\n *\n * @param url - The endpoint to fetch.\n * @param init - Fetch init options.\n * @returns The successful response.\n */\nasync function serverFetch(url: string, init?: RequestInit): Promise<Response> {\n const response = await fetch(url, init);\n\n if (!response.ok) {\n let detail: string | undefined;\n try {\n const body = (await response.json()) as {\n message?: string;\n error?: string;\n };\n detail = body.message ?? body.error;\n } catch {\n // Body wasn't JSON; fall through to status-only error.\n }\n throw new Error(\n detail ? `${response.status} - ${detail}` : String(response.status),\n );\n }\n\n return response;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-quotes.d.ts","sourceRoot":"","sources":["../../../src/strategy/server/server-quotes.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,2BAA2B,EAI3B,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAmBxB,OAAO,KAAK,EACV,WAAW,
|
|
1
|
+
{"version":3,"file":"server-quotes.d.ts","sourceRoot":"","sources":["../../../src/strategy/server/server-quotes.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,2BAA2B,EAI3B,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAmBxB,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,CAY7C"}
|
|
@@ -14,6 +14,7 @@ import { getQuotePricing, TradeType } from '../../utils/trade-type.js';
|
|
|
14
14
|
import { normalizeServerPerpsRequest } from './perps.js';
|
|
15
15
|
import { fetchServerQuote } from './server-api.js';
|
|
16
16
|
const log = createModuleLogger(projectLogger, 'server-quotes');
|
|
17
|
+
const HYPERCORE_CHAIN_ID_NUMBER = Number(CHAIN_ID_HYPERCORE);
|
|
17
18
|
const TOKEN_TRANSFER_FOUR_BYTE = '0xa9059cbb';
|
|
18
19
|
const TRANSFER_INTERFACE = new Interface([
|
|
19
20
|
'function transfer(address to, uint256 amount)',
|
|
@@ -37,13 +38,19 @@ export async function getServerQuotes(request) {
|
|
|
37
38
|
}
|
|
38
39
|
async function getQuotesForRequest(quoteRequest, fullRequest) {
|
|
39
40
|
const { accountSupports7702, messenger, signal, transaction } = fullRequest;
|
|
40
|
-
const body = await buildServerQuoteRequest(quoteRequest, transaction, messenger, accountSupports7702);
|
|
41
41
|
try {
|
|
42
|
+
const body = await buildServerQuoteRequest(quoteRequest, transaction, messenger, accountSupports7702);
|
|
42
43
|
log('Request body', body);
|
|
43
44
|
const response = await fetchServerQuote(messenger, body, signal);
|
|
44
45
|
log('Raw quote response', response);
|
|
45
46
|
const fulfilledResults = response.results.filter(isFulfilledResult);
|
|
46
|
-
|
|
47
|
+
// The second leg runs from `request.recipient`, so it has to match the
|
|
48
|
+
// executing account the quote settles on.
|
|
49
|
+
const settledRequest = {
|
|
50
|
+
...quoteRequest,
|
|
51
|
+
recipient: transaction.txParams.from,
|
|
52
|
+
};
|
|
53
|
+
const normalized = await Promise.all(fulfilledResults.map((result) => normalizeQuote(result, settledRequest, messenger, body.tradeType === TradeType.ExactInput, transaction, accountSupports7702, isSecondLegRequired(body, quoteRequest, transaction, result.quote))));
|
|
47
54
|
log('Normalized quotes', normalized);
|
|
48
55
|
return normalized;
|
|
49
56
|
}
|
|
@@ -54,14 +61,16 @@ async function getQuotesForRequest(quoteRequest, fullRequest) {
|
|
|
54
61
|
}
|
|
55
62
|
async function buildServerQuoteRequest(quoteRequest, transaction, messenger, accountSupports7702) {
|
|
56
63
|
const normalizedRequest = normalizeServerPerpsRequest(quoteRequest, transaction);
|
|
57
|
-
const { from, isMaxAmount, isPostQuote, paymentOverride, sourceChainId, sourceTokenAddress, sourceTokenAmount, targetAmountMinimum, targetChainId, targetTokenAddress, } = normalizedRequest;
|
|
64
|
+
const { atomic, from, isMaxAmount, isPostQuote, paymentOverride, sourceChainId, sourceTokenAddress, sourceTokenAmount, targetAmountMinimum, targetChainId, targetTokenAddress, } = normalizedRequest;
|
|
58
65
|
const singleData = getSingleTransactionData(transaction);
|
|
59
66
|
const isHypercore = targetChainId === CHAIN_ID_HYPERCORE;
|
|
60
67
|
const isTokenTransfer = !isHypercore && Boolean(singleData?.startsWith(TOKEN_TRANSFER_FOUR_BYTE));
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
68
|
+
// `from` is the payer, which differs from the account the transaction's calls
|
|
69
|
+
// run from when an account override (e.g. Money Account) is active.
|
|
70
|
+
const executionAccount = transaction.txParams.from;
|
|
71
|
+
const recipient = isTokenTransfer && singleData
|
|
72
|
+
? decodeTransferRecipient(singleData)
|
|
73
|
+
: executionAccount;
|
|
65
74
|
const isHypercoreSource = sourceChainId === CHAIN_ID_HYPERCORE;
|
|
66
75
|
const supportsGasless = !isHypercoreSource &&
|
|
67
76
|
accountSupports7702 &&
|
|
@@ -79,6 +88,9 @@ async function buildServerQuoteRequest(quoteRequest, transaction, messenger, acc
|
|
|
79
88
|
isTokenTransfer ||
|
|
80
89
|
isHypercore ||
|
|
81
90
|
isHypercoreSource ||
|
|
91
|
+
// Explicitly non-atomic requests want the calls run after settlement, so
|
|
92
|
+
// they must not be embedded in the quote.
|
|
93
|
+
atomic === false ||
|
|
82
94
|
(isPostQuote ?? false) ||
|
|
83
95
|
(isMaxAmount ?? false);
|
|
84
96
|
if (isPostQuote && paymentOverride === PaymentOverride.MoneyAccount) {
|
|
@@ -88,7 +100,7 @@ async function buildServerQuoteRequest(quoteRequest, transaction, messenger, acc
|
|
|
88
100
|
const delegation = await messenger.call('TransactionPayController:getDelegationTransaction', { transaction });
|
|
89
101
|
body.calls = [
|
|
90
102
|
{
|
|
91
|
-
data: buildTransferData(
|
|
103
|
+
data: buildTransferData(executionAccount, targetAmountMinimum),
|
|
92
104
|
to: targetTokenAddress,
|
|
93
105
|
value: '0x0',
|
|
94
106
|
},
|
|
@@ -98,6 +110,19 @@ async function buildServerQuoteRequest(quoteRequest, transaction, messenger, acc
|
|
|
98
110
|
value: delegation.value,
|
|
99
111
|
},
|
|
100
112
|
];
|
|
113
|
+
// Prefer atomic execution, but let providers that cannot run the calls
|
|
114
|
+
// still quote for the funds. Only this path can fall back to a second leg:
|
|
115
|
+
// the calls run as the execution account, which is also the recipient, so
|
|
116
|
+
// we can submit them ourselves once the funds land. Post-quote flows submit
|
|
117
|
+
// their own calls and must not opt in.
|
|
118
|
+
if (canDeferCalls({
|
|
119
|
+
accountSupports7702,
|
|
120
|
+
messenger,
|
|
121
|
+
targetChainId,
|
|
122
|
+
transaction,
|
|
123
|
+
})) {
|
|
124
|
+
body.supportsDeferredCalls = true;
|
|
125
|
+
}
|
|
101
126
|
if (delegation.authorizationList?.length) {
|
|
102
127
|
body.authorizationList = normalizeAuthorizationList(delegation.authorizationList);
|
|
103
128
|
}
|
|
@@ -116,6 +141,35 @@ async function buildServerQuoteRequest(quoteRequest, transaction, messenger, acc
|
|
|
116
141
|
tradeType: pricing.tradeType,
|
|
117
142
|
};
|
|
118
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* Whether we can run the calls ourselves after the quote settles without
|
|
146
|
+
* involving the user, so a funds-only quote is acceptable.
|
|
147
|
+
*
|
|
148
|
+
* The second leg is an internal, sponsored EIP-7702 batch on the target chain,
|
|
149
|
+
* so the account must be able to sign EIP-7702 authorizations, the target chain
|
|
150
|
+
* must support EIP-7702, and MetaMask must sponsor gas for the transaction on
|
|
151
|
+
* that chain. Otherwise the user would need native gas on the target chain.
|
|
152
|
+
*
|
|
153
|
+
* Temporarily, only nested transactions are supported as second-leg calls, as
|
|
154
|
+
* they are what the second leg re-encodes for the settled amount. Calls that
|
|
155
|
+
* exist only on the top-level transaction are not deferred, so a provider that
|
|
156
|
+
* cannot execute them declines rather than returning a funds-only quote.
|
|
157
|
+
*
|
|
158
|
+
* @param options - Check options.
|
|
159
|
+
* @param options.accountSupports7702 - Whether the account can sign EIP-7702
|
|
160
|
+
* authorizations.
|
|
161
|
+
* @param options.messenger - Controller messenger.
|
|
162
|
+
* @param options.targetChainId - Chain the second leg would run on.
|
|
163
|
+
* @param options.transaction - Transaction being paid for.
|
|
164
|
+
* @returns Whether the calls can be deferred to a second leg.
|
|
165
|
+
*/
|
|
166
|
+
function canDeferCalls({ accountSupports7702, messenger, targetChainId, transaction, }) {
|
|
167
|
+
return (Boolean(transaction.nestedTransactions?.length) &&
|
|
168
|
+
accountSupports7702 &&
|
|
169
|
+
transaction.isGasFeeSponsored === true &&
|
|
170
|
+
transaction.chainId === targetChainId &&
|
|
171
|
+
isEIP7702Chain(messenger, targetChainId));
|
|
172
|
+
}
|
|
119
173
|
function normalizeAuthorizationList(authorizationList) {
|
|
120
174
|
return authorizationList.map((entry) => ({
|
|
121
175
|
address: entry.address,
|
|
@@ -144,18 +198,14 @@ async function processMoneyAccountPostQuote(transaction, request, body, messenge
|
|
|
144
198
|
// The bundled calls transfer exactly this amount, so pin it rather than
|
|
145
199
|
// letting the amount be derived from the request.
|
|
146
200
|
body.amount = rawAmount;
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
to: call.to,
|
|
156
|
-
value: call.value ?? '0x0',
|
|
157
|
-
})),
|
|
158
|
-
];
|
|
201
|
+
// Settle directly on the Money Account. The deposit calls are delegated from
|
|
202
|
+
// the Money Account, so the funds have to be there before they run.
|
|
203
|
+
body.recipient = fundingRecipient;
|
|
204
|
+
body.calls = overrideCalls.map((call) => ({
|
|
205
|
+
data: call.data,
|
|
206
|
+
to: call.to,
|
|
207
|
+
value: call.value ?? '0x0',
|
|
208
|
+
}));
|
|
159
209
|
if (authorizationList?.length) {
|
|
160
210
|
body.authorizationList = normalizeAuthorizationList(authorizationList);
|
|
161
211
|
}
|
|
@@ -169,7 +219,57 @@ function shouldRequestQuote(quoteRequest) {
|
|
|
169
219
|
Boolean(quoteRequest.isMaxAmount) ||
|
|
170
220
|
Boolean(quoteRequest.isHyperliquidSource));
|
|
171
221
|
}
|
|
172
|
-
|
|
222
|
+
/**
|
|
223
|
+
* Determines whether the transaction's calls must be submitted as a separate
|
|
224
|
+
* second leg on the target chain after the quote settles.
|
|
225
|
+
*
|
|
226
|
+
* `atomic` is only a hint: whether the calls can be executed by the provider
|
|
227
|
+
* depends on the flow, so this checks what the built request actually carries
|
|
228
|
+
* rather than what the caller asked for. Flows with nothing to run, or that
|
|
229
|
+
* submit their own calls, are excluded.
|
|
230
|
+
*
|
|
231
|
+
* A second leg is needed either because we declined to embed the calls, or
|
|
232
|
+
* because the provider that won the quote told us it will not execute them.
|
|
233
|
+
*
|
|
234
|
+
* @param body - The built server quote request.
|
|
235
|
+
* @param quoteRequest - The originating quote request.
|
|
236
|
+
* @param transaction - Original transaction meta.
|
|
237
|
+
* @param quote - The provider's quote payload.
|
|
238
|
+
* @returns `true` when a second leg is required.
|
|
239
|
+
*/
|
|
240
|
+
function isSecondLegRequired(body, quoteRequest, transaction, quote) {
|
|
241
|
+
// Embedded calls are executed by the provider as part of the quote, unless
|
|
242
|
+
// it quoted for the funds alone and told us to run the calls ourselves.
|
|
243
|
+
if (body.calls?.length && !quote.callsDeferred) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
// No calls to run. Plain funding transfers and empty calldata are already
|
|
247
|
+
// satisfied by the quote delivering the target token to the recipient.
|
|
248
|
+
if (!transaction.nestedTransactions?.length) {
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
const singleData = getSingleTransactionData(transaction);
|
|
252
|
+
if (singleData === undefined || singleData === '0x') {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
if (singleData.startsWith(TOKEN_TRANSFER_FOUR_BYTE)) {
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
// HyperCore settles off-chain, so there is no target-chain transfer to read
|
|
259
|
+
// a settled amount from. Checks the built body rather than the original
|
|
260
|
+
// request, since perps deposits are only rewritten to HyperCore there.
|
|
261
|
+
if (body.target.chainId === HYPERCORE_CHAIN_ID_NUMBER ||
|
|
262
|
+
body.source.chainId === HYPERCORE_CHAIN_ID_NUMBER) {
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
// Post-quote flows submit the original transaction separately, so running it
|
|
266
|
+
// again as a second leg would double-execute it.
|
|
267
|
+
if (quoteRequest.isPostQuote) {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
async function normalizeQuote(result, quoteRequest, messenger, isInputBased, transaction, accountSupports7702, requiresSecondLeg) {
|
|
173
273
|
const { quote } = result;
|
|
174
274
|
const { gasless } = quote;
|
|
175
275
|
const transactionSteps = quote.steps.filter(isTransactionStep);
|
|
@@ -222,6 +322,7 @@ async function normalizeQuote(result, quoteRequest, messenger, isInputBased, tra
|
|
|
222
322
|
steps: quote.steps,
|
|
223
323
|
},
|
|
224
324
|
request: quoteRequest,
|
|
325
|
+
requiresSecondLeg,
|
|
225
326
|
sourceAmount: {
|
|
226
327
|
fiat: sourceFiatRate
|
|
227
328
|
? new BigNumber(quote.input.formatted)
|