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

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 (45) hide show
  1. package/dist/TransactionController.cjs +17 -53
  2. package/dist/TransactionController.cjs.map +1 -1
  3. package/dist/TransactionController.d.cts +2 -20
  4. package/dist/TransactionController.d.cts.map +1 -1
  5. package/dist/TransactionController.d.mts +2 -20
  6. package/dist/TransactionController.d.mts.map +1 -1
  7. package/dist/TransactionController.mjs +17 -53
  8. package/dist/TransactionController.mjs.map +1 -1
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.d.cts +1 -1
  11. package/dist/index.d.cts.map +1 -1
  12. package/dist/index.d.mts +1 -1
  13. package/dist/index.d.mts.map +1 -1
  14. package/dist/index.mjs.map +1 -1
  15. package/dist/types.cjs.map +1 -1
  16. package/dist/types.d.cts +0 -71
  17. package/dist/types.d.cts.map +1 -1
  18. package/dist/types.d.mts +0 -71
  19. package/dist/types.d.mts.map +1 -1
  20. package/dist/types.mjs.map +1 -1
  21. package/dist/utils/batch.cjs +1 -123
  22. package/dist/utils/batch.cjs.map +1 -1
  23. package/dist/utils/batch.d.cts +1 -7
  24. package/dist/utils/batch.d.cts.map +1 -1
  25. package/dist/utils/batch.d.mts +1 -7
  26. package/dist/utils/batch.d.mts.map +1 -1
  27. package/dist/utils/batch.mjs +1 -123
  28. package/dist/utils/batch.mjs.map +1 -1
  29. package/package.json +1 -1
  30. package/dist/hooks/CollectPublishHook.cjs +0 -84
  31. package/dist/hooks/CollectPublishHook.cjs.map +0 -1
  32. package/dist/hooks/CollectPublishHook.d.cts +0 -29
  33. package/dist/hooks/CollectPublishHook.d.cts.map +0 -1
  34. package/dist/hooks/CollectPublishHook.d.mts +0 -29
  35. package/dist/hooks/CollectPublishHook.d.mts.map +0 -1
  36. package/dist/hooks/CollectPublishHook.mjs +0 -80
  37. package/dist/hooks/CollectPublishHook.mjs.map +0 -1
  38. package/dist/hooks/ExtraTransactionsPublishHook.cjs +0 -76
  39. package/dist/hooks/ExtraTransactionsPublishHook.cjs.map +0 -1
  40. package/dist/hooks/ExtraTransactionsPublishHook.d.cts +0 -18
  41. package/dist/hooks/ExtraTransactionsPublishHook.d.cts.map +0 -1
  42. package/dist/hooks/ExtraTransactionsPublishHook.d.mts +0 -18
  43. package/dist/hooks/ExtraTransactionsPublishHook.d.mts.map +0 -1
  44. package/dist/hooks/ExtraTransactionsPublishHook.mjs +0 -72
  45. package/dist/hooks/ExtraTransactionsPublishHook.mjs.map +0 -1
@@ -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");
@@ -342,11 +341,8 @@ class TransactionController extends base_controller_1.BaseController {
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
343
  getInternalAccounts: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getInternalAccounts).bind(this),
345
- getTransaction: (transactionId) => this.getTransactionOrThrow(transactionId),
346
344
  messenger: this.messagingSystem,
347
- publishBatchHook: __classPrivateFieldGet(this, _TransactionController_publishBatchHook, "f"),
348
345
  request,
349
- updateTransaction: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).bind(this),
350
346
  });
351
347
  }
352
348
  /**
@@ -370,12 +366,10 @@ class TransactionController extends base_controller_1.BaseController {
370
366
  * @param txParams - Standard parameters for an Ethereum transaction.
371
367
  * @param options - Additional options to control how the transaction is added.
372
368
  * @param options.actionId - Unique ID to prevent duplicate requests.
373
- * @param options.batchId - ID of the batch this transaction belongs to.
374
369
  * @param options.deviceConfirmedOn - An enum to indicate what device confirmed the transaction.
375
370
  * @param options.method - RPC method that requested the transaction.
376
371
  * @param options.nestedTransactions - Params for any nested transactions encoded in the data.
377
372
  * @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
373
  * @param options.requireApproval - Whether the transaction requires approval by the user, defaults to true unless explicitly disabled.
380
374
  * @param options.securityAlertResponse - Response from security validator.
381
375
  * @param options.sendFlowHistory - The sendFlowHistory entries to add.
@@ -389,7 +383,7 @@ class TransactionController extends base_controller_1.BaseController {
389
383
  */
