@metamask/transaction-controller 40.0.0 → 40.1.0

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 (40) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/dist/TransactionController.cjs +58 -6
  3. package/dist/TransactionController.cjs.map +1 -1
  4. package/dist/TransactionController.d.cts +3 -1
  5. package/dist/TransactionController.d.cts.map +1 -1
  6. package/dist/TransactionController.d.mts +3 -1
  7. package/dist/TransactionController.d.mts.map +1 -1
  8. package/dist/TransactionController.mjs +60 -8
  9. package/dist/TransactionController.mjs.map +1 -1
  10. package/dist/api/accounts-api.cjs +47 -0
  11. package/dist/api/accounts-api.cjs.map +1 -0
  12. package/dist/api/accounts-api.d.cts +43 -0
  13. package/dist/api/accounts-api.d.cts.map +1 -0
  14. package/dist/api/accounts-api.d.mts +43 -0
  15. package/dist/api/accounts-api.d.mts.map +1 -0
  16. package/dist/api/accounts-api.mjs +43 -0
  17. package/dist/api/accounts-api.mjs.map +1 -0
  18. package/dist/errors.cjs +8 -1
  19. package/dist/errors.cjs.map +1 -1
  20. package/dist/errors.d.cts +4 -0
  21. package/dist/errors.d.cts.map +1 -1
  22. package/dist/errors.d.mts +4 -0
  23. package/dist/errors.d.mts.map +1 -1
  24. package/dist/errors.mjs +6 -0
  25. package/dist/errors.mjs.map +1 -1
  26. package/dist/types.cjs.map +1 -1
  27. package/dist/types.d.cts +4 -0
  28. package/dist/types.d.cts.map +1 -1
  29. package/dist/types.d.mts +4 -0
  30. package/dist/types.d.mts.map +1 -1
  31. package/dist/types.mjs.map +1 -1
  32. package/dist/utils/validation.cjs +13 -1
  33. package/dist/utils/validation.cjs.map +1 -1
  34. package/dist/utils/validation.d.cts +7 -0
  35. package/dist/utils/validation.d.cts.map +1 -1
  36. package/dist/utils/validation.d.mts +7 -0
  37. package/dist/utils/validation.d.mts.map +1 -1
  38. package/dist/utils/validation.mjs +11 -0
  39. package/dist/utils/validation.mjs.map +1 -1
  40. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [40.1.0]
