@metamask-previews/transaction-controller 49.0.0-preview-9b02be34 → 50.0.0-preview-39c90ec

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 (62) hide show
  1. package/CHANGELOG.md +24 -1
  2. package/dist/TransactionController.cjs +81 -51
  3. package/dist/TransactionController.cjs.map +1 -1
  4. package/dist/TransactionController.d.cts +7 -11
  5. package/dist/TransactionController.d.cts.map +1 -1
  6. package/dist/TransactionController.d.mts +7 -11
  7. package/dist/TransactionController.d.mts.map +1 -1
  8. package/dist/TransactionController.mjs +82 -52
  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 +26 -12
  18. package/dist/types.d.cts.map +1 -1
  19. package/dist/types.d.mts +26 -12
  20. package/dist/types.d.mts.map +1 -1
  21. package/dist/types.mjs.map +1 -1
  22. package/dist/utils/batch.cjs +32 -6
  23. package/dist/utils/batch.cjs.map +1 -1
  24. package/dist/utils/batch.d.cts +3 -1
  25. package/dist/utils/batch.d.cts.map +1 -1
  26. package/dist/utils/batch.d.mts +3 -1
  27. package/dist/utils/batch.d.mts.map +1 -1
  28. package/dist/utils/batch.mjs +33 -7
  29. package/dist/utils/batch.mjs.map +1 -1
  30. package/dist/utils/eip7702.cjs +21 -9
  31. package/dist/utils/eip7702.cjs.map +1 -1
  32. package/dist/utils/eip7702.d.cts +10 -1
  33. package/dist/utils/eip7702.d.cts.map +1 -1
  34. package/dist/utils/eip7702.d.mts +10 -1
  35. package/dist/utils/eip7702.d.mts.map +1 -1
  36. package/dist/utils/eip7702.mjs +19 -8
  37. package/dist/utils/eip7702.mjs.map +1 -1
  38. package/dist/utils/feature-flags.cjs +26 -5
  39. package/dist/utils/feature-flags.cjs.map +1 -1
  40. package/dist/utils/feature-flags.d.cts +27 -7
  41. package/dist/utils/feature-flags.d.cts.map +1 -1
  42. package/dist/utils/feature-flags.d.mts +27 -7
  43. package/dist/utils/feature-flags.d.mts.map +1 -1
  44. package/dist/utils/feature-flags.mjs +24 -4
  45. package/dist/utils/feature-flags.mjs.map +1 -1
  46. package/dist/utils/signature.cjs +26 -0
  47. package/dist/utils/signature.cjs.map +1 -0
  48. package/dist/utils/signature.d.cts +11 -0
  49. package/dist/utils/signature.d.cts.map +1 -0
  50. package/dist/utils/signature.d.mts +11 -0
  51. package/dist/utils/signature.d.mts.map +1 -0
  52. package/dist/utils/signature.mjs +22 -0
  53. package/dist/utils/signature.mjs.map +1 -0
  54. package/dist/utils/validation.cjs +5 -1
  55. package/dist/utils/validation.cjs.map +1 -1
  56. package/dist/utils/validation.d.cts +3 -1
  57. package/dist/utils/validation.d.cts.map +1 -1
  58. package/dist/utils/validation.d.mts +3 -1
  59. package/dist/utils/validation.d.mts.map +1 -1
  60. package/dist/utils/validation.mjs +5 -1
  61. package/dist/utils/validation.mjs.map +1 -1
  62. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [50.0.0]
