@metamask-previews/transaction-controller 49.0.0-preview-2084c06c → 49.0.0-preview-b4d33c51

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 (44) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/TransactionController.cjs +63 -46
  3. package/dist/TransactionController.cjs.map +1 -1
  4. package/dist/TransactionController.d.cts +3 -11
  5. package/dist/TransactionController.d.cts.map +1 -1
  6. package/dist/TransactionController.d.mts +3 -11
  7. package/dist/TransactionController.d.mts.map +1 -1
  8. package/dist/TransactionController.mjs +64 -47
  9. package/dist/TransactionController.mjs.map +1 -1
  10. package/dist/helpers/AccountsApiRemoteTransactionSource.cjs +8 -3
  11. package/dist/helpers/AccountsApiRemoteTransactionSource.cjs.map +1 -1
  12. package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts.map +1 -1
  13. package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts.map +1 -1
  14. package/dist/helpers/AccountsApiRemoteTransactionSource.mjs +8 -3
  15. package/dist/helpers/AccountsApiRemoteTransactionSource.mjs.map +1 -1
  16. package/dist/helpers/IncomingTransactionHelper.cjs +12 -4
  17. package/dist/helpers/IncomingTransactionHelper.cjs.map +1 -1
  18. package/dist/helpers/IncomingTransactionHelper.d.cts +3 -1
  19. package/dist/helpers/IncomingTransactionHelper.d.cts.map +1 -1
  20. package/dist/helpers/IncomingTransactionHelper.d.mts +3 -1
  21. package/dist/helpers/IncomingTransactionHelper.d.mts.map +1 -1
  22. package/dist/helpers/IncomingTransactionHelper.mjs +12 -4
  23. package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -1
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.cts +1 -1
  26. package/dist/index.d.cts.map +1 -1
  27. package/dist/index.d.mts +1 -1
  28. package/dist/index.d.mts.map +1 -1
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/types.cjs.map +1 -1
  31. package/dist/types.d.cts +25 -12
  32. package/dist/types.d.cts.map +1 -1
  33. package/dist/types.d.mts +25 -12
  34. package/dist/types.d.mts.map +1 -1
  35. package/dist/types.mjs.map +1 -1
  36. package/dist/utils/batch.cjs +19 -1
  37. package/dist/utils/batch.cjs.map +1 -1
  38. package/dist/utils/batch.d.cts +1 -1
  39. package/dist/utils/batch.d.cts.map +1 -1
  40. package/dist/utils/batch.d.mts +1 -1
  41. package/dist/utils/batch.d.mts.map +1 -1
  42. package/dist/utils/batch.mjs +19 -1
  43. package/dist/utils/batch.mjs.map +1 -1
  44. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Added
