@metamask-previews/transaction-controller 46.0.0-preview-5b37150f → 46.0.0-preview-def92ff7

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 (54) hide show
  1. package/CHANGELOG.md +0 -1
  2. package/dist/TransactionController.cjs +17 -54
  3. package/dist/TransactionController.cjs.map +1 -1
  4. package/dist/TransactionController.d.cts +2 -20
  5. package/dist/TransactionController.d.cts.map +1 -1
  6. package/dist/TransactionController.d.mts +2 -20
  7. package/dist/TransactionController.d.mts.map +1 -1
  8. package/dist/TransactionController.mjs +17 -54
  9. package/dist/TransactionController.mjs.map +1 -1
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.d.cts +1 -1
  12. package/dist/index.d.cts.map +1 -1
  13. package/dist/index.d.mts +1 -1
  14. package/dist/index.d.mts.map +1 -1
  15. package/dist/index.mjs.map +1 -1
  16. package/dist/types.cjs.map +1 -1
  17. package/dist/types.d.cts +0 -71
  18. package/dist/types.d.cts.map +1 -1
  19. package/dist/types.d.mts +0 -71
  20. package/dist/types.d.mts.map +1 -1
  21. package/dist/types.mjs.map +1 -1
  22. package/dist/utils/batch.cjs +2 -129
  23. package/dist/utils/batch.cjs.map +1 -1
  24. package/dist/utils/batch.d.cts +1 -8
  25. package/dist/utils/batch.d.cts.map +1 -1
  26. package/dist/utils/batch.d.mts +1 -8
  27. package/dist/utils/batch.d.mts.map +1 -1
  28. package/dist/utils/batch.mjs +2 -129
  29. package/dist/utils/batch.mjs.map +1 -1
  30. package/dist/utils/validation.cjs +1 -19
  31. package/dist/utils/validation.cjs.map +1 -1
  32. package/dist/utils/validation.d.cts +0 -12
  33. package/dist/utils/validation.d.cts.map +1 -1
  34. package/dist/utils/validation.d.mts +0 -12
  35. package/dist/utils/validation.d.mts.map +1 -1
  36. package/dist/utils/validation.mjs +0 -17
  37. package/dist/utils/validation.mjs.map +1 -1
  38. package/package.json +4 -4
  39. package/dist/hooks/CollectPublishHook.cjs +0 -84
  40. package/dist/hooks/CollectPublishHook.cjs.map +0 -1
  41. package/dist/hooks/CollectPublishHook.d.cts +0 -29
  42. package/dist/hooks/CollectPublishHook.d.cts.map +0 -1
  43. package/dist/hooks/CollectPublishHook.d.mts +0 -29
  44. package/dist/hooks/CollectPublishHook.d.mts.map +0 -1
  45. package/dist/hooks/CollectPublishHook.mjs +0 -80
  46. package/dist/hooks/CollectPublishHook.mjs.map +0 -1
  47. package/dist/hooks/ExtraTransactionsPublishHook.cjs +0 -76
  48. package/dist/hooks/ExtraTransactionsPublishHook.cjs.map +0 -1
  49. package/dist/hooks/ExtraTransactionsPublishHook.d.cts +0 -18
  50. package/dist/hooks/ExtraTransactionsPublishHook.d.cts.map +0 -1
  51. package/dist/hooks/ExtraTransactionsPublishHook.d.mts +0 -18
  52. package/dist/hooks/ExtraTransactionsPublishHook.d.mts.map +0 -1
  53. package/dist/hooks/ExtraTransactionsPublishHook.mjs +0 -72
  54. package/dist/hooks/ExtraTransactionsPublishHook.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -24,7 +24,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
24
24
 
25
25
  ### Changed
26
26
 