11
+
12
+ ### Added
13
+
14
+ - Add additional metadata for batch metrics ([#5488](https://github.com/MetaMask/core/pull/5488))
15
+ - Add `delegationAddress` to `TransactionMetadata`.
16
+ - Add `NestedTransactionMetadata` type containing `BatchTransactionParams` and `type`.
17
+ - Add optional `type` to `TransactionBatchSingleRequest`.
18
+ - Verify EIP-7702 contract address using signatures ([#5472](https://github.com/MetaMask/core/pull/5472))
19
+ - Add optional `publicKeyEIP7702` property to constructor.
20
+ - Add dependency on `^5.7.0` of `@ethersproject/wallet`.
21
+
22
+ ### Changed
23
+
24
+ - **BREAKING:** Bump `@metamask/accounts-controller` peer dependency to `^26.1.0` ([#5481](https://github.com/MetaMask/core/pull/5481))
25
+ - **BREAKING:** Add additional metadata for batch metrics ([#5488](https://github.com/MetaMask/core/pull/5488))
26
+ - Change `error` in `TransactionMetadata` to optional for all statuses.
27
+ - Change `nestedTransactions` in `TransactionMetadata` to array of `NestedTransactionMetadata`.
28
+ - Throw if `addTransactionBatch` called with external origin and size limit exceeded ([#5489](https://github.com/MetaMask/core/pull/5489))
29
+ - Verify EIP-7702 contract address using signatures ([#5472](https://github.com/MetaMask/core/pull/5472))
30
+ - Use new `contracts` property from feature flags instead of `contractAddresses`.
31
+
10
32
  ## [49.0.0]
11
33
 
12
34
  ### Added
@@ -1358,7 +1380,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1358
1380
 
1359
1381
  All changes listed after this point were applied to this package following the monorepo conversion.
1360
1382
 
1361
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@49.0.0...HEAD
1383
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@50.0.0...HEAD
1384
+ [50.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@49.0.0...@metamask/transaction-controller@50.0.0
1362
1385
  [49.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@48.2.0...@metamask/transaction-controller@49.0.0
1363
1386
  [48.2.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@48.1.0...@metamask/transaction-controller@48.2.0
1364
1387
  [48.1.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@48.0.0...@metamask/transaction-controller@48.1.0
@@ -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_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, _TransactionController_updateGasEstimate;
16
+ var _TransactionController_instances, _TransactionController_internalEvents, _TransactionController_methodDataHelper, _TransactionController_incomingTransactionChainIds, _TransactionController_incomingTransactionHelper, _TransactionController_incomingTransactionOptions, _TransactionController_pendingTransactionOptions, _TransactionController_publicKeyEIP7702, _TransactionController_trace, _TransactionController_transactionHistoryLimit, _TransactionController_isFirstTimeInteractionEnabled, _TransactionController_isSimulationEnabled, _TransactionController_testGasFeeFlows, _TransactionController_afterSimulate, _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");
@@ -156,7 +156,7 @@ class TransactionController extends base_controller_1.BaseController {
156
156
  * @param options - The controller options.
157
157
  */
158
158
  constructor(options) {
159
- const { disableHistory, disableSendFlowHistory, disableSwaps, getCurrentAccountEIP1559Compatibility, getCurrentNetworkEIP1559Compatibility, getExternalPendingTransactions, getGasFeeEstimates, getNetworkClientRegistry, getNetworkState, getPermittedAccounts, getSavedGasFees, incomingTransactions = {}, isFirstTimeInteractionEnabled, isSimulationEnabled, messenger, pendingTransactions = {}, securityProviderRequest, sign, state, testGasFeeFlows, trace, transactionHistoryLimit = 40, hooks, } = options;
159
+ const { disableHistory, disableSendFlowHistory, disableSwaps, getCurrentAccountEIP1559Compatibility, getCurrentNetworkEIP1559Compatibility, getExternalPendingTransactions, getGasFeeEstimates, getNetworkClientRegistry, getNetworkState, getPermittedAccounts, getSavedGasFees, incomingTransactions = {}, isFirstTimeInteractionEnabled, isSimulationEnabled, messenger, pendingTransactions = {}, publicKeyEIP7702, securityProviderRequest, sign, state, testGasFeeFlows, trace, transactionHistoryLimit = 40, hooks, } = options;
160
160
  super({
161
161
  name: controllerName,
162
162
  metadata,
@@ -175,12 +175,14 @@ class TransactionController extends base_controller_1.BaseController {
175
175
  _TransactionController_incomingTransactionHelper.set(this, void 0);
176
176
  _TransactionController_incomingTransactionOptions.set(this, void 0);
177
177
  _TransactionController_pendingTransactionOptions.set(this, void 0);
178
+ _TransactionController_publicKeyEIP7702.set(this, void 0);
178
179
  this.signAbortCallbacks = new Map();
179
180
  _TransactionController_trace.set(this, void 0);
180
181
  _TransactionController_transactionHistoryLimit.set(this, void 0);
181
182
  _TransactionController_isFirstTimeInteractionEnabled.set(this, void 0);
182
183
  _TransactionController_isSimulationEnabled.set(this, void 0);
183
184
  _TransactionController_testGasFeeFlows.set(this, void 0);
185
+ _TransactionController_afterSimulate.set(this, void 0);
184
186
  _TransactionController_multichainTrackingHelper.set(this, void 0);
185
187
  _TransactionController_checkForPendingTransactionAndStartPolling.set(this, () => {
186
188
  __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").checkForPendingTransactionAndStartPolling();
@@ -205,11 +207,13 @@ class TransactionController extends base_controller_1.BaseController {
205
207
  this.securityProviderRequest = securityProviderRequest;
206
208
  __classPrivateFieldSet(this, _TransactionController_incomingTransactionOptions, incomingTransactions, "f");
207
209
  __classPrivateFieldSet(this, _TransactionController_pendingTransactionOptions, pendingTransactions, "f");
210
+ __classPrivateFieldSet(this, _TransactionController_publicKeyEIP7702, publicKeyEIP7702, "f");
208
211
  __classPrivateFieldSet(this, _TransactionController_transactionHistoryLimit, transactionHistoryLimit, "f");
209
212
  this.sign = sign;
210
213
  __classPrivateFieldSet(this, _TransactionController_testGasFeeFlows, testGasFeeFlows === true, "f");
211
214
  __classPrivateFieldSet(this, _TransactionController_trace, trace ?? ((_request, fn) => fn?.()), "f");
212
215
  this.afterSign = hooks?.afterSign ?? (() => true);
216
+ __classPrivateFieldSet(this, _TransactionController_afterSimulate, hooks?.afterSimulate ?? (() => Promise.resolve(undefined)), "f");
213
217
  this.beforeCheckPendingTransaction =
214
218
  hooks?.beforeCheckPendingTransaction ??
215
219
  /* istanbul ignore next */
@@ -320,6 +324,7 @@ class TransactionController extends base_controller_1.BaseController {
320
324
  getEthQuery: (networkClientId) => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, { networkClientId }),
321
325
  getInternalAccounts: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getInternalAccounts).bind(this),
322
326
  messenger: this.messagingSystem,
327
+ publicKeyEIP7702: __classPrivateFieldGet(this, _TransactionController_publicKeyEIP7702, "f"),
323
328
  request,
324
329
  });
325
330
  }
@@ -334,6 +339,7 @@ class TransactionController extends base_controller_1.BaseController {
334
339
  address,
335
340
  getEthQuery: (chainId) => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, { chainId }),
336
341
  messenger: this.messagingSystem,
342
+ publicKeyEIP7702: __classPrivateFieldGet(this, _TransactionController_publicKeyEIP7702, "f"),
337
343
  });
338
344
  }
339
345
  /**
@@ -367,6 +373,10 @@ class TransactionController extends base_controller_1.BaseController {
367
373
  if (!__classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").has(networkClientId)) {
368
374
  throw new Error(`Network client not found - ${networkClientId}`);
369
375
  }
376
+ const chainId = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getChainId).call(this, networkClientId);
377
+ const ethQuery = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, {
378
+ networkClientId,
379
+ });
370
380
  const permittedAddresses = origin === undefined
371
381
  ? undefined
372
382
  : await this.getPermittedAccounts?.(origin);
@@ -382,6 +392,7 @@ class TransactionController extends base_controller_1.BaseController {
382
392
  txParams,
383
393
  type,
384
394
  });
395
+ const delegationAddressPromise = (0, eip7702_1.getDelegationAddress)(txParams.from, ethQuery).catch(() => undefined);
385
396
  const isEIP1559Compatible = await this.getEIP1559Compatibility(networkClientId);
386
397
  (0, validation_1.validateTxParams)(txParams, isEIP1559Compatible);
387
398
  const isDuplicateBatchId = batchId?.length &&
@@ -390,11 +401,8 @@ class TransactionController extends base_controller_1.BaseController {
390
401
  throw rpc_errors_1.rpcErrors.invalidInput('Batch ID already exists');
391
402
  }
392
403
  const dappSuggestedGasFees = this.generateDappSuggestedGasFees(txParams, origin);
393
- const chainId = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getChainId).call(this, networkClientId);
394
- const ethQuery = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, {
395
- networkClientId,
396
- });
397
404
  const transactionType = type ?? (await (0, transaction_type_1.determineTransactionType)(txParams, ethQuery)).type;
405
+ const delegationAddress = await delegationAddressPromise;
398
406
  const existingTransactionMeta = this.getTransactionWithActionId(actionId);
399
407
  // If a request to add a transaction with the same actionId is submitted again, a new transaction will not be created for it.
400
408
  let addedTransactionMeta = existingTransactionMeta
@@ -405,6 +413,7 @@ class TransactionController extends base_controller_1.BaseController {
405
413
  batchId,
406
414
  chainId,
407
415
  dappSuggestedGasFees,
416
+ delegationAddress,
408
417
  deviceConfirmedOn,
409
418
  id: (0, uuid_1.v1)(),
410
419
  isFirstTimeInteraction: undefined,
@@ -439,12 +448,13 @@ class TransactionController extends base_controller_1.BaseController {
439
448
  }
440
449
  addedTransactionMeta = (0, swaps_1.updateSwapsTransaction)(addedTransactionMeta, transactionType, swaps, {
441
450
  isSwapsDisabled: this.isSwapsDisabled,
442
- cancelTransaction: this.cancelTransaction.bind(this),
451
+ cancelTransaction: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_rejectTransaction).bind(this),
443
452
  messenger: this.messagingSystem,
444
453
  });
445
454
  this.addMetadata(addedTransactionMeta);
446
455
  if (requireApproval !== false) {
447
456
  __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateSimulationData).call(this, addedTransactionMeta, {
457
+ ethQuery,
448
458
  traceContext,
449
459
  }).catch((error) => {
450
460
  (0, logger_1.projectLogger)('Error while updating simulation data', error);
@@ -1239,18 +1249,13 @@ class TransactionController extends base_controller_1.BaseController {
1239
1249
  actionId,
1240
1250
  });
1241
1251
  }
1242
- // TODO: Replace `any` with type
1243
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1244
1252
  }
1245
- catch (error) {
1253
+ catch (rawError) {
1254
+ const error = rawError;
1246
1255
  const { isCompleted: isTxCompleted } = this.isTransactionCompleted(transactionId);
1247
1256
  if (!isTxCompleted) {
1248
- if (error?.code === rpc_errors_1.errorCodes.provider.userRejectedRequest) {
1249
- this.cancelTransaction(transactionId, actionId);
1250
- throw rpc_errors_1.providerErrors.userRejectedRequest({
1251
- message: 'MetaMask Tx Signature: User denied transaction signature.',
1252
- data: error?.data,
1253
- });
1257
+ if (__classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_isRejectError).call(this, error)) {
1258
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_rejectTransactionAndThrow).call(this, transactionId, actionId, error);
1254
1259
  }
1255
1260
  else {
1256
1261
  this.failTransaction(meta, error, actionId);
@@ -1261,8 +1266,9 @@ class TransactionController extends base_controller_1.BaseController {
1261
1266
  const finalMeta = await finishedPromise;
1262
1267
  switch (finalMeta?.status) {
1263
1268
  case types_1.TransactionStatus.failed:
1264
- resultCallbacks?.error(finalMeta.error);
1265
- throw rpc_errors_1.rpcErrors.internal(finalMeta.error.message);
1269
+ const error = finalMeta.error;
1270
+ resultCallbacks?.error(error);
1271
+ throw rpc_errors_1.rpcErrors.internal(error.message);
1266
1272
  case types_1.TransactionStatus.submitted:
1267
1273
  resultCallbacks?.success();
1268
1274
  return finalMeta.hash;
@@ -1389,34 +1395,6 @@ class TransactionController extends base_controller_1.BaseController {
1389
1395
  }
1390
1396
  return transactionHash;
1391
1397
  }
1392
- /**
1393
- * Cancels a transaction based on its ID by setting its status to "rejected"
1394
- * and emitting a `<tx.id>:finished` hub event.
1395
- *
1396
- * @param transactionId - The ID of the transaction to cancel.
1397
- * @param actionId - The actionId passed from UI
1398
- */
1399
- cancelTransaction(transactionId, actionId) {
1400
- const transactionMeta = this.state.transactions.find(({ id }) => id === transactionId);
1401
- if (!transactionMeta) {
1402
- return;
1403
- }
1404
- this.update((state) => {
1405
- const transactions = state.transactions.filter(({ id }) => id !== transactionId);
1406
- state.transactions = this.trimTransactionsForState(transactions);
1407
- });
1408
- const updatedTransactionMeta = {
1409
- ...transactionMeta,
1410
- status: types_1.TransactionStatus.rejected,
1411
- };
1412
- this.messagingSystem.publish(`${controllerName}:transactionFinished`, updatedTransactionMeta);
1413
- __classPrivateFieldGet(this, _TransactionController_internalEvents, "f").emit(`${transactionMeta.id}:finished`, updatedTransactionMeta);
1414
- this.messagingSystem.publish(`${controllerName}:transactionRejected`, {
1415
- transactionMeta: updatedTransactionMeta,
1416
- actionId,
1417
- });
1418
- this.onTransactionStatusChange(updatedTransactionMeta);
1419
- }
1420
1398
  /**
1421
1399
  * Trim the amount of transactions that are set on the state. Checks
1422
1400
  * if the length of the tx history is longer then desired persistence
@@ -1794,7 +1772,7 @@ class TransactionController extends base_controller_1.BaseController {
1794
1772
  }
1795
1773
  }
1796
1774
  exports.TransactionController = TransactionController;
1797
- _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, }) {
1775
+ _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_publicKeyEIP7702 = new WeakMap(), _TransactionController_trace = new WeakMap(), _TransactionController_transactionHistoryLimit = new WeakMap(), _TransactionController_isFirstTimeInteractionEnabled = new WeakMap(), _TransactionController_isSimulationEnabled = new WeakMap(), _TransactionController_testGasFeeFlows = new WeakMap(), _TransactionController_afterSimulate = 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, }) {
1798
1776
  // If transaction is found for same action id, do not create a new transaction.
1799
1777
  if (this.getTransactionWithActionId(actionId)) {
1800
1778
  return;
@@ -1859,6 +1837,24 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1859
1837
  actionId,
1860
1838
  });
1861
1839
  afterSubmit?.(newTransactionMeta);
1840
+ }, _TransactionController_rejectTransaction = function _TransactionController_rejectTransaction(transactionId, actionId, error) {
1841
+ const transactionMeta = this.getTransaction(transactionId);
1842
+ if (!transactionMeta) {
1843
+ return;
1844
+ }
1845
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_deleteTransaction).call(this, transactionId);
1846
+ const updatedTransactionMeta = {
1847
+ ...transactionMeta,
1848
+ status: types_1.TransactionStatus.rejected,
1849
+ error: (0, utils_2.normalizeTxError)(error ?? rpc_errors_1.providerErrors.userRejectedRequest()),
1850
+ };
1851
+ this.messagingSystem.publish(`${controllerName}:transactionFinished`, updatedTransactionMeta);
1852
+ __classPrivateFieldGet(this, _TransactionController_internalEvents, "f").emit(`${transactionMeta.id}:finished`, updatedTransactionMeta);
1853
+ this.messagingSystem.publish(`${controllerName}:transactionRejected`, {
1854
+ transactionMeta: updatedTransactionMeta,
1855
+ actionId,
1856
+ });
1857
+ this.onTransactionStatusChange(updatedTransactionMeta);
1862
1858
  }, _TransactionController_getChainId = function _TransactionController_getChainId(networkClientId) {
1863
1859
  return __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").getNetworkClient({ networkClientId })
1864
1860
  .configuration.chainId;
@@ -2008,7 +2004,7 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
2008
2004
  catch (error) {
2009
2005
  (0, logger_1.projectLogger)('Error fetching account address relationship, skipping first time interaction update', error);
2010
2006
  }
2011
- }, _TransactionController_updateSimulationData = async function _TransactionController_updateSimulationData(transactionMeta, { blockTime, traceContext, } = {}) {
2007
+ }, _TransactionController_updateSimulationData = async function _TransactionController_updateSimulationData(transactionMeta, { blockTime, ethQuery, traceContext, } = {}) {
2012
2008
  const { id: transactionId, chainId, txParams, simulationData: prevSimulationData, } = transactionMeta;
2013
2009
  const { from, to, value, data } = txParams;
2014
2010
  let simulationData = {
@@ -2037,20 +2033,35 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
2037
2033
  };
2038
2034
  }
2039
2035
  }
2040
- const finalTransactionMeta = this.getTransaction(transactionId);
2036
+ let finalTransactionMeta = this.getTransaction(transactionId);
2041
2037
  /* istanbul ignore if */
2042
2038
  if (!finalTransactionMeta) {
2043
2039
  (0, logger_1.projectLogger)('Cannot update simulation data as transaction not found', transactionId, simulationData);
2044
2040
  return;
2045
2041
  }
2046
- __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
2042
+ finalTransactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
2047
2043
  transactionId,
2048
2044
  note: 'TransactionController#updateSimulationData - Update simulation data',
2049
2045
  skipResimulateCheck: Boolean(blockTime),
2050
2046
  }, (txMeta) => {
2051
2047
  txMeta.simulationData = simulationData;
2052
2048
  });
2053
- (0, logger_1.projectLogger)('Updated simulation data', transactionId, simulationData);
2049
+ if (ethQuery) {
2050
+ (0, logger_1.projectLogger)('Calling afterSimulate hook', finalTransactionMeta);
2051
+ const result = await __classPrivateFieldGet(this, _TransactionController_afterSimulate, "f").call(this, {
2052
+ transactionMeta: finalTransactionMeta,
2053
+ });
2054
+ if (result?.updateTransaction) {
2055
+ (0, logger_1.projectLogger)('Updating transaction with afterSimulate data');
2056
+ finalTransactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, { transactionId }, result.updateTransaction);
2057
+ const { estimatedGas } = await (0, gas_1.estimateGas)({ ...finalTransactionMeta.txParams, gas: undefined }, ethQuery);
2058
+ (0, logger_1.projectLogger)('Updating gas following afterSimulate hook', estimatedGas);
2059
+ finalTransactionMeta = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, { transactionId }, (txMeta) => {
2060
+ txMeta.txParams.gas = estimatedGas;
2061
+ });
2062
+ }
2063
+ }
2064
+ (0, logger_1.projectLogger)('Updated simulation data', transactionId, finalTransactionMeta);
2054
2065
  }, _TransactionController_onGasFeePollerTransactionUpdate = function _TransactionController_onGasFeePollerTransactionUpdate({ transactionId, gasFeeEstimates, gasFeeEstimatesLoaded, layer1GasFee, }) {
2055
2066
  __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, { transactionId, skipHistory: true }, (txMeta) => {
2056
2067
  if (gasFeeEstimates) {
@@ -2106,5 +2117,24 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
2106
2117
  isCustomNetwork,
2107
2118
  txMeta: transactionMeta,
2108
2119
  });
2120
+ }, _TransactionController_deleteTransaction = function _TransactionController_deleteTransaction(transactionId) {
2121
+ this.update((state) => {
2122
+ const transactions = state.transactions.filter(({ id }) => id !== transactionId);
2123
+ state.transactions = this.trimTransactionsForState(transactions);
2124
+ });
2125
+ }, _TransactionController_isRejectError = function _TransactionController_isRejectError(error) {
2126
+ return [
2127
+ rpc_errors_1.errorCodes.provider.userRejectedRequest,
2128
+ rpc_errors_1.errorCodes.rpc.methodNotSupported,
2129
+ ].includes(error.code);
2130
+ }, _TransactionController_rejectTransactionAndThrow = function _TransactionController_rejectTransactionAndThrow(transactionId, actionId, error) {
2131
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_rejectTransaction).call(this, transactionId, actionId, error);
2132
+ if (error.code === rpc_errors_1.errorCodes.provider.userRejectedRequest) {
2133
+ throw rpc_errors_1.providerErrors.userRejectedRequest({
2134
+ message: 'MetaMask Tx Signature: User denied transaction signature.',
2135
+ data: error?.data,
2136
+ });
2137
+ }
2138
+ throw error;
2109
2139
  };
2110
2140
  //# sourceMappingURL=TransactionController.cjs.map