@metamask/transaction-controller 57.0.0 → 57.2.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.
Files changed (66) hide show
  1. package/CHANGELOG.md +29 -1
  2. package/dist/TransactionController.cjs +18 -55
  3. package/dist/TransactionController.cjs.map +1 -1
  4. package/dist/TransactionController.d.cts.map +1 -1
  5. package/dist/TransactionController.d.mts.map +1 -1
  6. package/dist/TransactionController.mjs +21 -58
  7. package/dist/TransactionController.mjs.map +1 -1
  8. package/dist/api/simulation-api.cjs.map +1 -1
  9. package/dist/api/simulation-api.d.cts +22 -5
  10. package/dist/api/simulation-api.d.cts.map +1 -1
  11. package/dist/api/simulation-api.d.mts +22 -5
  12. package/dist/api/simulation-api.d.mts.map +1 -1
  13. package/dist/api/simulation-api.mjs.map +1 -1
  14. package/dist/hooks/ExtraTransactionsPublishHook.cjs +3 -1
  15. package/dist/hooks/ExtraTransactionsPublishHook.cjs.map +1 -1
  16. package/dist/hooks/ExtraTransactionsPublishHook.d.cts.map +1 -1
  17. package/dist/hooks/ExtraTransactionsPublishHook.d.mts.map +1 -1
  18. package/dist/hooks/ExtraTransactionsPublishHook.mjs +3 -1
  19. package/dist/hooks/ExtraTransactionsPublishHook.mjs.map +1 -1
  20. package/dist/types.cjs +4 -0
  21. package/dist/types.cjs.map +1 -1
  22. package/dist/types.d.cts +27 -4
  23. package/dist/types.d.cts.map +1 -1
  24. package/dist/types.d.mts +27 -4
  25. package/dist/types.d.mts.map +1 -1
  26. package/dist/types.mjs +4 -0
  27. package/dist/types.mjs.map +1 -1
  28. package/dist/utils/{simulation.cjs → balance-changes.cjs} +103 -112
  29. package/dist/utils/balance-changes.cjs.map +1 -0
  30. package/dist/utils/balance-changes.d.cts +30 -0
  31. package/dist/utils/balance-changes.d.cts.map +1 -0
  32. package/dist/utils/balance-changes.d.mts +30 -0
  33. package/dist/utils/balance-changes.d.mts.map +1 -0
  34. package/dist/utils/{simulation.mjs → balance-changes.mjs} +107 -111
  35. package/dist/utils/balance-changes.mjs.map +1 -0
  36. package/dist/utils/batch.cjs +82 -35
  37. package/dist/utils/batch.cjs.map +1 -1
  38. package/dist/utils/batch.d.cts +1 -0
  39. package/dist/utils/batch.d.cts.map +1 -1
  40. package/dist/utils/batch.d.mts +1 -0
  41. package/dist/utils/batch.d.mts.map +1 -1
  42. package/dist/utils/batch.mjs +83 -36
  43. package/dist/utils/batch.mjs.map +1 -1
  44. package/dist/utils/gas-fee-tokens.cjs +123 -0
  45. package/dist/utils/gas-fee-tokens.cjs.map +1 -0
  46. package/dist/utils/gas-fee-tokens.d.cts +22 -0
  47. package/dist/utils/gas-fee-tokens.d.cts.map +1 -0
  48. package/dist/utils/gas-fee-tokens.d.mts +22 -0
  49. package/dist/utils/gas-fee-tokens.d.mts.map +1 -0
  50. package/dist/utils/gas-fee-tokens.mjs +119 -0
  51. package/dist/utils/gas-fee-tokens.mjs.map +1 -0
  52. package/dist/utils/gas.cjs +40 -1
  53. package/dist/utils/gas.cjs.map +1 -1
  54. package/dist/utils/gas.d.cts +17 -0
  55. package/dist/utils/gas.d.cts.map +1 -1
  56. package/dist/utils/gas.d.mts +17 -0
  57. package/dist/utils/gas.d.mts.map +1 -1
  58. package/dist/utils/gas.mjs +38 -0
  59. package/dist/utils/gas.mjs.map +1 -1
  60. package/package.json +3 -3
  61. package/dist/utils/simulation.cjs.map +0 -1
  62. package/dist/utils/simulation.d.cts +0 -60
  63. package/dist/utils/simulation.d.cts.map +0 -1
  64. package/dist/utils/simulation.d.mts +0 -60
  65. package/dist/utils/simulation.d.mts.map +0 -1
  66. package/dist/utils/simulation.mjs.map +0 -1
@@ -7,6 +7,7 @@ const utils_1 = require("@metamask/utils");
7
7
  const uuid_1 = require("uuid");
8
8
  const eip7702_1 = require("./eip7702.cjs");
9
9
  const feature_flags_1 = require("./feature-flags.cjs");
10
+ const gas_1 = require("./gas.cjs");
10
11
  const validation_1 = require("./validation.cjs");
11
12
  const __1 = require("../index.cjs");
12
13
  const CollectPublishHook_1 = require("../hooks/CollectPublishHook.cjs");
@@ -22,19 +23,27 @@ exports.ERROR_MESSAGE_NO_UPGRADE_CONTRACT = 'Upgrade contract address not found'
22
23
  * @returns The batch result object including the batch ID.
23
24
  */
