@metamask-previews/transaction-controller 49.0.0-preview-3db01c5 → 49.0.0-preview-4a9f2de

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/TransactionController.cjs +60 -43
  3. package/dist/TransactionController.cjs.map +1 -1
  4. package/dist/TransactionController.d.cts +3 -8
  5. package/dist/TransactionController.d.cts.map +1 -1
  6. package/dist/TransactionController.d.mts +3 -8
  7. package/dist/TransactionController.d.mts.map +1 -1
  8. package/dist/TransactionController.mjs +61 -44
  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 +21 -12
  18. package/dist/types.d.cts.map +1 -1
  19. package/dist/types.d.mts +21 -12
  20. package/dist/types.d.mts.map +1 -1
  21. package/dist/types.mjs.map +1 -1
  22. package/dist/utils/batch.cjs +30 -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 +30 -6
  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 +10 -4
  39. package/dist/utils/feature-flags.cjs.map +1 -1
  40. package/dist/utils/feature-flags.d.cts +12 -5
  41. package/dist/utils/feature-flags.d.cts.map +1 -1
  42. package/dist/utils/feature-flags.d.mts +12 -5
  43. package/dist/utils/feature-flags.d.mts.map +1 -1
  44. package/dist/utils/feature-flags.mjs +10 -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/package.json +2 -1
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_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_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,6 +175,7 @@ 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);
@@ -205,6 +206,7 @@ class TransactionController extends base_controller_1.BaseController {
205
206
  this.securityProviderRequest = securityProviderRequest;
206
207
  __classPrivateFieldSet(this, _TransactionController_incomingTransactionOptions, incomingTransactions, "f");
207
208
  __classPrivateFieldSet(this, _TransactionController_pendingTransactionOptions, pendingTransactions, "f");
209
+ __classPrivateFieldSet(this, _TransactionController_publicKeyEIP7702, publicKeyEIP7702, "f");
208
210
  __classPrivateFieldSet(this, _TransactionController_transactionHistoryLimit, transactionHistoryLimit, "f");
209
211
  this.sign = sign;
210
212
  __classPrivateFieldSet(this, _TransactionController_testGasFeeFlows, testGasFeeFlows === true, "f");
@@ -320,6 +322,7 @@ class TransactionController extends base_controller_1.BaseController {
320
322
  getEthQuery: (networkClientId) => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, { networkClientId }),
321
323
  getInternalAccounts: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getInternalAccounts).bind(this),
322
324
  messenger: this.messagingSystem,
325
+ publicKeyEIP7702: __classPrivateFieldGet(this, _TransactionController_publicKeyEIP7702, "f"),
323
326
  request,
324
327
  });
325
328
  }
@@ -334,6 +337,7 @@ class TransactionController extends base_controller_1.BaseController {
334
337
  address,
335
338
  getEthQuery: (chainId) => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getEthQuery).call(this, { chainId }),
336
339
  messenger: this.messagingSystem,
340
+ publicKeyEIP7702: __classPrivateFieldGet(this, _TransactionController_publicKeyEIP7702, "f"),
337
341
  });
338
342
  }
