@metamask-previews/transaction-controller 52.1.0-preview-7ecf950 → 52.1.0-preview-8a8331b2

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 (64) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/TransactionController.cjs +69 -23
  3. package/dist/TransactionController.cjs.map +1 -1
  4. package/dist/TransactionController.d.cts +26 -5
  5. package/dist/TransactionController.d.cts.map +1 -1
  6. package/dist/TransactionController.d.mts +26 -5
  7. package/dist/TransactionController.d.mts.map +1 -1
  8. package/dist/TransactionController.mjs +69 -23
  9. package/dist/TransactionController.mjs.map +1 -1
  10. package/dist/hooks/CollectPublishHook.cjs +84 -0
  11. package/dist/hooks/CollectPublishHook.cjs.map +1 -0
  12. package/dist/hooks/CollectPublishHook.d.cts +29 -0
  13. package/dist/hooks/CollectPublishHook.d.cts.map +1 -0
  14. package/dist/hooks/CollectPublishHook.d.mts +29 -0
  15. package/dist/hooks/CollectPublishHook.d.mts.map +1 -0
  16. package/dist/hooks/CollectPublishHook.mjs +80 -0
  17. package/dist/hooks/CollectPublishHook.mjs.map +1 -0
  18. package/dist/hooks/ExtraTransactionsPublishHook.cjs +90 -0
  19. package/dist/hooks/ExtraTransactionsPublishHook.cjs.map +1 -0
  20. package/dist/hooks/ExtraTransactionsPublishHook.d.cts +18 -0
  21. package/dist/hooks/ExtraTransactionsPublishHook.d.cts.map +1 -0
  22. package/dist/hooks/ExtraTransactionsPublishHook.d.mts +18 -0
  23. package/dist/hooks/ExtraTransactionsPublishHook.d.mts.map +1 -0
  24. package/dist/hooks/ExtraTransactionsPublishHook.mjs +86 -0
  25. package/dist/hooks/ExtraTransactionsPublishHook.mjs.map +1 -0
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.cts +1 -1
  28. package/dist/index.d.cts.map +1 -1
  29. package/dist/index.d.mts +1 -1
  30. package/dist/index.d.mts.map +1 -1
  31. package/dist/index.mjs.map +1 -1
  32. package/dist/types.cjs.map +1 -1
  33. package/dist/types.d.cts +101 -11
  34. package/dist/types.d.cts.map +1 -1
  35. package/dist/types.d.mts +101 -11
  36. package/dist/types.d.mts.map +1 -1
  37. package/dist/types.mjs.map +1 -1
  38. package/dist/utils/batch.cjs +121 -1
  39. package/dist/utils/batch.cjs.map +1 -1
  40. package/dist/utils/batch.d.cts +7 -1
  41. package/dist/utils/batch.d.cts.map +1 -1
  42. package/dist/utils/batch.d.mts +7 -1
  43. package/dist/utils/batch.d.mts.map +1 -1
  44. package/dist/utils/batch.mjs +121 -1
  45. package/dist/utils/batch.mjs.map +1 -1
  46. package/dist/utils/eip7702.cjs +12 -0
  47. package/dist/utils/eip7702.cjs.map +1 -1
  48. package/dist/utils/eip7702.d.cts.map +1 -1
  49. package/dist/utils/eip7702.d.mts.map +1 -1
  50. package/dist/utils/eip7702.mjs +12 -0
  51. package/dist/utils/eip7702.mjs.map +1 -1
  52. package/dist/utils/gas.cjs +7 -3
  53. package/dist/utils/gas.cjs.map +1 -1
  54. package/dist/utils/gas.mjs +7 -3
  55. package/dist/utils/gas.mjs.map +1 -1
  56. package/dist/utils/nonce.cjs +3 -3
  57. package/dist/utils/nonce.cjs.map +1 -1
  58. package/dist/utils/nonce.d.cts +2 -2
  59. package/dist/utils/nonce.d.cts.map +1 -1
  60. package/dist/utils/nonce.d.mts +2 -2
  61. package/dist/utils/nonce.d.mts.map +1 -1
  62. package/dist/utils/nonce.mjs +3 -3
  63. package/dist/utils/nonce.mjs.map +1 -1
  64. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -14,6 +14,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
14
14
  - Add optional `securityAlertId` to `SecurityAlertResponse`.