11
+
12
+ ### Added
13
+
14
+ - Add `firstTimeInteraction` to transaction meta ([#4895](https://github.com/MetaMask/core/pull/4895))
15
+ - This is a boolean value that indicates whether the transaction is the first time the user has interacted with it.
16
+ - Add `isFirstTimeInteractionEnabled` callback constructor option ([#4895](https://github.com/MetaMask/core/pull/4895))
17
+ - This is a function that returns a boolean value indicating whether the first time interaction check should be enabled.
18
+
10
19
  ## [40.0.0]
11
20
 
12
21
  ### Changed
@@ -1133,7 +1142,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1133
1142
 
1134
1143
  All changes listed after this point were applied to this package following the monorepo conversion.
1135
1144
 
1136
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@40.0.0...HEAD
1145
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@40.1.0...HEAD
1146
+ [40.1.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@40.0.0...@metamask/transaction-controller@40.1.0
1137
1147
  [40.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@39.1.0...@metamask/transaction-controller@40.0.0
1138
1148
  [39.1.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@39.0.0...@metamask/transaction-controller@39.1.0
1139
1149
  [39.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@38.3.0...@metamask/transaction-controller@39.0.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_incomingTransactionOptions, _TransactionController_pendingTransactionOptions, _TransactionController_trace, _TransactionController_transactionHistoryLimit, _TransactionController_isSimulationEnabled, _TransactionController_testGasFeeFlows, _TransactionController_multichainTrackingHelper, _TransactionController_retryTransaction, _TransactionController_createNonceTracker, _TransactionController_createIncomingTransactionHelper, _TransactionController_createPendingTransactionTracker, _TransactionController_checkForPendingTransactionAndStartPolling, _TransactionController_stopAllTracking, _TransactionController_removeIncomingTransactionHelperListeners, _TransactionController_addIncomingTransactionHelperListeners, _TransactionController_removePendingTransactionTrackerListeners, _TransactionController_addPendingTransactionTrackerListeners, _TransactionController_getNonceTrackerPendingTransactions, _TransactionController_getGasFeeFlows, _TransactionController_getLayer1GasFeeFlows, _TransactionController_updateTransactionInternal, _TransactionController_updateSimulationData, _TransactionController_onGasFeePollerTransactionUpdate, _TransactionController_getNetworkClientId, _TransactionController_getGlobalNetworkClientId, _TransactionController_getGlobalChainId, _TransactionController_isCustomNetwork, _TransactionController_getSelectedAccount, _TransactionController_updateSubmitHistory;
16
+ var _TransactionController_instances, _TransactionController_internalEvents, _TransactionController_incomingTransactionOptions, _TransactionController_pendingTransactionOptions, _TransactionController_trace, _TransactionController_transactionHistoryLimit, _TransactionController_isFirstTimeInteractionEnabled, _TransactionController_isSimulationEnabled, _TransactionController_testGasFeeFlows, _TransactionController_multichainTrackingHelper, _TransactionController_retryTransaction, _TransactionController_createNonceTracker, _TransactionController_createIncomingTransactionHelper, _TransactionController_createPendingTransactionTracker, _TransactionController_checkForPendingTransactionAndStartPolling, _TransactionController_stopAllTracking, _TransactionController_removeIncomingTransactionHelperListeners, _TransactionController_addIncomingTransactionHelperListeners, _TransactionController_removePendingTransactionTrackerListeners, _TransactionController_addPendingTransactionTrackerListeners, _TransactionController_getNonceTrackerPendingTransactions, _TransactionController_getGasFeeFlows, _TransactionController_getLayer1GasFeeFlows, _TransactionController_updateTransactionInternal, _TransactionController_updateFirstTimeInteraction, _TransactionController_updateSimulationData, _TransactionController_onGasFeePollerTransactionUpdate, _TransactionController_getNetworkClientId, _TransactionController_getGlobalNetworkClientId, _TransactionController_getGlobalChainId, _TransactionController_isCustomNetwork, _TransactionController_getSelectedAccount, _TransactionController_updateSubmitHistory;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.TransactionController = exports.ApprovalState = exports.SPEED_UP_RATE = exports.CANCEL_RATE = exports.HARDFORK = void 0;
19
19
  const common_1 = require("@ethereumjs/common");
@@ -31,6 +31,7 @@ const eth_method_registry_1 = require("eth-method-registry");
31
31
  const events_1 = require("events");
32
32
  const lodash_1 = require("lodash");
33
33
  const uuid_1 = require("uuid");
34
+ const accounts_api_1 = require("./api/accounts-api.cjs");
34
35
  const DefaultGasFeeFlow_1 = require("./gas-flows/DefaultGasFeeFlow.cjs");
35
36
  const LineaGasFeeFlow_1 = require("./gas-flows/LineaGasFeeFlow.cjs");
36
37
  const OptimismLayer1GasFeeFlow_1 = require("./gas-flows/OptimismLayer1GasFeeFlow.cjs");
@@ -177,6 +178,7 @@ class TransactionController extends base_controller_1.BaseController {
177
178
  * @param options.getSavedGasFees - Gets the saved gas fee config.
178
179
  * @param options.incomingTransactions - Configuration options for incoming transaction support.
179
180
  * @param options.isMultichainEnabled - Enable multichain support.
181
+ * @param options.isFirstTimeInteractionEnabled - Whether first time interaction checks are enabled.
180
182
  * @param options.isSimulationEnabled - Whether new transactions will be automatically simulated.
181
183
  * @param options.messenger - The controller messenger.
182
184
  * @param options.onNetworkStateChange - Allows subscribing to network controller state changes.
@@ -190,7 +192,7 @@ class TransactionController extends base_controller_1.BaseController {
190
192
  * @param options.transactionHistoryLimit - Transaction history limit.
191
193
  * @param options.hooks - The controller hooks.
192
194
  */
193
- constructor({ blockTracker, disableHistory, disableSendFlowHistory, disableSwaps, getCurrentAccountEIP1559Compatibility, getCurrentNetworkEIP1559Compatibility, getExternalPendingTransactions, getGasFeeEstimates, getNetworkClientRegistry, getNetworkState, getPermittedAccounts, getSavedGasFees, incomingTransactions = {}, isMultichainEnabled = false, isSimulationEnabled, messenger, onNetworkStateChange, pendingTransactions = {}, provider, securityProviderRequest, sign, state, testGasFeeFlows, trace, transactionHistoryLimit = 40, hooks, }) {
195
+ constructor({ blockTracker, disableHistory, disableSendFlowHistory, disableSwaps, getCurrentAccountEIP1559Compatibility, getCurrentNetworkEIP1559Compatibility, getExternalPendingTransactions, getGasFeeEstimates, getNetworkClientRegistry, getNetworkState, getPermittedAccounts, getSavedGasFees, incomingTransactions = {}, isMultichainEnabled = false, isFirstTimeInteractionEnabled, isSimulationEnabled, messenger, onNetworkStateChange, pendingTransactions = {}, provider, securityProviderRequest, sign, state, testGasFeeFlows, trace, transactionHistoryLimit = 40, hooks, }) {
194
196
  super({
195
197
  name: controllerName,
196
198
  metadata,
@@ -209,6 +211,7 @@ class TransactionController extends base_controller_1.BaseController {
209
211
  this.signAbortCallbacks = new Map();
210
212
  _TransactionController_trace.set(this, void 0);
211
213
  _TransactionController_transactionHistoryLimit.set(this, void 0);
214
+ _TransactionController_isFirstTimeInteractionEnabled.set(this, void 0);
212
215
  _TransactionController_isSimulationEnabled.set(this, void 0);
213
216
  _TransactionController_testGasFeeFlows.set(this, void 0);
214
217
  _TransactionController_multichainTrackingHelper.set(this, void 0);
@@ -222,6 +225,7 @@ class TransactionController extends base_controller_1.BaseController {
222
225
  this.isSendFlowHistoryDisabled = disableSendFlowHistory ?? false;
223
226
  this.isHistoryDisabled = disableHistory ?? false;
224
227
  this.isSwapsDisabled = disableSwaps ?? false;
228
+ __classPrivateFieldSet(this, _TransactionController_isFirstTimeInteractionEnabled, isFirstTimeInteractionEnabled ?? (() => true), "f");
225
229
  __classPrivateFieldSet(this, _TransactionController_isSimulationEnabled, isSimulationEnabled ?? (() => true), "f");
226
230
  // @ts-expect-error the type in eth-method-registry is inappropriate and should be changed
227
231
  this.registry = new eth_method_registry_1.MethodRegistry({ provider });
@@ -403,15 +407,16 @@ class TransactionController extends base_controller_1.BaseController {
403
407
  dappSuggestedGasFees,
404
408
  deviceConfirmedOn,
405
409
  id: (0, uuid_1.v1)(),
410
+ isFirstTimeInteraction: undefined,
411
+ networkClientId,
406
412
  origin,
407
413
  securityAlertResponse,
408
414
  status: types_1.TransactionStatus.unapproved,
409
415
  time: Date.now(),
410
416
  txParams,
417
+ type: transactionType,
411
418
  userEditedGasLimit: false,
412
419
  verifiedOnBlockchain: false,
413
- type: transactionType,
414
- networkClientId,
415
420
  };
416
421
  await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Estimate Gas Properties', parentContext: traceContext }, (context) => this.updateGasProperties(addedTransactionMeta, {
417
422
  traceContext: context,
@@ -444,9 +449,14 @@ class TransactionController extends base_controller_1.BaseController {
444
449
  (0, logger_1.projectLogger)('Error while updating simulation data', error);
445
450
  throw error;
446
451
  });
452
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateFirstTimeInteraction).call(this, addedTransactionMeta, {
453
+ traceContext,
454
+ }).catch((error) => {
455
+ (0, logger_1.projectLogger)('Error while updating first interaction properties', error);
456
+ });
447
457
  }
448
458
  else {
449
- (0, logger_1.projectLogger)('Skipping simulation as approval not required');
459
+ (0, logger_1.projectLogger)('Skipping simulation & first interaction update as approval not required');
450
460
  }
451
461
  this.messagingSystem.publish(`${controllerName}:unapprovedTransactionAdded`, addedTransactionMeta);
452
462
  }
@@ -1785,7 +1795,7 @@ class TransactionController extends base_controller_1.BaseController {
1785
1795
  }
1786
1796
  }
1787
1797
  exports.TransactionController = TransactionController;
1788
- _TransactionController_internalEvents = new WeakMap(), _TransactionController_incomingTransactionOptions = new WeakMap(), _TransactionController_pendingTransactionOptions = new WeakMap(), _TransactionController_trace = new WeakMap(), _TransactionController_transactionHistoryLimit = 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
+ _TransactionController_internalEvents = 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, }) {
1789
1799
  // If transaction is found for same action id, do not create a new transaction.
1790
1800
  if (this.getTransactionWithActionId(actionId)) {
1791
1801
  return;
@@ -1963,6 +1973,48 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_in
1963
1973
  });
1964
1974
  }
1965
1975
  return transactionMeta;
1976
+ }, _TransactionController_updateFirstTimeInteraction = async function _TransactionController_updateFirstTimeInteraction(transactionMeta, { traceContext, } = {}) {
1977
+ if (!__classPrivateFieldGet(this, _TransactionController_isFirstTimeInteractionEnabled, "f").call(this)) {
1978
+ return;
1979
+ }
1980
+ const { chainId, id: transactionId, txParams: { to, from }, } = transactionMeta;
1981
+ const request = {
1982
+ chainId: (0, utils_1.hexToNumber)(chainId),
1983
+ to: to,
1984
+ from,
1985
+ };
1986
+ (0, validation_1.validateParamTo)(to);
1987
+ const existingTransaction = this.state.transactions.find((tx) => tx.chainId === chainId &&
1988
+ tx.txParams.from === from &&
1989
+ tx.txParams.to === to &&
1990
+ tx.id !== transactionId);
1991
+ // Check if there is an existing transaction with the same from, to, and chainId
1992
+ // else we continue to check the account address relationship from API
1993
+ if (existingTransaction) {
1994
+ return;
1995
+ }
1996
+ try {
1997
+ const { count } = await __classPrivateFieldGet(this, _TransactionController_trace, "f").call(this, { name: 'Account Address Relationship', parentContext: traceContext }, () => (0, accounts_api_1.getAccountAddressRelationship)(request));
1998
+ const isFirstTimeInteraction = count === undefined ? undefined : count === 0;
1999
+ const finalTransactionMeta = this.getTransaction(transactionId);
2000
+ /* istanbul ignore if */
2001
+ if (!finalTransactionMeta) {
2002
+ (0, logger_1.projectLogger)('Cannot update first time interaction as transaction not found', transactionId);
2003
+ return;
2004
+ }
2005
+ __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_updateTransactionInternal).call(this, {
2006
+ transactionId,
2007
+ note: 'TransactionController#updateFirstInteraction - Update first time interaction',
2008
+ }, (txMeta) => {
2009
+ txMeta.isFirstTimeInteraction = isFirstTimeInteraction;
2010
+ });
2011
+ (0, logger_1.projectLogger)('Updated first time interaction', transactionId, {
2012
+ isFirstTimeInteraction,
2013
+ });
2014
+ }
2015
+ catch (error) {
2016
+ (0, logger_1.projectLogger)('Error fetching account address relationship, skipping first time interaction update', error);
2017
+ }
1966
2018
  }, _TransactionController_updateSimulationData = async function _TransactionController_updateSimulationData(transactionMeta, { blockTime, traceContext, } = {}) {
1967
2019
  const { id: transactionId, chainId, txParams, simulationData: prevSimulationData, } = transactionMeta;
1968
2020
  const { from, to, value, data } = txParams;