339
343
  /**
@@ -395,6 +399,13 @@ class TransactionController extends base_controller_1.BaseController {
395
399
  networkClientId,
396
400
  });
397
401
  const transactionType = type ?? (await (0, transaction_type_1.determineTransactionType)(txParams, ethQuery)).type;
402
+ let delegationAddress;
403
+ try {
404
+ delegationAddress = await (0, eip7702_1.getDelegationAddress)(txParams.from, ethQuery);
405
+ }
406
+ catch (error) {
407
+ (0, logger_1.projectLogger)('Error checking if account is upgraded to EIP-7702', error);
408
+ }
398
409
  const existingTransactionMeta = this.getTransactionWithActionId(actionId);
399
410
  // If a request to add a transaction with the same actionId is submitted again, a new transaction will not be created for it.
400
411
  let addedTransactionMeta = existingTransactionMeta
@@ -405,6 +416,7 @@ class TransactionController extends base_controller_1.BaseController {
405
416
  batchId,
406
417
  chainId,
407
418
  dappSuggestedGasFees,
419
+ delegationAddress,
408
420
  deviceConfirmedOn,
409
421
  id: (0, uuid_1.v1)(),
410
422
  isFirstTimeInteraction: undefined,
@@ -439,7 +451,7 @@ class TransactionController extends base_controller_1.BaseController {
439
451
  }
440
452
  addedTransactionMeta = (0, swaps_1.updateSwapsTransaction)(addedTransactionMeta, transactionType, swaps, {
441
453
  isSwapsDisabled: this.isSwapsDisabled,
442
- cancelTransaction: this.cancelTransaction.bind(this),
454
+ cancelTransaction: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_rejectTransaction).bind(this),
443
455
  messenger: this.messagingSystem,
444
456
  });
445
457
  this.addMetadata(addedTransactionMeta);
@@ -1239,18 +1251,13 @@ class TransactionController extends base_controller_1.BaseController {
1239
1251
  actionId,
1240
1252
  });
1241
1253
  }
1242
- // TODO: Replace `any` with type
1243
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
1244
1254
  }
1245
- catch (error) {
1255
+ catch (rawError) {
1256
+ const error = rawError;
1246
1257
  const { isCompleted: isTxCompleted } = this.isTransactionCompleted(transactionId);
1247
1258
  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
- });
1259
+ if (__classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_isRejectError).call(this, error)) {
1260
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_rejectTransactionAndThrow).call(this, transactionId, actionId, error);
1254
1261
  }
1255
1262
  else {
1256
1263
  this.failTransaction(meta, error, actionId);
@@ -1261,8 +1268,9 @@ class TransactionController extends base_controller_1.BaseController {
1261
1268
  const finalMeta = await finishedPromise;
1262
1269
  switch (finalMeta?.status) {
1263
1270
  case types_1.TransactionStatus.failed:
1264
- resultCallbacks?.error(finalMeta.error);
1265
- throw rpc_errors_1.rpcErrors.internal(finalMeta.error.message);
1271
+ const error = finalMeta.error;
1272
+ resultCallbacks?.error(error);
1273
+ throw rpc_errors_1.rpcErrors.internal(error.message);
1266
1274
  case types_1.TransactionStatus.submitted:
1267
1275
  resultCallbacks?.success();
1268
1276
  return finalMeta.hash;
@@ -1389,34 +1397,6 @@ class TransactionController extends base_controller_1.BaseController {
1389
1397
  }
1390
1398
  return transactionHash;
1391
1399
  }
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
1400
  /**
1421
1401
  * Trim the amount of transactions that are set on the state. Checks
1422
1402
  * if the length of the tx history is longer then desired persistence
@@ -1794,7 +1774,7 @@ class TransactionController extends base_controller_1.BaseController {
1794
1774
  }
1795
1775
  }
1796
1776
  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, }) {
1777
+ _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_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
1778
  // If transaction is found for same action id, do not create a new transaction.
1799
1779
  if (this.getTransactionWithActionId(actionId)) {
1800
1780
  return;
@@ -1859,6 +1839,24 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
1859
1839
  actionId,
1860
1840
  });
1861
1841
  afterSubmit?.(newTransactionMeta);
1842
+ }, _TransactionController_rejectTransaction = function _TransactionController_rejectTransaction(transactionId, actionId, error) {
1843
+ const transactionMeta = this.getTransaction(transactionId);
1844
+ if (!transactionMeta) {
1845
+ return;
1846
+ }
1847
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_deleteTransaction).call(this, transactionId);
1848
+ const updatedTransactionMeta = {
1849
+ ...transactionMeta,
1850
+ status: types_1.TransactionStatus.rejected,
1851
+ error: (0, utils_2.normalizeTxError)(error ?? rpc_errors_1.providerErrors.userRejectedRequest()),
1852
+ };
1853
+ this.messagingSystem.publish(`${controllerName}:transactionFinished`, updatedTransactionMeta);
1854
+ __classPrivateFieldGet(this, _TransactionController_internalEvents, "f").emit(`${transactionMeta.id}:finished`, updatedTransactionMeta);
1855
+ this.messagingSystem.publish(`${controllerName}:transactionRejected`, {
1856
+ transactionMeta: updatedTransactionMeta,
1857
+ actionId,
1858
+ });
1859
+ this.onTransactionStatusChange(updatedTransactionMeta);
1862
1860
  }, _TransactionController_getChainId = function _TransactionController_getChainId(networkClientId) {
1863
1861
  return __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").getNetworkClient({ networkClientId })
1864
1862
  .configuration.chainId;
@@ -2106,5 +2104,24 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_me
2106
2104
  isCustomNetwork,
2107
2105
  txMeta: transactionMeta,
2108
2106
  });
2107
+ }, _TransactionController_deleteTransaction = function _TransactionController_deleteTransaction(transactionId) {
2108
+ this.update((state) => {
2109
+ const transactions = state.transactions.filter(({ id }) => id !== transactionId);
2110
+ state.transactions = this.trimTransactionsForState(transactions);
2111
+ });
2112
+ }, _TransactionController_isRejectError = function _TransactionController_isRejectError(error) {
2113
+ return [
2114
+ rpc_errors_1.errorCodes.provider.userRejectedRequest,
2115
+ rpc_errors_1.errorCodes.rpc.methodNotSupported,
2116
+ ].includes(error.code);
2117
+ }, _TransactionController_rejectTransactionAndThrow = function _TransactionController_rejectTransactionAndThrow(transactionId, actionId, error) {
2118
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_rejectTransaction).call(this, transactionId, actionId, error);
2119
+ if (error.code === rpc_errors_1.errorCodes.provider.userRejectedRequest) {
2120
+ throw rpc_errors_1.providerErrors.userRejectedRequest({
2121
+ message: 'MetaMask Tx Signature: User denied transaction signature.',
2122
+ data: error?.data,
2123
+ });
2124
+ }
2125
+ throw error;
2109
2126
  };
2110
2127
  //# sourceMappingURL=TransactionController.cjs.map