@metamask-previews/transaction-controller 72.2.0-preview-082d695 → 72.2.0-preview-b59bc5b6f
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 +0 -21
- package/dist/TransactionController.d.ts +7 -14
- package/dist/TransactionController.d.ts.map +1 -1
- package/dist/TransactionController.js +44 -88
- package/dist/TransactionController.js.map +1 -1
- package/dist/hooks/ExtraTransactionsPublishHook.d.ts.map +1 -1
- package/dist/hooks/ExtraTransactionsPublishHook.js +2 -2
- package/dist/hooks/ExtraTransactionsPublishHook.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/types.d.ts +12 -38
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/batch.js +2 -2
- package/dist/utils/batch.js.map +1 -1
- package/dist/utils/gas-fee-tokens.d.ts +2 -2
- package/dist/utils/gas-fee-tokens.d.ts.map +1 -1
- package/dist/utils/gas-fee-tokens.js +12 -5
- package/dist/utils/gas-fee-tokens.js.map +1 -1
- package/dist/utils/nonce.d.ts.map +1 -1
- package/dist/utils/nonce.js +5 -1
- package/dist/utils/nonce.js.map +1 -1
- package/package.json +1 -1
package/dist/utils/batch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/utils/batch.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AcceptResultCallbacks,\n AddResult,\n} from '@metamask/approval-controller';\nimport {\n ApprovalType,\n ORIGIN_METAMASK,\n toHex,\n} from '@metamask/controller-utils';\nimport type {\n FetchGasFeeEstimateOptions,\n GasFeeState,\n} from '@metamask/gas-fee-controller';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport { JsonRpcError, rpcErrors } from '@metamask/rpc-errors';\nimport type { Hex } from '@metamask/utils';\nimport { bytesToHex, createModuleLogger } from '@metamask/utils';\nimport { parse, v4 } from 'uuid';\n\nimport { DefaultGasFeeFlow } from '../gas-flows/DefaultGasFeeFlow.js';\nimport { updateTransactionGasEstimates } from '../helpers/GasFeePoller.js';\nimport type { PendingTransactionTracker } from '../helpers/PendingTransactionTracker.js';\nimport { CollectPublishHook } from '../hooks/CollectPublishHook.js';\nimport { SequentialPublishBatchHook } from '../hooks/SequentialPublishBatchHook.js';\nimport { GasFeeEstimateLevel, TransactionStatus } from '../index.js';\nimport type {\n BatchTransactionParams,\n GetSimulationConfig,\n PublishBatchHookRequest,\n TransactionController,\n TransactionControllerMessenger,\n TransactionControllerState,\n TransactionMeta,\n} from '../index.js';\nimport { projectLogger } from '../logger.js';\nimport { TransactionEnvelopeType, TransactionType } from '../types.js';\nimport type {\n AuthorizationList,\n NestedTransactionMetadata,\n SecurityAlertResponse,\n TransactionBatchSingleRequest,\n PublishBatchHook,\n PublishBatchHookTransaction,\n PublishHook,\n TransactionBatchRequest,\n ValidateSecurityRequest,\n IsAtomicBatchSupportedResult,\n IsAtomicBatchSupportedResultEntry,\n TransactionBatchMeta,\n} from '../types.js';\nimport type { TransactionBatchResult, TransactionParams } from '../types.js';\nimport {\n ERROR_MESSGE_PUBLIC_KEY,\n doesAccountSupportEIP7702,\n doesChainSupportEIP7702,\n generateEIP7702BatchTransaction,\n isAccountUpgradedToEIP7702,\n} from './eip7702.js';\nimport {\n getBatchSizeLimit,\n getEIP7702SupportedChains,\n getEIP7702UpgradeContractAddress,\n} from './feature-flags.js';\nimport { simulateGasBatch } from './gas.js';\nimport { getChainId } from './provider.js';\nimport { determineTransactionType } from './transaction-type.js';\nimport { validateBatchRequest } from './validation.js';\n\ntype UpdateStateCallback = (\n callback: (\n state: TransactionControllerState,\n ) => void | TransactionControllerState,\n) => void;\n\ntype AddTransactionBatchRequest = {\n addTransaction: TransactionController['addTransaction'];\n estimateGas: TransactionController['estimateGas'];\n getGasFeeEstimates: (\n options: FetchGasFeeEstimateOptions,\n ) => Promise<GasFeeState>;\n getInternalAccounts: () => Hex[];\n getPendingTransactionTracker: (\n networkClientId: string,\n ) => PendingTransactionTracker;\n getSimulationConfig: GetSimulationConfig;\n getTransaction: (id: string) => TransactionMeta;\n isSimulationEnabled: (transactionMeta?: TransactionMeta) => boolean;\n messenger: TransactionControllerMessenger;\n publishBatchHook?: PublishBatchHook;\n publishTransaction: (transactionMeta: TransactionMeta) => Promise<Hex>;\n publicKeyEIP7702?: Hex;\n request: TransactionBatchRequest;\n requestId?: string;\n signTransaction: (\n transactionMeta: TransactionMeta,\n ) => Promise<string | undefined>;\n update: UpdateStateCallback;\n updateTransaction: (\n options: { transactionId: string },\n callback: (transactionMeta: TransactionMeta) => void,\n ) => void;\n};\n\ntype AddTransactionBatchRequestWithBatchId = Omit<\n AddTransactionBatchRequest,\n 'request'\n> & {\n request: Omit<TransactionBatchRequest, 'batchId'> & {\n batchId: Hex;\n };\n};\n\ntype IsAtomicBatchSupportedRequestInternal = {\n address: Hex;\n chainIds?: Hex[];\n messenger: TransactionControllerMessenger;\n publicKeyEIP7702?: Hex;\n};\n\nconst log = createModuleLogger(projectLogger, 'batch');\n\nexport const ERROR_MESSAGE_NO_UPGRADE_CONTRACT =\n 'Upgrade contract address not found';\n\n/**\n * Add a batch transaction.\n *\n * @param request - The request object including the user request and necessary callbacks.\n * @returns The batch result object including the batch ID.\n */\nexport async function addTransactionBatch(\n request: AddTransactionBatchRequest,\n): Promise<TransactionBatchResult> {\n const {\n getInternalAccounts,\n messenger,\n request: transactionBatchRequest,\n } = request;\n\n const { disableHook, disable7702, disableSequential } =\n transactionBatchRequest;\n\n const sizeLimit = getBatchSizeLimit(messenger);\n\n validateBatchRequest({\n internalAccounts: getInternalAccounts(),\n isInternal: transactionBatchRequest.isInternal,\n request: transactionBatchRequest,\n sizeLimit,\n });\n\n log('Adding', transactionBatchRequest);\n\n const accountCanUse7702 = doesAccountSupportEIP7702(\n messenger,\n transactionBatchRequest.from,\n );\n\n if (disableHook && disableSequential && !disable7702 && !accountCanUse7702) {\n throw rpcErrors.internal('Account does not support EIP-7702');\n }\n\n const batchId = transactionBatchRequest.batchId ?? generateBatchId();\n const requestWithBatchId: AddTransactionBatchRequestWithBatchId = {\n ...request,\n request: {\n ...transactionBatchRequest,\n batchId,\n },\n };\n\n try {\n if (!disable7702 && accountCanUse7702) {\n try {\n return await addTransactionBatchWith7702(requestWithBatchId);\n } catch (error: unknown) {\n const isEIP7702NotSupportedError =\n error instanceof JsonRpcError &&\n error.message === 'Chain does not support EIP-7702';\n\n if (!isEIP7702NotSupportedError || (disableHook && disableSequential)) {\n throw error;\n }\n }\n }\n\n return await addTransactionBatchWithHook(requestWithBatchId);\n } finally {\n wipeBatchTransactionCount(request.update, batchId);\n }\n}\n\n/**\n * Determine which chains support atomic batch transactions for the given account.\n *\n * @param request - The request object including the account address and necessary callbacks.\n * @returns The chain IDs that support atomic batch transactions.\n */\nexport async function isAtomicBatchSupported(\n request: IsAtomicBatchSupportedRequestInternal,\n): Promise<IsAtomicBatchSupportedResult> {\n const { address, chainIds, messenger, publicKeyEIP7702: publicKey } = request;\n\n if (!publicKey) {\n throw rpcErrors.internal(ERROR_MESSGE_PUBLIC_KEY);\n }\n\n const chainIds7702 = getEIP7702SupportedChains(messenger);\n\n const filteredChainIds = chainIds7702.filter(\n (chainId) => !chainIds || chainIds.includes(chainId),\n );\n\n const resultsRaw: (IsAtomicBatchSupportedResultEntry | undefined)[] =\n await Promise.all(\n filteredChainIds.map(async (chainId) => {\n try {\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n const { isSupported, delegationAddress } =\n await isAccountUpgradedToEIP7702(\n address,\n chainId,\n publicKey,\n messenger,\n networkClientId,\n );\n\n const upgradeContractAddress = getEIP7702UpgradeContractAddress(\n chainId,\n messenger,\n publicKey,\n );\n\n return {\n chainId,\n delegationAddress,\n isSupported,\n upgradeContractAddress,\n };\n } catch (error) {\n log('Error checking atomic batch support', chainId, error);\n return;\n }\n }),\n );\n\n const results = resultsRaw.filter(\n (result): result is IsAtomicBatchSupportedResultEntry => Boolean(result),\n );\n\n log('Atomic batch supported results', results);\n\n return results;\n}\n\n/**\n * Generate a transaction batch ID.\n *\n * @returns A unique batch ID as a hexadecimal string.\n */\nexport function generateBatchId(): Hex {\n const idString = v4();\n const idBytes = new Uint8Array(parse(idString));\n return bytesToHex(idBytes);\n}\n\n/**\n * Generate the metadata for a nested transaction.\n *\n * @param request - The batch request.\n * @param singleRequest - The request for a single transaction.\n * @param messenger - The transaction controller messenger.\n * @param networkClientId - The network client ID.\n * @returns The metadata for the nested transaction.\n */\nasync function getNestedTransactionMeta(\n request: TransactionBatchRequest,\n singleRequest: TransactionBatchSingleRequest,\n messenger: TransactionControllerMessenger,\n networkClientId: NetworkClientId,\n): Promise<NestedTransactionMetadata> {\n const { from } = request;\n const { params, type: requestedType } = singleRequest;\n\n if (requestedType) {\n return {\n ...params,\n type: requestedType,\n };\n }\n\n const { type: determinedType } = await determineTransactionType(\n { from, ...params },\n { messenger, networkClientId },\n );\n\n return {\n ...params,\n type: determinedType,\n };\n}\n\n/**\n * Build the authorization list for an EIP-7702 batch transaction.\n *\n * When the batch payer (`from`) requires an upgrade, an unsigned upgrade\n * authorization for that account is included first. Any caller-provided\n * authorizations (e.g. a pre-signed Money Account upgrade) are appended so\n * both can be submitted on the same type-4 transaction.\n *\n * @param options - Options bag.\n * @param options.chainId - Chain ID of the batch.\n * @param options.messenger - Controller messenger.\n * @param options.providedAuthorizationList - Optional authorizations from the batch request.\n * @param options.publicKeyEIP7702 - Public key used to resolve the upgrade contract.\n * @param options.requiresUpgrade - Whether the batch payer requires an EIP-7702 upgrade.\n * @returns The combined authorization list, or undefined when none are needed.\n */\nfunction buildBatchAuthorizationList({\n chainId,\n messenger,\n providedAuthorizationList,\n publicKeyEIP7702,\n requiresUpgrade,\n}: {\n chainId: Hex;\n messenger: TransactionControllerMessenger;\n providedAuthorizationList?: AuthorizationList;\n publicKeyEIP7702: Hex;\n requiresUpgrade: boolean;\n}): AuthorizationList | undefined {\n const authorizationList: AuthorizationList = [];\n\n if (requiresUpgrade) {\n const upgradeContractAddress = getEIP7702UpgradeContractAddress(\n chainId,\n messenger,\n publicKeyEIP7702,\n );\n\n if (!upgradeContractAddress) {\n throw rpcErrors.internal(ERROR_MESSAGE_NO_UPGRADE_CONTRACT);\n }\n\n authorizationList.push({ address: upgradeContractAddress });\n }\n\n if (providedAuthorizationList?.length) {\n authorizationList.push(...providedAuthorizationList);\n }\n\n return authorizationList.length ? authorizationList : undefined;\n}\n\n/**\n * Process a batch transaction using an EIP-7702 transaction.\n *\n * @param request - The request object including the user request and necessary callbacks.\n * @returns The batch result object including the batch ID.\n */\nasync function addTransactionBatchWith7702(\n request: AddTransactionBatchRequestWithBatchId,\n): Promise<TransactionBatchResult> {\n const {\n addTransaction,\n messenger,\n publicKeyEIP7702,\n request: userRequest,\n } = request;\n\n const {\n atomic,\n authorizationList: providedAuthorizationList,\n batchId,\n disableUpgrade,\n from,\n gasFeeToken,\n gasLimit7702,\n isInternal,\n networkClientId,\n origin,\n overwriteUpgrade,\n requestId,\n requiredAssets,\n requireApproval,\n securityAlertId,\n skipInitialGasEstimate,\n transactions,\n excludeNativeTokenForFee,\n forceIsGasFeeSponsored,\n isGasFeeIncluded,\n validateSecurity,\n } = userRequest;\n\n const chainId = getChainId({ messenger, networkClientId });\n const isChainSupported = doesChainSupportEIP7702(chainId, messenger);\n\n if (!isChainSupported) {\n log('Chain does not support EIP-7702', chainId);\n throw rpcErrors.internal('Chain does not support EIP-7702');\n }\n\n if (!publicKeyEIP7702) {\n throw rpcErrors.internal(ERROR_MESSGE_PUBLIC_KEY);\n }\n\n let requiresUpgrade = false;\n\n if (!disableUpgrade) {\n const { delegationAddress, isSupported } = await isAccountUpgradedToEIP7702(\n from,\n chainId,\n publicKeyEIP7702,\n messenger,\n networkClientId,\n );\n\n log('Account', { delegationAddress, isSupported });\n\n if (!isSupported && delegationAddress && !overwriteUpgrade) {\n log('Account upgraded to unsupported contract', from, delegationAddress);\n throw rpcErrors.internal('Account upgraded to unsupported contract');\n }\n\n requiresUpgrade = !isSupported;\n\n if (requiresUpgrade && delegationAddress) {\n log('Overwriting authorization as already upgraded', {\n current: delegationAddress,\n });\n }\n }\n\n const nestedTransactions = await Promise.all(\n transactions.map((tx) =>\n getNestedTransactionMeta(userRequest, tx, messenger, networkClientId),\n ),\n );\n\n const batchParams = generateEIP7702BatchTransaction(\n from,\n nestedTransactions,\n {\n atomic,\n },\n );\n\n const txParams: TransactionParams = {\n ...batchParams,\n from,\n gas: gasLimit7702,\n maxFeePerGas: nestedTransactions[0]?.maxFeePerGas,\n maxPriorityFeePerGas: nestedTransactions[0]?.maxPriorityFeePerGas,\n };\n\n const authorizationList = buildBatchAuthorizationList({\n chainId,\n messenger,\n providedAuthorizationList,\n publicKeyEIP7702,\n requiresUpgrade,\n });\n\n if (authorizationList?.length) {\n txParams.type = TransactionEnvelopeType.setCode;\n txParams.authorizationList = authorizationList;\n }\n\n if (validateSecurity) {\n // `delegationMock` applies to the batch payer (`from`) only. When\n // `requiresUpgrade` is true, that upgrade authorization is always first in\n // the list. Caller-provided auths for other accounts must not be used here.\n const securityRequest: ValidateSecurityRequest = {\n method: 'eth_sendTransaction',\n params: [\n {\n ...txParams,\n authorizationList: undefined,\n type: TransactionEnvelopeType.feeMarket,\n },\n ],\n delegationMock: requiresUpgrade\n ? authorizationList?.[0]?.address\n : undefined,\n origin,\n };\n\n log('Security request', securityRequest);\n\n validateSecurity(securityRequest, chainId).catch((error) => {\n log('Security validation failed', error);\n });\n }\n\n log('Adding batch transaction', txParams, networkClientId);\n\n setBatchTransactionCount(request.update, batchId, 1);\n\n const securityAlertResponse = securityAlertId\n ? ({ securityAlertId } as SecurityAlertResponse)\n : undefined;\n\n const existingTransaction = transactions.find(\n (tx) => tx.existingTransaction,\n )?.existingTransaction;\n\n if (existingTransaction) {\n await convertTransactionToEIP7702({\n batchId,\n existingTransaction,\n nestedTransactions,\n request,\n txParams,\n });\n\n return { batchId };\n }\n\n const { result } = await addTransaction(txParams, {\n batchId,\n gasFeeToken,\n excludeNativeTokenForFee,\n forceIsGasFeeSponsored,\n isGasFeeIncluded,\n isInternal,\n nestedTransactions,\n networkClientId,\n origin,\n requestId,\n requireApproval,\n requiredAssets,\n securityAlertResponse,\n skipInitialGasEstimate,\n type: TransactionType.batch,\n });\n\n const transactionHash = await result;\n\n log('Batch transaction added', { batchId, transactionHash });\n\n return {\n batchId,\n };\n}\n\n/**\n * Wait for a transaction to reach one of the specified statuses.\n * Checks the current state first to avoid race conditions, then subscribes to\n * state changes for ongoing updates.\n *\n * @param transactionId - The ID of the transaction to monitor.\n * @param targetStatuses - The statuses that indicate success.\n * @param request - The batch request containing messenger and getTransaction.\n */\nfunction waitForTransactionStatus(\n transactionId: string,\n targetStatuses: TransactionStatus[],\n request: Pick<AddTransactionBatchRequest, 'getTransaction' | 'messenger'>,\n): Promise<void> {\n const { getTransaction, messenger } = request;\n const failureStatuses = [\n TransactionStatus.failed,\n TransactionStatus.rejected,\n ];\n\n return new Promise<void>((resolve, reject) => {\n const checkStatus = (\n tx?: TransactionMeta,\n unsubscribe?: () => void,\n ): boolean => {\n if (targetStatuses.includes(tx?.status as TransactionStatus)) {\n unsubscribe?.();\n resolve();\n return true;\n }\n\n if (failureStatuses.includes(tx?.status as TransactionStatus)) {\n unsubscribe?.();\n reject(\n new Error(\n tx?.error?.message ?? `Transaction ${transactionId} ${tx?.status}`,\n ),\n );\n return true;\n }\n\n return false;\n };\n\n const initialTx = getTransaction(transactionId);\n\n if (checkStatus(initialTx)) {\n return;\n }\n\n const handler = (tx?: TransactionMeta): void => {\n const unsubscribe = (): void =>\n messenger.unsubscribe('TransactionController:stateChange', handler);\n\n checkStatus(tx, unsubscribe);\n };\n\n messenger.subscribe(\n 'TransactionController:stateChange',\n handler,\n (state: TransactionControllerState) =>\n state.transactions.find((tx) => tx.id === transactionId),\n );\n });\n}\n\n/**\n * Process a batch transaction using a publish batch hook.\n *\n * @param request - The request object including the user request and necessary callbacks.\n * @returns The batch result object including the batch ID.\n */\nasync function addTransactionBatchWithHook(\n request: AddTransactionBatchRequestWithBatchId,\n): Promise<TransactionBatchResult> {\n const {\n messenger,\n publishBatchHook: requestPublishBatchHook,\n request: userRequest,\n update,\n } = request;\n\n const {\n batchId,\n from,\n networkClientId,\n origin,\n requireApproval,\n transactions: requestedTransactions,\n } = userRequest;\n\n let resultCallbacks: AcceptResultCallbacks | undefined;\n let isSequentialBatchHook = false;\n\n log('Adding transaction batch using hook', userRequest);\n\n const sequentialPublishBatchHook = new SequentialPublishBatchHook({\n publishTransaction: request.publishTransaction,\n getTransaction: request.getTransaction,\n getPendingTransactionTracker: request.getPendingTransactionTracker,\n });\n\n let { disable7702, disableSequential } = userRequest;\n const { disableHook, useHook } = userRequest;\n\n // use hook is a temporary alias for disable7702 and disableSequential\n if (useHook) {\n disable7702 = true;\n disableSequential = true;\n }\n\n let publishBatchHook = null;\n\n if (!disableHook && requestPublishBatchHook) {\n publishBatchHook = requestPublishBatchHook;\n } else if (!disableSequential) {\n publishBatchHook = sequentialPublishBatchHook.getHook();\n isSequentialBatchHook = true;\n }\n\n if (!publishBatchHook) {\n log(`No supported batch methods found`, {\n disable7702,\n disableHook,\n disableSequential,\n });\n throw rpcErrors.internal(`Can't process batch`);\n }\n\n let txBatchMeta: TransactionBatchMeta | undefined;\n const nestedTransactions = requestedTransactions.map((tx) => ({\n ...tx,\n origin,\n }));\n\n const transactionCount = nestedTransactions.length;\n setBatchTransactionCount(update, batchId, transactionCount);\n const collectHook = new CollectPublishHook(transactionCount);\n\n try {\n if (requireApproval) {\n txBatchMeta = await prepareApprovalData({\n batchId,\n request,\n });\n\n resultCallbacks = (await requestApproval(txBatchMeta, messenger))\n .resultCallbacks;\n }\n\n const publishHook = collectHook.getHook();\n const hookTransactions: Omit<PublishBatchHookTransaction, 'signedTx'>[] =\n [];\n\n let index = 0;\n\n for (const nestedTransaction of nestedTransactions) {\n const hookTransaction = await processTransactionWithHook(\n batchId,\n nestedTransaction,\n publishHook,\n request,\n txBatchMeta,\n index,\n );\n\n hookTransactions.push(hookTransaction);\n index += 1;\n\n await waitForTransactionStatus(\n String(hookTransaction.id),\n [\n TransactionStatus.signed,\n TransactionStatus.submitted,\n TransactionStatus.confirmed,\n ],\n request,\n );\n }\n\n const { signedTransactions } = await collectHook.ready();\n\n const transactions = hookTransactions.map((transaction, i) => ({\n ...transaction,\n signedTx: signedTransactions[i],\n }));\n\n const hookParams: PublishBatchHookRequest = {\n from,\n networkClientId,\n transactions,\n };\n\n log('Calling publish batch hook', hookParams);\n\n let result = await publishBatchHook(hookParams);\n\n log('Publish batch hook result', result);\n\n if (!result && !isSequentialBatchHook && !disableSequential) {\n log('Fallback to sequential publish batch hook due to empty results');\n const sequentialBatchHook = sequentialPublishBatchHook.getHook();\n result = await sequentialBatchHook(hookParams);\n }\n\n if (!result?.results?.length) {\n throw new Error('Publish batch hook did not return a result');\n }\n\n const transactionHashes = result.results.map(\n ({ transactionHash }) => transactionHash,\n );\n\n collectHook.success(transactionHashes);\n resultCallbacks?.success();\n\n log('Completed batch transaction with hook', transactionHashes);\n\n return {\n batchId,\n };\n } catch (error) {\n log('Publish batch hook failed', error);\n\n collectHook.error(error);\n resultCallbacks?.error(error as Error);\n\n throw error;\n } finally {\n log('Cleaning up publish batch hook', batchId);\n wipeTransactionBatchById(update, batchId);\n }\n}\n\n/**\n * Process a single transaction with a publish batch hook.\n *\n * @param batchId - ID of the transaction batch.\n * @param nestedTransaction - The nested transaction request.\n * @param publishHook - The publish hook to use for each transaction.\n * @param request - The request object including the user request and necessary callbacks.\n * @param txBatchMeta - Metadata for the transaction batch.\n * @param index - The index of the transaction in the batch.\n * @returns The single transaction request to be processed by the publish batch hook.\n */\nasync function processTransactionWithHook(\n batchId: Hex,\n nestedTransaction: TransactionBatchSingleRequest,\n publishHook: PublishHook,\n request: AddTransactionBatchRequest,\n txBatchMeta: TransactionBatchMeta | undefined,\n index: number,\n): Promise<\n Omit<PublishBatchHookTransaction, 'signedTx'> & { type?: TransactionType }\n> {\n const { assetsFiatValues, existingTransaction, params, type } =\n nestedTransaction;\n\n const {\n addTransaction,\n getTransaction,\n request: userRequest,\n updateTransaction,\n } = request;\n\n const { from, isInternal, networkClientId, origin } = userRequest;\n\n if (existingTransaction) {\n const { id, onPublish } = existingTransaction;\n let transactionMeta = getTransaction(id);\n const currentNonceHex = transactionMeta.txParams.nonce;\n let { signedTransaction } = existingTransaction;\n\n const currentNonceNum = currentNonceHex\n ? parseInt(currentNonceHex, 16)\n : undefined;\n\n const newNonce =\n index > 0 && currentNonceNum !== undefined\n ? currentNonceNum + index\n : undefined;\n\n updateTransaction({ transactionId: id }, (_transactionMeta) => {\n _transactionMeta.batchId = batchId;\n\n if (newNonce) {\n _transactionMeta.txParams.nonce = toHex(newNonce);\n }\n });\n\n if (newNonce) {\n const signResult = await updateTransactionSignature({\n transactionId: id,\n request,\n });\n\n signedTransaction = signResult.newSignature;\n transactionMeta = signResult.transactionMeta;\n }\n\n publishHook(transactionMeta, signedTransaction)\n .then((hookResult) => {\n onPublish?.(hookResult);\n return;\n })\n .catch(() => {\n // Intentionally empty\n });\n\n log('Processed existing transaction with hook', {\n id,\n params,\n });\n\n return {\n id,\n params,\n };\n }\n\n const transactionMetaForGasEstimates = {\n ...txBatchMeta,\n txParams: { ...params, from, gas: txBatchMeta?.gas ?? params.gas },\n };\n\n if (txBatchMeta) {\n updateTransactionGasEstimates({\n txMeta: transactionMetaForGasEstimates as TransactionMeta,\n userFeeLevel: GasFeeEstimateLevel.Medium,\n });\n }\n\n const { transactionMeta } = await addTransaction(\n transactionMetaForGasEstimates.txParams,\n {\n assetsFiatValues,\n batchId,\n disableGasBuffer: true,\n isInternal,\n networkClientId,\n origin,\n publishHook,\n requireApproval: false,\n type,\n },\n );\n\n const { id, txParams } = transactionMeta;\n const data = txParams.data as Hex | undefined;\n const gas = txParams.gas as Hex | undefined;\n const maxFeePerGas = txParams.maxFeePerGas as Hex | undefined;\n const maxPriorityFeePerGas = txParams.maxPriorityFeePerGas as Hex | undefined;\n const to = txParams.to as Hex | undefined;\n const value = txParams.value as Hex | undefined;\n\n const newParams: BatchTransactionParams = {\n data,\n gas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n value,\n };\n\n log('Processed new transaction with hook', {\n id,\n params: newParams,\n type,\n });\n\n return {\n id,\n params: newParams,\n type,\n };\n}\n\n/**\n * Requests approval for a transaction batch by interacting with the ApprovalController.\n *\n * @param txBatchMeta - Metadata for the transaction batch, including its ID and origin.\n * @param messenger - The messenger instance used to communicate with the ApprovalController.\n * @returns A promise that resolves to the result of adding the approval request.\n */\nasync function requestApproval(\n txBatchMeta: TransactionBatchMeta,\n messenger: TransactionControllerMessenger,\n): Promise<AddResult> {\n const id = String(txBatchMeta.id);\n const { origin } = txBatchMeta;\n const type = ApprovalType.TransactionBatch;\n const requestData = { txBatchId: id };\n\n log('Requesting approval for transaction batch', id);\n return (await messenger.call(\n 'ApprovalController:addRequest',\n {\n id,\n origin: origin ?? ORIGIN_METAMASK,\n requestData,\n expectsResult: true,\n type,\n },\n true,\n )) as Promise<AddResult>;\n}\n\n/**\n * Adds batch metadata to the transaction controller state.\n *\n * @param transactionBatchMeta - The transaction batch metadata to be added.\n * @param update - The update function to modify the transaction controller state.\n */\nfunction addBatchMetadata(\n transactionBatchMeta: TransactionBatchMeta,\n update: UpdateStateCallback,\n): void {\n update((state) => {\n state.transactionBatches = [\n ...state.transactionBatches,\n transactionBatchMeta,\n ];\n });\n}\n\n/**\n * Set the transaction count for an active batch.\n *\n * @param update - The update function to modify the transaction controller state.\n * @param id - The ID of the transaction batch.\n * @param count - The number of transactions to sign.\n */\nfunction setBatchTransactionCount(\n update: UpdateStateCallback,\n id: string,\n count: number,\n): void {\n update((state) => {\n state.batchTransactionCounts[id] = count;\n });\n}\n\n/**\n * Wipes the transaction count for a completed batch.\n *\n * @param update - The update function to modify the transaction controller state.\n * @param id - The ID of the transaction batch.\n */\nfunction wipeBatchTransactionCount(\n update: UpdateStateCallback,\n id: string,\n): void {\n update((state) => {\n delete state.batchTransactionCounts[id];\n });\n}\n\n/**\n * Wipes a specific transaction batch from the transaction controller state by its ID.\n *\n * @param update - The update function to modify the transaction controller state.\n * @param id - The ID of the transaction batch to be wiped.\n */\nfunction wipeTransactionBatchById(\n update: UpdateStateCallback,\n id: string,\n): void {\n update((state) => {\n state.transactionBatches = state.transactionBatches.filter(\n (batch) => batch.id !== id,\n );\n });\n}\n\n/**\n * Create a new batch metadata object.\n *\n * @param transactionBatchMeta - The transaction batch metadata object to be created.\n * @returns A new TransactionBatchMeta object.\n */\nfunction newBatchMetadata(\n transactionBatchMeta: Omit<TransactionBatchMeta, 'status'>,\n): TransactionBatchMeta {\n return {\n ...transactionBatchMeta,\n status: TransactionStatus.unapproved,\n };\n}\n\n/**\n * Prepares the approval data for a transaction batch.\n *\n * @param options - The options object containing necessary parameters.\n * @param options.batchId - The batch ID for the transaction batch.\n * @param options.request - The request object including the user request and necessary callbacks.\n * @returns The prepared transaction batch metadata.\n */\nasync function prepareApprovalData({\n batchId,\n request,\n}: {\n batchId: Hex;\n request: AddTransactionBatchRequest;\n}): Promise<TransactionBatchMeta> {\n const {\n messenger,\n request: userRequest,\n isSimulationEnabled,\n getGasFeeEstimates,\n getSimulationConfig,\n update,\n } = request;\n\n const {\n from,\n isInternal,\n origin,\n networkClientId,\n transactions: nestedTransactions,\n } = userRequest;\n\n if (!isSimulationEnabled()) {\n throw new Error(\n 'Cannot create transaction batch as simulation not supported',\n );\n }\n log('Preparing approval data for batch');\n const chainId = getChainId({ messenger, networkClientId });\n\n const { totalGasLimit: gasLimit } = await simulateGasBatch({\n chainId,\n from,\n getSimulationConfig,\n transactions: nestedTransactions,\n });\n\n const txBatchMeta: TransactionBatchMeta = newBatchMetadata({\n chainId,\n from,\n gas: gasLimit,\n id: batchId,\n isInternal,\n networkClientId,\n origin,\n transactions: nestedTransactions,\n });\n\n const defaultGasFeeFlow = new DefaultGasFeeFlow();\n const gasFeeControllerData = await getGasFeeEstimates({\n networkClientId,\n });\n\n const gasFeeResponse = await defaultGasFeeFlow.getGasFees({\n gasFeeControllerData,\n messenger,\n transactionMeta: {\n ...txBatchMeta,\n txParams: {\n from,\n gas: gasLimit,\n },\n time: Date.now(),\n },\n });\n\n txBatchMeta.gasFeeEstimates = gasFeeResponse.estimates;\n\n log('Saving transaction batch metadata', txBatchMeta);\n addBatchMetadata(txBatchMeta, update);\n\n return txBatchMeta;\n}\n\n/**\n * Convert an existing transaction to an EIP-7702 batch transaction.\n *\n * @param options - Options object.\n * @param options.batchId - Batch ID for the transaction batch.\n * @param options.existingTransaction - Existing transaction to be converted.\n * @param options.nestedTransactions - Nested transactions to be included in the batch.\n * @param options.request - Request object including the user request and necessary callbacks.\n * @param options.txParams - Transaction parameters for the new EIP-7702 transaction.\n * @param options.existingTransaction.id - ID of the existing transaction.\n * @param options.existingTransaction.onPublish - Callback for when the transaction is published.\n * @returns Promise that resolves after the publish callback has been invoked.\n */\nasync function convertTransactionToEIP7702({\n batchId,\n existingTransaction,\n nestedTransactions,\n request,\n txParams,\n}: {\n batchId: Hex;\n request: AddTransactionBatchRequest;\n existingTransaction: {\n id: string;\n onPublish?: ({\n transactionHash,\n newSignature,\n }: {\n transactionHash: string | undefined;\n newSignature: Hex;\n }) => void;\n };\n nestedTransactions: NestedTransactionMetadata[];\n txParams: TransactionParams;\n}): Promise<void> {\n const { getTransaction, estimateGas, updateTransaction } = request;\n const existingTransactionMeta = getTransaction(existingTransaction.id);\n\n if (!existingTransactionMeta) {\n throw new Error('Existing transaction not found');\n }\n\n log('Converting existing transaction to 7702', { batchId, txParams });\n\n const { networkClientId } = existingTransactionMeta;\n const newGasResult = await estimateGas(txParams, networkClientId);\n\n log('Estimated gas for converted EIP-7702 transaction', newGasResult);\n\n updateTransaction(\n { transactionId: existingTransactionMeta.id },\n (transactionMeta) => {\n transactionMeta.batchId = batchId;\n transactionMeta.nestedTransactions = nestedTransactions;\n transactionMeta.txParams = txParams;\n transactionMeta.txParams.gas = newGasResult.gas;\n transactionMeta.txParams.gasLimit = newGasResult.gas;\n transactionMeta.txParams.maxFeePerGas =\n existingTransactionMeta.txParams.maxFeePerGas;\n transactionMeta.txParams.maxPriorityFeePerGas =\n existingTransactionMeta.txParams.maxPriorityFeePerGas;\n transactionMeta.txParams.nonce = existingTransactionMeta.txParams.nonce;\n transactionMeta.txParams.type ??= TransactionEnvelopeType.feeMarket;\n },\n );\n\n const { newSignature } = await updateTransactionSignature({\n request,\n transactionId: existingTransactionMeta.id,\n });\n\n existingTransaction.onPublish?.({\n transactionHash: undefined,\n newSignature,\n });\n\n log('Transaction updated to EIP-7702', { batchId, txParams, newSignature });\n}\n\n/**\n * Update the signature of an existing transaction.\n *\n * @param options - Options object.\n * @param options.request - The request object including the user request and necessary callbacks.\n * @param options.transactionId - The ID of the transaction to update.\n * @returns An object containing the new signature and updated transaction metadata.\n */\nasync function updateTransactionSignature({\n request,\n transactionId,\n}: {\n request: AddTransactionBatchRequest;\n transactionId: string;\n}): Promise<{\n newSignature: Hex;\n transactionMeta: TransactionMeta;\n}> {\n const { getTransaction, signTransaction } = request;\n const metadataToSign = getTransaction(transactionId);\n\n log('Re-signing existing transaction', {\n transactionId,\n txParams: metadataToSign.txParams,\n });\n\n const newSignature = (await signTransaction(metadataToSign)) as\n | Hex\n | undefined;\n\n if (!newSignature) {\n throw new Error('Failed to re-sign transaction');\n }\n\n const transactionMeta = getTransaction(transactionId);\n\n log('New signature', newSignature);\n\n return { newSignature, transactionMeta };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/utils/batch.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AcceptResultCallbacks,\n AddResult,\n} from '@metamask/approval-controller';\nimport {\n ApprovalType,\n ORIGIN_METAMASK,\n toHex,\n} from '@metamask/controller-utils';\nimport type {\n FetchGasFeeEstimateOptions,\n GasFeeState,\n} from '@metamask/gas-fee-controller';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport { JsonRpcError, rpcErrors } from '@metamask/rpc-errors';\nimport type { Hex } from '@metamask/utils';\nimport { bytesToHex, createModuleLogger } from '@metamask/utils';\nimport { parse, v4 } from 'uuid';\n\nimport { DefaultGasFeeFlow } from '../gas-flows/DefaultGasFeeFlow.js';\nimport { updateTransactionGasEstimates } from '../helpers/GasFeePoller.js';\nimport type { PendingTransactionTracker } from '../helpers/PendingTransactionTracker.js';\nimport { CollectPublishHook } from '../hooks/CollectPublishHook.js';\nimport { SequentialPublishBatchHook } from '../hooks/SequentialPublishBatchHook.js';\nimport { GasFeeEstimateLevel, TransactionStatus } from '../index.js';\nimport type {\n BatchTransactionParams,\n GetSimulationConfig,\n PublishBatchHookRequest,\n TransactionController,\n TransactionControllerMessenger,\n TransactionControllerState,\n TransactionMeta,\n} from '../index.js';\nimport { projectLogger } from '../logger.js';\nimport { TransactionEnvelopeType, TransactionType } from '../types.js';\nimport type {\n AuthorizationList,\n NestedTransactionMetadata,\n SecurityAlertResponse,\n TransactionBatchSingleRequest,\n PublishBatchHook,\n PublishBatchHookTransaction,\n PublishHook,\n TransactionBatchRequest,\n ValidateSecurityRequest,\n IsAtomicBatchSupportedResult,\n IsAtomicBatchSupportedResultEntry,\n TransactionBatchMeta,\n} from '../types.js';\nimport type { TransactionBatchResult, TransactionParams } from '../types.js';\nimport {\n ERROR_MESSGE_PUBLIC_KEY,\n doesAccountSupportEIP7702,\n doesChainSupportEIP7702,\n generateEIP7702BatchTransaction,\n isAccountUpgradedToEIP7702,\n} from './eip7702.js';\nimport {\n getBatchSizeLimit,\n getEIP7702SupportedChains,\n getEIP7702UpgradeContractAddress,\n} from './feature-flags.js';\nimport { simulateGasBatch } from './gas.js';\nimport { getChainId } from './provider.js';\nimport { determineTransactionType } from './transaction-type.js';\nimport { validateBatchRequest } from './validation.js';\n\ntype UpdateStateCallback = (\n callback: (\n state: TransactionControllerState,\n ) => void | TransactionControllerState,\n) => void;\n\ntype AddTransactionBatchRequest = {\n addTransaction: TransactionController['addTransaction'];\n estimateGas: TransactionController['estimateGas'];\n getGasFeeEstimates: (\n options: FetchGasFeeEstimateOptions,\n ) => Promise<GasFeeState>;\n getInternalAccounts: () => Hex[];\n getPendingTransactionTracker: (\n networkClientId: string,\n ) => PendingTransactionTracker;\n getSimulationConfig: GetSimulationConfig;\n getTransaction: (id: string) => TransactionMeta;\n isSimulationEnabled: (transactionMeta?: TransactionMeta) => boolean;\n messenger: TransactionControllerMessenger;\n publishBatchHook?: PublishBatchHook;\n publishTransaction: (transactionMeta: TransactionMeta) => Promise<Hex>;\n publicKeyEIP7702?: Hex;\n request: TransactionBatchRequest;\n requestId?: string;\n signTransaction: (\n transactionMeta: TransactionMeta,\n ) => Promise<string | undefined>;\n update: UpdateStateCallback;\n updateTransaction: (\n options: { transactionId: string },\n callback: (transactionMeta: TransactionMeta) => void,\n ) => void;\n};\n\ntype AddTransactionBatchRequestWithBatchId = Omit<\n AddTransactionBatchRequest,\n 'request'\n> & {\n request: Omit<TransactionBatchRequest, 'batchId'> & {\n batchId: Hex;\n };\n};\n\ntype IsAtomicBatchSupportedRequestInternal = {\n address: Hex;\n chainIds?: Hex[];\n messenger: TransactionControllerMessenger;\n publicKeyEIP7702?: Hex;\n};\n\nconst log = createModuleLogger(projectLogger, 'batch');\n\nexport const ERROR_MESSAGE_NO_UPGRADE_CONTRACT =\n 'Upgrade contract address not found';\n\n/**\n * Add a batch transaction.\n *\n * @param request - The request object including the user request and necessary callbacks.\n * @returns The batch result object including the batch ID.\n */\nexport async function addTransactionBatch(\n request: AddTransactionBatchRequest,\n): Promise<TransactionBatchResult> {\n const {\n getInternalAccounts,\n messenger,\n request: transactionBatchRequest,\n } = request;\n\n const { disableHook, disable7702, disableSequential } =\n transactionBatchRequest;\n\n const sizeLimit = getBatchSizeLimit(messenger);\n\n validateBatchRequest({\n internalAccounts: getInternalAccounts(),\n isInternal: transactionBatchRequest.isInternal,\n request: transactionBatchRequest,\n sizeLimit,\n });\n\n log('Adding', transactionBatchRequest);\n\n const accountCanUse7702 = doesAccountSupportEIP7702(\n messenger,\n transactionBatchRequest.from,\n );\n\n if (disableHook && disableSequential && !disable7702 && !accountCanUse7702) {\n throw rpcErrors.internal('Account does not support EIP-7702');\n }\n\n const batchId = transactionBatchRequest.batchId ?? generateBatchId();\n const requestWithBatchId: AddTransactionBatchRequestWithBatchId = {\n ...request,\n request: {\n ...transactionBatchRequest,\n batchId,\n },\n };\n\n try {\n if (!disable7702 && accountCanUse7702) {\n try {\n return await addTransactionBatchWith7702(requestWithBatchId);\n } catch (error: unknown) {\n const isEIP7702NotSupportedError =\n error instanceof JsonRpcError &&\n error.message === 'Chain does not support EIP-7702';\n\n if (!isEIP7702NotSupportedError || (disableHook && disableSequential)) {\n throw error;\n }\n }\n }\n\n return await addTransactionBatchWithHook(requestWithBatchId);\n } finally {\n wipeBatchTransactionCount(request.update, batchId);\n }\n}\n\n/**\n * Determine which chains support atomic batch transactions for the given account.\n *\n * @param request - The request object including the account address and necessary callbacks.\n * @returns The chain IDs that support atomic batch transactions.\n */\nexport async function isAtomicBatchSupported(\n request: IsAtomicBatchSupportedRequestInternal,\n): Promise<IsAtomicBatchSupportedResult> {\n const { address, chainIds, messenger, publicKeyEIP7702: publicKey } = request;\n\n if (!publicKey) {\n throw rpcErrors.internal(ERROR_MESSGE_PUBLIC_KEY);\n }\n\n const chainIds7702 = getEIP7702SupportedChains(messenger);\n\n const filteredChainIds = chainIds7702.filter(\n (chainId) => !chainIds || chainIds.includes(chainId),\n );\n\n const resultsRaw: (IsAtomicBatchSupportedResultEntry | undefined)[] =\n await Promise.all(\n filteredChainIds.map(async (chainId) => {\n try {\n const networkClientId = messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId,\n );\n\n const { isSupported, delegationAddress } =\n await isAccountUpgradedToEIP7702(\n address,\n chainId,\n publicKey,\n messenger,\n networkClientId,\n );\n\n const upgradeContractAddress = getEIP7702UpgradeContractAddress(\n chainId,\n messenger,\n publicKey,\n );\n\n return {\n chainId,\n delegationAddress,\n isSupported,\n upgradeContractAddress,\n };\n } catch (error) {\n log('Error checking atomic batch support', chainId, error);\n return;\n }\n }),\n );\n\n const results = resultsRaw.filter(\n (result): result is IsAtomicBatchSupportedResultEntry => Boolean(result),\n );\n\n log('Atomic batch supported results', results);\n\n return results;\n}\n\n/**\n * Generate a transaction batch ID.\n *\n * @returns A unique batch ID as a hexadecimal string.\n */\nexport function generateBatchId(): Hex {\n const idString = v4();\n const idBytes = new Uint8Array(parse(idString));\n return bytesToHex(idBytes);\n}\n\n/**\n * Generate the metadata for a nested transaction.\n *\n * @param request - The batch request.\n * @param singleRequest - The request for a single transaction.\n * @param messenger - The transaction controller messenger.\n * @param networkClientId - The network client ID.\n * @returns The metadata for the nested transaction.\n */\nasync function getNestedTransactionMeta(\n request: TransactionBatchRequest,\n singleRequest: TransactionBatchSingleRequest,\n messenger: TransactionControllerMessenger,\n networkClientId: NetworkClientId,\n): Promise<NestedTransactionMetadata> {\n const { from } = request;\n const { params, type: requestedType } = singleRequest;\n\n if (requestedType) {\n return {\n ...params,\n type: requestedType,\n };\n }\n\n const { type: determinedType } = await determineTransactionType(\n { from, ...params },\n { messenger, networkClientId },\n );\n\n return {\n ...params,\n type: determinedType,\n };\n}\n\n/**\n * Build the authorization list for an EIP-7702 batch transaction.\n *\n * When the batch payer (`from`) requires an upgrade, an unsigned upgrade\n * authorization for that account is included first. Any caller-provided\n * authorizations (e.g. a pre-signed Money Account upgrade) are appended so\n * both can be submitted on the same type-4 transaction.\n *\n * @param options - Options bag.\n * @param options.chainId - Chain ID of the batch.\n * @param options.messenger - Controller messenger.\n * @param options.providedAuthorizationList - Optional authorizations from the batch request.\n * @param options.publicKeyEIP7702 - Public key used to resolve the upgrade contract.\n * @param options.requiresUpgrade - Whether the batch payer requires an EIP-7702 upgrade.\n * @returns The combined authorization list, or undefined when none are needed.\n */\nfunction buildBatchAuthorizationList({\n chainId,\n messenger,\n providedAuthorizationList,\n publicKeyEIP7702,\n requiresUpgrade,\n}: {\n chainId: Hex;\n messenger: TransactionControllerMessenger;\n providedAuthorizationList?: AuthorizationList;\n publicKeyEIP7702: Hex;\n requiresUpgrade: boolean;\n}): AuthorizationList | undefined {\n const authorizationList: AuthorizationList = [];\n\n if (requiresUpgrade) {\n const upgradeContractAddress = getEIP7702UpgradeContractAddress(\n chainId,\n messenger,\n publicKeyEIP7702,\n );\n\n if (!upgradeContractAddress) {\n throw rpcErrors.internal(ERROR_MESSAGE_NO_UPGRADE_CONTRACT);\n }\n\n authorizationList.push({ address: upgradeContractAddress });\n }\n\n if (providedAuthorizationList?.length) {\n authorizationList.push(...providedAuthorizationList);\n }\n\n return authorizationList.length ? authorizationList : undefined;\n}\n\n/**\n * Process a batch transaction using an EIP-7702 transaction.\n *\n * @param request - The request object including the user request and necessary callbacks.\n * @returns The batch result object including the batch ID.\n */\nasync function addTransactionBatchWith7702(\n request: AddTransactionBatchRequestWithBatchId,\n): Promise<TransactionBatchResult> {\n const {\n addTransaction,\n messenger,\n publicKeyEIP7702,\n request: userRequest,\n } = request;\n\n const {\n atomic,\n authorizationList: providedAuthorizationList,\n batchId,\n disableUpgrade,\n from,\n gasFeeToken,\n gasLimit7702,\n isInternal,\n networkClientId,\n origin,\n overwriteUpgrade,\n requestId,\n requiredAssets,\n requireApproval,\n securityAlertId,\n skipInitialGasEstimate,\n transactions,\n excludeNativeTokenForFee,\n isGasFeeIncluded,\n isGasFeeSponsored,\n validateSecurity,\n } = userRequest;\n\n const chainId = getChainId({ messenger, networkClientId });\n const isChainSupported = doesChainSupportEIP7702(chainId, messenger);\n\n if (!isChainSupported) {\n log('Chain does not support EIP-7702', chainId);\n throw rpcErrors.internal('Chain does not support EIP-7702');\n }\n\n if (!publicKeyEIP7702) {\n throw rpcErrors.internal(ERROR_MESSGE_PUBLIC_KEY);\n }\n\n let requiresUpgrade = false;\n\n if (!disableUpgrade) {\n const { delegationAddress, isSupported } = await isAccountUpgradedToEIP7702(\n from,\n chainId,\n publicKeyEIP7702,\n messenger,\n networkClientId,\n );\n\n log('Account', { delegationAddress, isSupported });\n\n if (!isSupported && delegationAddress && !overwriteUpgrade) {\n log('Account upgraded to unsupported contract', from, delegationAddress);\n throw rpcErrors.internal('Account upgraded to unsupported contract');\n }\n\n requiresUpgrade = !isSupported;\n\n if (requiresUpgrade && delegationAddress) {\n log('Overwriting authorization as already upgraded', {\n current: delegationAddress,\n });\n }\n }\n\n const nestedTransactions = await Promise.all(\n transactions.map((tx) =>\n getNestedTransactionMeta(userRequest, tx, messenger, networkClientId),\n ),\n );\n\n const batchParams = generateEIP7702BatchTransaction(\n from,\n nestedTransactions,\n {\n atomic,\n },\n );\n\n const txParams: TransactionParams = {\n ...batchParams,\n from,\n gas: gasLimit7702,\n maxFeePerGas: nestedTransactions[0]?.maxFeePerGas,\n maxPriorityFeePerGas: nestedTransactions[0]?.maxPriorityFeePerGas,\n };\n\n const authorizationList = buildBatchAuthorizationList({\n chainId,\n messenger,\n providedAuthorizationList,\n publicKeyEIP7702,\n requiresUpgrade,\n });\n\n if (authorizationList?.length) {\n txParams.type = TransactionEnvelopeType.setCode;\n txParams.authorizationList = authorizationList;\n }\n\n if (validateSecurity) {\n // `delegationMock` applies to the batch payer (`from`) only. When\n // `requiresUpgrade` is true, that upgrade authorization is always first in\n // the list. Caller-provided auths for other accounts must not be used here.\n const securityRequest: ValidateSecurityRequest = {\n method: 'eth_sendTransaction',\n params: [\n {\n ...txParams,\n authorizationList: undefined,\n type: TransactionEnvelopeType.feeMarket,\n },\n ],\n delegationMock: requiresUpgrade\n ? authorizationList?.[0]?.address\n : undefined,\n origin,\n };\n\n log('Security request', securityRequest);\n\n validateSecurity(securityRequest, chainId).catch((error) => {\n log('Security validation failed', error);\n });\n }\n\n log('Adding batch transaction', txParams, networkClientId);\n\n setBatchTransactionCount(request.update, batchId, 1);\n\n const securityAlertResponse = securityAlertId\n ? ({ securityAlertId } as SecurityAlertResponse)\n : undefined;\n\n const existingTransaction = transactions.find(\n (tx) => tx.existingTransaction,\n )?.existingTransaction;\n\n if (existingTransaction) {\n await convertTransactionToEIP7702({\n batchId,\n existingTransaction,\n nestedTransactions,\n request,\n txParams,\n });\n\n return { batchId };\n }\n\n const { result } = await addTransaction(txParams, {\n batchId,\n gasFeeToken,\n excludeNativeTokenForFee,\n isGasFeeIncluded,\n isGasFeeSponsored,\n isInternal,\n nestedTransactions,\n networkClientId,\n origin,\n requestId,\n requireApproval,\n requiredAssets,\n securityAlertResponse,\n skipInitialGasEstimate,\n type: TransactionType.batch,\n });\n\n const transactionHash = await result;\n\n log('Batch transaction added', { batchId, transactionHash });\n\n return {\n batchId,\n };\n}\n\n/**\n * Wait for a transaction to reach one of the specified statuses.\n * Checks the current state first to avoid race conditions, then subscribes to\n * state changes for ongoing updates.\n *\n * @param transactionId - The ID of the transaction to monitor.\n * @param targetStatuses - The statuses that indicate success.\n * @param request - The batch request containing messenger and getTransaction.\n */\nfunction waitForTransactionStatus(\n transactionId: string,\n targetStatuses: TransactionStatus[],\n request: Pick<AddTransactionBatchRequest, 'getTransaction' | 'messenger'>,\n): Promise<void> {\n const { getTransaction, messenger } = request;\n const failureStatuses = [\n TransactionStatus.failed,\n TransactionStatus.rejected,\n ];\n\n return new Promise<void>((resolve, reject) => {\n const checkStatus = (\n tx?: TransactionMeta,\n unsubscribe?: () => void,\n ): boolean => {\n if (targetStatuses.includes(tx?.status as TransactionStatus)) {\n unsubscribe?.();\n resolve();\n return true;\n }\n\n if (failureStatuses.includes(tx?.status as TransactionStatus)) {\n unsubscribe?.();\n reject(\n new Error(\n tx?.error?.message ?? `Transaction ${transactionId} ${tx?.status}`,\n ),\n );\n return true;\n }\n\n return false;\n };\n\n const initialTx = getTransaction(transactionId);\n\n if (checkStatus(initialTx)) {\n return;\n }\n\n const handler = (tx?: TransactionMeta): void => {\n const unsubscribe = (): void =>\n messenger.unsubscribe('TransactionController:stateChange', handler);\n\n checkStatus(tx, unsubscribe);\n };\n\n messenger.subscribe(\n 'TransactionController:stateChange',\n handler,\n (state: TransactionControllerState) =>\n state.transactions.find((tx) => tx.id === transactionId),\n );\n });\n}\n\n/**\n * Process a batch transaction using a publish batch hook.\n *\n * @param request - The request object including the user request and necessary callbacks.\n * @returns The batch result object including the batch ID.\n */\nasync function addTransactionBatchWithHook(\n request: AddTransactionBatchRequestWithBatchId,\n): Promise<TransactionBatchResult> {\n const {\n messenger,\n publishBatchHook: requestPublishBatchHook,\n request: userRequest,\n update,\n } = request;\n\n const {\n batchId,\n from,\n networkClientId,\n origin,\n requireApproval,\n transactions: requestedTransactions,\n } = userRequest;\n\n let resultCallbacks: AcceptResultCallbacks | undefined;\n let isSequentialBatchHook = false;\n\n log('Adding transaction batch using hook', userRequest);\n\n const sequentialPublishBatchHook = new SequentialPublishBatchHook({\n publishTransaction: request.publishTransaction,\n getTransaction: request.getTransaction,\n getPendingTransactionTracker: request.getPendingTransactionTracker,\n });\n\n let { disable7702, disableSequential } = userRequest;\n const { disableHook, useHook } = userRequest;\n\n // use hook is a temporary alias for disable7702 and disableSequential\n if (useHook) {\n disable7702 = true;\n disableSequential = true;\n }\n\n let publishBatchHook = null;\n\n if (!disableHook && requestPublishBatchHook) {\n publishBatchHook = requestPublishBatchHook;\n } else if (!disableSequential) {\n publishBatchHook = sequentialPublishBatchHook.getHook();\n isSequentialBatchHook = true;\n }\n\n if (!publishBatchHook) {\n log(`No supported batch methods found`, {\n disable7702,\n disableHook,\n disableSequential,\n });\n throw rpcErrors.internal(`Can't process batch`);\n }\n\n let txBatchMeta: TransactionBatchMeta | undefined;\n const nestedTransactions = requestedTransactions.map((tx) => ({\n ...tx,\n origin,\n }));\n\n const transactionCount = nestedTransactions.length;\n setBatchTransactionCount(update, batchId, transactionCount);\n const collectHook = new CollectPublishHook(transactionCount);\n\n try {\n if (requireApproval) {\n txBatchMeta = await prepareApprovalData({\n batchId,\n request,\n });\n\n resultCallbacks = (await requestApproval(txBatchMeta, messenger))\n .resultCallbacks;\n }\n\n const publishHook = collectHook.getHook();\n const hookTransactions: Omit<PublishBatchHookTransaction, 'signedTx'>[] =\n [];\n\n let index = 0;\n\n for (const nestedTransaction of nestedTransactions) {\n const hookTransaction = await processTransactionWithHook(\n batchId,\n nestedTransaction,\n publishHook,\n request,\n txBatchMeta,\n index,\n );\n\n hookTransactions.push(hookTransaction);\n index += 1;\n\n await waitForTransactionStatus(\n String(hookTransaction.id),\n [\n TransactionStatus.signed,\n TransactionStatus.submitted,\n TransactionStatus.confirmed,\n ],\n request,\n );\n }\n\n const { signedTransactions } = await collectHook.ready();\n\n const transactions = hookTransactions.map((transaction, i) => ({\n ...transaction,\n signedTx: signedTransactions[i],\n }));\n\n const hookParams: PublishBatchHookRequest = {\n from,\n networkClientId,\n transactions,\n };\n\n log('Calling publish batch hook', hookParams);\n\n let result = await publishBatchHook(hookParams);\n\n log('Publish batch hook result', result);\n\n if (!result && !isSequentialBatchHook && !disableSequential) {\n log('Fallback to sequential publish batch hook due to empty results');\n const sequentialBatchHook = sequentialPublishBatchHook.getHook();\n result = await sequentialBatchHook(hookParams);\n }\n\n if (!result?.results?.length) {\n throw new Error('Publish batch hook did not return a result');\n }\n\n const transactionHashes = result.results.map(\n ({ transactionHash }) => transactionHash,\n );\n\n collectHook.success(transactionHashes);\n resultCallbacks?.success();\n\n log('Completed batch transaction with hook', transactionHashes);\n\n return {\n batchId,\n };\n } catch (error) {\n log('Publish batch hook failed', error);\n\n collectHook.error(error);\n resultCallbacks?.error(error as Error);\n\n throw error;\n } finally {\n log('Cleaning up publish batch hook', batchId);\n wipeTransactionBatchById(update, batchId);\n }\n}\n\n/**\n * Process a single transaction with a publish batch hook.\n *\n * @param batchId - ID of the transaction batch.\n * @param nestedTransaction - The nested transaction request.\n * @param publishHook - The publish hook to use for each transaction.\n * @param request - The request object including the user request and necessary callbacks.\n * @param txBatchMeta - Metadata for the transaction batch.\n * @param index - The index of the transaction in the batch.\n * @returns The single transaction request to be processed by the publish batch hook.\n */\nasync function processTransactionWithHook(\n batchId: Hex,\n nestedTransaction: TransactionBatchSingleRequest,\n publishHook: PublishHook,\n request: AddTransactionBatchRequest,\n txBatchMeta: TransactionBatchMeta | undefined,\n index: number,\n): Promise<\n Omit<PublishBatchHookTransaction, 'signedTx'> & { type?: TransactionType }\n> {\n const { assetsFiatValues, existingTransaction, params, type } =\n nestedTransaction;\n\n const {\n addTransaction,\n getTransaction,\n request: userRequest,\n updateTransaction,\n } = request;\n\n const { from, isInternal, networkClientId, origin } = userRequest;\n\n if (existingTransaction) {\n const { id, onPublish } = existingTransaction;\n let transactionMeta = getTransaction(id);\n const currentNonceHex = transactionMeta.txParams.nonce;\n let { signedTransaction } = existingTransaction;\n\n const currentNonceNum = currentNonceHex\n ? parseInt(currentNonceHex, 16)\n : undefined;\n\n const newNonce =\n index > 0 && currentNonceNum !== undefined\n ? currentNonceNum + index\n : undefined;\n\n updateTransaction({ transactionId: id }, (_transactionMeta) => {\n _transactionMeta.batchId = batchId;\n\n if (newNonce) {\n _transactionMeta.txParams.nonce = toHex(newNonce);\n }\n });\n\n if (newNonce) {\n const signResult = await updateTransactionSignature({\n transactionId: id,\n request,\n });\n\n signedTransaction = signResult.newSignature;\n transactionMeta = signResult.transactionMeta;\n }\n\n publishHook(transactionMeta, signedTransaction)\n .then((hookResult) => {\n onPublish?.(hookResult);\n return;\n })\n .catch(() => {\n // Intentionally empty\n });\n\n log('Processed existing transaction with hook', {\n id,\n params,\n });\n\n return {\n id,\n params,\n };\n }\n\n const transactionMetaForGasEstimates = {\n ...txBatchMeta,\n txParams: { ...params, from, gas: txBatchMeta?.gas ?? params.gas },\n };\n\n if (txBatchMeta) {\n updateTransactionGasEstimates({\n txMeta: transactionMetaForGasEstimates as TransactionMeta,\n userFeeLevel: GasFeeEstimateLevel.Medium,\n });\n }\n\n const { transactionMeta } = await addTransaction(\n transactionMetaForGasEstimates.txParams,\n {\n assetsFiatValues,\n batchId,\n disableGasBuffer: true,\n isInternal,\n networkClientId,\n origin,\n publishHook,\n requireApproval: false,\n type,\n },\n );\n\n const { id, txParams } = transactionMeta;\n const data = txParams.data as Hex | undefined;\n const gas = txParams.gas as Hex | undefined;\n const maxFeePerGas = txParams.maxFeePerGas as Hex | undefined;\n const maxPriorityFeePerGas = txParams.maxPriorityFeePerGas as Hex | undefined;\n const to = txParams.to as Hex | undefined;\n const value = txParams.value as Hex | undefined;\n\n const newParams: BatchTransactionParams = {\n data,\n gas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n to,\n value,\n };\n\n log('Processed new transaction with hook', {\n id,\n params: newParams,\n type,\n });\n\n return {\n id,\n params: newParams,\n type,\n };\n}\n\n/**\n * Requests approval for a transaction batch by interacting with the ApprovalController.\n *\n * @param txBatchMeta - Metadata for the transaction batch, including its ID and origin.\n * @param messenger - The messenger instance used to communicate with the ApprovalController.\n * @returns A promise that resolves to the result of adding the approval request.\n */\nasync function requestApproval(\n txBatchMeta: TransactionBatchMeta,\n messenger: TransactionControllerMessenger,\n): Promise<AddResult> {\n const id = String(txBatchMeta.id);\n const { origin } = txBatchMeta;\n const type = ApprovalType.TransactionBatch;\n const requestData = { txBatchId: id };\n\n log('Requesting approval for transaction batch', id);\n return (await messenger.call(\n 'ApprovalController:addRequest',\n {\n id,\n origin: origin ?? ORIGIN_METAMASK,\n requestData,\n expectsResult: true,\n type,\n },\n true,\n )) as Promise<AddResult>;\n}\n\n/**\n * Adds batch metadata to the transaction controller state.\n *\n * @param transactionBatchMeta - The transaction batch metadata to be added.\n * @param update - The update function to modify the transaction controller state.\n */\nfunction addBatchMetadata(\n transactionBatchMeta: TransactionBatchMeta,\n update: UpdateStateCallback,\n): void {\n update((state) => {\n state.transactionBatches = [\n ...state.transactionBatches,\n transactionBatchMeta,\n ];\n });\n}\n\n/**\n * Set the transaction count for an active batch.\n *\n * @param update - The update function to modify the transaction controller state.\n * @param id - The ID of the transaction batch.\n * @param count - The number of transactions to sign.\n */\nfunction setBatchTransactionCount(\n update: UpdateStateCallback,\n id: string,\n count: number,\n): void {\n update((state) => {\n state.batchTransactionCounts[id] = count;\n });\n}\n\n/**\n * Wipes the transaction count for a completed batch.\n *\n * @param update - The update function to modify the transaction controller state.\n * @param id - The ID of the transaction batch.\n */\nfunction wipeBatchTransactionCount(\n update: UpdateStateCallback,\n id: string,\n): void {\n update((state) => {\n delete state.batchTransactionCounts[id];\n });\n}\n\n/**\n * Wipes a specific transaction batch from the transaction controller state by its ID.\n *\n * @param update - The update function to modify the transaction controller state.\n * @param id - The ID of the transaction batch to be wiped.\n */\nfunction wipeTransactionBatchById(\n update: UpdateStateCallback,\n id: string,\n): void {\n update((state) => {\n state.transactionBatches = state.transactionBatches.filter(\n (batch) => batch.id !== id,\n );\n });\n}\n\n/**\n * Create a new batch metadata object.\n *\n * @param transactionBatchMeta - The transaction batch metadata object to be created.\n * @returns A new TransactionBatchMeta object.\n */\nfunction newBatchMetadata(\n transactionBatchMeta: Omit<TransactionBatchMeta, 'status'>,\n): TransactionBatchMeta {\n return {\n ...transactionBatchMeta,\n status: TransactionStatus.unapproved,\n };\n}\n\n/**\n * Prepares the approval data for a transaction batch.\n *\n * @param options - The options object containing necessary parameters.\n * @param options.batchId - The batch ID for the transaction batch.\n * @param options.request - The request object including the user request and necessary callbacks.\n * @returns The prepared transaction batch metadata.\n */\nasync function prepareApprovalData({\n batchId,\n request,\n}: {\n batchId: Hex;\n request: AddTransactionBatchRequest;\n}): Promise<TransactionBatchMeta> {\n const {\n messenger,\n request: userRequest,\n isSimulationEnabled,\n getGasFeeEstimates,\n getSimulationConfig,\n update,\n } = request;\n\n const {\n from,\n isInternal,\n origin,\n networkClientId,\n transactions: nestedTransactions,\n } = userRequest;\n\n if (!isSimulationEnabled()) {\n throw new Error(\n 'Cannot create transaction batch as simulation not supported',\n );\n }\n log('Preparing approval data for batch');\n const chainId = getChainId({ messenger, networkClientId });\n\n const { totalGasLimit: gasLimit } = await simulateGasBatch({\n chainId,\n from,\n getSimulationConfig,\n transactions: nestedTransactions,\n });\n\n const txBatchMeta: TransactionBatchMeta = newBatchMetadata({\n chainId,\n from,\n gas: gasLimit,\n id: batchId,\n isInternal,\n networkClientId,\n origin,\n transactions: nestedTransactions,\n });\n\n const defaultGasFeeFlow = new DefaultGasFeeFlow();\n const gasFeeControllerData = await getGasFeeEstimates({\n networkClientId,\n });\n\n const gasFeeResponse = await defaultGasFeeFlow.getGasFees({\n gasFeeControllerData,\n messenger,\n transactionMeta: {\n ...txBatchMeta,\n txParams: {\n from,\n gas: gasLimit,\n },\n time: Date.now(),\n },\n });\n\n txBatchMeta.gasFeeEstimates = gasFeeResponse.estimates;\n\n log('Saving transaction batch metadata', txBatchMeta);\n addBatchMetadata(txBatchMeta, update);\n\n return txBatchMeta;\n}\n\n/**\n * Convert an existing transaction to an EIP-7702 batch transaction.\n *\n * @param options - Options object.\n * @param options.batchId - Batch ID for the transaction batch.\n * @param options.existingTransaction - Existing transaction to be converted.\n * @param options.nestedTransactions - Nested transactions to be included in the batch.\n * @param options.request - Request object including the user request and necessary callbacks.\n * @param options.txParams - Transaction parameters for the new EIP-7702 transaction.\n * @param options.existingTransaction.id - ID of the existing transaction.\n * @param options.existingTransaction.onPublish - Callback for when the transaction is published.\n * @returns Promise that resolves after the publish callback has been invoked.\n */\nasync function convertTransactionToEIP7702({\n batchId,\n existingTransaction,\n nestedTransactions,\n request,\n txParams,\n}: {\n batchId: Hex;\n request: AddTransactionBatchRequest;\n existingTransaction: {\n id: string;\n onPublish?: ({\n transactionHash,\n newSignature,\n }: {\n transactionHash: string | undefined;\n newSignature: Hex;\n }) => void;\n };\n nestedTransactions: NestedTransactionMetadata[];\n txParams: TransactionParams;\n}): Promise<void> {\n const { getTransaction, estimateGas, updateTransaction } = request;\n const existingTransactionMeta = getTransaction(existingTransaction.id);\n\n if (!existingTransactionMeta) {\n throw new Error('Existing transaction not found');\n }\n\n log('Converting existing transaction to 7702', { batchId, txParams });\n\n const { networkClientId } = existingTransactionMeta;\n const newGasResult = await estimateGas(txParams, networkClientId);\n\n log('Estimated gas for converted EIP-7702 transaction', newGasResult);\n\n updateTransaction(\n { transactionId: existingTransactionMeta.id },\n (transactionMeta) => {\n transactionMeta.batchId = batchId;\n transactionMeta.nestedTransactions = nestedTransactions;\n transactionMeta.txParams = txParams;\n transactionMeta.txParams.gas = newGasResult.gas;\n transactionMeta.txParams.gasLimit = newGasResult.gas;\n transactionMeta.txParams.maxFeePerGas =\n existingTransactionMeta.txParams.maxFeePerGas;\n transactionMeta.txParams.maxPriorityFeePerGas =\n existingTransactionMeta.txParams.maxPriorityFeePerGas;\n transactionMeta.txParams.nonce = existingTransactionMeta.txParams.nonce;\n transactionMeta.txParams.type ??= TransactionEnvelopeType.feeMarket;\n },\n );\n\n const { newSignature } = await updateTransactionSignature({\n request,\n transactionId: existingTransactionMeta.id,\n });\n\n existingTransaction.onPublish?.({\n transactionHash: undefined,\n newSignature,\n });\n\n log('Transaction updated to EIP-7702', { batchId, txParams, newSignature });\n}\n\n/**\n * Update the signature of an existing transaction.\n *\n * @param options - Options object.\n * @param options.request - The request object including the user request and necessary callbacks.\n * @param options.transactionId - The ID of the transaction to update.\n * @returns An object containing the new signature and updated transaction metadata.\n */\nasync function updateTransactionSignature({\n request,\n transactionId,\n}: {\n request: AddTransactionBatchRequest;\n transactionId: string;\n}): Promise<{\n newSignature: Hex;\n transactionMeta: TransactionMeta;\n}> {\n const { getTransaction, signTransaction } = request;\n const metadataToSign = getTransaction(transactionId);\n\n log('Re-signing existing transaction', {\n transactionId,\n txParams: metadataToSign.txParams,\n });\n\n const newSignature = (await signTransaction(metadataToSign)) as\n | Hex\n | undefined;\n\n if (!newSignature) {\n throw new Error('Failed to re-sign transaction');\n }\n\n const transactionMeta = getTransaction(transactionId);\n\n log('New signature', newSignature);\n\n return { newSignature, transactionMeta };\n}\n"]}
|
|
@@ -20,11 +20,11 @@ export type GetGasFeeTokensRequest = {
|
|
|
20
20
|
* @param request.publicKeyEIP7702 - Public key to validate EIP-7702 contract signatures.
|
|
21
21
|
* @param request.transactionMeta - The transaction metadata.
|
|
22
22
|
* @param request.getSimulationConfig - Optional transaction simulation parameters.
|
|
23
|
-
* @returns
|
|
23
|
+
* @returns An array of gas fee tokens.
|
|
24
24
|
*/
|
|
25
25
|
export declare function getGasFeeTokens({ chainId, isEIP7702GasFeeTokensEnabled, messenger, publicKeyEIP7702, transactionMeta, getSimulationConfig, }: GetGasFeeTokensRequest): Promise<{
|
|
26
26
|
gasFeeTokens: GasFeeToken[];
|
|
27
|
-
|
|
27
|
+
isGasFeeSponsored: boolean;
|
|
28
28
|
}>;
|
|
29
29
|
/**
|
|
30
30
|
* Check and update gas fee token selection before publishing a transaction.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas-fee-tokens.d.ts","sourceRoot":"","sources":["../../src/utils/gas-fee-tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAS3C,OAAO,KAAK,EACV,WAAW,EACX,8BAA8B,EAC9B,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQvD,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,GAAG,CAAC;IACb,4BAA4B,EAAE,CAC5B,eAAe,EAAE,eAAe,KAC7B,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,SAAS,EAAE,8BAA8B,CAAC;IAC1C,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;CAClC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CAAC,EACpC,OAAO,EACP,4BAA4B,EAC5B,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,EAAE,sBAAsB,GAAG,OAAO,CAAC;IAClC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,
|
|
1
|
+
{"version":3,"file":"gas-fee-tokens.d.ts","sourceRoot":"","sources":["../../src/utils/gas-fee-tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAS3C,OAAO,KAAK,EACV,WAAW,EACX,8BAA8B,EAC9B,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAQvD,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,GAAG,CAAC;IACb,4BAA4B,EAAE,CAC5B,eAAe,EAAE,eAAe,KAC7B,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,SAAS,EAAE,8BAA8B,CAAC;IAC1C,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;CAClC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CAAC,EACpC,OAAO,EACP,4BAA4B,EAC5B,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,EAAE,sBAAsB,GAAG,OAAO,CAAC;IAClC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC,CAiED;AAED;;;;;;;;;GASG;AACH,wBAAsB,6BAA6B,CAAC,EAClD,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,iBAAiB,GAClB,EAAE;IACD,SAAS,EAAE,8BAA8B,CAAC;IAC1C,eAAe,EAAE,eAAe,CAAC;IACjC,iBAAiB,EAAE,CAAC,WAAW,EAAE,eAAe,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5E,WAAW,EAAE,eAAe,CAAC;IAC7B,iBAAiB,EAAE,CACjB,aAAa,EAAE,MAAM,EACrB,EAAE,EAAE,CAAC,EAAE,EAAE,eAAe,KAAK,IAAI,KAC9B,IAAI,CAAC;CACX,GAAG,OAAO,CAAC,IAAI,CAAC,CAgEhB"}
|
|
@@ -17,7 +17,7 @@ const log = createModuleLogger(projectLogger, 'gas-fee-tokens');
|
|
|
17
17
|
* @param request.publicKeyEIP7702 - Public key to validate EIP-7702 contract signatures.
|
|
18
18
|
* @param request.transactionMeta - The transaction metadata.
|
|
19
19
|
* @param request.getSimulationConfig - Optional transaction simulation parameters.
|
|
20
|
-
* @returns
|
|
20
|
+
* @returns An array of gas fee tokens.
|
|
21
21
|
*/
|
|
22
22
|
export async function getGasFeeTokens({ chainId, isEIP7702GasFeeTokensEnabled, messenger, publicKeyEIP7702, transactionMeta, getSimulationConfig, }) {
|
|
23
23
|
const { delegationAddress, txParams } = transactionMeta;
|
|
@@ -69,7 +69,7 @@ export async function getGasFeeTokens({ chainId, isEIP7702GasFeeTokensEnabled, m
|
|
|
69
69
|
}
|
|
70
70
|
catch (error) {
|
|
71
71
|
log('Failed to gas fee tokens', error);
|
|
72
|
-
return { gasFeeTokens: [],
|
|
72
|
+
return { gasFeeTokens: [], isGasFeeSponsored: false };
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
@@ -94,21 +94,27 @@ export async function checkGasFeeTokenBeforePublish({ messenger, networkClientId
|
|
|
94
94
|
if (hasNativeBalance) {
|
|
95
95
|
log('Ignoring gas fee token before publish due to sufficient native balance');
|
|
96
96
|
updateTransaction(transaction.id, (tx) => {
|
|
97
|
+
tx.isExternalSign = false;
|
|
97
98
|
tx.selectedGasFeeToken = undefined;
|
|
98
99
|
});
|
|
99
100
|
return;
|
|
100
101
|
}
|
|
101
102
|
}
|
|
102
|
-
const gasFeeTokens = await fetchGasFeeTokens(
|
|
103
|
+
const gasFeeTokens = await fetchGasFeeTokens({
|
|
104
|
+
...transaction,
|
|
105
|
+
isExternalSign: true,
|
|
106
|
+
});
|
|
103
107
|
const isSelectedGasFeeTokenAvailable = gasFeeTokens?.some((token) => token.tokenAddress.toLowerCase() === selectedGasFeeToken.toLowerCase());
|
|
104
108
|
if (!isSelectedGasFeeTokenAvailable) {
|
|
105
109
|
updateTransaction(transaction.id, (tx) => {
|
|
106
110
|
tx.gasFeeTokens = gasFeeTokens;
|
|
111
|
+
tx.isExternalSign = false;
|
|
107
112
|
});
|
|
108
113
|
throw new Error('Gas fee token not found and insufficient native balance');
|
|
109
114
|
}
|
|
110
115
|
updateTransaction(transaction.id, (tx) => {
|
|
111
116
|
tx.gasFeeTokens = gasFeeTokens;
|
|
117
|
+
tx.isExternalSign = true;
|
|
112
118
|
tx.txParams.nonce = undefined;
|
|
113
119
|
});
|
|
114
120
|
log('Updated gas fee tokens before publish', gasFeeTokens);
|
|
@@ -118,11 +124,12 @@ export async function checkGasFeeTokenBeforePublish({ messenger, networkClientId
|
|
|
118
124
|
* Extract gas fee tokens from a simulation response.
|
|
119
125
|
*
|
|
120
126
|
* @param response - The simulation response.
|
|
121
|
-
* @returns
|
|
127
|
+
* @returns gasFeeTokens: An array of gas fee tokens. isGasFeeSponsored: Whether the transaction is sponsored
|
|
122
128
|
*/
|
|
123
129
|
function parseGasFeeTokens(response) {
|
|
124
130
|
const feeLevel = response.transactions?.[0]
|
|
125
131
|
?.fees?.[0];
|
|
132
|
+
const isGasFeeSponsored = response.sponsorship?.isSponsored ?? false;
|
|
126
133
|
const tokenFees = feeLevel?.tokenFees ?? [];
|
|
127
134
|
return {
|
|
128
135
|
gasFeeTokens: tokenFees.map((tokenFee) => ({
|
|
@@ -139,7 +146,7 @@ function parseGasFeeTokens(response) {
|
|
|
139
146
|
symbol: tokenFee.token.symbol,
|
|
140
147
|
tokenAddress: tokenFee.token.address,
|
|
141
148
|
})),
|
|
142
|
-
|
|
149
|
+
isGasFeeSponsored,
|
|
143
150
|
};
|
|
144
151
|
}
|
|
145
152
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas-fee-tokens.js","sourceRoot":"","sources":["../../src/utils/gas-fee-tokens.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NetworkClientId } from '@metamask/network-controller';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { simulateTransactions } from '../api/simulation-api.js';\nimport type { SimulationRequestTransaction } from '../api/simulation-api.js';\nimport type {\n SimulationResponse,\n SimulationResponseTransaction,\n} from '../api/simulation-api.js';\nimport type {\n GasFeeToken,\n TransactionControllerMessenger,\n TransactionMeta,\n} from '../index.js';\nimport { projectLogger } from '../logger.js';\nimport type { GetSimulationConfig } from '../types.js';\nimport { isNativeBalanceSufficientForGas } from './balance.js';\nimport { ERROR_MESSAGE_NO_UPGRADE_CONTRACT } from './batch.js';\nimport { ERROR_MESSGE_PUBLIC_KEY, doesChainSupportEIP7702 } from './eip7702.js';\nimport { getEIP7702UpgradeContractAddress } from './feature-flags.js';\n\nconst log = createModuleLogger(projectLogger, 'gas-fee-tokens');\n\nexport type GetGasFeeTokensRequest = {\n chainId: Hex;\n isEIP7702GasFeeTokensEnabled: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n getSimulationConfig: GetSimulationConfig;\n messenger: TransactionControllerMessenger;\n publicKeyEIP7702?: Hex;\n transactionMeta: TransactionMeta;\n};\n\n/**\n * Get gas fee tokens for a transaction.\n *\n * @param request - The request object.\n * @param request.chainId - The chain ID of the transaction.\n * @param request.isEIP7702GasFeeTokensEnabled - Callback to check if EIP-7702 gas fee tokens are enabled.\n * @param request.messenger - The messenger instance.\n * @param request.publicKeyEIP7702 - Public key to validate EIP-7702 contract signatures.\n * @param request.transactionMeta - The transaction metadata.\n * @param request.getSimulationConfig - Optional transaction simulation parameters.\n * @returns The available gas fee tokens and whether gas fee sponsorship is available.\n */\nexport async function getGasFeeTokens({\n chainId,\n isEIP7702GasFeeTokensEnabled,\n messenger,\n publicKeyEIP7702,\n transactionMeta,\n getSimulationConfig,\n}: GetGasFeeTokensRequest): Promise<{\n gasFeeTokens: GasFeeToken[];\n isGasFeeSponsoredAvailable: boolean;\n}> {\n const { delegationAddress, txParams } = transactionMeta;\n const { authorizationList: authorizationListRequest } = txParams;\n const data = txParams.data as Hex;\n const from = txParams.from as Hex;\n const to = txParams.to as Hex;\n const value = txParams.value as Hex;\n\n log('Request', { chainId, txParams });\n\n const is7702GasFeeTokensEnabled =\n await isEIP7702GasFeeTokensEnabled(transactionMeta);\n\n const with7702 =\n is7702GasFeeTokensEnabled && doesChainSupportEIP7702(chainId, messenger);\n\n let authorizationList:\n | SimulationRequestTransaction['authorizationList']\n | undefined = authorizationListRequest?.map((authorization) => ({\n address: authorization.address,\n from,\n }));\n\n if (with7702 && !delegationAddress && !authorizationList) {\n authorizationList = buildAuthorizationList({\n chainId,\n from,\n messenger,\n publicKeyEIP7702,\n });\n }\n\n try {\n const response = await simulateTransactions(chainId, {\n getSimulationConfig,\n transactions: [\n {\n authorizationList,\n data,\n from,\n to,\n value,\n },\n ],\n suggestFees: {\n withTransfer: true,\n withFeeTransfer: true,\n with7702,\n // The EIP-7702 publish hook always restricts redemption to the relay\n // signers via a RedeemerEnforcer caveat, so include it in the estimate.\n withRedeemerEnforcer: with7702,\n },\n });\n\n log('Response', response);\n\n const result = parseGasFeeTokens(response);\n\n log('Gas fee tokens', result);\n\n return result;\n } catch (error) {\n log('Failed to gas fee tokens', error);\n return { gasFeeTokens: [], isGasFeeSponsoredAvailable: false };\n }\n}\n\n/**\n * Check and update gas fee token selection before publishing a transaction.\n *\n * @param request - Request object.\n * @param request.messenger - The transaction controller messenger.\n * @param request.networkClientId - The network client ID.\n * @param request.fetchGasFeeTokens - Function to fetch gas fee tokens.\n * @param request.transaction - Transaction metadata.\n * @param request.updateTransaction - Function to update the transaction.\n */\nexport async function checkGasFeeTokenBeforePublish({\n messenger,\n networkClientId,\n fetchGasFeeTokens,\n transaction,\n updateTransaction,\n}: {\n messenger: TransactionControllerMessenger;\n networkClientId: NetworkClientId;\n fetchGasFeeTokens: (transaction: TransactionMeta) => Promise<GasFeeToken[]>;\n transaction: TransactionMeta;\n updateTransaction: (\n transactionId: string,\n fn: (tx: TransactionMeta) => void,\n ) => void;\n}): Promise<void> {\n const {\n excludeNativeTokenForFee,\n isGasFeeTokenIgnoredIfBalance,\n selectedGasFeeToken,\n } = transaction;\n\n if (\n !selectedGasFeeToken ||\n (!isGasFeeTokenIgnoredIfBalance && !excludeNativeTokenForFee)\n ) {\n return;\n }\n\n log('Checking gas fee token before publish', { selectedGasFeeToken });\n\n if (!excludeNativeTokenForFee) {\n const hasNativeBalance = await isNativeBalanceSufficientForGas(\n transaction,\n messenger,\n networkClientId,\n );\n\n if (hasNativeBalance) {\n log(\n 'Ignoring gas fee token before publish due to sufficient native balance',\n );\n\n updateTransaction(transaction.id, (tx) => {\n tx.selectedGasFeeToken = undefined;\n });\n\n return;\n }\n }\n\n const gasFeeTokens = await fetchGasFeeTokens(transaction);\n\n const isSelectedGasFeeTokenAvailable = gasFeeTokens?.some(\n (token) =>\n token.tokenAddress.toLowerCase() === selectedGasFeeToken.toLowerCase(),\n );\n\n if (!isSelectedGasFeeTokenAvailable) {\n updateTransaction(transaction.id, (tx) => {\n tx.gasFeeTokens = gasFeeTokens;\n });\n\n throw new Error('Gas fee token not found and insufficient native balance');\n }\n\n updateTransaction(transaction.id, (tx) => {\n tx.gasFeeTokens = gasFeeTokens;\n tx.txParams.nonce = undefined;\n });\n\n log('Updated gas fee tokens before publish', gasFeeTokens);\n log('Publishing with selected gas fee token', { selectedGasFeeToken });\n}\n\n/**\n * Extract gas fee tokens from a simulation response.\n *\n * @param response - The simulation response.\n * @returns The available gas fee tokens and whether gas fee sponsorship is available.\n */\nfunction parseGasFeeTokens(response: SimulationResponse): {\n gasFeeTokens: GasFeeToken[];\n isGasFeeSponsoredAvailable: boolean;\n} {\n const feeLevel = response.transactions?.[0]\n ?.fees?.[0] as Required<SimulationResponseTransaction>['fees'][0];\n\n const tokenFees = feeLevel?.tokenFees ?? [];\n\n return {\n gasFeeTokens: tokenFees.map((tokenFee) => ({\n amount: tokenFee.balanceNeededToken,\n balance: tokenFee.currentBalanceToken,\n decimals: tokenFee.token.decimals,\n fee: tokenFee.serviceFee,\n gas: feeLevel.gas,\n gasTransfer: tokenFee.transferEstimate,\n maxFeePerGas: feeLevel.maxFeePerGas,\n maxPriorityFeePerGas: feeLevel.maxPriorityFeePerGas,\n rateWei: tokenFee.rateWei,\n recipient: tokenFee.feeRecipient,\n symbol: tokenFee.token.symbol,\n tokenAddress: tokenFee.token.address,\n })),\n isGasFeeSponsoredAvailable: response.sponsorship?.isSponsored ?? false,\n };\n}\n\n/**\n * Generate the authorization list for the request.\n *\n * @param request - The request object.\n * @param request.chainId - The chain ID.\n * @param request.from - The sender's address.\n * @param request.messenger - The messenger instance.\n * @param request.publicKeyEIP7702 - The public key for EIP-7702.\n * @returns The authorization list.\n */\nfunction buildAuthorizationList({\n chainId,\n from,\n messenger,\n publicKeyEIP7702,\n}: {\n chainId: Hex;\n from: Hex;\n messenger: TransactionControllerMessenger;\n publicKeyEIP7702?: Hex;\n}): SimulationRequestTransaction['authorizationList'] | undefined {\n if (!publicKeyEIP7702) {\n throw rpcErrors.internal(ERROR_MESSGE_PUBLIC_KEY);\n }\n\n const upgradeAddress = getEIP7702UpgradeContractAddress(\n chainId,\n messenger,\n publicKeyEIP7702,\n );\n\n if (!upgradeAddress) {\n throw rpcErrors.internal(ERROR_MESSAGE_NO_UPGRADE_CONTRACT);\n }\n\n return [\n {\n address: upgradeAddress,\n from,\n },\n ];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"gas-fee-tokens.js","sourceRoot":"","sources":["../../src/utils/gas-fee-tokens.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NetworkClientId } from '@metamask/network-controller';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { simulateTransactions } from '../api/simulation-api.js';\nimport type { SimulationRequestTransaction } from '../api/simulation-api.js';\nimport type {\n SimulationResponse,\n SimulationResponseTransaction,\n} from '../api/simulation-api.js';\nimport type {\n GasFeeToken,\n TransactionControllerMessenger,\n TransactionMeta,\n} from '../index.js';\nimport { projectLogger } from '../logger.js';\nimport type { GetSimulationConfig } from '../types.js';\nimport { isNativeBalanceSufficientForGas } from './balance.js';\nimport { ERROR_MESSAGE_NO_UPGRADE_CONTRACT } from './batch.js';\nimport { ERROR_MESSGE_PUBLIC_KEY, doesChainSupportEIP7702 } from './eip7702.js';\nimport { getEIP7702UpgradeContractAddress } from './feature-flags.js';\n\nconst log = createModuleLogger(projectLogger, 'gas-fee-tokens');\n\nexport type GetGasFeeTokensRequest = {\n chainId: Hex;\n isEIP7702GasFeeTokensEnabled: (\n transactionMeta: TransactionMeta,\n ) => Promise<boolean>;\n getSimulationConfig: GetSimulationConfig;\n messenger: TransactionControllerMessenger;\n publicKeyEIP7702?: Hex;\n transactionMeta: TransactionMeta;\n};\n\n/**\n * Get gas fee tokens for a transaction.\n *\n * @param request - The request object.\n * @param request.chainId - The chain ID of the transaction.\n * @param request.isEIP7702GasFeeTokensEnabled - Callback to check if EIP-7702 gas fee tokens are enabled.\n * @param request.messenger - The messenger instance.\n * @param request.publicKeyEIP7702 - Public key to validate EIP-7702 contract signatures.\n * @param request.transactionMeta - The transaction metadata.\n * @param request.getSimulationConfig - Optional transaction simulation parameters.\n * @returns An array of gas fee tokens.\n */\nexport async function getGasFeeTokens({\n chainId,\n isEIP7702GasFeeTokensEnabled,\n messenger,\n publicKeyEIP7702,\n transactionMeta,\n getSimulationConfig,\n}: GetGasFeeTokensRequest): Promise<{\n gasFeeTokens: GasFeeToken[];\n isGasFeeSponsored: boolean;\n}> {\n const { delegationAddress, txParams } = transactionMeta;\n const { authorizationList: authorizationListRequest } = txParams;\n const data = txParams.data as Hex;\n const from = txParams.from as Hex;\n const to = txParams.to as Hex;\n const value = txParams.value as Hex;\n\n log('Request', { chainId, txParams });\n\n const is7702GasFeeTokensEnabled =\n await isEIP7702GasFeeTokensEnabled(transactionMeta);\n\n const with7702 =\n is7702GasFeeTokensEnabled && doesChainSupportEIP7702(chainId, messenger);\n\n let authorizationList:\n | SimulationRequestTransaction['authorizationList']\n | undefined = authorizationListRequest?.map((authorization) => ({\n address: authorization.address,\n from,\n }));\n\n if (with7702 && !delegationAddress && !authorizationList) {\n authorizationList = buildAuthorizationList({\n chainId,\n from,\n messenger,\n publicKeyEIP7702,\n });\n }\n\n try {\n const response = await simulateTransactions(chainId, {\n getSimulationConfig,\n transactions: [\n {\n authorizationList,\n data,\n from,\n to,\n value,\n },\n ],\n suggestFees: {\n withTransfer: true,\n withFeeTransfer: true,\n with7702,\n // The EIP-7702 publish hook always restricts redemption to the relay\n // signers via a RedeemerEnforcer caveat, so include it in the estimate.\n withRedeemerEnforcer: with7702,\n },\n });\n\n log('Response', response);\n\n const result = parseGasFeeTokens(response);\n\n log('Gas fee tokens', result);\n\n return result;\n } catch (error) {\n log('Failed to gas fee tokens', error);\n return { gasFeeTokens: [], isGasFeeSponsored: false };\n }\n}\n\n/**\n * Check and update gas fee token selection before publishing a transaction.\n *\n * @param request - Request object.\n * @param request.messenger - The transaction controller messenger.\n * @param request.networkClientId - The network client ID.\n * @param request.fetchGasFeeTokens - Function to fetch gas fee tokens.\n * @param request.transaction - Transaction metadata.\n * @param request.updateTransaction - Function to update the transaction.\n */\nexport async function checkGasFeeTokenBeforePublish({\n messenger,\n networkClientId,\n fetchGasFeeTokens,\n transaction,\n updateTransaction,\n}: {\n messenger: TransactionControllerMessenger;\n networkClientId: NetworkClientId;\n fetchGasFeeTokens: (transaction: TransactionMeta) => Promise<GasFeeToken[]>;\n transaction: TransactionMeta;\n updateTransaction: (\n transactionId: string,\n fn: (tx: TransactionMeta) => void,\n ) => void;\n}): Promise<void> {\n const {\n excludeNativeTokenForFee,\n isGasFeeTokenIgnoredIfBalance,\n selectedGasFeeToken,\n } = transaction;\n\n if (\n !selectedGasFeeToken ||\n (!isGasFeeTokenIgnoredIfBalance && !excludeNativeTokenForFee)\n ) {\n return;\n }\n\n log('Checking gas fee token before publish', { selectedGasFeeToken });\n\n if (!excludeNativeTokenForFee) {\n const hasNativeBalance = await isNativeBalanceSufficientForGas(\n transaction,\n messenger,\n networkClientId,\n );\n\n if (hasNativeBalance) {\n log(\n 'Ignoring gas fee token before publish due to sufficient native balance',\n );\n\n updateTransaction(transaction.id, (tx) => {\n tx.isExternalSign = false;\n tx.selectedGasFeeToken = undefined;\n });\n\n return;\n }\n }\n\n const gasFeeTokens = await fetchGasFeeTokens({\n ...transaction,\n isExternalSign: true,\n });\n\n const isSelectedGasFeeTokenAvailable = gasFeeTokens?.some(\n (token) =>\n token.tokenAddress.toLowerCase() === selectedGasFeeToken.toLowerCase(),\n );\n\n if (!isSelectedGasFeeTokenAvailable) {\n updateTransaction(transaction.id, (tx) => {\n tx.gasFeeTokens = gasFeeTokens;\n tx.isExternalSign = false;\n });\n\n throw new Error('Gas fee token not found and insufficient native balance');\n }\n\n updateTransaction(transaction.id, (tx) => {\n tx.gasFeeTokens = gasFeeTokens;\n tx.isExternalSign = true;\n tx.txParams.nonce = undefined;\n });\n\n log('Updated gas fee tokens before publish', gasFeeTokens);\n log('Publishing with selected gas fee token', { selectedGasFeeToken });\n}\n\n/**\n * Extract gas fee tokens from a simulation response.\n *\n * @param response - The simulation response.\n * @returns gasFeeTokens: An array of gas fee tokens. isGasFeeSponsored: Whether the transaction is sponsored\n */\nfunction parseGasFeeTokens(response: SimulationResponse): {\n gasFeeTokens: GasFeeToken[];\n isGasFeeSponsored: boolean;\n} {\n const feeLevel = response.transactions?.[0]\n ?.fees?.[0] as Required<SimulationResponseTransaction>['fees'][0];\n\n const isGasFeeSponsored = response.sponsorship?.isSponsored ?? false;\n\n const tokenFees = feeLevel?.tokenFees ?? [];\n\n return {\n gasFeeTokens: tokenFees.map((tokenFee) => ({\n amount: tokenFee.balanceNeededToken,\n balance: tokenFee.currentBalanceToken,\n decimals: tokenFee.token.decimals,\n fee: tokenFee.serviceFee,\n gas: feeLevel.gas,\n gasTransfer: tokenFee.transferEstimate,\n maxFeePerGas: feeLevel.maxFeePerGas,\n maxPriorityFeePerGas: feeLevel.maxPriorityFeePerGas,\n rateWei: tokenFee.rateWei,\n recipient: tokenFee.feeRecipient,\n symbol: tokenFee.token.symbol,\n tokenAddress: tokenFee.token.address,\n })),\n isGasFeeSponsored,\n };\n}\n\n/**\n * Generate the authorization list for the request.\n *\n * @param request - The request object.\n * @param request.chainId - The chain ID.\n * @param request.from - The sender's address.\n * @param request.messenger - The messenger instance.\n * @param request.publicKeyEIP7702 - The public key for EIP-7702.\n * @returns The authorization list.\n */\nfunction buildAuthorizationList({\n chainId,\n from,\n messenger,\n publicKeyEIP7702,\n}: {\n chainId: Hex;\n from: Hex;\n messenger: TransactionControllerMessenger;\n publicKeyEIP7702?: Hex;\n}): SimulationRequestTransaction['authorizationList'] | undefined {\n if (!publicKeyEIP7702) {\n throw rpcErrors.internal(ERROR_MESSGE_PUBLIC_KEY);\n }\n\n const upgradeAddress = getEIP7702UpgradeContractAddress(\n chainId,\n messenger,\n publicKeyEIP7702,\n );\n\n if (!upgradeAddress) {\n throw rpcErrors.internal(ERROR_MESSAGE_NO_UPGRADE_CONTRACT);\n }\n\n return [\n {\n address: upgradeAddress,\n from,\n },\n ];\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nonce.d.ts","sourceRoot":"","sources":["../../src/utils/nonce.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,IAAI,uBAAuB,EACvC,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAKtE;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,GACpD,OAAO,CAAC,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"nonce.d.ts","sourceRoot":"","sources":["../../src/utils/nonce.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,IAAI,uBAAuB,EACvC,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAKtE;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,GACpD,OAAO,CAAC,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,CA+BzD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uCAAuC,CACrD,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,iBAAiB,EAAE,EACxC,YAAY,EAAE,eAAe,EAAE,GAC9B,uBAAuB,EAAE,CAwD3B"}
|
package/dist/utils/nonce.js
CHANGED
|
@@ -10,7 +10,11 @@ const log = createModuleLogger(projectLogger, 'nonce');
|
|
|
10
10
|
* @returns The next hexadecimal nonce to be used for the given transaction, and optionally a function to release the nonce lock.
|
|
11
11
|
*/
|
|
12
12
|
export async function getNextNonce(txMeta, getNonceLock) {
|
|
13
|
-
const { customNonceValue, txParams: { from, nonce: existingNonce }, } = txMeta;
|
|
13
|
+
const { customNonceValue, isExternalSign, txParams: { from, nonce: existingNonce }, } = txMeta;
|
|
14
|
+
if (isExternalSign) {
|
|
15
|
+
log('Skipping nonce as signed externally');
|
|
16
|
+
return [undefined, undefined];
|
|
17
|
+
}
|
|
14
18
|
const customNonce = customNonceValue ? toHex(customNonceValue) : undefined;
|
|
15
19
|
if (customNonce) {
|
|
16
20
|
log('Using custom nonce', customNonce);
|
package/dist/utils/nonce.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nonce.js","sourceRoot":"","sources":["../../src/utils/nonce.ts"],"names":[],"mappings":"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","sourcesContent":["import { toHex } from '@metamask/controller-utils';\nimport type {\n NonceLock,\n Transaction as NonceTrackerTransaction,\n} from '@metamask/nonce-tracker';\n\nimport { createModuleLogger, projectLogger } from '../logger.js';\nimport type { TransactionMeta, TransactionStatus } from '../types.js';\nimport { getAuthorizationAuthority } from './eip7702.js';\n\nconst log = createModuleLogger(projectLogger, 'nonce');\n\n/**\n * Determine the next nonce to be used for a transaction.\n *\n * @param txMeta - The transaction metadata.\n * @param getNonceLock - An anonymous function that acquires the nonce lock for an address\n * @returns The next hexadecimal nonce to be used for the given transaction, and optionally a function to release the nonce lock.\n */\nexport async function getNextNonce(\n txMeta: TransactionMeta,\n getNonceLock: (address: string) => Promise<NonceLock>,\n): Promise<[string | undefined, (() => void) | undefined]> {\n const {\n customNonceValue,\n txParams: { from, nonce: existingNonce },\n } = txMeta;\n\n const customNonce = customNonceValue ? toHex(customNonceValue) : undefined;\n\n if (customNonce) {\n log('Using custom nonce', customNonce);\n return [customNonce, undefined];\n }\n\n if (existingNonce) {\n log('Using existing nonce', existingNonce);\n return [existingNonce, undefined];\n }\n\n const nonceLock = await getNonceLock(from);\n const nonce = toHex(nonceLock.nextNonce);\n const releaseLock = nonceLock.releaseLock.bind(nonceLock);\n\n log('Using nonce from nonce tracker', nonce, nonceLock.nonceDetails);\n\n return [nonce, releaseLock];\n}\n\n/**\n * Filter and format transactions for the nonce tracker.\n *\n * Includes the outer transaction nonce when `txParams.from` matches, and EIP-7702\n * authorization nonces only when their recovered authority matches `fromAddress`.\n * This keeps foreign authorizations (e.g. Money Account upgrades on a same-chain\n * pay batch) out of the payer's nonce history.\n *\n * @param currentChainId - Chain ID of the current network.\n * @param fromAddress - Address of the account from which the transactions to filter from are sent.\n * @param transactionStatuses - Status of the transactions for which to filter.\n * @param transactions - Array of transactionMeta objects that have been prefiltered.\n * @returns Array of transactions formatted for the nonce tracker.\n */\nexport function getAndFormatTransactionsForNonceTracker(\n currentChainId: string,\n fromAddress: string,\n transactionStatuses: TransactionStatus[],\n transactions: TransactionMeta[],\n): NonceTrackerTransaction[] {\n const normalizedFromAddress = fromAddress.toLowerCase();\n\n return transactions\n .filter(\n ({ chainId, isTransfer, isUserOperation, status, txParams: { nonce } }) =>\n !isTransfer &&\n !isUserOperation &&\n chainId === currentChainId &&\n transactionStatuses.includes(status) &&\n Boolean(nonce),\n )\n .flatMap(({ status, txParams }) => {\n const { authorizationList, from, gas, value, nonce } = txParams;\n // the only value we care about is the nonce\n // but we need to return the other values to satisfy the type\n // TODO: refactor nonceTracker to not require this\n /* istanbul ignore next */\n const toNonceTrackerTransaction = (\n currentNonce: string,\n authority: string,\n ): NonceTrackerTransaction => ({\n status,\n history: [{}],\n txParams: {\n from: authority,\n gas: gas ?? '',\n value: value ?? '',\n nonce: currentNonce,\n },\n });\n\n const formatted: NonceTrackerTransaction[] = [];\n\n if (from.toLowerCase() === normalizedFromAddress && nonce) {\n formatted.push(toNonceTrackerTransaction(nonce, from));\n }\n\n for (const authorization of authorizationList ?? []) {\n if (authorization.nonce === undefined) {\n continue;\n }\n\n const authority = getAuthorizationAuthority(authorization, from);\n\n if (authority?.toLowerCase() !== normalizedFromAddress) {\n continue;\n }\n\n formatted.push(\n toNonceTrackerTransaction(authorization.nonce, authority),\n );\n }\n\n return formatted;\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"nonce.js","sourceRoot":"","sources":["../../src/utils/nonce.ts"],"names":[],"mappings":"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","sourcesContent":["import { toHex } from '@metamask/controller-utils';\nimport type {\n NonceLock,\n Transaction as NonceTrackerTransaction,\n} from '@metamask/nonce-tracker';\n\nimport { createModuleLogger, projectLogger } from '../logger.js';\nimport type { TransactionMeta, TransactionStatus } from '../types.js';\nimport { getAuthorizationAuthority } from './eip7702.js';\n\nconst log = createModuleLogger(projectLogger, 'nonce');\n\n/**\n * Determine the next nonce to be used for a transaction.\n *\n * @param txMeta - The transaction metadata.\n * @param getNonceLock - An anonymous function that acquires the nonce lock for an address\n * @returns The next hexadecimal nonce to be used for the given transaction, and optionally a function to release the nonce lock.\n */\nexport async function getNextNonce(\n txMeta: TransactionMeta,\n getNonceLock: (address: string) => Promise<NonceLock>,\n): Promise<[string | undefined, (() => void) | undefined]> {\n const {\n customNonceValue,\n isExternalSign,\n txParams: { from, nonce: existingNonce },\n } = txMeta;\n\n if (isExternalSign) {\n log('Skipping nonce as signed externally');\n return [undefined, undefined];\n }\n\n const customNonce = customNonceValue ? toHex(customNonceValue) : undefined;\n\n if (customNonce) {\n log('Using custom nonce', customNonce);\n return [customNonce, undefined];\n }\n\n if (existingNonce) {\n log('Using existing nonce', existingNonce);\n return [existingNonce, undefined];\n }\n\n const nonceLock = await getNonceLock(from);\n const nonce = toHex(nonceLock.nextNonce);\n const releaseLock = nonceLock.releaseLock.bind(nonceLock);\n\n log('Using nonce from nonce tracker', nonce, nonceLock.nonceDetails);\n\n return [nonce, releaseLock];\n}\n\n/**\n * Filter and format transactions for the nonce tracker.\n *\n * Includes the outer transaction nonce when `txParams.from` matches, and EIP-7702\n * authorization nonces only when their recovered authority matches `fromAddress`.\n * This keeps foreign authorizations (e.g. Money Account upgrades on a same-chain\n * pay batch) out of the payer's nonce history.\n *\n * @param currentChainId - Chain ID of the current network.\n * @param fromAddress - Address of the account from which the transactions to filter from are sent.\n * @param transactionStatuses - Status of the transactions for which to filter.\n * @param transactions - Array of transactionMeta objects that have been prefiltered.\n * @returns Array of transactions formatted for the nonce tracker.\n */\nexport function getAndFormatTransactionsForNonceTracker(\n currentChainId: string,\n fromAddress: string,\n transactionStatuses: TransactionStatus[],\n transactions: TransactionMeta[],\n): NonceTrackerTransaction[] {\n const normalizedFromAddress = fromAddress.toLowerCase();\n\n return transactions\n .filter(\n ({ chainId, isTransfer, isUserOperation, status, txParams: { nonce } }) =>\n !isTransfer &&\n !isUserOperation &&\n chainId === currentChainId &&\n transactionStatuses.includes(status) &&\n Boolean(nonce),\n )\n .flatMap(({ status, txParams }) => {\n const { authorizationList, from, gas, value, nonce } = txParams;\n // the only value we care about is the nonce\n // but we need to return the other values to satisfy the type\n // TODO: refactor nonceTracker to not require this\n /* istanbul ignore next */\n const toNonceTrackerTransaction = (\n currentNonce: string,\n authority: string,\n ): NonceTrackerTransaction => ({\n status,\n history: [{}],\n txParams: {\n from: authority,\n gas: gas ?? '',\n value: value ?? '',\n nonce: currentNonce,\n },\n });\n\n const formatted: NonceTrackerTransaction[] = [];\n\n if (from.toLowerCase() === normalizedFromAddress && nonce) {\n formatted.push(toNonceTrackerTransaction(nonce, from));\n }\n\n for (const authorization of authorizationList ?? []) {\n if (authorization.nonce === undefined) {\n continue;\n }\n\n const authority = getAuthorizationAuthority(authorization, from);\n\n if (authority?.toLowerCase() !== normalizedFromAddress) {\n continue;\n }\n\n formatted.push(\n toNonceTrackerTransaction(authorization.nonce, authority),\n );\n }\n\n return formatted;\n });\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/transaction-controller",
|
|
3
|
-
"version": "72.2.0-preview-
|
|
3
|
+
"version": "72.2.0-preview-b59bc5b6f",
|
|
4
4
|
"description": "Stores transactions alongside their periodically updated statuses and manages interactions such as approval and cancellation",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ethereum",
|