15
15
  - Add optional `securityAlertId` to `TransactionBatchRequest`.
16
16
  - Add optional `validateSecurity` callback to `TransactionBatchRequest`.
17
+ - Support publish batch hook ([#5401](https://github.com/MetaMask/core/pull/5401))
18
+ - Add `hooks.publishBatch` option to constructor.
19
+ - Add `updateBatchTransactions` method.
20
+ - Add `maxFeePerGas` and `maxPriorityFeePerGas` to `updateEditableParams` options.
21
+ - Add types.
22
+ - `PublishBatchHook`
23
+ - `PublishBatchHookRequest`
24
+ - `PublishBatchHookResult`
25
+ - `PublishBatchHookTransaction`
26
+ - `PublishHook`
27
+ - `PublishHookResult`
28
+ - Add optional properties to `TransactionMeta`.
29
+ - `batchTransactions`
30
+ - `disableGasBuffer`
31
+ - Add optional properties to `BatchTransactionParams`.
32
+ - `gas`
33
+ - `maxFeePerGas`
34
+ - `maxPriorityFeePerGas`
35
+ - Add optional `existingTransaction` property to `TransactionBatchSingleRequest`.
36
+ - Add optional `useHook` property to `TransactionBatchRequest`.
17
37
 
18
38
  ## [52.1.0]
19
39
 
@@ -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_incomingTransactionHelper, _TransactionController_incomingTransactionOptions, _TransactionController_pendingTransactionOptions, _TransactionController_publicKeyEIP7702, _TransactionController_trace, _TransactionController_transactionHistoryLimit, _TransactionController_isFirstTimeInteractionEnabled, _TransactionController_isSimulationEnabled, _TransactionController_testGasFeeFlows, _TransactionController_multichainTrackingHelper, _TransactionController_retryTransaction, _TransactionController_rejectTransaction, _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, _TransactionController_updateGasEstimate, _TransactionController_deleteTransaction, _TransactionController_isRejectError, _TransactionController_rejectTransactionAndThrow;
16
+ var _TransactionController_instances, _TransactionController_internalEvents, _TransactionController_methodDataHelper, _TransactionController_incomingTransactionHelper, _TransactionController_incomingTransactionOptions, _TransactionController_pendingTransactionOptions, _TransactionController_publishBatchHook, _TransactionController_publicKeyEIP7702, _TransactionController_trace, _TransactionController_transactionHistoryLimit, _TransactionController_isFirstTimeInteractionEnabled, _TransactionController_isSimulationEnabled, _TransactionController_testGasFeeFlows, _TransactionController_multichainTrackingHelper, _TransactionController_retryTransaction, _TransactionController_rejectTransaction, _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, _TransactionController_updateGasEstimate, _TransactionController_deleteTransaction, _TransactionController_isRejectError, _TransactionController_rejectTransactionAndThrow;
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,7 +23,6 @@ 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");
27
26
  // This package purposefully relies on Node's EventEmitter module.
28
27
  // eslint-disable-next-line import-x/no-nodejs-modules
29
28
  const events_1 = require("events");
@@ -42,6 +41,7 @@ const MethodDataHelper_1 = require("./helpers/MethodDataHelper.cjs");
42
41
  const MultichainTrackingHelper_1 = require("./helpers/MultichainTrackingHelper.cjs");
43
42
  const PendingTransactionTracker_1 = require("./helpers/PendingTransactionTracker.cjs");
44
43
  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");
@@ -170,10 +170,10 @@ class TransactionController extends base_controller_1.BaseController {
170
170
  _TransactionController_internalEvents.set(this, new events_1.EventEmitter());
171
171
  this.approvingTransactionIds = new Set();
172
172
  _TransactionController_methodDataHelper.set(this, void 0);
173
- this.mutex = new async_mutex_1.Mutex();
174
173
  _TransactionController_incomingTransactionHelper.set(this, void 0);
175
174
  _TransactionController_incomingTransactionOptions.set(this, void 0);
176
175
  _TransactionController_pendingTransactionOptions.set(this, void 0);
176
+ _TransactionController_publishBatchHook.set(this, void 0);
177
177
  _TransactionController_publicKeyEIP7702.set(this, void 0);
178
178
  this.signAbortCallbacks = new Map();
179
179
  _TransactionController_trace.set(this, void 0);
@@ -206,6 +206,7 @@ class TransactionController extends base_controller_1.BaseController {
206
206
  this.securityProviderRequest = securityProviderRequest;
207
207
  __classPrivateFieldSet(this, _TransactionController_incomingTransactionOptions, incomingTransactions, "f");
208
208
  __classPrivateFieldSet(this, _TransactionController_pendingTransactionOptions, pendingTransactions, "f");
209
+ __classPrivateFieldSet(this, _TransactionController_publishBatchHook, hooks?.publishBatch, "f");
209
210
  __classPrivateFieldSet(this, _TransactionController_publicKeyEIP7702, publicKeyEIP7702, "f");
210
211
  __classPrivateFieldSet(this, _TransactionController_transactionHistoryLimit, transactionHistoryLimit, "f");
211
212
  this.sign = sign;
@@ -320,9 +321,12 @@ class TransactionController extends base_controller_1.BaseController {
320
321
  getChainId: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getChainId).bind(this),
321
322
  getEthQuery: (networkClientId) => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, { networkClientId }),
322
323
  getInternalAccounts: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getInternalAccounts).bind(this),
324
+ getTransaction: (transactionId) => this.getTransactionOrThrow(transactionId),
323
325
  messenger: this.messagingSystem,
326
+ publishBatchHook: __classPrivateFieldGet(this, _TransactionController_publishBatchHook, "f"),
324
327
  publicKeyEIP7702: __classPrivateFieldGet(this, _TransactionController_publicKeyEIP7702, "f"),
325
328
  request,
329
+ updateTransaction: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).bind(this),
326
330
  });