11
+
12
+ - Add additional metadata for batch metrics ([#5488](https://github.com/MetaMask/core/pull/5488))
13
+ - Add `delegationAddress` to `TransactionMetadata`.
14
+ - Add `NestedTransactionMetadata` type containing `BatchTransactionParams` and `type`.
15
+ - Add optional `type` to `TransactionBatchSingleRequest`.
16
+
17
+ ### Changed
18
+
19
+ - **BREAKING:** Add additional metadata for batch metrics ([#5488](https://github.com/MetaMask/core/pull/5488))
20
+ - Change `error` in `TransactionMetadata` to optional for all statuses.
21
+ - Change `nestedTransactions` in `TransactionMetadata` to array of `NestedTransactionMetadata`.
22
+
10
23
  ## [49.0.0]
11
24
 
12
25
  ### Added
@@ -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_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_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");
@@ -171,6 +171,7 @@ class TransactionController extends base_controller_1.BaseController {
171
171
  this.approvingTransactionIds = new Set();
172
172
  _TransactionController_methodDataHelper.set(this, void 0);
173
173
  this.mutex = new async_mutex_1.Mutex();
174
+ _TransactionController_incomingTransactionChainIds.set(this, new Set());
174
175
  _TransactionController_incomingTransactionHelper.set(this, void 0);
175
176
  _TransactionController_incomingTransactionOptions.set(this, void 0);
176
177
  _TransactionController_pendingTransactionOptions.set(this, void 0);
@@ -265,6 +266,7 @@ class TransactionController extends base_controller_1.BaseController {
265
266
  };
266
267
  __classPrivateFieldSet(this, _TransactionController_incomingTransactionHelper, new IncomingTransactionHelper_1.IncomingTransactionHelper({
267
268
  getCache: () => this.state.lastFetchedBlockNumbers,
269
+ getChainIds: () => [...__classPrivateFieldGet(this, _TransactionController_incomingTransactionChainIds, "f")],
268
270
  getCurrentAccount: () => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getSelectedAccount).call(this),
269
271
  getLocalTransactions: () => this.state.transactions,
270
272
  includeTokenTransfers: __classPrivateFieldGet(this, _TransactionController_incomingTransactionOptions, "f").includeTokenTransfers,
@@ -393,6 +395,7 @@ class TransactionController extends base_controller_1.BaseController {
393
395
  networkClientId,
394
396
  });
395
397
  const transactionType = type ?? (await (0, transaction_type_1.determineTransactionType)(txParams, ethQuery)).type;
398
+ const { delegationAddress } = await (0, eip7702_1.isAccountUpgradedToEIP7702)(txParams.from, chainId, this.messagingSystem, ethQuery);
396
399
  const existingTransactionMeta = this.getTransactionWithActionId(actionId);
397
400
  // If a request to add a transaction with the same actionId is submitted again, a new transaction will not be created for it.
398
401
  let addedTransactionMeta = existingTransactionMeta
@@ -403,6 +406,7 @@ class TransactionController extends base_controller_1.BaseController {
403
406
  batchId,
404
407
  chainId,
405
408
  dappSuggestedGasFees,
409
+ delegationAddress,
406
410
  deviceConfirmedOn,
407
411
  id: (0, uuid_1.v1)(),
408
412
  isFirstTimeInteraction: undefined,
@@ -437,7 +441,7 @@ class TransactionController extends base_controller_1.BaseController {
437
441
  }
438
442
  addedTransactionMeta = (0, swaps_1.updateSwapsTransaction)(addedTransactionMeta, transactionType, swaps, {
439
443
  isSwapsDisabled: this.isSwapsDisabled,
440
- cancelTransaction: this.cancelTransaction.bind(this),
444
+ cancelTransaction: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_rejectTransaction).bind(this),
441
445
  messenger: this.messagingSystem,
442
446
  });
443
447
  this.addMetadata(addedTransactionMeta);
@@ -469,13 +473,21 @@ class TransactionController extends base_controller_1.BaseController {
469
473
  transactionMeta: addedTransactionMeta,
470
474
  };
471
475
  }
472
- startIncomingTransactionPolling() {
476
+ startIncomingTransactionPolling(chainIds) {
477
+ chainIds.forEach((chainId) => __classPrivateFieldGet(this, _TransactionController_incomingTransactionChainIds, "f").add(chainId));
473
478
  __classPrivateFieldGet(this, _TransactionController_incomingTransactionHelper, "f").start();
474
479
  }
475
- stopIncomingTransactionPolling() {
476
- __classPrivateFieldGet(this, _TransactionController_incomingTransactionHelper, "f").stop();
480
+ stopIncomingTransactionPolling(chainIds) {
481
+ chainIds?.forEach((chainId) => __classPrivateFieldGet(this, _TransactionController_incomingTransactionChainIds, "f").delete(chainId));
482
+ if (!chainIds) {
483
+ __classPrivateFieldGet(this, _TransactionController_incomingTransactionChainIds, "f").clear();
484
+ }
485
+ if (__classPrivateFieldGet(this, _TransactionController_incomingTransactionChainIds, "f").size === 0) {
486
+ __classPrivateFieldGet(this, _TransactionController_incomingTransactionHelper, "f").stop();
487
+ }
477
488
  }
478
- async updateIncomingTransactions() {
489
+ async updateIncomingTransactions(chainIds) {
490
+ chainIds.forEach((chainId) => __classPrivateFieldGet(this, _TransactionController_incomingTransactionChainIds, "f").add(chainId));
479
491
  await __classPrivateFieldGet(this, _TransactionController_incomingTransactionHelper, "f").update();
480
492
  }
481
493
  /**
@@ -1229,18 +1241,13 @@ class TransactionController extends base_controller_1.BaseController {
1229
1241
  actionId,
1230
1242
  });
1231
1243
  }
1232
- // TODO: Replace `any` with type
1233
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1234
1244
  }
1235
- catch (error) {
1245
+ catch (rawError) {
1246
+ const error = rawError;
1236
1247
  const { isCompleted: isTxCompleted } = this.isTransactionCompleted(transactionId);
1237
1248
  if (!isTxCompleted) {
1238
- if (error?.code === rpc_errors_1.errorCodes.provider.userRejectedRequest) {
1239
- this.cancelTransaction(transactionId, actionId);
1240
- throw rpc_errors_1.providerErrors.userRejectedRequest({
1241
- message: 'MetaMask Tx Signature: User denied transaction signature.',
1242
- data: error?.data,
1243
- });
1249
+ if (__classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_isRejectError).call(this, error)) {
1250
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_rejectTransactionAndThrow).call(this, transactionId, actionId, error);
1244
1251
  }
1245
1252
  else {
1246
1253
  this.failTransaction(meta, error, actionId);
@@ -1251,8 +1258,9 @@ class TransactionController extends base_controller_1.BaseController {
1251
1258
  const finalMeta = await finishedPromise;
1252
1259
  switch (finalMeta?.status) {
1253
1260
  case types_1.TransactionStatus.failed:
1254
- resultCallbacks?.error(finalMeta.error);
1255
- throw rpc_errors_1.rpcErrors.internal(finalMeta.error.message);
1261
+ const error = finalMeta.error;
1262
+ resultCallbacks?.error(error);
1263
+ throw rpc_errors_1.rpcErrors.internal(error.message);
1256
1264
  case types_1.TransactionStatus.submitted:
1257
1265
  resultCallbacks?.success();
1258
1266
  return finalMeta.hash;
@@ -1379,34 +1387,6 @@ class TransactionController extends base_controller_1.BaseController {
1379
1387
  }
1380
1388
  return transactionHash;
1381
1389
  }
1382
- /**
1383
- * Cancels a transaction based on its ID by setting its status to "rejected"
1384
- * and emitting a `<tx.id>:finished` hub event.
1385
- *
1386
- * @param transactionId - The ID of the transaction to cancel.
1387
- * @param actionId - The actionId passed from UI
1388
- */
1389
- cancelTransaction(transactionId, actionId) {
1390
- const transactionMeta = this.state.transactions.find(({ id }) => id === transactionId);
1391
- if (!transactionMeta) {
1392
- return;
1393
- }
1394
- this.update((state) => {
1395
- const transactions = state.transactions.filter(({ id }) => id !== transactionId);
1396
- state.transactions = this.trimTransactionsForState(transactions);
1397
- });
1398
- const updatedTransactionMeta = {
1399
- ...transactionMeta,
1400
- status: types_1.TransactionStatus.rejected,
1401
- };
1402
- this.messagingSystem.publish(`${controllerName}:transactionFinished`, updatedTransactionMeta);
1403
- __classPrivateFieldGet(this, _TransactionController_internalEvents, "f").emit(`${transactionMeta.id}:finished`, updatedTransactionMeta);
1404
- this.messagingSystem.publish(`${controllerName}:transactionRejected`, {
1405
- transactionMeta: updatedTransactionMeta,
1406
- actionId,
1407
- });
1408
- this.onTransactionStatusChange(updatedTransactionMeta);
1409
- }
1410
1390
  /**
1411
1391
  * Trim the amount of transactions that are set on the state. Checks
1412
1392
  * if the length of the tx history is longer then desired persistence
@@ -1784,7 +1764,7 @@ class TransactionController extends base_controller_1.BaseController {
1784
1764
  }
1785
1765
  }
1786
1766
  exports.TransactionController = TransactionController;
1787
- _TransactionController_internalEvents = new WeakMap(), _TransactionController_methodDataHelper = 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, }) {
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, }) {
1788
1768
  // If transaction is found for same action id, do not create a new transaction.
1789
1769
  if (this.getTransactionWithActionId(actionId)) {
1790
1770
  return;
@@ -1849,6 +1829,24 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1849
1829
  actionId,
1850
1830
  });
1851
1831
  afterSubmit?.(newTransactionMeta);
1832
+ }, _TransactionController_rejectTransaction = function _TransactionController_rejectTransaction(transactionId, actionId, error) {
1833
+ const transactionMeta = this.getTransaction(transactionId);
1834
+ if (!transactionMeta) {
1835
+ return;
1836
+ }
1837
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_deleteTransaction).call(this, transactionId);
1838
+ const updatedTransactionMeta = {
1839
+ ...transactionMeta,
1840
+ status: types_1.TransactionStatus.rejected,
1841
+ error: (0, utils_2.normalizeTxError)(error ?? rpc_errors_1.providerErrors.userRejectedRequest()),
1842
+ };
1843
+ this.messagingSystem.publish(`${controllerName}:transactionFinished`, updatedTransactionMeta);
1844
+ __classPrivateFieldGet(this, _TransactionController_internalEvents, "f").emit(`${transactionMeta.id}:finished`, updatedTransactionMeta);
1845
+ this.messagingSystem.publish(`${controllerName}:transactionRejected`, {
1846
+ transactionMeta: updatedTransactionMeta,
1847
+ actionId,
1848
+ });
1849
+ this.onTransactionStatusChange(updatedTransactionMeta);
1852
1850
  }, _TransactionController_getChainId = function _TransactionController_getChainId(networkClientId) {
1853
1851
  return __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").getNetworkClient({ networkClientId })
1854
1852
  .configuration.chainId;
@@ -2096,5 +2094,24 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
2096
2094
  isCustomNetwork,
2097
2095
  txMeta: transactionMeta,
2098
2096
  });
2097
+ }, _TransactionController_deleteTransaction = function _TransactionController_deleteTransaction(transactionId) {
2098
+ this.update((state) => {
2099
+ const transactions = state.transactions.filter(({ id }) => id !== transactionId);
2100
+ state.transactions = this.trimTransactionsForState(transactions);
2101
+ });
2102
+ }, _TransactionController_isRejectError = function _TransactionController_isRejectError(error) {
2103
+ return [
2104
+ rpc_errors_1.errorCodes.provider.userRejectedRequest,
2105
+ rpc_errors_1.errorCodes.rpc.methodNotSupported,
2106
+ ].includes(error.code);
2107
+ }, _TransactionController_rejectTransactionAndThrow = function _TransactionController_rejectTransactionAndThrow(transactionId, actionId, error) {
2108
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_rejectTransaction).call(this, transactionId, actionId, error);
2109
+ if (error.code === rpc_errors_1.errorCodes.provider.userRejectedRequest) {
2110
+ throw rpc_errors_1.providerErrors.userRejectedRequest({
2111
+ message: 'MetaMask Tx Signature: User denied transaction signature.',
2112
+ data: error?.data,
2113
+ });
2114
+ }
2115
+ throw error;
2099
2116
  };
2100
2117
  //# sourceMappingURL=TransactionController.cjs.map