390
384
  async addTransaction(txParams, options) {
391
385
  (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;
386
+ const { actionId, deviceConfirmedOn, method, nestedTransactions, networkClientId, origin, requireApproval, securityAlertResponse, sendFlowHistory, swaps = {}, traceContext, type, } = options;
393
387
  txParams = (0, utils_2.normalizeTransactionParams)(txParams);
394
388
  if (!__classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").has(networkClientId)) {
395
389
  throw new Error(`Network client not found - ${networkClientId}`);
@@ -423,7 +417,6 @@ class TransactionController extends base_controller_1.BaseController {
423
417
  : {
424
418
  // Add actionId to txMeta to check if same actionId is seen again
425
419
  actionId,
426
- batchId,
427
420
  chainId,
428
421
  dappSuggestedGasFees,
429
422
  deviceConfirmedOn,
@@ -484,10 +477,9 @@ class TransactionController extends base_controller_1.BaseController {
484
477
  }
485
478
  return {
486
479
  result: this.processApproval(addedTransactionMeta, {
487
- actionId,
488
480
  isExisting: Boolean(existingTransactionMeta),
489
- publishHook,
490
481
  requireApproval,
482
+ actionId,
491
483
  traceContext,
492
484
  }),
493
485
  transactionMeta: addedTransactionMeta,
@@ -1131,22 +1123,6 @@ class TransactionController extends base_controller_1.BaseController {
1131
1123
  abortCallback();
1132
1124
  this.signAbortCallbacks.delete(transactionId);
1133
1125
  }
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
1126
  addMetadata(transactionMeta) {
1151
1127
  (0, validation_1.validateTxParams)(transactionMeta.txParams);
1152
1128
  this.update((state) => {
@@ -1196,7 +1172,7 @@ class TransactionController extends base_controller_1.BaseController {
1196
1172
  this.failTransaction(transactionMeta, new Error('Transaction incomplete at startup'));
1197
1173
  }
1198
1174
  }
1199
- async processApproval(transactionMeta, { actionId, isExisting = false, publishHook, requireApproval, shouldShowRequest = true, traceContext, }) {
1175
+ async processApproval(transactionMeta, { isExisting = false, requireApproval, shouldShowRequest = true, actionId, traceContext, }) {
1200
1176
  const transactionId = transactionMeta.id;
1201
1177
  let resultCallbacks;
1202
1178
  const { meta, isCompleted } = this.isTransactionCompleted(transactionId);
@@ -1223,7 +1199,7 @@ class TransactionController extends base_controller_1.BaseController {
1223
1199
  }
1224
1200
  const { isCompleted: isTxCompleted } = this.isTransactionCompleted(transactionId);
1225
1201
  if (!isTxCompleted) {
1226
- const approvalResult = await this.approveTransaction(transactionId, traceContext, publishHook);
1202
+ const approvalResult = await this.approveTransaction(transactionId, traceContext);
1227
1203
  if (approvalResult === ApprovalState.SkippedViaBeforePublishHook &&
1228
1204
  resultCallbacks) {
1229
1205
  resultCallbacks.success();
@@ -1257,7 +1233,7 @@ class TransactionController extends base_controller_1.BaseController {
1257
1233
  switch (finalMeta?.status) {
1258
1234
  case types_1.TransactionStatus.failed:
1259
1235
  resultCallbacks?.error(finalMeta.error);
1260
- throw rpc_errors_1.rpcErrors.internal(finalMeta.error.stack);
1236
+ throw rpc_errors_1.rpcErrors.internal(finalMeta.error.message);
1261
1237
  case types_1.TransactionStatus.submitted:
1262
1238
  resultCallbacks?.success();
1263
1239
  return finalMeta.hash;
@@ -1275,12 +1251,10 @@ class TransactionController extends base_controller_1.BaseController {
1275
1251
  *
1276
1252
  * @param transactionId - The ID of the transaction to approve.
1277
1253
  * @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
1254
  */
1281
- async approveTransaction(transactionId, traceContext, publishHookOverride) {
1282
- let clearApprovingTransactionId;
1283
- let clearNonceLock;
1255
+ async approveTransaction(transactionId, traceContext) {
1256
+ const cleanupTasks = new Array();
1257
+ cleanupTasks.push(await this.mutex.acquire());
1284
1258
  let transactionMeta = this.getTransactionOrThrow(transactionId);
1285
1259
  try {
1286
1260
  if (!this.sign) {
@@ -1296,9 +1270,10 @@ class TransactionController extends base_controller_1.BaseController {
1296
1270
  return ApprovalState.NotApproved;
1297
1271
  }
1298
1272
  this.approvingTransactionIds.add(transactionId);
1299
- clearApprovingTransactionId = () => this.approvingTransactionIds.delete(transactionId);
1273
+ cleanupTasks.push(() => this.approvingTransactionIds.delete(transactionId));
1300
1274
  const [nonce, releaseNonce] = await (0, nonce_1.getNextNonce)(transactionMeta, (address) => __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").getNonceLock(address, transactionMeta.networkClientId));
1301
- clearNonceLock = releaseNonce;
1275
+ // must set transaction to submitted/failed before releasing lock
1276
+ releaseNonce && cleanupTasks.push(releaseNonce);
1302
1277
  transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
1303
1278
  transactionId,
1304
1279
  note: 'TransactionController#approveTransaction - Transaction approved',
@@ -1335,18 +1310,8 @@ class TransactionController extends base_controller_1.BaseController {
1335
1310
  }
1336
1311
  (0, logger_1.projectLogger)('Publishing transaction', transactionMeta.txParams);
1337
1312
  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
1313
  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));
1314
+ ({ transactionHash: hash } = await this.publish(transactionMeta, rawTx));
1350
1315
  if (hash === undefined) {
1351
1316
  hash = await this.publishTransaction(ethQuery, {
1352
1317
  ...transactionMeta,
@@ -1382,8 +1347,7 @@ class TransactionController extends base_controller_1.BaseController {
1382
1347
  return ApprovalState.NotApproved;
1383
1348
  }
1384
1349
  finally {
1385
- clearApprovingTransactionId?.();
1386
- clearNonceLock?.();
1350
+ cleanupTasks.forEach((task) => task());
1387
1351
  }
1388
1352
  }
1389
1353
  async publishTransaction(ethQuery, transactionMeta, { skipSubmitHistory } = {}) {
@@ -1800,7 +1764,7 @@ class TransactionController extends base_controller_1.BaseController {
1800
1764
  }
1801
1765
  }
1802
1766
  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, }) {
1767
+ _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
1768
  // If transaction is found for same action id, do not create a new transaction.
1805
1769
  if (this.getTransactionWithActionId(actionId)) {
1806
1770
  return;