27
- - Throw if `addTransactionBatch` is called with any nested transaction with `to` matching internal account ([#5369](https://github.com/MetaMask/core/pull/5369))
28
27
  - **BREAKING:** Support atomic batch transactions ([#5306](https://github.com/MetaMask/core/pull/5306))
29
28
  - Require `AccountsController:getState` action permission in messenger.
30
29
  - Require `RemoteFeatureFlagController:getState` action permission in messenger.
@@ -13,7 +13,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
13
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
15
  };
16
- var _TransactionController_instances, _TransactionController_internalEvents, _TransactionController_methodDataHelper, _TransactionController_incomingTransactionChainIds, _TransactionController_incomingTransactionHelper, _TransactionController_incomingTransactionOptions, _TransactionController_pendingTransactionOptions, _TransactionController_publishBatchHook, _TransactionController_trace, _TransactionController_transactionHistoryLimit, _TransactionController_isFirstTimeInteractionEnabled, _TransactionController_isSimulationEnabled, _TransactionController_testGasFeeFlows, _TransactionController_multichainTrackingHelper, _TransactionController_retryTransaction, _TransactionController_getChainId, _TransactionController_getNetworkClientId, _TransactionController_getEthQuery, _TransactionController_getProvider, _TransactionController_createNonceTracker, _TransactionController_createPendingTransactionTracker, _TransactionController_checkForPendingTransactionAndStartPolling, _TransactionController_stopAllTracking, _TransactionController_addIncomingTransactionHelperListeners, _TransactionController_removePendingTransactionTrackerListeners, _TransactionController_addPendingTransactionTrackerListeners, _TransactionController_getNonceTrackerPendingTransactions, _TransactionController_getGasFeeFlows, _TransactionController_getLayer1GasFeeFlows, _TransactionController_updateTransactionInternal, _TransactionController_updateFirstTimeInteraction, _TransactionController_updateSimulationData, _TransactionController_onGasFeePollerTransactionUpdate, _TransactionController_getSelectedAccount, _TransactionController_getInternalAccounts, _TransactionController_updateSubmitHistory;
16
+ var _TransactionController_instances, _TransactionController_internalEvents, _TransactionController_methodDataHelper, _TransactionController_incomingTransactionChainIds, _TransactionController_incomingTransactionHelper, _TransactionController_incomingTransactionOptions, _TransactionController_pendingTransactionOptions, _TransactionController_trace, _TransactionController_transactionHistoryLimit, _TransactionController_isFirstTimeInteractionEnabled, _TransactionController_isSimulationEnabled, _TransactionController_testGasFeeFlows, _TransactionController_multichainTrackingHelper, _TransactionController_retryTransaction, _TransactionController_getChainId, _TransactionController_getNetworkClientId, _TransactionController_getEthQuery, _TransactionController_getProvider, _TransactionController_createNonceTracker, _TransactionController_createPendingTransactionTracker, _TransactionController_checkForPendingTransactionAndStartPolling, _TransactionController_stopAllTracking, _TransactionController_addIncomingTransactionHelperListeners, _TransactionController_removePendingTransactionTrackerListeners, _TransactionController_addPendingTransactionTrackerListeners, _TransactionController_getNonceTrackerPendingTransactions, _TransactionController_getGasFeeFlows, _TransactionController_getLayer1GasFeeFlows, _TransactionController_updateTransactionInternal, _TransactionController_updateFirstTimeInteraction, _TransactionController_updateSimulationData, _TransactionController_onGasFeePollerTransactionUpdate, _TransactionController_getSelectedAccount, _TransactionController_getInternalAccounts, _TransactionController_updateSubmitHistory;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.TransactionController = exports.ApprovalState = exports.SPEED_UP_RATE = exports.CANCEL_RATE = void 0;
19
19
  const base_controller_1 = require("@metamask/base-controller");
@@ -23,6 +23,7 @@ const network_controller_1 = require("@metamask/network-controller");
23
23
  const nonce_tracker_1 = require("@metamask/nonce-tracker");
24
24
  const rpc_errors_1 = require("@metamask/rpc-errors");
25
25
  const utils_1 = require("@metamask/utils");
26
+ const async_mutex_1 = require("async-mutex");
26
27
  // This package purposefully relies on Node's EventEmitter module.
27
28
  // eslint-disable-next-line import-x/no-nodejs-modules
28
29
  const events_1 = require("events");
@@ -41,7 +42,6 @@ const MethodDataHelper_1 = require("./helpers/MethodDataHelper.cjs");
41
42
  const MultichainTrackingHelper_1 = require("./helpers/MultichainTrackingHelper.cjs");
42
43
  const PendingTransactionTracker_1 = require("./helpers/PendingTransactionTracker.cjs");
43
44
  const ResimulateHelper_1 = require("./helpers/ResimulateHelper.cjs");
44
- const ExtraTransactionsPublishHook_1 = require("./hooks/ExtraTransactionsPublishHook.cjs");
45
45
  const logger_1 = require("./logger.cjs");
46
46
  const types_1 = require("./types.cjs");
47
47
  const batch_1 = require("./utils/batch.cjs");
@@ -192,11 +192,11 @@ class TransactionController extends base_controller_1.BaseController {
192
192
  _TransactionController_internalEvents.set(this, new events_1.EventEmitter());
193
193
  this.approvingTransactionIds = new Set();
194
194
  _TransactionController_methodDataHelper.set(this, void 0);
195
+ this.mutex = new async_mutex_1.Mutex();
195
196
  _TransactionController_incomingTransactionChainIds.set(this, new Set());
196
197
  _TransactionController_incomingTransactionHelper.set(this, void 0);
197
198
  _TransactionController_incomingTransactionOptions.set(this, void 0);
198
199
  _TransactionController_pendingTransactionOptions.set(this, void 0);
199
- _TransactionController_publishBatchHook.set(this, void 0);
200
200
  this.signAbortCallbacks = new Map();
201
201
  _TransactionController_trace.set(this, void 0);
202
202
  _TransactionController_transactionHistoryLimit.set(this, void 0);
@@ -227,7 +227,6 @@ class TransactionController extends base_controller_1.BaseController {
227
227
  this.securityProviderRequest = securityProviderRequest;
228
228
  __classPrivateFieldSet(this, _TransactionController_incomingTransactionOptions, incomingTransactions, "f");
229
229
  __classPrivateFieldSet(this, _TransactionController_pendingTransactionOptions, pendingTransactions, "f");
230
- __classPrivateFieldSet(this, _TransactionController_publishBatchHook, hooks?.publishBatch, "f");
231
230
  __classPrivateFieldSet(this, _TransactionController_transactionHistoryLimit, transactionHistoryLimit, "f");
232
231
  this.sign = sign;
233
232
  __classPrivateFieldSet(this, _TransactionController_testGasFeeFlows, testGasFeeFlows === true, "f");
@@ -341,12 +340,8 @@ class TransactionController extends base_controller_1.BaseController {
341
340
  addTransaction: this.addTransaction.bind(this),
342
341
  getChainId: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getChainId).bind(this),
343
342
  getEthQuery: (networkClientId) => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, { networkClientId }),
344
- getInternalAccounts: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getInternalAccounts).bind(this),
345
- getTransaction: (transactionId) => this.getTransactionOrThrow(transactionId),
346
343
  messenger: this.messagingSystem,
347
- publishBatchHook: __classPrivateFieldGet(this, _TransactionController_publishBatchHook, "f"),
348
344
  request,
349
- updateTransaction: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).bind(this),
350
345
  });
