@metamask/transaction-controller 61.2.0 → 62.0.0
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 +28 -1
- package/dist/TransactionController.cjs +65 -22
- package/dist/TransactionController.cjs.map +1 -1
- package/dist/TransactionController.d.cts +9 -2
- package/dist/TransactionController.d.cts.map +1 -1
- package/dist/TransactionController.d.mts +9 -2
- package/dist/TransactionController.d.mts.map +1 -1
- package/dist/TransactionController.mjs +66 -23
- package/dist/TransactionController.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +21 -0
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +21 -0
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/balance-changes.cjs +3 -4
- package/dist/utils/balance-changes.cjs.map +1 -1
- package/dist/utils/balance-changes.d.cts.map +1 -1
- package/dist/utils/balance-changes.d.mts.map +1 -1
- package/dist/utils/balance-changes.mjs +4 -5
- package/dist/utils/balance-changes.mjs.map +1 -1
- package/dist/utils/balance.cjs +40 -0
- package/dist/utils/balance.cjs.map +1 -0
- package/dist/utils/balance.d.cts +23 -0
- package/dist/utils/balance.d.cts.map +1 -0
- package/dist/utils/balance.d.mts +23 -0
- package/dist/utils/balance.d.mts.map +1 -0
- package/dist/utils/balance.mjs +35 -0
- package/dist/utils/balance.mjs.map +1 -0
- package/dist/utils/batch.cjs +2 -1
- package/dist/utils/batch.cjs.map +1 -1
- package/dist/utils/batch.mjs +2 -1
- package/dist/utils/batch.mjs.map +1 -1
- package/dist/utils/gas-fee-tokens.cjs +39 -1
- package/dist/utils/gas-fee-tokens.cjs.map +1 -1
- package/dist/utils/gas-fee-tokens.d.cts +16 -0
- package/dist/utils/gas-fee-tokens.d.cts.map +1 -1
- package/dist/utils/gas-fee-tokens.d.mts +16 -0
- package/dist/utils/gas-fee-tokens.d.mts.map +1 -1
- package/dist/utils/gas-fee-tokens.mjs +37 -0
- package/dist/utils/gas-fee-tokens.mjs.map +1 -1
- package/package.json +12 -11
package/dist/utils/batch.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch.cjs","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 EthQuery from '@metamask/eth-query';\nimport type {\n FetchGasFeeEstimateOptions,\n GasFeeState,\n} from '@metamask/gas-fee-controller';\nimport { JsonRpcError, rpcErrors } from '@metamask/rpc-errors';\nimport type { Hex } from '@metamask/utils';\nimport { bytesToHex, createModuleLogger } from '@metamask/utils';\nimport type { WritableDraft } from 'immer/dist/internal.js';\nimport { parse, v4 } from 'uuid';\n\nimport {\n ERROR_MESSGE_PUBLIC_KEY,\n doesChainSupportEIP7702,\n generateEIP7702BatchTransaction,\n isAccountUpgradedToEIP7702,\n} from './eip7702';\nimport {\n getBatchSizeLimit,\n getEIP7702SupportedChains,\n getEIP7702UpgradeContractAddress,\n} from './feature-flags';\nimport { simulateGasBatch } from './gas';\nimport { validateBatchRequest } from './validation';\nimport type { GetSimulationConfig, TransactionControllerState } from '..';\nimport {\n determineTransactionType,\n GasFeeEstimateLevel,\n TransactionStatus,\n type BatchTransactionParams,\n type TransactionController,\n type TransactionControllerMessenger,\n type TransactionMeta,\n} from '..';\nimport { DefaultGasFeeFlow } from '../gas-flows/DefaultGasFeeFlow';\nimport { updateTransactionGasEstimates } from '../helpers/GasFeePoller';\nimport type { PendingTransactionTracker } from '../helpers/PendingTransactionTracker';\nimport { CollectPublishHook } from '../hooks/CollectPublishHook';\nimport { SequentialPublishBatchHook } from '../hooks/SequentialPublishBatchHook';\nimport { projectLogger } from '../logger';\nimport type {\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';\nimport {\n TransactionEnvelopeType,\n type TransactionBatchResult,\n type TransactionParams,\n TransactionType,\n} from '../types';\n\ntype UpdateStateCallback = (\n callback: (\n state: WritableDraft<TransactionControllerState>,\n ) => void | TransactionControllerState,\n) => void;\n\ntype AddTransactionBatchRequest = {\n addTransaction: TransactionController['addTransaction'];\n estimateGas: TransactionController['estimateGas'];\n getChainId: (networkClientId: string) => Hex;\n getEthQuery: (networkClientId: string) => EthQuery;\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: () => boolean;\n messenger: TransactionControllerMessenger;\n publishBatchHook?: PublishBatchHook;\n publishTransaction: (\n _ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<Hex>;\n publicKeyEIP7702?: Hex;\n request: TransactionBatchRequest;\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 IsAtomicBatchSupportedRequestInternal = {\n address: Hex;\n chainIds?: Hex[];\n getEthQuery: (chainId: Hex) => EthQuery;\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 const sizeLimit = getBatchSizeLimit(messenger);\n\n validateBatchRequest({\n internalAccounts: getInternalAccounts(),\n request: transactionBatchRequest,\n sizeLimit,\n });\n\n log('Adding', transactionBatchRequest);\n\n if (!transactionBatchRequest.disable7702) {\n try {\n return await addTransactionBatchWith7702(request);\n } catch (error: unknown) {\n const isEIP7702NotSupportedError =\n error instanceof JsonRpcError &&\n error.message === 'Chain does not support EIP-7702';\n\n if (!isEIP7702NotSupportedError) {\n throw error;\n }\n }\n }\n\n return await addTransactionBatchWithHook(request);\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 {\n address,\n chainIds,\n getEthQuery,\n messenger,\n publicKeyEIP7702: publicKey,\n } = 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 ethQuery = getEthQuery(chainId);\n\n const { isSupported, delegationAddress } =\n await isAccountUpgradedToEIP7702(\n address,\n chainId,\n publicKey,\n messenger,\n ethQuery,\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 undefined;\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 */\nfunction 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 ethQuery - The EthQuery instance used to interact with the Ethereum blockchain.\n * @returns The metadata for the nested transaction.\n */\nasync function getNestedTransactionMeta(\n request: TransactionBatchRequest,\n singleRequest: TransactionBatchSingleRequest,\n ethQuery: EthQuery,\n): Promise<NestedTransactionMetadata> {\n const { from } = request;\n const { params, type: requestedType } = singleRequest;\n\n const { type: determinedType } = await determineTransactionType(\n { from, ...params },\n ethQuery,\n );\n\n const type = requestedType ?? determinedType;\n return {\n ...params,\n type,\n };\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: AddTransactionBatchRequest,\n) {\n const {\n addTransaction,\n getChainId,\n messenger,\n publicKeyEIP7702,\n request: userRequest,\n } = request;\n\n const {\n batchId: batchIdOverride,\n from,\n networkClientId,\n origin,\n requireApproval,\n securityAlertId,\n transactions,\n validateSecurity,\n } = userRequest;\n\n const chainId = getChainId(networkClientId);\n const ethQuery = request.getEthQuery(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 const { delegationAddress, isSupported } = await isAccountUpgradedToEIP7702(\n from,\n chainId,\n publicKeyEIP7702,\n messenger,\n ethQuery,\n );\n\n log('Account', { delegationAddress, isSupported });\n\n if (!isSupported && delegationAddress) {\n log('Account upgraded to unsupported contract', from, delegationAddress);\n throw rpcErrors.internal('Account upgraded to unsupported contract');\n }\n\n const nestedTransactions = await Promise.all(\n transactions.map((tx) =>\n getNestedTransactionMeta(userRequest, tx, ethQuery),\n ),\n );\n\n const batchParams = generateEIP7702BatchTransaction(from, nestedTransactions);\n\n const txParams: TransactionParams = {\n from,\n ...batchParams,\n };\n\n if (!isSupported) {\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 txParams.type = TransactionEnvelopeType.setCode;\n txParams.authorizationList = [{ address: upgradeContractAddress }];\n }\n\n if (validateSecurity) {\n const securityRequest: ValidateSecurityRequest = {\n method: 'eth_sendTransaction',\n params: [\n {\n ...txParams,\n authorizationList: undefined,\n type: TransactionEnvelopeType.feeMarket,\n },\n ],\n delegationMock: txParams.authorizationList?.[0]?.address,\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 const batchId = batchIdOverride ?? generateBatchId();\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 isGasFeeIncluded: userRequest.isGasFeeIncluded,\n isGasFeeSponsored: userRequest.isGasFeeSponsored,\n nestedTransactions,\n networkClientId,\n origin,\n requireApproval,\n securityAlertResponse,\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 * 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: AddTransactionBatchRequest,\n): Promise<TransactionBatchResult> {\n const {\n messenger,\n publishBatchHook: requestPublishBatchHook,\n request: userRequest,\n update,\n } = request;\n\n const {\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 getEthQuery: request.getEthQuery,\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 batchId = generateBatchId();\n\n const nestedTransactions = requestedTransactions.map((tx) => ({\n ...tx,\n origin,\n }));\n\n const transactionCount = nestedTransactions.length;\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\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 = { from, networkClientId, transactions };\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) {\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, 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(onPublish)\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 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) {\n update((state) => {\n state.transactionBatches = [\n ...state.transactionBatches,\n transactionBatchMeta,\n ];\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 getChainId,\n getEthQuery,\n getGasFeeEstimates,\n getSimulationConfig,\n update,\n } = request;\n\n const {\n from,\n origin,\n networkClientId,\n transactions: nestedTransactions,\n } = userRequest;\n\n const ethQuery = getEthQuery(networkClientId);\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(networkClientId);\n\n const { 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 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 ethQuery,\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}) {\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.cjs","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 EthQuery from '@metamask/eth-query';\nimport type {\n FetchGasFeeEstimateOptions,\n GasFeeState,\n} from '@metamask/gas-fee-controller';\nimport { JsonRpcError, rpcErrors } from '@metamask/rpc-errors';\nimport type { Hex } from '@metamask/utils';\nimport { bytesToHex, createModuleLogger } from '@metamask/utils';\nimport type { WritableDraft } from 'immer/dist/internal.js';\nimport { parse, v4 } from 'uuid';\n\nimport {\n ERROR_MESSGE_PUBLIC_KEY,\n doesChainSupportEIP7702,\n generateEIP7702BatchTransaction,\n isAccountUpgradedToEIP7702,\n} from './eip7702';\nimport {\n getBatchSizeLimit,\n getEIP7702SupportedChains,\n getEIP7702UpgradeContractAddress,\n} from './feature-flags';\nimport { simulateGasBatch } from './gas';\nimport { validateBatchRequest } from './validation';\nimport type { GetSimulationConfig, TransactionControllerState } from '..';\nimport {\n determineTransactionType,\n GasFeeEstimateLevel,\n TransactionStatus,\n type BatchTransactionParams,\n type TransactionController,\n type TransactionControllerMessenger,\n type TransactionMeta,\n} from '..';\nimport { DefaultGasFeeFlow } from '../gas-flows/DefaultGasFeeFlow';\nimport { updateTransactionGasEstimates } from '../helpers/GasFeePoller';\nimport type { PendingTransactionTracker } from '../helpers/PendingTransactionTracker';\nimport { CollectPublishHook } from '../hooks/CollectPublishHook';\nimport { SequentialPublishBatchHook } from '../hooks/SequentialPublishBatchHook';\nimport { projectLogger } from '../logger';\nimport type {\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';\nimport {\n TransactionEnvelopeType,\n type TransactionBatchResult,\n type TransactionParams,\n TransactionType,\n} from '../types';\n\ntype UpdateStateCallback = (\n callback: (\n state: WritableDraft<TransactionControllerState>,\n ) => void | TransactionControllerState,\n) => void;\n\ntype AddTransactionBatchRequest = {\n addTransaction: TransactionController['addTransaction'];\n estimateGas: TransactionController['estimateGas'];\n getChainId: (networkClientId: string) => Hex;\n getEthQuery: (networkClientId: string) => EthQuery;\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: () => boolean;\n messenger: TransactionControllerMessenger;\n publishBatchHook?: PublishBatchHook;\n publishTransaction: (\n _ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<Hex>;\n publicKeyEIP7702?: Hex;\n request: TransactionBatchRequest;\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 IsAtomicBatchSupportedRequestInternal = {\n address: Hex;\n chainIds?: Hex[];\n getEthQuery: (chainId: Hex) => EthQuery;\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 const sizeLimit = getBatchSizeLimit(messenger);\n\n validateBatchRequest({\n internalAccounts: getInternalAccounts(),\n request: transactionBatchRequest,\n sizeLimit,\n });\n\n log('Adding', transactionBatchRequest);\n\n if (!transactionBatchRequest.disable7702) {\n try {\n return await addTransactionBatchWith7702(request);\n } catch (error: unknown) {\n const isEIP7702NotSupportedError =\n error instanceof JsonRpcError &&\n error.message === 'Chain does not support EIP-7702';\n\n if (!isEIP7702NotSupportedError) {\n throw error;\n }\n }\n }\n\n return await addTransactionBatchWithHook(request);\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 {\n address,\n chainIds,\n getEthQuery,\n messenger,\n publicKeyEIP7702: publicKey,\n } = 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 ethQuery = getEthQuery(chainId);\n\n const { isSupported, delegationAddress } =\n await isAccountUpgradedToEIP7702(\n address,\n chainId,\n publicKey,\n messenger,\n ethQuery,\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 undefined;\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 */\nfunction 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 ethQuery - The EthQuery instance used to interact with the Ethereum blockchain.\n * @returns The metadata for the nested transaction.\n */\nasync function getNestedTransactionMeta(\n request: TransactionBatchRequest,\n singleRequest: TransactionBatchSingleRequest,\n ethQuery: EthQuery,\n): Promise<NestedTransactionMetadata> {\n const { from } = request;\n const { params, type: requestedType } = singleRequest;\n\n const { type: determinedType } = await determineTransactionType(\n { from, ...params },\n ethQuery,\n );\n\n const type = requestedType ?? determinedType;\n return {\n ...params,\n type,\n };\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: AddTransactionBatchRequest,\n) {\n const {\n addTransaction,\n getChainId,\n messenger,\n publicKeyEIP7702,\n request: userRequest,\n } = request;\n\n const {\n batchId: batchIdOverride,\n from,\n gasFeeToken,\n networkClientId,\n origin,\n requireApproval,\n securityAlertId,\n transactions,\n validateSecurity,\n } = userRequest;\n\n const chainId = getChainId(networkClientId);\n const ethQuery = request.getEthQuery(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 const { delegationAddress, isSupported } = await isAccountUpgradedToEIP7702(\n from,\n chainId,\n publicKeyEIP7702,\n messenger,\n ethQuery,\n );\n\n log('Account', { delegationAddress, isSupported });\n\n if (!isSupported && delegationAddress) {\n log('Account upgraded to unsupported contract', from, delegationAddress);\n throw rpcErrors.internal('Account upgraded to unsupported contract');\n }\n\n const nestedTransactions = await Promise.all(\n transactions.map((tx) =>\n getNestedTransactionMeta(userRequest, tx, ethQuery),\n ),\n );\n\n const batchParams = generateEIP7702BatchTransaction(from, nestedTransactions);\n\n const txParams: TransactionParams = {\n from,\n ...batchParams,\n };\n\n if (!isSupported) {\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 txParams.type = TransactionEnvelopeType.setCode;\n txParams.authorizationList = [{ address: upgradeContractAddress }];\n }\n\n if (validateSecurity) {\n const securityRequest: ValidateSecurityRequest = {\n method: 'eth_sendTransaction',\n params: [\n {\n ...txParams,\n authorizationList: undefined,\n type: TransactionEnvelopeType.feeMarket,\n },\n ],\n delegationMock: txParams.authorizationList?.[0]?.address,\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 const batchId = batchIdOverride ?? generateBatchId();\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 isGasFeeIncluded: userRequest.isGasFeeIncluded,\n isGasFeeSponsored: userRequest.isGasFeeSponsored,\n nestedTransactions,\n networkClientId,\n origin,\n requireApproval,\n securityAlertResponse,\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 * 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: AddTransactionBatchRequest,\n): Promise<TransactionBatchResult> {\n const {\n messenger,\n publishBatchHook: requestPublishBatchHook,\n request: userRequest,\n update,\n } = request;\n\n const {\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 getEthQuery: request.getEthQuery,\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 batchId = generateBatchId();\n\n const nestedTransactions = requestedTransactions.map((tx) => ({\n ...tx,\n origin,\n }));\n\n const transactionCount = nestedTransactions.length;\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\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 = { from, networkClientId, transactions };\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) {\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, 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(onPublish)\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 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) {\n update((state) => {\n state.transactionBatches = [\n ...state.transactionBatches,\n transactionBatchMeta,\n ];\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 getChainId,\n getEthQuery,\n getGasFeeEstimates,\n getSimulationConfig,\n update,\n } = request;\n\n const {\n from,\n origin,\n networkClientId,\n transactions: nestedTransactions,\n } = userRequest;\n\n const ethQuery = getEthQuery(networkClientId);\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(networkClientId);\n\n const { 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 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 ethQuery,\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}) {\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"]}
|
package/dist/utils/batch.mjs
CHANGED
|
@@ -114,7 +114,7 @@ async function getNestedTransactionMeta(request, singleRequest, ethQuery) {
|
|
|
114
114
|
*/
|
|
115
115
|
async function addTransactionBatchWith7702(request) {
|
|
116
116
|
const { addTransaction, getChainId, messenger, publicKeyEIP7702, request: userRequest, } = request;
|
|
117
|
-
const { batchId: batchIdOverride, from, networkClientId, origin, requireApproval, securityAlertId, transactions, validateSecurity, } = userRequest;
|
|
117
|
+
const { batchId: batchIdOverride, from, gasFeeToken, networkClientId, origin, requireApproval, securityAlertId, transactions, validateSecurity, } = userRequest;
|
|
118
118
|
const chainId = getChainId(networkClientId);
|
|
119
119
|
const ethQuery = request.getEthQuery(networkClientId);
|
|
120
120
|
const isChainSupported = doesChainSupportEIP7702(chainId, messenger);
|
|
@@ -181,6 +181,7 @@ async function addTransactionBatchWith7702(request) {
|
|
|
181
181
|
}
|
|
182
182
|
const { result } = await addTransaction(txParams, {
|
|
183
183
|
batchId,
|
|
184
|
+
gasFeeToken,
|
|
184
185
|
isGasFeeIncluded: userRequest.isGasFeeIncluded,
|
|
185
186
|
isGasFeeSponsored: userRequest.isGasFeeSponsored,
|
|
186
187
|
nestedTransactions,
|
package/dist/utils/batch.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch.mjs","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 EthQuery from '@metamask/eth-query';\nimport type {\n FetchGasFeeEstimateOptions,\n GasFeeState,\n} from '@metamask/gas-fee-controller';\nimport { JsonRpcError, rpcErrors } from '@metamask/rpc-errors';\nimport type { Hex } from '@metamask/utils';\nimport { bytesToHex, createModuleLogger } from '@metamask/utils';\nimport type { WritableDraft } from 'immer/dist/internal.js';\nimport { parse, v4 } from 'uuid';\n\nimport {\n ERROR_MESSGE_PUBLIC_KEY,\n doesChainSupportEIP7702,\n generateEIP7702BatchTransaction,\n isAccountUpgradedToEIP7702,\n} from './eip7702';\nimport {\n getBatchSizeLimit,\n getEIP7702SupportedChains,\n getEIP7702UpgradeContractAddress,\n} from './feature-flags';\nimport { simulateGasBatch } from './gas';\nimport { validateBatchRequest } from './validation';\nimport type { GetSimulationConfig, TransactionControllerState } from '..';\nimport {\n determineTransactionType,\n GasFeeEstimateLevel,\n TransactionStatus,\n type BatchTransactionParams,\n type TransactionController,\n type TransactionControllerMessenger,\n type TransactionMeta,\n} from '..';\nimport { DefaultGasFeeFlow } from '../gas-flows/DefaultGasFeeFlow';\nimport { updateTransactionGasEstimates } from '../helpers/GasFeePoller';\nimport type { PendingTransactionTracker } from '../helpers/PendingTransactionTracker';\nimport { CollectPublishHook } from '../hooks/CollectPublishHook';\nimport { SequentialPublishBatchHook } from '../hooks/SequentialPublishBatchHook';\nimport { projectLogger } from '../logger';\nimport type {\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';\nimport {\n TransactionEnvelopeType,\n type TransactionBatchResult,\n type TransactionParams,\n TransactionType,\n} from '../types';\n\ntype UpdateStateCallback = (\n callback: (\n state: WritableDraft<TransactionControllerState>,\n ) => void | TransactionControllerState,\n) => void;\n\ntype AddTransactionBatchRequest = {\n addTransaction: TransactionController['addTransaction'];\n estimateGas: TransactionController['estimateGas'];\n getChainId: (networkClientId: string) => Hex;\n getEthQuery: (networkClientId: string) => EthQuery;\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: () => boolean;\n messenger: TransactionControllerMessenger;\n publishBatchHook?: PublishBatchHook;\n publishTransaction: (\n _ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<Hex>;\n publicKeyEIP7702?: Hex;\n request: TransactionBatchRequest;\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 IsAtomicBatchSupportedRequestInternal = {\n address: Hex;\n chainIds?: Hex[];\n getEthQuery: (chainId: Hex) => EthQuery;\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 const sizeLimit = getBatchSizeLimit(messenger);\n\n validateBatchRequest({\n internalAccounts: getInternalAccounts(),\n request: transactionBatchRequest,\n sizeLimit,\n });\n\n log('Adding', transactionBatchRequest);\n\n if (!transactionBatchRequest.disable7702) {\n try {\n return await addTransactionBatchWith7702(request);\n } catch (error: unknown) {\n const isEIP7702NotSupportedError =\n error instanceof JsonRpcError &&\n error.message === 'Chain does not support EIP-7702';\n\n if (!isEIP7702NotSupportedError) {\n throw error;\n }\n }\n }\n\n return await addTransactionBatchWithHook(request);\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 {\n address,\n chainIds,\n getEthQuery,\n messenger,\n publicKeyEIP7702: publicKey,\n } = 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 ethQuery = getEthQuery(chainId);\n\n const { isSupported, delegationAddress } =\n await isAccountUpgradedToEIP7702(\n address,\n chainId,\n publicKey,\n messenger,\n ethQuery,\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 undefined;\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 */\nfunction 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 ethQuery - The EthQuery instance used to interact with the Ethereum blockchain.\n * @returns The metadata for the nested transaction.\n */\nasync function getNestedTransactionMeta(\n request: TransactionBatchRequest,\n singleRequest: TransactionBatchSingleRequest,\n ethQuery: EthQuery,\n): Promise<NestedTransactionMetadata> {\n const { from } = request;\n const { params, type: requestedType } = singleRequest;\n\n const { type: determinedType } = await determineTransactionType(\n { from, ...params },\n ethQuery,\n );\n\n const type = requestedType ?? determinedType;\n return {\n ...params,\n type,\n };\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: AddTransactionBatchRequest,\n) {\n const {\n addTransaction,\n getChainId,\n messenger,\n publicKeyEIP7702,\n request: userRequest,\n } = request;\n\n const {\n batchId: batchIdOverride,\n from,\n networkClientId,\n origin,\n requireApproval,\n securityAlertId,\n transactions,\n validateSecurity,\n } = userRequest;\n\n const chainId = getChainId(networkClientId);\n const ethQuery = request.getEthQuery(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 const { delegationAddress, isSupported } = await isAccountUpgradedToEIP7702(\n from,\n chainId,\n publicKeyEIP7702,\n messenger,\n ethQuery,\n );\n\n log('Account', { delegationAddress, isSupported });\n\n if (!isSupported && delegationAddress) {\n log('Account upgraded to unsupported contract', from, delegationAddress);\n throw rpcErrors.internal('Account upgraded to unsupported contract');\n }\n\n const nestedTransactions = await Promise.all(\n transactions.map((tx) =>\n getNestedTransactionMeta(userRequest, tx, ethQuery),\n ),\n );\n\n const batchParams = generateEIP7702BatchTransaction(from, nestedTransactions);\n\n const txParams: TransactionParams = {\n from,\n ...batchParams,\n };\n\n if (!isSupported) {\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 txParams.type = TransactionEnvelopeType.setCode;\n txParams.authorizationList = [{ address: upgradeContractAddress }];\n }\n\n if (validateSecurity) {\n const securityRequest: ValidateSecurityRequest = {\n method: 'eth_sendTransaction',\n params: [\n {\n ...txParams,\n authorizationList: undefined,\n type: TransactionEnvelopeType.feeMarket,\n },\n ],\n delegationMock: txParams.authorizationList?.[0]?.address,\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 const batchId = batchIdOverride ?? generateBatchId();\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 isGasFeeIncluded: userRequest.isGasFeeIncluded,\n isGasFeeSponsored: userRequest.isGasFeeSponsored,\n nestedTransactions,\n networkClientId,\n origin,\n requireApproval,\n securityAlertResponse,\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 * 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: AddTransactionBatchRequest,\n): Promise<TransactionBatchResult> {\n const {\n messenger,\n publishBatchHook: requestPublishBatchHook,\n request: userRequest,\n update,\n } = request;\n\n const {\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 getEthQuery: request.getEthQuery,\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 batchId = generateBatchId();\n\n const nestedTransactions = requestedTransactions.map((tx) => ({\n ...tx,\n origin,\n }));\n\n const transactionCount = nestedTransactions.length;\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\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 = { from, networkClientId, transactions };\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) {\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, 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(onPublish)\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 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) {\n update((state) => {\n state.transactionBatches = [\n ...state.transactionBatches,\n transactionBatchMeta,\n ];\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 getChainId,\n getEthQuery,\n getGasFeeEstimates,\n getSimulationConfig,\n update,\n } = request;\n\n const {\n from,\n origin,\n networkClientId,\n transactions: nestedTransactions,\n } = userRequest;\n\n const ethQuery = getEthQuery(networkClientId);\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(networkClientId);\n\n const { 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 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 ethQuery,\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}) {\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.mjs","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 EthQuery from '@metamask/eth-query';\nimport type {\n FetchGasFeeEstimateOptions,\n GasFeeState,\n} from '@metamask/gas-fee-controller';\nimport { JsonRpcError, rpcErrors } from '@metamask/rpc-errors';\nimport type { Hex } from '@metamask/utils';\nimport { bytesToHex, createModuleLogger } from '@metamask/utils';\nimport type { WritableDraft } from 'immer/dist/internal.js';\nimport { parse, v4 } from 'uuid';\n\nimport {\n ERROR_MESSGE_PUBLIC_KEY,\n doesChainSupportEIP7702,\n generateEIP7702BatchTransaction,\n isAccountUpgradedToEIP7702,\n} from './eip7702';\nimport {\n getBatchSizeLimit,\n getEIP7702SupportedChains,\n getEIP7702UpgradeContractAddress,\n} from './feature-flags';\nimport { simulateGasBatch } from './gas';\nimport { validateBatchRequest } from './validation';\nimport type { GetSimulationConfig, TransactionControllerState } from '..';\nimport {\n determineTransactionType,\n GasFeeEstimateLevel,\n TransactionStatus,\n type BatchTransactionParams,\n type TransactionController,\n type TransactionControllerMessenger,\n type TransactionMeta,\n} from '..';\nimport { DefaultGasFeeFlow } from '../gas-flows/DefaultGasFeeFlow';\nimport { updateTransactionGasEstimates } from '../helpers/GasFeePoller';\nimport type { PendingTransactionTracker } from '../helpers/PendingTransactionTracker';\nimport { CollectPublishHook } from '../hooks/CollectPublishHook';\nimport { SequentialPublishBatchHook } from '../hooks/SequentialPublishBatchHook';\nimport { projectLogger } from '../logger';\nimport type {\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';\nimport {\n TransactionEnvelopeType,\n type TransactionBatchResult,\n type TransactionParams,\n TransactionType,\n} from '../types';\n\ntype UpdateStateCallback = (\n callback: (\n state: WritableDraft<TransactionControllerState>,\n ) => void | TransactionControllerState,\n) => void;\n\ntype AddTransactionBatchRequest = {\n addTransaction: TransactionController['addTransaction'];\n estimateGas: TransactionController['estimateGas'];\n getChainId: (networkClientId: string) => Hex;\n getEthQuery: (networkClientId: string) => EthQuery;\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: () => boolean;\n messenger: TransactionControllerMessenger;\n publishBatchHook?: PublishBatchHook;\n publishTransaction: (\n _ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<Hex>;\n publicKeyEIP7702?: Hex;\n request: TransactionBatchRequest;\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 IsAtomicBatchSupportedRequestInternal = {\n address: Hex;\n chainIds?: Hex[];\n getEthQuery: (chainId: Hex) => EthQuery;\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 const sizeLimit = getBatchSizeLimit(messenger);\n\n validateBatchRequest({\n internalAccounts: getInternalAccounts(),\n request: transactionBatchRequest,\n sizeLimit,\n });\n\n log('Adding', transactionBatchRequest);\n\n if (!transactionBatchRequest.disable7702) {\n try {\n return await addTransactionBatchWith7702(request);\n } catch (error: unknown) {\n const isEIP7702NotSupportedError =\n error instanceof JsonRpcError &&\n error.message === 'Chain does not support EIP-7702';\n\n if (!isEIP7702NotSupportedError) {\n throw error;\n }\n }\n }\n\n return await addTransactionBatchWithHook(request);\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 {\n address,\n chainIds,\n getEthQuery,\n messenger,\n publicKeyEIP7702: publicKey,\n } = 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 ethQuery = getEthQuery(chainId);\n\n const { isSupported, delegationAddress } =\n await isAccountUpgradedToEIP7702(\n address,\n chainId,\n publicKey,\n messenger,\n ethQuery,\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 undefined;\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 */\nfunction 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 ethQuery - The EthQuery instance used to interact with the Ethereum blockchain.\n * @returns The metadata for the nested transaction.\n */\nasync function getNestedTransactionMeta(\n request: TransactionBatchRequest,\n singleRequest: TransactionBatchSingleRequest,\n ethQuery: EthQuery,\n): Promise<NestedTransactionMetadata> {\n const { from } = request;\n const { params, type: requestedType } = singleRequest;\n\n const { type: determinedType } = await determineTransactionType(\n { from, ...params },\n ethQuery,\n );\n\n const type = requestedType ?? determinedType;\n return {\n ...params,\n type,\n };\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: AddTransactionBatchRequest,\n) {\n const {\n addTransaction,\n getChainId,\n messenger,\n publicKeyEIP7702,\n request: userRequest,\n } = request;\n\n const {\n batchId: batchIdOverride,\n from,\n gasFeeToken,\n networkClientId,\n origin,\n requireApproval,\n securityAlertId,\n transactions,\n validateSecurity,\n } = userRequest;\n\n const chainId = getChainId(networkClientId);\n const ethQuery = request.getEthQuery(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 const { delegationAddress, isSupported } = await isAccountUpgradedToEIP7702(\n from,\n chainId,\n publicKeyEIP7702,\n messenger,\n ethQuery,\n );\n\n log('Account', { delegationAddress, isSupported });\n\n if (!isSupported && delegationAddress) {\n log('Account upgraded to unsupported contract', from, delegationAddress);\n throw rpcErrors.internal('Account upgraded to unsupported contract');\n }\n\n const nestedTransactions = await Promise.all(\n transactions.map((tx) =>\n getNestedTransactionMeta(userRequest, tx, ethQuery),\n ),\n );\n\n const batchParams = generateEIP7702BatchTransaction(from, nestedTransactions);\n\n const txParams: TransactionParams = {\n from,\n ...batchParams,\n };\n\n if (!isSupported) {\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 txParams.type = TransactionEnvelopeType.setCode;\n txParams.authorizationList = [{ address: upgradeContractAddress }];\n }\n\n if (validateSecurity) {\n const securityRequest: ValidateSecurityRequest = {\n method: 'eth_sendTransaction',\n params: [\n {\n ...txParams,\n authorizationList: undefined,\n type: TransactionEnvelopeType.feeMarket,\n },\n ],\n delegationMock: txParams.authorizationList?.[0]?.address,\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 const batchId = batchIdOverride ?? generateBatchId();\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 isGasFeeIncluded: userRequest.isGasFeeIncluded,\n isGasFeeSponsored: userRequest.isGasFeeSponsored,\n nestedTransactions,\n networkClientId,\n origin,\n requireApproval,\n securityAlertResponse,\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 * 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: AddTransactionBatchRequest,\n): Promise<TransactionBatchResult> {\n const {\n messenger,\n publishBatchHook: requestPublishBatchHook,\n request: userRequest,\n update,\n } = request;\n\n const {\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 getEthQuery: request.getEthQuery,\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 batchId = generateBatchId();\n\n const nestedTransactions = requestedTransactions.map((tx) => ({\n ...tx,\n origin,\n }));\n\n const transactionCount = nestedTransactions.length;\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\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 = { from, networkClientId, transactions };\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) {\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, 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(onPublish)\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 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) {\n update((state) => {\n state.transactionBatches = [\n ...state.transactionBatches,\n transactionBatchMeta,\n ];\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 getChainId,\n getEthQuery,\n getGasFeeEstimates,\n getSimulationConfig,\n update,\n } = request;\n\n const {\n from,\n origin,\n networkClientId,\n transactions: nestedTransactions,\n } = userRequest;\n\n const ethQuery = getEthQuery(networkClientId);\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(networkClientId);\n\n const { 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 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 ethQuery,\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}) {\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,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getGasFeeTokens = void 0;
|
|
3
|
+
exports.checkGasFeeTokenBeforePublish = exports.getGasFeeTokens = void 0;
|
|
4
4
|
const rpc_errors_1 = require("@metamask/rpc-errors");
|
|
5
5
|
const utils_1 = require("@metamask/utils");
|
|
6
|
+
const balance_1 = require("./balance.cjs");
|
|
6
7
|
const batch_1 = require("./batch.cjs");
|
|
7
8
|
const eip7702_1 = require("./eip7702.cjs");
|
|
8
9
|
const feature_flags_1 = require("./feature-flags.cjs");
|
|
@@ -72,6 +73,43 @@ async function getGasFeeTokens({ chainId, isEIP7702GasFeeTokensEnabled, messenge
|
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
75
|
exports.getGasFeeTokens = getGasFeeTokens;
|
|
76
|
+
/**
|
|
77
|
+
* Check and update gas fee token selection before publishing a transaction.
|
|
78
|
+
*
|
|
79
|
+
* @param request - Request object.
|
|
80
|
+
* @param request.ethQuery - EthQuery instance.
|
|
81
|
+
* @param request.fetchGasFeeTokens - Function to fetch gas fee tokens.
|
|
82
|
+
* @param request.transaction - Transaction metadata.
|
|
83
|
+
* @param request.updateTransaction - Function to update the transaction.
|
|
84
|
+
*/
|
|
85
|
+
async function checkGasFeeTokenBeforePublish({ ethQuery, fetchGasFeeTokens, transaction, updateTransaction, }) {
|
|
86
|
+
const { isGasFeeTokenIgnoredIfBalance, selectedGasFeeToken } = transaction;
|
|
87
|
+
if (!selectedGasFeeToken || !isGasFeeTokenIgnoredIfBalance) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
log('Checking gas fee token before publish', { selectedGasFeeToken });
|
|
91
|
+
const hasNativeBalance = await (0, balance_1.isNativeBalanceSufficientForGas)(transaction, ethQuery);
|
|
92
|
+
if (hasNativeBalance) {
|
|
93
|
+
log('Ignoring gas fee token before publish due to sufficient native balance');
|
|
94
|
+
updateTransaction(transaction.id, (tx) => {
|
|
95
|
+
tx.isExternalSign = false;
|
|
96
|
+
tx.selectedGasFeeToken = undefined;
|
|
97
|
+
});
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const gasFeeTokens = await fetchGasFeeTokens(transaction);
|
|
101
|
+
updateTransaction(transaction.id, (tx) => {
|
|
102
|
+
tx.gasFeeTokens = gasFeeTokens;
|
|
103
|
+
tx.isExternalSign = true;
|
|
104
|
+
tx.txParams.nonce = undefined;
|
|
105
|
+
});
|
|
106
|
+
log('Updated gas fee tokens before publish', gasFeeTokens);
|
|
107
|
+
if (!gasFeeTokens?.some((t) => t.tokenAddress.toLowerCase() === selectedGasFeeToken.toLowerCase())) {
|
|
108
|
+
throw new Error('Gas fee token not found and insufficient native balance');
|
|
109
|
+
}
|
|
110
|
+
log('Publishing with selected gas fee token', { selectedGasFeeToken });
|
|
111
|
+
}
|
|
112
|
+
exports.checkGasFeeTokenBeforePublish = checkGasFeeTokenBeforePublish;
|
|
75
113
|
/**
|
|
76
114
|
* Extract gas fee tokens from a simulation response.
|
|
77
115
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas-fee-tokens.cjs","sourceRoot":"","sources":["../../src/utils/gas-fee-tokens.ts"],"names":[],"mappings":"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","sourcesContent":["import { rpcErrors } from '@metamask/rpc-errors';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { ERROR_MESSAGE_NO_UPGRADE_CONTRACT } from './batch';\nimport { ERROR_MESSGE_PUBLIC_KEY, doesChainSupportEIP7702 } from './eip7702';\nimport { getEIP7702UpgradeContractAddress } from './feature-flags';\nimport type {\n GasFeeToken,\n TransactionControllerMessenger,\n TransactionMeta,\n} from '..';\nimport type { SimulationRequestTransaction } from '../api/simulation-api';\nimport {\n simulateTransactions,\n type SimulationResponse,\n type SimulationResponseTransaction,\n} from '../api/simulation-api';\nimport { projectLogger } from '../logger';\nimport type { GetSimulationConfig } from '../types';\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) {\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: from as Hex,\n }));\n\n if (with7702 && !delegationAddress && !authorizationList) {\n authorizationList = buildAuthorizationList({\n chainId,\n from: from as Hex,\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 },\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 * 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: from as Hex,\n },\n ];\n}\n"]}
|
|
1
|
+
{"version":3,"file":"gas-fee-tokens.cjs","sourceRoot":"","sources":["../../src/utils/gas-fee-tokens.ts"],"names":[],"mappings":"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","sourcesContent":["import type EthQuery from '@metamask/eth-query';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type { Hex } from '@metamask/utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { isNativeBalanceSufficientForGas } from './balance';\nimport { ERROR_MESSAGE_NO_UPGRADE_CONTRACT } from './batch';\nimport { ERROR_MESSGE_PUBLIC_KEY, doesChainSupportEIP7702 } from './eip7702';\nimport { getEIP7702UpgradeContractAddress } from './feature-flags';\nimport type {\n GasFeeToken,\n TransactionControllerMessenger,\n TransactionMeta,\n} from '..';\nimport type { SimulationRequestTransaction } from '../api/simulation-api';\nimport {\n simulateTransactions,\n type SimulationResponse,\n type SimulationResponseTransaction,\n} from '../api/simulation-api';\nimport { projectLogger } from '../logger';\nimport type { GetSimulationConfig } from '../types';\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) {\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: from as Hex,\n }));\n\n if (with7702 && !delegationAddress && !authorizationList) {\n authorizationList = buildAuthorizationList({\n chainId,\n from: from as Hex,\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 },\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.ethQuery - EthQuery instance.\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 ethQuery,\n fetchGasFeeTokens,\n transaction,\n updateTransaction,\n}: {\n ethQuery: EthQuery;\n fetchGasFeeTokens: (transaction: TransactionMeta) => Promise<GasFeeToken[]>;\n transaction: TransactionMeta;\n updateTransaction: (\n transactionId: string,\n fn: (tx: TransactionMeta) => void,\n ) => void;\n}) {\n const { isGasFeeTokenIgnoredIfBalance, selectedGasFeeToken } = transaction;\n\n if (!selectedGasFeeToken || !isGasFeeTokenIgnoredIfBalance) {\n return;\n }\n\n log('Checking gas fee token before publish', { selectedGasFeeToken });\n\n const hasNativeBalance = await isNativeBalanceSufficientForGas(\n transaction,\n ethQuery,\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 const gasFeeTokens = await fetchGasFeeTokens(transaction);\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\n if (\n !gasFeeTokens?.some(\n (t) => t.tokenAddress.toLowerCase() === selectedGasFeeToken.toLowerCase(),\n )\n ) {\n throw new Error('Gas fee token not found and insufficient native balance');\n }\n\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: from as Hex,\n },\n ];\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type EthQuery from "@metamask/eth-query";
|
|
1
2
|
import type { Hex } from "@metamask/utils";
|
|
2
3
|
import type { GasFeeToken, TransactionControllerMessenger, TransactionMeta } from "../index.cjs";
|
|
3
4
|
import type { GetSimulationConfig } from "../types.cjs";
|
|
@@ -25,4 +26,19 @@ export declare function getGasFeeTokens({ chainId, isEIP7702GasFeeTokensEnabled,
|
|
|
25
26
|
gasFeeTokens: GasFeeToken[];
|
|
26
27
|
isGasFeeSponsored: boolean;
|
|
27
28
|
}>;
|
|
29
|
+
/**
|
|
30
|
+
* Check and update gas fee token selection before publishing a transaction.
|
|
31
|
+
*
|
|
32
|
+
* @param request - Request object.
|
|
33
|
+
* @param request.ethQuery - EthQuery instance.
|
|
34
|
+
* @param request.fetchGasFeeTokens - Function to fetch gas fee tokens.
|
|
35
|
+
* @param request.transaction - Transaction metadata.
|
|
36
|
+
* @param request.updateTransaction - Function to update the transaction.
|
|
37
|
+
*/
|
|
38
|
+
export declare function checkGasFeeTokenBeforePublish({ ethQuery, fetchGasFeeTokens, transaction, updateTransaction, }: {
|
|
39
|
+
ethQuery: EthQuery;
|
|
40
|
+
fetchGasFeeTokens: (transaction: TransactionMeta) => Promise<GasFeeToken[]>;
|
|
41
|
+
transaction: TransactionMeta;
|
|
42
|
+
updateTransaction: (transactionId: string, fn: (tx: TransactionMeta) => void) => void;
|
|
43
|
+
}): Promise<void>;
|
|
28
44
|
//# sourceMappingURL=gas-fee-tokens.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gas-fee-tokens.d.cts","sourceRoot":"","sources":["../../src/utils/gas-fee-tokens.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gas-fee-tokens.d.cts","sourceRoot":"","sources":["../../src/utils/gas-fee-tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,4BAA4B;AAEhD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAO3C,OAAO,KAAK,EACV,WAAW,EACX,8BAA8B,EAC9B,eAAe,EAChB,qBAAW;AAQZ,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAiB;AAIpD,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;;;GA8DxB;AAED;;;;;;;;GAQG;AACH,wBAAsB,6BAA6B,CAAC,EAClD,QAAQ,EACR,iBAAiB,EACjB,WAAW,EACX,iBAAiB,GAClB,EAAE;IACD,QAAQ,EAAE,QAAQ,CAAC;IACnB,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,iBA8CA"}
|