24
25
  async function addTransactionBatch(request) {
25
- const { getInternalAccounts, messenger, request: userRequest } = request;
26
+ const { getInternalAccounts, messenger, request: transactionBatchRequest, } = request;
26
27
  const sizeLimit = (0, feature_flags_1.getBatchSizeLimit)(messenger);
27
28
  (0, validation_1.validateBatchRequest)({
28
29
  internalAccounts: getInternalAccounts(),
29
- request: userRequest,
30
+ request: transactionBatchRequest,
30
31
  sizeLimit,
31
32
  });
32
- const { useHook } = userRequest;
33
- log('Adding', userRequest);
34
- if (useHook) {
35
- return await addTransactionBatchWithHook(request);
33
+ log('Adding', transactionBatchRequest);
34
+ if (!transactionBatchRequest.disable7702) {
35
+ try {
36
+ return await addTransactionBatchWith7702(request);
37
+ }
38
+ catch (error) {
39
+ const isEIP7702NotSupportedError = error instanceof rpc_errors_1.JsonRpcError &&
40
+ error.message === 'Chain does not support EIP-7702';
41
+ if (!isEIP7702NotSupportedError) {
42
+ throw error;
43
+ }
44
+ }
36
45
  }
37
- return await addTransactionBatchWith7702(request);
46
+ return await addTransactionBatchWithHook(request);
38
47
  }
39
48
  exports.addTransactionBatch = addTransactionBatch;
40
49
  /**
@@ -183,8 +192,8 @@ async function addTransactionBatchWith7702(request) {
183
192
  * @returns The batch result object including the batch ID.
184
193
  */
185
194
  async function addTransactionBatchWithHook(request) {
186
- const { getChainId, messenger, publishBatchHook: requestPublishBatchHook, request: userRequest, update, } = request;
187
- const { from, networkClientId, origin, requireApproval, transactions: nestedTransactions, useHook, } = userRequest;
195
+ const { getChainId, messenger, publishBatchHook: requestPublishBatchHook, request: userRequest, update, isSimulationEnabled, } = request;
196
+ const { from, networkClientId, origin, requireApproval, transactions: nestedTransactions, } = userRequest;
188
197
  let resultCallbacks;
189
198
  log('Adding transaction batch using hook', userRequest);
190
199
  const sequentialPublishBatchHook = new SequentialPublishBatchHook_1.SequentialPublishBatchHook({
@@ -193,21 +202,44 @@ async function addTransactionBatchWithHook(request) {
193
202
  getEthQuery: request.getEthQuery,
194
203
  getPendingTransactionTracker: request.getPendingTransactionTracker,
195
204
  });
196
- const publishBatchHook = requestPublishBatchHook ?? sequentialPublishBatchHook.getHook();
205
+ let { disable7702, disableSequential } = userRequest;
206
+ const { disableHook, useHook } = userRequest;
207
+ // use hook is a temporary alias for disable7702 and disableSequential
208
+ if (useHook) {
209
+ disable7702 = true;
210
+ disableSequential = true;
211
+ }
212
+ let publishBatchHook = null;
213
+ if (!disableHook) {
214
+ publishBatchHook = requestPublishBatchHook;
215
+ }
216
+ else if (!disableSequential) {
217
+ publishBatchHook = sequentialPublishBatchHook.getHook();
218
+ }
219
+ if (!publishBatchHook) {
220
+ log(`No supported batch methods found`, {
221
+ disable7702,
222
+ disableHook,
223
+ disableSequential,
224
+ });
225
+ throw rpc_errors_1.rpcErrors.internal(`Can't process batch`);
226
+ }
197
227
  const chainId = getChainId(networkClientId);
198
228
  const batchId = generateBatchId();
199
229
  const transactionCount = nestedTransactions.length;
200
230
  const collectHook = new CollectPublishHook_1.CollectPublishHook(transactionCount);
201
231
  try {
202
- if (requireApproval && useHook) {
203
- const txBatchMeta = newBatchMetadata({
204
- id: batchId,
232
+ if (requireApproval) {
233
+ const txBatchMeta = await prepareApprovalData({
234
+ batchId,
205
235
  chainId,
236
+ from,
237
+ isSimulationEnabled,
238
+ nestedTransactions,
206
239
  networkClientId,
207
- transactions: nestedTransactions,
208
240
  origin,
241
+ update,
209
242
  });
210
- addBatchMetadata(txBatchMeta, update);
211
243
  resultCallbacks = (await requestApproval(txBatchMeta, messenger))
212
244
  .resultCallbacks;
213
245
  }
@@ -335,26 +367,6 @@ async function requestApproval(txBatchMeta, messenger) {
335
367
  type,
336
368
  }, true));
337
369
  }
338
- /**
339
- * Create a new batch metadata object.
340
- *
341
- * @param options - The options for creating a new batch metadata object.
342
- * @param options.id - The ID of the transaction batch.
343
- * @param options.chainId - The chain ID of the transaction batch.
344
- * @param options.networkClientId - The network client ID of the transaction batch.
345
- * @param options.transactions - The transactions in the batch.
346
- * @param options.origin - The origin of the transaction batch.
347
- * @returns A new TransactionBatchMeta object.
348
- */
349
- function newBatchMetadata({ id, chainId, networkClientId, transactions, origin, }) {
350
- return {
351
- id,
352
- chainId,
353
- networkClientId,
354
- transactions,
355
- origin,
356
- };
357
- }
358
370
  /**
359
371
  * Adds batch metadata to the transaction controller state.
360
372
  *
@@ -380,4 +392,39 @@ function wipeTransactionBatchById(update, id) {
380
392
  state.transactionBatches = state.transactionBatches.filter((batch) => batch.id !== id);
381
393
  });
382
394
  }
395
+ /**
396
+ * Prepares the approval data for a transaction batch.
397
+ *
398
+ * @param options - The options object containing necessary parameters.
399
+ * @param options.batchId - The batch ID for the transaction batch.
400
+ * @param options.chainId - The chain ID of the transactions.
401
+ * @param options.from - The sender's address.
402
+ * @param options.isSimulationEnabled - A function to check if simulation is enabled.
403
+ * @param options.nestedTransactions - The array of nested transactions.
404
+ * @param options.networkClientId - The network client ID.
405
+ * @param options.origin - The origin of the transaction batch.
406
+ * @param options.update - The update function to modify the transaction controller state.
407
+ * @returns The prepared transaction batch metadata.
408
+ */
409
+ async function prepareApprovalData({ batchId, chainId, from, isSimulationEnabled, nestedTransactions, networkClientId, origin, update, }) {
410
+ if (!isSimulationEnabled()) {
411
+ throw new Error('Cannot create transaction batch as simulation not supported');
412
+ }
413
+ const { gasLimit } = await (0, gas_1.simulateGasBatch)({
414
+ chainId,
415
+ from,
416
+ transactions: nestedTransactions,
417
+ });
418
+ const txBatchMeta = {
419
+ chainId,
420
+ from,
421
+ gas: gasLimit,
422
+ id: batchId,
423
+ networkClientId,
424
+ origin,
425
+ transactions: nestedTransactions,
426
+ };
427
+ addBatchMetadata(txBatchMeta, update);
428
+ return txBatchMeta;
429
+ }
383
430
  //# sourceMappingURL=batch.cjs.map
@@ -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 { ORIGIN_METAMASK } from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\nimport { 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 { validateBatchRequest } from './validation';\nimport type { TransactionControllerState } from '..';\nimport {\n determineTransactionType,\n type BatchTransactionParams,\n type TransactionController,\n type TransactionControllerMessenger,\n type TransactionMeta,\n} from '..';\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 getChainId: (networkClientId: string) => Hex;\n getEthQuery: (networkClientId: string) => EthQuery;\n getInternalAccounts: () => Hex[];\n getTransaction: (id: string) => TransactionMeta;\n messenger: TransactionControllerMessenger;\n publishBatchHook?: PublishBatchHook;\n publicKeyEIP7702?: Hex;\n request: TransactionBatchRequest;\n updateTransaction: (\n options: { transactionId: string },\n callback: (transactionMeta: TransactionMeta) => void,\n ) => void;\n publishTransaction: (\n _ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<Hex>;\n getPendingTransactionTracker: (\n networkClientId: string,\n ) => PendingTransactionTracker;\n update: UpdateStateCallback;\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 { getInternalAccounts, messenger, request: userRequest } = request;\n const sizeLimit = getBatchSizeLimit(messenger);\n\n validateBatchRequest({\n internalAccounts: getInternalAccounts(),\n request: userRequest,\n sizeLimit,\n });\n\n const { useHook } = userRequest;\n\n log('Adding', userRequest);\n\n if (useHook) {\n return await addTransactionBatchWithHook(request);\n }\n\n return await addTransactionBatchWith7702(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 } = singleRequest;\n\n const { type } = await determineTransactionType(\n { from, ...params },\n ethQuery,\n );\n\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 { result } = await addTransaction(txParams, {\n batchId,\n nestedTransactions,\n networkClientId,\n origin,\n requireApproval,\n securityAlertResponse,\n type: TransactionType.batch,\n });\n\n // Wait for the transaction to be published.\n await result;\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 getChainId,\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: nestedTransactions,\n useHook,\n } = userRequest;\n\n let resultCallbacks: AcceptResultCallbacks | undefined;\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 const publishBatchHook =\n requestPublishBatchHook ?? sequentialPublishBatchHook.getHook();\n\n const chainId = getChainId(networkClientId);\n const batchId = generateBatchId();\n const transactionCount = nestedTransactions.length;\n const collectHook = new CollectPublishHook(transactionCount);\n try {\n if (requireApproval && useHook) {\n const txBatchMeta = newBatchMetadata({\n id: batchId,\n chainId,\n networkClientId,\n transactions: nestedTransactions,\n origin,\n });\n\n addBatchMetadata(txBatchMeta, update);\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 for (const nestedTransaction of nestedTransactions) {\n const hookTransaction = await processTransactionWithHook(\n batchId,\n nestedTransaction,\n publishHook,\n request,\n );\n\n hookTransactions.push(hookTransaction);\n }\n\n const { signedTransactions } = await collectHook.ready();\n\n const transactions = hookTransactions.map((transaction, index) => ({\n ...transaction,\n signedTx: signedTransactions[index],\n }));\n\n log('Calling publish batch hook', { from, networkClientId, transactions });\n\n const result = await publishBatchHook({\n from,\n networkClientId,\n transactions,\n });\n\n log('Publish batch hook result', result);\n\n if (!result) {\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 * @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) {\n const { existingTransaction, params } = nestedTransaction;\n\n const {\n addTransaction,\n getTransaction,\n request: userRequest,\n updateTransaction,\n } = request;\n\n const { from, networkClientId } = userRequest;\n\n if (existingTransaction) {\n const { id, onPublish, signedTransaction } = existingTransaction;\n const transactionMeta = getTransaction(id);\n\n updateTransaction({ transactionId: id }, (_transactionMeta) => {\n _transactionMeta.batchId = batchId;\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 { transactionMeta } = await addTransaction(\n {\n ...params,\n from,\n },\n {\n batchId,\n disableGasBuffer: true,\n networkClientId,\n publishHook,\n requireApproval: false,\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', { id, params: newParams });\n\n return {\n id,\n params: newParams,\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 = 'transaction_batch';\n const requestData = { txBatchId: id };\n\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 * Create a new batch metadata object.\n *\n * @param options - The options for creating a new batch metadata object.\n * @param options.id - The ID of the transaction batch.\n * @param options.chainId - The chain ID of the transaction batch.\n * @param options.networkClientId - The network client ID of the transaction batch.\n * @param options.transactions - The transactions in the batch.\n * @param options.origin - The origin of the transaction batch.\n * @returns A new TransactionBatchMeta object.\n */\nfunction newBatchMetadata({\n id,\n chainId,\n networkClientId,\n transactions,\n origin,\n}: TransactionBatchMeta): TransactionBatchMeta {\n return {\n id,\n chainId,\n networkClientId,\n transactions,\n origin,\n };\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"]}
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 { ORIGIN_METAMASK } from '@metamask/controller-utils';\nimport type EthQuery from '@metamask/eth-query';\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 { TransactionControllerState } from '..';\nimport {\n determineTransactionType,\n type BatchTransactionParams,\n type TransactionController,\n type TransactionControllerMessenger,\n type TransactionMeta,\n} from '..';\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 getChainId: (networkClientId: string) => Hex;\n getEthQuery: (networkClientId: string) => EthQuery;\n getInternalAccounts: () => Hex[];\n getTransaction: (id: string) => TransactionMeta;\n isSimulationEnabled: () => boolean;\n messenger: TransactionControllerMessenger;\n publishBatchHook?: PublishBatchHook;\n publicKeyEIP7702?: Hex;\n request: TransactionBatchRequest;\n updateTransaction: (\n options: { transactionId: string },\n callback: (transactionMeta: TransactionMeta) => void,\n ) => void;\n publishTransaction: (\n _ethQuery: EthQuery,\n transactionMeta: TransactionMeta,\n ) => Promise<Hex>;\n getPendingTransactionTracker: (\n networkClientId: string,\n ) => PendingTransactionTracker;\n update: UpdateStateCallback;\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 } = singleRequest;\n\n const { type } = await determineTransactionType(\n { from, ...params },\n ethQuery,\n );\n\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 { result } = await addTransaction(txParams, {\n batchId,\n nestedTransactions,\n networkClientId,\n origin,\n requireApproval,\n securityAlertResponse,\n type: TransactionType.batch,\n });\n\n // Wait for the transaction to be published.\n await result;\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 getChainId,\n messenger,\n publishBatchHook: requestPublishBatchHook,\n request: userRequest,\n update,\n isSimulationEnabled,\n } = request;\n\n const {\n from,\n networkClientId,\n origin,\n requireApproval,\n transactions: nestedTransactions,\n } = userRequest;\n\n let resultCallbacks: AcceptResultCallbacks | undefined;\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 if (!disableHook) {\n publishBatchHook = requestPublishBatchHook;\n } else if (!disableSequential) {\n publishBatchHook = sequentialPublishBatchHook.getHook();\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 const chainId = getChainId(networkClientId);\n const batchId = generateBatchId();\n const transactionCount = nestedTransactions.length;\n const collectHook = new CollectPublishHook(transactionCount);\n try {\n if (requireApproval) {\n const txBatchMeta = await prepareApprovalData({\n batchId,\n chainId,\n from,\n isSimulationEnabled,\n nestedTransactions,\n networkClientId,\n origin,\n update,\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 for (const nestedTransaction of nestedTransactions) {\n const hookTransaction = await processTransactionWithHook(\n batchId,\n nestedTransaction,\n publishHook,\n request,\n );\n\n hookTransactions.push(hookTransaction);\n }\n\n const { signedTransactions } = await collectHook.ready();\n\n const transactions = hookTransactions.map((transaction, index) => ({\n ...transaction,\n signedTx: signedTransactions[index],\n }));\n\n log('Calling publish batch hook', { from, networkClientId, transactions });\n\n const result = await publishBatchHook({\n from,\n networkClientId,\n transactions,\n });\n\n log('Publish batch hook result', result);\n\n if (!result) {\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 * @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) {\n const { existingTransaction, params } = nestedTransaction;\n\n const {\n addTransaction,\n getTransaction,\n request: userRequest,\n updateTransaction,\n } = request;\n\n const { from, networkClientId } = userRequest;\n\n if (existingTransaction) {\n const { id, onPublish, signedTransaction } = existingTransaction;\n const transactionMeta = getTransaction(id);\n\n updateTransaction({ transactionId: id }, (_transactionMeta) => {\n _transactionMeta.batchId = batchId;\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 { transactionMeta } = await addTransaction(\n {\n ...params,\n from,\n },\n {\n batchId,\n disableGasBuffer: true,\n networkClientId,\n publishHook,\n requireApproval: false,\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', { id, params: newParams });\n\n return {\n id,\n params: newParams,\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 = 'transaction_batch';\n const requestData = { txBatchId: id };\n\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 * 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.chainId - The chain ID of the transactions.\n * @param options.from - The sender's address.\n * @param options.isSimulationEnabled - A function to check if simulation is enabled.\n * @param options.nestedTransactions - The array of nested transactions.\n * @param options.networkClientId - The network client ID.\n * @param options.origin - The origin of the transaction batch.\n * @param options.update - The update function to modify the transaction controller state.\n * @returns The prepared transaction batch metadata.\n */\nasync function prepareApprovalData({\n batchId,\n chainId,\n from,\n isSimulationEnabled,\n nestedTransactions,\n networkClientId,\n origin,\n update,\n}: {\n batchId: Hex;\n chainId: Hex;\n from: Hex;\n isSimulationEnabled: () => boolean;\n nestedTransactions: TransactionBatchSingleRequest[];\n networkClientId: string;\n origin?: string;\n update: UpdateStateCallback;\n}): Promise<TransactionBatchMeta> {\n if (!isSimulationEnabled()) {\n throw new Error(\n 'Cannot create transaction batch as simulation not supported',\n );\n }\n\n const { gasLimit } = await simulateGasBatch({\n chainId,\n from,\n transactions: nestedTransactions,\n });\n\n const txBatchMeta: TransactionBatchMeta = {\n chainId,\n from,\n gas: gasLimit,\n id: batchId,\n networkClientId,\n origin,\n transactions: nestedTransactions,\n };\n\n addBatchMetadata(txBatchMeta, update);\n\n return txBatchMeta;\n}\n"]}
@@ -13,6 +13,7 @@ type AddTransactionBatchRequest = {
13
13
  getEthQuery: (networkClientId: string) => EthQuery;
14
14
  getInternalAccounts: () => Hex[];
15
15
  getTransaction: (id: string) => TransactionMeta;
16
+ isSimulationEnabled: () => boolean;
16
17
  messenger: TransactionControllerMessenger;
17
18
  publishBatchHook?: PublishBatchHook;
18
19
  publicKeyEIP7702?: Hex;
@@ -1 +1 @@
1
- {"version":3,"file":"batch.d.cts","sourceRoot":"","sources":["../../src/utils/batch.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,4BAA4B;AAEhD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,+BAA+B;AAe5D,OAAO,KAAK,EAAE,0BAA0B,EAAE,qBAAW;AACrD,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,8BAA8B,EACnC,KAAK,eAAe,EACrB,qBAAW;AACZ,OAAO,KAAK,EAAE,yBAAyB,EAAE,iDAA6C;AAItF,OAAO,KAAK,EAIV,gBAAgB,EAGhB,uBAAuB,EAEvB,4BAA4B,EAG7B,qBAAiB;AAClB,OAAO,EAEL,KAAK,sBAAsB,EAG5B,qBAAiB;AAElB,KAAK,mBAAmB,GAAG,CACzB,QAAQ,EAAE,CACR,KAAK,EAAE,aAAa,CAAC,0BAA0B,CAAC,KAC7C,IAAI,GAAG,0BAA0B,KACnC,IAAI,CAAC;AAEV,KAAK,0BAA0B,GAAG;IAChC,cAAc,EAAE,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IACxD,UAAU,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,GAAG,CAAC;IAC7C,WAAW,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,QAAQ,CAAC;IACnD,mBAAmB,EAAE,MAAM,GAAG,EAAE,CAAC;IACjC,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,eAAe,CAAC;IAChD,SAAS,EAAE,8BAA8B,CAAC;IAC1C,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,OAAO,EAAE,uBAAuB,CAAC;IACjC,iBAAiB,EAAE,CACjB,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,EAClC,QAAQ,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,IAAI,KACjD,IAAI,CAAC;IACV,kBAAkB,EAAE,CAClB,SAAS,EAAE,QAAQ,EACnB,eAAe,EAAE,eAAe,KAC7B,OAAO,CAAC,GAAG,CAAC,CAAC;IAClB,4BAA4B,EAAE,CAC5B,eAAe,EAAE,MAAM,KACpB,yBAAyB,CAAC;IAC/B,MAAM,EAAE,mBAAmB,CAAC;CAC7B,CAAC;AAEF,KAAK,qCAAqC,GAAG;IAC3C,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;IACjB,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,QAAQ,CAAC;IACxC,SAAS,EAAE,8BAA8B,CAAC;IAC1C,gBAAgB,CAAC,EAAE,GAAG,CAAC;CACxB,CAAC;AAIF,eAAO,MAAM,iCAAiC,uCACR,CAAC;AAEvC;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,sBAAsB,CAAC,CAmBjC;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,qCAAqC,GAC7C,OAAO,CAAC,4BAA4B,CAAC,CA4DvC"}
1
+ {"version":3,"file":"batch.d.cts","sourceRoot":"","sources":["../../src/utils/batch.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,4BAA4B;AAEhD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,+BAA+B;AAgB5D,OAAO,KAAK,EAAE,0BAA0B,EAAE,qBAAW;AACrD,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,8BAA8B,EACnC,KAAK,eAAe,EACrB,qBAAW;AACZ,OAAO,KAAK,EAAE,yBAAyB,EAAE,iDAA6C;AAItF,OAAO,KAAK,EAIV,gBAAgB,EAGhB,uBAAuB,EAEvB,4BAA4B,EAG7B,qBAAiB;AAClB,OAAO,EAEL,KAAK,sBAAsB,EAG5B,qBAAiB;AAElB,KAAK,mBAAmB,GAAG,CACzB,QAAQ,EAAE,CACR,KAAK,EAAE,aAAa,CAAC,0BAA0B,CAAC,KAC7C,IAAI,GAAG,0BAA0B,KACnC,IAAI,CAAC;AAEV,KAAK,0BAA0B,GAAG;IAChC,cAAc,EAAE,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IACxD,UAAU,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,GAAG,CAAC;IAC7C,WAAW,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,QAAQ,CAAC;IACnD,mBAAmB,EAAE,MAAM,GAAG,EAAE,CAAC;IACjC,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,eAAe,CAAC;IAChD,mBAAmB,EAAE,MAAM,OAAO,CAAC;IACnC,SAAS,EAAE,8BAA8B,CAAC;IAC1C,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,OAAO,EAAE,uBAAuB,CAAC;IACjC,iBAAiB,EAAE,CACjB,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,EAClC,QAAQ,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,IAAI,KACjD,IAAI,CAAC;IACV,kBAAkB,EAAE,CAClB,SAAS,EAAE,QAAQ,EACnB,eAAe,EAAE,eAAe,KAC7B,OAAO,CAAC,GAAG,CAAC,CAAC;IAClB,4BAA4B,EAAE,CAC5B,eAAe,EAAE,MAAM,KACpB,yBAAyB,CAAC;IAC/B,MAAM,EAAE,mBAAmB,CAAC;CAC7B,CAAC;AAEF,KAAK,qCAAqC,GAAG;IAC3C,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;IACjB,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,QAAQ,CAAC;IACxC,SAAS,EAAE,8BAA8B,CAAC;IAC1C,gBAAgB,CAAC,EAAE,GAAG,CAAC;CACxB,CAAC;AAIF,eAAO,MAAM,iCAAiC,uCACR,CAAC;AAEvC;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,sBAAsB,CAAC,CA+BjC;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,qCAAqC,GAC7C,OAAO,CAAC,4BAA4B,CAAC,CA4DvC"}
@@ -13,6 +13,7 @@ type AddTransactionBatchRequest = {
13
13
  getEthQuery: (networkClientId: string) => EthQuery;
14
14
  getInternalAccounts: () => Hex[];
15
15
  getTransaction: (id: string) => TransactionMeta;
16
+ isSimulationEnabled: () => boolean;
16
17
  messenger: TransactionControllerMessenger;
17
18
  publishBatchHook?: PublishBatchHook;
18
19
  publicKeyEIP7702?: Hex;
@@ -1 +1 @@
1
- {"version":3,"file":"batch.d.mts","sourceRoot":"","sources":["../../src/utils/batch.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,4BAA4B;AAEhD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,+BAA+B;AAe5D,OAAO,KAAK,EAAE,0BAA0B,EAAE,qBAAW;AACrD,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,8BAA8B,EACnC,KAAK,eAAe,EACrB,qBAAW;AACZ,OAAO,KAAK,EAAE,yBAAyB,EAAE,iDAA6C;AAItF,OAAO,KAAK,EAIV,gBAAgB,EAGhB,uBAAuB,EAEvB,4BAA4B,EAG7B,qBAAiB;AAClB,OAAO,EAEL,KAAK,sBAAsB,EAG5B,qBAAiB;AAElB,KAAK,mBAAmB,GAAG,CACzB,QAAQ,EAAE,CACR,KAAK,EAAE,aAAa,CAAC,0BAA0B,CAAC,KAC7C,IAAI,GAAG,0BAA0B,KACnC,IAAI,CAAC;AAEV,KAAK,0BAA0B,GAAG;IAChC,cAAc,EAAE,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IACxD,UAAU,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,GAAG,CAAC;IAC7C,WAAW,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,QAAQ,CAAC;IACnD,mBAAmB,EAAE,MAAM,GAAG,EAAE,CAAC;IACjC,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,eAAe,CAAC;IAChD,SAAS,EAAE,8BAA8B,CAAC;IAC1C,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,OAAO,EAAE,uBAAuB,CAAC;IACjC,iBAAiB,EAAE,CACjB,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,EAClC,QAAQ,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,IAAI,KACjD,IAAI,CAAC;IACV,kBAAkB,EAAE,CAClB,SAAS,EAAE,QAAQ,EACnB,eAAe,EAAE,eAAe,KAC7B,OAAO,CAAC,GAAG,CAAC,CAAC;IAClB,4BAA4B,EAAE,CAC5B,eAAe,EAAE,MAAM,KACpB,yBAAyB,CAAC;IAC/B,MAAM,EAAE,mBAAmB,CAAC;CAC7B,CAAC;AAEF,KAAK,qCAAqC,GAAG;IAC3C,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;IACjB,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,QAAQ,CAAC;IACxC,SAAS,EAAE,8BAA8B,CAAC;IAC1C,gBAAgB,CAAC,EAAE,GAAG,CAAC;CACxB,CAAC;AAIF,eAAO,MAAM,iCAAiC,uCACR,CAAC;AAEvC;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,sBAAsB,CAAC,CAmBjC;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,qCAAqC,GAC7C,OAAO,CAAC,4BAA4B,CAAC,CA4DvC"}
1
+ {"version":3,"file":"batch.d.mts","sourceRoot":"","sources":["../../src/utils/batch.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,4BAA4B;AAEhD,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,+BAA+B;AAgB5D,OAAO,KAAK,EAAE,0BAA0B,EAAE,qBAAW;AACrD,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,8BAA8B,EACnC,KAAK,eAAe,EACrB,qBAAW;AACZ,OAAO,KAAK,EAAE,yBAAyB,EAAE,iDAA6C;AAItF,OAAO,KAAK,EAIV,gBAAgB,EAGhB,uBAAuB,EAEvB,4BAA4B,EAG7B,qBAAiB;AAClB,OAAO,EAEL,KAAK,sBAAsB,EAG5B,qBAAiB;AAElB,KAAK,mBAAmB,GAAG,CACzB,QAAQ,EAAE,CACR,KAAK,EAAE,aAAa,CAAC,0BAA0B,CAAC,KAC7C,IAAI,GAAG,0BAA0B,KACnC,IAAI,CAAC;AAEV,KAAK,0BAA0B,GAAG;IAChC,cAAc,EAAE,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IACxD,UAAU,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,GAAG,CAAC;IAC7C,WAAW,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,QAAQ,CAAC;IACnD,mBAAmB,EAAE,MAAM,GAAG,EAAE,CAAC;IACjC,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,eAAe,CAAC;IAChD,mBAAmB,EAAE,MAAM,OAAO,CAAC;IACnC,SAAS,EAAE,8BAA8B,CAAC;IAC1C,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,OAAO,EAAE,uBAAuB,CAAC;IACjC,iBAAiB,EAAE,CACjB,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,EAClC,QAAQ,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,IAAI,KACjD,IAAI,CAAC;IACV,kBAAkB,EAAE,CAClB,SAAS,EAAE,QAAQ,EACnB,eAAe,EAAE,eAAe,KAC7B,OAAO,CAAC,GAAG,CAAC,CAAC;IAClB,4BAA4B,EAAE,CAC5B,eAAe,EAAE,MAAM,KACpB,yBAAyB,CAAC;IAC/B,MAAM,EAAE,mBAAmB,CAAC;CAC7B,CAAC;AAEF,KAAK,qCAAqC,GAAG;IAC3C,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;IACjB,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,QAAQ,CAAC;IACxC,SAAS,EAAE,8BAA8B,CAAC;IAC1C,gBAAgB,CAAC,EAAE,GAAG,CAAC;CACxB,CAAC;AAIF,eAAO,MAAM,iCAAiC,uCACR,CAAC;AAEvC;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,sBAAsB,CAAC,CA+BjC;AAED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,qCAAqC,GAC7C,OAAO,CAAC,4BAA4B,CAAC,CA4DvC"}
@@ -1,9 +1,10 @@
1
1
  import { ORIGIN_METAMASK } from "@metamask/controller-utils";
2
- import { rpcErrors } from "@metamask/rpc-errors";
2
+ import { JsonRpcError, rpcErrors } from "@metamask/rpc-errors";
3
3
  import { bytesToHex, createModuleLogger } from "@metamask/utils";
4
4
  import { parse, v4 } from "uuid";
5
5
  import { ERROR_MESSGE_PUBLIC_KEY, doesChainSupportEIP7702, generateEIP7702BatchTransaction, isAccountUpgradedToEIP7702 } from "./eip7702.mjs";
6
6
  import { getBatchSizeLimit, getEIP7702SupportedChains, getEIP7702UpgradeContractAddress } from "./feature-flags.mjs";
7
+ import { simulateGasBatch } from "./gas.mjs";
7
8
  import { validateBatchRequest } from "./validation.mjs";
8
9
  import { determineTransactionType } from "../index.mjs";
9
10
  import { CollectPublishHook } from "../hooks/CollectPublishHook.mjs";
@@ -19,19 +20,27 @@ export const ERROR_MESSAGE_NO_UPGRADE_CONTRACT = 'Upgrade contract address not f
19
20
  * @returns The batch result object including the batch ID.
20
21
  */
21
22
  export async function addTransactionBatch(request) {
22
- const { getInternalAccounts, messenger, request: userRequest } = request;
23
+ const { getInternalAccounts, messenger, request: transactionBatchRequest, } = request;
23
24
  const sizeLimit = getBatchSizeLimit(messenger);
24
25
  validateBatchRequest({
25
26
  internalAccounts: getInternalAccounts(),
26
- request: userRequest,
27
+ request: transactionBatchRequest,
27
28
  sizeLimit,
28
29
  });
29
- const { useHook } = userRequest;
30
- log('Adding', userRequest);
31
- if (useHook) {
32
- return await addTransactionBatchWithHook(request);
30
+ log('Adding', transactionBatchRequest);
31
+ if (!transactionBatchRequest.disable7702) {
32
+ try {
33
+ return await addTransactionBatchWith7702(request);
34
+ }
35
+ catch (error) {
36
+ const isEIP7702NotSupportedError = error instanceof JsonRpcError &&
37
+ error.message === 'Chain does not support EIP-7702';
38
+ if (!isEIP7702NotSupportedError) {
39
+ throw error;
40
+ }
41
+ }
33
42
  }
34
- return await addTransactionBatchWith7702(request);
43
+ return await addTransactionBatchWithHook(request);
35
44
  }
36
45
  /**
37
46
  * Determine which chains support atomic batch transactions for the given account.
@@ -178,8 +187,8 @@ async function addTransactionBatchWith7702(request) {
178
187
  * @returns The batch result object including the batch ID.
179
188
  */
180
189
  async function addTransactionBatchWithHook(request) {
181
- const { getChainId, messenger, publishBatchHook: requestPublishBatchHook, request: userRequest, update, } = request;
182
- const { from, networkClientId, origin, requireApproval, transactions: nestedTransactions, useHook, } = userRequest;
190
+ const { getChainId, messenger, publishBatchHook: requestPublishBatchHook, request: userRequest, update, isSimulationEnabled, } = request;
191
+ const { from, networkClientId, origin, requireApproval, transactions: nestedTransactions, } = userRequest;
183
192
  let resultCallbacks;
184
193
  log('Adding transaction batch using hook', userRequest);
185
194
  const sequentialPublishBatchHook = new SequentialPublishBatchHook({
@@ -188,21 +197,44 @@ async function addTransactionBatchWithHook(request) {
188
197
  getEthQuery: request.getEthQuery,
189
198
  getPendingTransactionTracker: request.getPendingTransactionTracker,
190
199
  });
191
- const publishBatchHook = requestPublishBatchHook ?? sequentialPublishBatchHook.getHook();
200
+ let { disable7702, disableSequential } = userRequest;
201
+ const { disableHook, useHook } = userRequest;
202
+ // use hook is a temporary alias for disable7702 and disableSequential
203
+ if (useHook) {
204
+ disable7702 = true;
205
+ disableSequential = true;
206
+ }
207
+ let publishBatchHook = null;
208
+ if (!disableHook) {
209
+ publishBatchHook = requestPublishBatchHook;
210
+ }
211
+ else if (!disableSequential) {
212
+ publishBatchHook = sequentialPublishBatchHook.getHook();
213
+ }
214
+ if (!publishBatchHook) {
215
+ log(`No supported batch methods found`, {
216
+ disable7702,
217
+ disableHook,
218
+ disableSequential,
219
+ });
220
+ throw rpcErrors.internal(`Can't process batch`);
221
+ }
192
222
  const chainId = getChainId(networkClientId);
193
223
  const batchId = generateBatchId();
194
224
  const transactionCount = nestedTransactions.length;
195
225
  const collectHook = new CollectPublishHook(transactionCount);
196
226
  try {
197
- if (requireApproval && useHook) {
198
- const txBatchMeta = newBatchMetadata({
199
- id: batchId,
227
+ if (requireApproval) {
228
+ const txBatchMeta = await prepareApprovalData({
229
+ batchId,
200
230
  chainId,
231
+ from,
232
+ isSimulationEnabled,
233
+ nestedTransactions,
201
234
  networkClientId,
202
- transactions: nestedTransactions,
203
235
  origin,
236
+ update,
204
237
  });
205
- addBatchMetadata(txBatchMeta, update);
206
238
  resultCallbacks = (await requestApproval(txBatchMeta, messenger))
207
239
  .resultCallbacks;
208
240
  }
@@ -330,26 +362,6 @@ async function requestApproval(txBatchMeta, messenger) {
330
362
  type,
331
363
  }, true));
332
364
  }
333
- /**
334
- * Create a new batch metadata object.
335
- *
336
- * @param options - The options for creating a new batch metadata object.
337
- * @param options.id - The ID of the transaction batch.
338
- * @param options.chainId - The chain ID of the transaction batch.
339
- * @param options.networkClientId - The network client ID of the transaction batch.
340
- * @param options.transactions - The transactions in the batch.
341
- * @param options.origin - The origin of the transaction batch.
342
- * @returns A new TransactionBatchMeta object.
343
- */
344
- function newBatchMetadata({ id, chainId, networkClientId, transactions, origin, }) {
345
- return {
346
- id,
347
- chainId,
348
- networkClientId,
349
- transactions,
350
- origin,
351
- };
352
- }
353
365
  /**
354
366
  * Adds batch metadata to the transaction controller state.
355
367
  *
@@ -375,4 +387,39 @@ function wipeTransactionBatchById(update, id) {
375
387
  state.transactionBatches = state.transactionBatches.filter((batch) => batch.id !== id);
376
388
  });
377
389
  }
390
+ /**
391
+ * Prepares the approval data for a transaction batch.
392
+ *
393
+ * @param options - The options object containing necessary parameters.
394
+ * @param options.batchId - The batch ID for the transaction batch.
395
+ * @param options.chainId - The chain ID of the transactions.
396
+ * @param options.from - The sender's address.
397
+ * @param options.isSimulationEnabled - A function to check if simulation is enabled.
398
+ * @param options.nestedTransactions - The array of nested transactions.
399
+ * @param options.networkClientId - The network client ID.
400
+ * @param options.origin - The origin of the transaction batch.
401
+ * @param options.update - The update function to modify the transaction controller state.
402
+ * @returns The prepared transaction batch metadata.
403
+ */
404
+ async function prepareApprovalData({ batchId, chainId, from, isSimulationEnabled, nestedTransactions, networkClientId, origin, update, }) {
405
+ if (!isSimulationEnabled()) {
406
+ throw new Error('Cannot create transaction batch as simulation not supported');
407
+ }
408
+ const { gasLimit } = await simulateGasBatch({
409
+ chainId,
410
+ from,
411
+ transactions: nestedTransactions,
412
+ });
413
+ const txBatchMeta = {
414
+ chainId,
415
+ from,
416
+ gas: gasLimit,
417
+ id: batchId,
418
+ networkClientId,
419
+ origin,
420
+ transactions: nestedTransactions,
421
+ };
422
+ addBatchMetadata(txBatchMeta, update);
423
+ return txBatchMeta;
424
+ }
378
425
  //# sourceMappingURL=batch.mjs.map