351
346
  }
352
347
  /**
@@ -370,12 +365,10 @@ class TransactionController extends base_controller_1.BaseController {
370
365
  * @param txParams - Standard parameters for an Ethereum transaction.
371
366
  * @param options - Additional options to control how the transaction is added.
372
367
  * @param options.actionId - Unique ID to prevent duplicate requests.
373
- * @param options.batchId - ID of the batch this transaction belongs to.
374
368
  * @param options.deviceConfirmedOn - An enum to indicate what device confirmed the transaction.
375
369
  * @param options.method - RPC method that requested the transaction.
376
370
  * @param options.nestedTransactions - Params for any nested transactions encoded in the data.
377
371
  * @param options.origin - The origin of the transaction request, such as a dApp hostname.
378
- * @param options.publishHook - Custom logic to publish the transaction.
379
372
  * @param options.requireApproval - Whether the transaction requires approval by the user, defaults to true unless explicitly disabled.
380
373
  * @param options.securityAlertResponse - Response from security validator.
381
374
  * @param options.sendFlowHistory - The sendFlowHistory entries to add.
@@ -389,7 +382,7 @@ class TransactionController extends base_controller_1.BaseController {
389
382
  */
390
383
  async addTransaction(txParams, options) {
391
384
  (0, logger_1.projectLogger)('Adding transaction', txParams, options);
392
- const { actionId, batchId, deviceConfirmedOn, method, nestedTransactions, networkClientId, origin, publishHook, requireApproval, securityAlertResponse, sendFlowHistory, swaps = {}, traceContext, type, } = options;
385
+ const { actionId, deviceConfirmedOn, method, nestedTransactions, networkClientId, origin, requireApproval, securityAlertResponse, sendFlowHistory, swaps = {}, traceContext, type, } = options;
393
386
  txParams = (0, utils_2.normalizeTransactionParams)(txParams);
394
387
  if (!__classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").has(networkClientId)) {
395
388
  throw new Error(`Network client not found - ${networkClientId}`);
@@ -423,7 +416,6 @@ class TransactionController extends base_controller_1.BaseController {
423
416
  : {
424
417
  // Add actionId to txMeta to check if same actionId is seen again
425
418
  actionId,
426
- batchId,
427
419
  chainId,
428
420
  dappSuggestedGasFees,
429
421
  deviceConfirmedOn,
@@ -484,10 +476,9 @@ class TransactionController extends base_controller_1.BaseController {
484
476
  }
485
477
  return {
486
478
  result: this.processApproval(addedTransactionMeta, {
487
- actionId,
488
479
  isExisting: Boolean(existingTransactionMeta),
489
- publishHook,
490
480
  requireApproval,
481
+ actionId,
491
482
  traceContext,
492
483
  }),
493
484
  transactionMeta: addedTransactionMeta,
@@ -1131,22 +1122,6 @@ class TransactionController extends base_controller_1.BaseController {
1131
1122
  abortCallback();
1132
1123
  this.signAbortCallbacks.delete(transactionId);
1133
1124
  }
1134
- /**
1135
- * Update the batch transactions associated with a transaction.
1136
- * These transactions will be submitted with the main transaction as a batch.
1137
- *
1138
- * @param request - The request object.
1139
- * @param request.transactionId - The ID of the transaction to update.
1140
- * @param request.batchTransactions - The new batch transactions.
1141
- */
1142
- updateBatchTransactions({ transactionId, batchTransactions, }) {
1143
- __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
1144
- transactionId,
1145
- note: 'TransactionController#updateBatchTransactions - Batch transactions updated',
1146
- }, (transactionMeta) => {
1147
- transactionMeta.batchTransactions = batchTransactions;
1148
- });
1149
- }
1150
1125
  addMetadata(transactionMeta) {
1151
1126
  (0, validation_1.validateTxParams)(transactionMeta.txParams);
1152
1127
  this.update((state) => {
@@ -1196,7 +1171,7 @@ class TransactionController extends base_controller_1.BaseController {
1196
1171
  this.failTransaction(transactionMeta, new Error('Transaction incomplete at startup'));
1197
1172
  }
1198
1173
  }
1199
- async processApproval(transactionMeta, { actionId, isExisting = false, publishHook, requireApproval, shouldShowRequest = true, traceContext, }) {
1174
+ async processApproval(transactionMeta, { isExisting = false, requireApproval, shouldShowRequest = true, actionId, traceContext, }) {
1200
1175
  const transactionId = transactionMeta.id;
1201
1176
  let resultCallbacks;
1202
1177
  const { meta, isCompleted } = this.isTransactionCompleted(transactionId);
@@ -1223,7 +1198,7 @@ class TransactionController extends base_controller_1.BaseController {
1223
1198
  }
1224
1199
  const { isCompleted: isTxCompleted } = this.isTransactionCompleted(transactionId);
1225
1200
  if (!isTxCompleted) {
1226
- const approvalResult = await this.approveTransaction(transactionId, traceContext, publishHook);
1201
+ const approvalResult = await this.approveTransaction(transactionId, traceContext);
1227
1202
  if (approvalResult === ApprovalState.SkippedViaBeforePublishHook &&
1228
1203
  resultCallbacks) {
1229
1204
  resultCallbacks.success();
@@ -1257,7 +1232,7 @@ class TransactionController extends base_controller_1.BaseController {
1257
1232
  switch (finalMeta?.status) {
1258
1233
  case types_1.TransactionStatus.failed:
1259
1234
  resultCallbacks?.error(finalMeta.error);
1260
- throw rpc_errors_1.rpcErrors.internal(finalMeta.error.stack);
1235
+ throw rpc_errors_1.rpcErrors.internal(finalMeta.error.message);
1261
1236
  case types_1.TransactionStatus.submitted:
1262
1237
  resultCallbacks?.success();
1263
1238
  return finalMeta.hash;
@@ -1275,12 +1250,10 @@ class TransactionController extends base_controller_1.BaseController {
1275
1250
  *
1276
1251
  * @param transactionId - The ID of the transaction to approve.
1277
1252
  * @param traceContext - The parent context for any new traces.
1278
- * @param publishHookOverride - Custom logic to publish the transaction.
1279
- * @returns The approval state of the transaction.
1280
1253
  */
1281
- async approveTransaction(transactionId, traceContext, publishHookOverride) {
1282
- let clearApprovingTransactionId;
1283
- let clearNonceLock;
1254
+ async approveTransaction(transactionId, traceContext) {
1255
+ const cleanupTasks = new Array();
1256
+ cleanupTasks.push(await this.mutex.acquire());
1284
1257
  let transactionMeta = this.getTransactionOrThrow(transactionId);
1285
1258
  try {
1286
1259
  if (!this.sign) {
@@ -1296,9 +1269,10 @@ class TransactionController extends base_controller_1.BaseController {
1296
1269
  return ApprovalState.NotApproved;
1297
1270
  }
1298
1271
  this.approvingTransactionIds.add(transactionId);
1299
- clearApprovingTransactionId = () => this.approvingTransactionIds.delete(transactionId);
1272
+ cleanupTasks.push(() => this.approvingTransactionIds.delete(transactionId));
1300
1273
  const [nonce, releaseNonce] = await (0, nonce_1.getNextNonce)(transactionMeta, (address) => __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").getNonceLock(address, transactionMeta.networkClientId));
1301
- clearNonceLock = releaseNonce;
1274
+ // must set transaction to submitted/failed before releasing lock
1275
+ releaseNonce && cleanupTasks.push(releaseNonce);
1302
1276
  transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
1303
1277
  transactionId,
1304
1278
  note: 'TransactionController#approveTransaction - Transaction approved',
@@ -1335,18 +1309,8 @@ class TransactionController extends base_controller_1.BaseController {
1335
1309
  }
1336
1310
  (0, logger_1.projectLogger)('Publishing transaction', transactionMeta.txParams);
1337
1311
  let hash;
1338
- clearNonceLock?.();
1339
- clearNonceLock = undefined;
1340
- if (transactionMeta.batchTransactions?.length) {
1341
- const extraTransactionsPublishHook = new ExtraTransactionsPublishHook_1.ExtraTransactionsPublishHook({
1342
- addTransactionBatch: this.addTransactionBatch.bind(this),
1343
- transactions: transactionMeta.batchTransactions,
1344
- });
1345
- publishHookOverride = extraTransactionsPublishHook.getHook();
1346
- }
1347
1312
  await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Publish', parentContext: traceContext }, async () => {
1348
- const publishHook = publishHookOverride ?? this.publish;
1349
- ({ transactionHash: hash } = await publishHook(transactionMeta, rawTx));
1313
+ ({ transactionHash: hash } = await this.publish(transactionMeta, rawTx));
1350
1314
  if (hash === undefined) {
1351
1315
  hash = await this.publishTransaction(ethQuery, {
1352
1316
  ...transactionMeta,
@@ -1382,8 +1346,7 @@ class TransactionController extends base_controller_1.BaseController {
1382
1346
  return ApprovalState.NotApproved;
1383
1347
  }
1384
1348
  finally {
1385
- clearApprovingTransactionId?.();
1386
- clearNonceLock?.();
1349
+ cleanupTasks.forEach((task) => task());
1387
1350
  }
1388
1351
  }
1389
1352
  async publishTransaction(ethQuery, transactionMeta, { skipSubmitHistory } = {}) {
@@ -1800,7 +1763,7 @@ class TransactionController extends base_controller_1.BaseController {
1800
1763
  }
1801
1764
  }
1802
1765
  exports.TransactionController = TransactionController;
1803
- _TransactionController_internalEvents = new WeakMap(), _TransactionController_methodDataHelper = new WeakMap(), _TransactionController_incomingTransactionChainIds = new WeakMap(), _TransactionController_incomingTransactionHelper = new WeakMap(), _TransactionController_incomingTransactionOptions = new WeakMap(), _TransactionController_pendingTransactionOptions = new WeakMap(), _TransactionController_publishBatchHook = new WeakMap(), _TransactionController_trace = new WeakMap(), _TransactionController_transactionHistoryLimit = new WeakMap(), _TransactionController_isFirstTimeInteractionEnabled = new WeakMap(), _TransactionController_isSimulationEnabled = new WeakMap(), _TransactionController_testGasFeeFlows = new WeakMap(), _TransactionController_multichainTrackingHelper = new WeakMap(), _TransactionController_checkForPendingTransactionAndStartPolling = new WeakMap(), _TransactionController_instances = new WeakSet(), _TransactionController_retryTransaction = async function _TransactionController_retryTransaction({ actionId, afterSubmit, estimatedBaseFee, gasValues, label, prepareTransactionParams, rate, transactionId, transactionType, }) {
1766
+ _TransactionController_internalEvents = new WeakMap(), _TransactionController_methodDataHelper = new WeakMap(), _TransactionController_incomingTransactionChainIds = new WeakMap(), _TransactionController_incomingTransactionHelper = new WeakMap(), _TransactionController_incomingTransactionOptions = new WeakMap(), _TransactionController_pendingTransactionOptions = new WeakMap(), _TransactionController_trace = new WeakMap(), _TransactionController_transactionHistoryLimit = new WeakMap(), _TransactionController_isFirstTimeInteractionEnabled = new WeakMap(), _TransactionController_isSimulationEnabled = new WeakMap(), _TransactionController_testGasFeeFlows = new WeakMap(), _TransactionController_multichainTrackingHelper = new WeakMap(), _TransactionController_checkForPendingTransactionAndStartPolling = new WeakMap(), _TransactionController_instances = new WeakSet(), _TransactionController_retryTransaction = async function _TransactionController_retryTransaction({ actionId, afterSubmit, estimatedBaseFee, gasValues, label, prepareTransactionParams, rate, transactionId, transactionType, }) {
1804
1767
  // If transaction is found for same action id, do not create a new transaction.
1805
1768
  if (this.getTransactionWithActionId(actionId)) {
1806
1769
  return;