327
331
  }
328
332
  /**
@@ -349,9 +353,11 @@ class TransactionController extends base_controller_1.BaseController {
349
353
  * @param options.actionId - Unique ID to prevent duplicate requests.
350
354
  * @param options.batchId - A custom ID for the batch this transaction belongs to.
351
355
  * @param options.deviceConfirmedOn - An enum to indicate what device confirmed the transaction.
356
+ * @param options.disableGasBuffer - Whether to disable the gas estimation buffer.
352
357
  * @param options.method - RPC method that requested the transaction.
353
358
  * @param options.nestedTransactions - Params for any nested transactions encoded in the data.
354
359
  * @param options.origin - The origin of the transaction request, such as a dApp hostname.
360
+ * @param options.publishHook - Custom logic to publish the transaction.
355
361
  * @param options.requireApproval - Whether the transaction requires approval by the user, defaults to true unless explicitly disabled.
356
362
  * @param options.securityAlertResponse - Response from security validator.
357
363
  * @param options.sendFlowHistory - The sendFlowHistory entries to add.
@@ -365,7 +371,7 @@ class TransactionController extends base_controller_1.BaseController {
365
371
  */
366
372
  async addTransaction(txParams, options) {
367
373
  (0, logger_1.projectLogger)('Adding transaction', txParams, options);
368
- const { actionId, batchId, deviceConfirmedOn, method, nestedTransactions, networkClientId, origin, requireApproval, securityAlertResponse, sendFlowHistory, swaps = {}, traceContext, type, } = options;
374
+ const { actionId, batchId, deviceConfirmedOn, disableGasBuffer, method, nestedTransactions, networkClientId, origin, publishHook, requireApproval, securityAlertResponse, sendFlowHistory, swaps = {}, traceContext, type, } = options;
369
375
  txParams = (0, utils_2.normalizeTransactionParams)(txParams);
370
376
  if (!__classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").has(networkClientId)) {
371
377
  throw new Error(`Network client not found - ${networkClientId}`);
@@ -394,7 +400,7 @@ class TransactionController extends base_controller_1.BaseController {
394
400
  (0, validation_1.validateTxParams)(txParams, isEIP1559Compatible);
395
401
  const isDuplicateBatchId = batchId?.length &&
396
402
  this.state.transactions.some((tx) => tx.batchId?.toLowerCase() === batchId?.toLowerCase());
397
- if (isDuplicateBatchId) {
403
+ if (isDuplicateBatchId && origin && origin !== controller_utils_1.ORIGIN_METAMASK) {
398
404
  throw rpc_errors_1.rpcErrors.invalidInput('Batch ID already exists');
399
405
  }
400
406
  const dappSuggestedGasFees = this.generateDappSuggestedGasFees(txParams, origin);
@@ -412,6 +418,7 @@ class TransactionController extends base_controller_1.BaseController {
412
418
  dappSuggestedGasFees,
413
419
  delegationAddress,
414
420
  deviceConfirmedOn,
421
+ disableGasBuffer,
415
422
  id: (0, uuid_1.v1)(),
416
423
  isFirstTimeInteraction: undefined,
417
424
  nestedTransactions,
@@ -469,9 +476,10 @@ class TransactionController extends base_controller_1.BaseController {
469
476
  }
470
477
  return {
471
478
  result: this.processApproval(addedTransactionMeta, {
479
+ actionId,
472
480
  isExisting: Boolean(existingTransactionMeta),
481
+ publishHook,
473
482
  requireApproval,
474
- actionId,
475
483
  traceContext,
476
484
  }),
477
485
  transactionMeta: addedTransactionMeta,
@@ -794,14 +802,16 @@ class TransactionController extends base_controller_1.BaseController {
794
802
  * @param txId - The ID of the transaction to update.
795
803
  * @param params - The editable parameters to update.
796
804
  * @param params.data - Data to pass with the transaction.
805
+ * @param params.from - Address to send the transaction from.
797
806
  * @param params.gas - Maximum number of units of gas to use for the transaction.
798
807
  * @param params.gasPrice - Price per gas for legacy transactions.
799
- * @param params.from - Address to send the transaction from.
808
+ * @param params.maxFeePerGas - Maximum amount per gas to pay for the transaction, including the priority fee.
809
+ * @param params.maxPriorityFeePerGas - Maximum amount per gas to give to validator as incentive.
800
810
  * @param params.to - Address to send the transaction to.
801
811
  * @param params.value - Value associated with the transaction.
802
812
  * @returns The updated transaction metadata.
803
813
  */
804
- async updateEditableParams(txId, { data, gas, gasPrice, from, to, value, }) {
814
+ async updateEditableParams(txId, { data, from, gas, gasPrice, maxFeePerGas, maxPriorityFeePerGas, to, value, }) {
805
815
  const transactionMeta = this.getTransaction(txId);
806
816
  if (!transactionMeta) {
807
817
  throw new Error(`Cannot update editable params as no transaction metadata found`);
@@ -815,6 +825,8 @@ class TransactionController extends base_controller_1.BaseController {
815
825
  value,
816
826
  gas,
817
827
  gasPrice,
828
+ maxFeePerGas,
829
+ maxPriorityFeePerGas,
818
830
  },
819
831
  };
820
832
  editableParams.txParams = (0, lodash_1.pickBy)(editableParams.txParams);
@@ -1167,6 +1179,23 @@ class TransactionController extends base_controller_1.BaseController {
1167
1179
  });
1168
1180
  return updatedTransactionMeta.txParams.data;
1169
1181
  }
1182
+ /**
1183
+ * Update the batch transactions associated with a transaction.
1184
+ * These transactions will be submitted with the main transaction as a batch.
1185
+ *
1186
+ * @param request - The request object.
1187
+ * @param request.transactionId - The ID of the transaction to update.
1188
+ * @param request.batchTransactions - The new batch transactions.
1189
+ */
1190
+ updateBatchTransactions({ transactionId, batchTransactions, }) {
1191
+ (0, logger_1.projectLogger)('Updating batch transactions', { transactionId, batchTransactions });
1192
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
1193
+ transactionId,
1194
+ note: 'TransactionController#updateBatchTransactions - Batch transactions updated',
1195
+ }, (transactionMeta) => {
1196
+ transactionMeta.batchTransactions = batchTransactions;
1197
+ });
1198
+ }
1170
1199
  addMetadata(transactionMeta) {
1171
1200
  (0, validation_1.validateTxParams)(transactionMeta.txParams);
1172
1201
  this.update((state) => {
@@ -1209,7 +1238,7 @@ class TransactionController extends base_controller_1.BaseController {
1209
1238
  this.failTransaction(transactionMeta, new Error('Transaction incomplete at startup'));
1210
1239
  }
1211
1240
  }
1212
- async processApproval(transactionMeta, { isExisting = false, requireApproval, shouldShowRequest = true, actionId, traceContext, }) {
1241
+ async processApproval(transactionMeta, { actionId, isExisting = false, publishHook, requireApproval, shouldShowRequest = true, traceContext, }) {
1213
1242
  const transactionId = transactionMeta.id;
1214
1243
  let resultCallbacks;
1215
1244
  const { meta, isCompleted } = this.isTransactionCompleted(transactionId);
@@ -1236,7 +1265,7 @@ class TransactionController extends base_controller_1.BaseController {
1236
1265
  }
1237
1266
  const { isCompleted: isTxCompleted } = this.isTransactionCompleted(transactionId);
1238
1267
  if (!isTxCompleted) {
1239
- const approvalResult = await this.approveTransaction(transactionId, traceContext);
1268
+ const approvalResult = await this.approveTransaction(transactionId, traceContext, publishHook);
1240
1269
  if (approvalResult === ApprovalState.SkippedViaBeforePublishHook &&
1241
1270
  resultCallbacks) {
1242
1271
  resultCallbacks.success();
@@ -1284,12 +1313,14 @@ class TransactionController extends base_controller_1.BaseController {
1284
1313
  *
1285
1314
  * @param transactionId - The ID of the transaction to approve.
1286
1315
  * @param traceContext - The parent context for any new traces.
1316
+ * @param publishHookOverride - Custom logic to publish the transaction.
1287
1317
  * @returns The state of the approval.
1288
1318
  */
1289
- async approveTransaction(transactionId, traceContext) {
1290
- const cleanupTasks = new Array();
1291
- cleanupTasks.push(await this.mutex.acquire());
1319
+ async approveTransaction(transactionId, traceContext, publishHookOverride) {
1320
+ let clearApprovingTransactionId;
1321
+ let clearNonceLock;
1292
1322
  let transactionMeta = this.getTransactionOrThrow(transactionId);
1323
+ (0, logger_1.projectLogger)('Approving transaction', transactionMeta);
1293
1324
  try {
1294
1325
  if (!this.sign) {
1295
1326
  this.failTransaction(transactionMeta, new Error('No sign method defined.'));
@@ -1304,10 +1335,9 @@ class TransactionController extends base_controller_1.BaseController {
1304
1335
  return ApprovalState.NotApproved;
1305
1336
  }
1306
1337
  this.approvingTransactionIds.add(transactionId);
1307
- cleanupTasks.push(() => this.approvingTransactionIds.delete(transactionId));
1338
+ clearApprovingTransactionId = () => this.approvingTransactionIds.delete(transactionId);
1308
1339
  const [nonce, releaseNonce] = await (0, nonce_1.getNextNonce)(transactionMeta, (address) => __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").getNonceLock(address, transactionMeta.networkClientId));
1309
- // must set transaction to submitted/failed before releasing lock
1310
- releaseNonce && cleanupTasks.push(releaseNonce);
1340
+ clearNonceLock = releaseNonce;
1311
1341
  transactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
1312
1342
  transactionId,
1313
1343
  note: 'TransactionController#approveTransaction - Transaction approved',
@@ -1344,8 +1374,19 @@ class TransactionController extends base_controller_1.BaseController {
1344
1374
  }
1345
1375
  (0, logger_1.projectLogger)('Publishing transaction', transactionMeta.txParams);
1346
1376
  let hash;
1377
+ clearNonceLock?.();
1378
+ clearNonceLock = undefined;
1379
+ if (transactionMeta.batchTransactions?.length) {
1380
+ (0, logger_1.projectLogger)('Found batch transactions', transactionMeta.batchTransactions);
1381
+ const extraTransactionsPublishHook = new ExtraTransactionsPublishHook_1.ExtraTransactionsPublishHook({
1382
+ addTransactionBatch: this.addTransactionBatch.bind(this),
1383
+ transactions: transactionMeta.batchTransactions,
1384
+ });
1385
+ publishHookOverride = extraTransactionsPublishHook.getHook();
1386
+ }
1347
1387
  await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Publish', parentContext: traceContext }, async () => {
1348
- ({ transactionHash: hash } = await this.publish(transactionMeta, rawTx));
1388
+ const publishHook = publishHookOverride ?? this.publish;
1389
+ ({ transactionHash: hash } = await publishHook(transactionMeta, rawTx));
1349
1390
  if (hash === undefined) {
1350
1391
  hash = await this.publishTransaction(ethQuery, {
1351
1392
  ...transactionMeta,
@@ -1381,7 +1422,8 @@ class TransactionController extends base_controller_1.BaseController {
1381
1422
  return ApprovalState.NotApproved;
1382
1423
  }
1383
1424
  finally {
1384
- cleanupTasks.forEach((task) => task());
1425
+ clearApprovingTransactionId?.();
1426
+ clearNonceLock?.();
1385
1427
  }
1386
1428
  }
1387
1429
  async publishTransaction(ethQuery, transactionMeta, { skipSubmitHistory } = {}) {
@@ -1708,8 +1750,8 @@ class TransactionController extends base_controller_1.BaseController {
1708
1750
  transactionMeta,
1709
1751
  });
1710
1752
  }
1711
- getNonceTrackerTransactions(status, address, chainId) {
1712
- return (0, nonce_1.getAndFormatTransactionsForNonceTracker)(chainId, address, status, this.state.transactions);
1753
+ getNonceTrackerTransactions(statuses, address, chainId) {
1754
+ return (0, nonce_1.getAndFormatTransactionsForNonceTracker)(chainId, address, statuses, this.state.transactions);
1713
1755
  }
1714
1756
  onConfirmedTransaction(transactionMeta) {
1715
1757
  (0, logger_1.projectLogger)('Processing confirmed transaction', transactionMeta.id);
@@ -1770,7 +1812,7 @@ class TransactionController extends base_controller_1.BaseController {
1770
1812
  }
1771
1813
  }
1772
1814
  exports.TransactionController = TransactionController;
1773
- _TransactionController_internalEvents = new WeakMap(), _TransactionController_methodDataHelper = new WeakMap(), _TransactionController_incomingTransactionHelper = new WeakMap(), _TransactionController_incomingTransactionOptions = new WeakMap(), _TransactionController_pendingTransactionOptions = new WeakMap(), _TransactionController_publicKeyEIP7702 = 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, }) {
1815
+ _TransactionController_internalEvents = new WeakMap(), _TransactionController_methodDataHelper = new WeakMap(), _TransactionController_incomingTransactionHelper = new WeakMap(), _TransactionController_incomingTransactionOptions = new WeakMap(), _TransactionController_pendingTransactionOptions = new WeakMap(), _TransactionController_publishBatchHook = new WeakMap(), _TransactionController_publicKeyEIP7702 = 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, }) {
1774
1816
  // If transaction is found for same action id, do not create a new transaction.
1775
1817
  if (this.getTransactionWithActionId(actionId)) {
1776
1818
  return;
@@ -1878,7 +1920,7 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1878
1920
  // TODO: Fix types
1879
1921
  blockTracker,
1880
1922
  getPendingTransactions: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getNonceTrackerPendingTransactions).bind(this, chainId),
1881
- getConfirmedTransactions: this.getNonceTrackerTransactions.bind(this, types_1.TransactionStatus.confirmed, chainId),
1923
+ getConfirmedTransactions: this.getNonceTrackerTransactions.bind(this, [types_1.TransactionStatus.confirmed], chainId),
1882
1924
  });
1883
1925
  }, _TransactionController_createPendingTransactionTracker = function _TransactionController_createPendingTransactionTracker({ provider, blockTracker, chainId, networkClientId, }) {
1884
1926
  const ethQuery = new eth_query_1.default(provider);
@@ -1917,7 +1959,11 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1917
1959
  pendingTransactionTracker.hub.on('transaction-failed', this.failTransaction.bind(this));
1918
1960
  pendingTransactionTracker.hub.on('transaction-updated', this.updateTransaction.bind(this));
1919
1961
  }, _TransactionController_getNonceTrackerPendingTransactions = function _TransactionController_getNonceTrackerPendingTransactions(chainId, address) {
1920
- const standardPendingTransactions = this.getNonceTrackerTransactions(types_1.TransactionStatus.submitted, address, chainId);
1962
+ const standardPendingTransactions = this.getNonceTrackerTransactions([
1963
+ types_1.TransactionStatus.approved,
1964
+ types_1.TransactionStatus.signed,
1965
+ types_1.TransactionStatus.submitted,
1966
+ ], address, chainId);
1921
1967
  const externalPendingTransactions = this.getExternalPendingTransactions(address, chainId);
1922
1968
  return [...standardPendingTransactions, ...externalPendingTransactions];
1923
1969
  }, _TransactionController_getGasFeeFlows = function _TransactionController_getGasFeeFlows() {