@metamask-previews/transaction-controller 39.1.0-preview-fd7ad7de → 40.0.0-preview-e6722625

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 (80) hide show
  1. package/CHANGELOG.md +8 -1
  2. package/dist/TransactionController.cjs +47 -44
  3. package/dist/TransactionController.cjs.map +1 -1
  4. package/dist/TransactionController.d.cts +8 -8
  5. package/dist/TransactionController.d.cts.map +1 -1
  6. package/dist/TransactionController.d.mts +8 -8
  7. package/dist/TransactionController.d.mts.map +1 -1
  8. package/dist/TransactionController.mjs +47 -44
  9. package/dist/TransactionController.mjs.map +1 -1
  10. package/dist/constants.cjs +85 -1
  11. package/dist/constants.cjs.map +1 -1
  12. package/dist/constants.d.cts +84 -0
  13. package/dist/constants.d.cts.map +1 -1
  14. package/dist/constants.d.mts +84 -0
  15. package/dist/constants.d.mts.map +1 -1
  16. package/dist/constants.mjs +84 -0
  17. package/dist/constants.mjs.map +1 -1
  18. package/dist/helpers/EtherscanRemoteTransactionSource.cjs +157 -0
  19. package/dist/helpers/EtherscanRemoteTransactionSource.cjs.map +1 -0
  20. package/dist/helpers/EtherscanRemoteTransactionSource.d.cts +16 -0
  21. package/dist/helpers/EtherscanRemoteTransactionSource.d.cts.map +1 -0
  22. package/dist/helpers/EtherscanRemoteTransactionSource.d.mts +16 -0
  23. package/dist/helpers/EtherscanRemoteTransactionSource.d.mts.map +1 -0
  24. package/dist/helpers/EtherscanRemoteTransactionSource.mjs +157 -0
  25. package/dist/helpers/EtherscanRemoteTransactionSource.mjs.map +1 -0
  26. package/dist/helpers/IncomingTransactionHelper.cjs +137 -87
  27. package/dist/helpers/IncomingTransactionHelper.cjs.map +1 -1
  28. package/dist/helpers/IncomingTransactionHelper.d.cts +12 -7
  29. package/dist/helpers/IncomingTransactionHelper.d.cts.map +1 -1
  30. package/dist/helpers/IncomingTransactionHelper.d.mts +12 -7
  31. package/dist/helpers/IncomingTransactionHelper.d.mts.map +1 -1
  32. package/dist/helpers/IncomingTransactionHelper.mjs +137 -87
  33. package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -1
  34. package/dist/helpers/MultichainTrackingHelper.cjs +66 -3
  35. package/dist/helpers/MultichainTrackingHelper.cjs.map +1 -1
  36. package/dist/helpers/MultichainTrackingHelper.d.cts +14 -1
  37. package/dist/helpers/MultichainTrackingHelper.d.cts.map +1 -1
  38. package/dist/helpers/MultichainTrackingHelper.d.mts +14 -1
  39. package/dist/helpers/MultichainTrackingHelper.d.mts.map +1 -1
  40. package/dist/helpers/MultichainTrackingHelper.mjs +66 -3
  41. package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -1
  42. package/dist/index.cjs +2 -1
  43. package/dist/index.cjs.map +1 -1
  44. package/dist/index.d.cts +3 -2
  45. package/dist/index.d.cts.map +1 -1
  46. package/dist/index.d.mts +3 -2
  47. package/dist/index.d.mts.map +1 -1
  48. package/dist/index.mjs +1 -1
  49. package/dist/index.mjs.map +1 -1
  50. package/dist/types.cjs.map +1 -1
  51. package/dist/types.d.cts +8 -11
  52. package/dist/types.d.cts.map +1 -1
  53. package/dist/types.d.mts +8 -11
  54. package/dist/types.d.mts.map +1 -1
  55. package/dist/types.mjs.map +1 -1
  56. package/dist/utils/etherscan.cjs +115 -0
  57. package/dist/utils/etherscan.cjs.map +1 -0
  58. package/dist/utils/etherscan.d.cts +74 -0
  59. package/dist/utils/etherscan.d.cts.map +1 -0
  60. package/dist/utils/etherscan.d.mts +74 -0
  61. package/dist/utils/etherscan.d.mts.map +1 -0
  62. package/dist/utils/etherscan.mjs +109 -0
  63. package/dist/utils/etherscan.mjs.map +1 -0
  64. package/package.json +3 -3
  65. package/dist/api/accounts-api.cjs +0 -66
  66. package/dist/api/accounts-api.cjs.map +0 -1
  67. package/dist/api/accounts-api.d.cts +0 -56
  68. package/dist/api/accounts-api.d.cts.map +0 -1
  69. package/dist/api/accounts-api.d.mts +0 -56
  70. package/dist/api/accounts-api.d.mts.map +0 -1
  71. package/dist/api/accounts-api.mjs +0 -61
  72. package/dist/api/accounts-api.mjs.map +0 -1
  73. package/dist/helpers/AccountsApiRemoteTransactionSource.cjs +0 -132
  74. package/dist/helpers/AccountsApiRemoteTransactionSource.cjs.map +0 -1
  75. package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts +0 -11
  76. package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts.map +0 -1
  77. package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts +0 -11
  78. package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts.map +0 -1
  79. package/dist/helpers/AccountsApiRemoteTransactionSource.mjs +0 -132
  80. package/dist/helpers/AccountsApiRemoteTransactionSource.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [40.0.0]
11
+
12
+ ### Changed
13
+
14
+ - **BREAKING:** Bump `@metamask/accounts-controller` peer dependency from `^19.0.0` to `^20.0.0` ([#4195](https://github.com/MetaMask/core/pull/4956))
15
+
10
16
  ## [39.1.0]
11
17
 
12
18
  ### Changed
@@ -1127,7 +1133,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1127
1133
 
1128
1134
  All changes listed after this point were applied to this package following the monorepo conversion.
1129
1135
 
1130
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@39.1.0...HEAD
1136
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@40.0.0...HEAD
1137
+ [40.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@39.1.0...@metamask/transaction-controller@40.0.0
1131
1138
  [39.1.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@39.0.0...@metamask/transaction-controller@39.1.0
1132
1139
  [39.0.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@38.3.0...@metamask/transaction-controller@39.0.0
1133
1140
  [38.3.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@38.2.0...@metamask/transaction-controller@38.3.0
@@ -36,7 +36,7 @@ const LineaGasFeeFlow_1 = require("./gas-flows/LineaGasFeeFlow.cjs");
36
36
  const OptimismLayer1GasFeeFlow_1 = require("./gas-flows/OptimismLayer1GasFeeFlow.cjs");
37
37
  const ScrollLayer1GasFeeFlow_1 = require("./gas-flows/ScrollLayer1GasFeeFlow.cjs");
38
38
  const TestGasFeeFlow_1 = require("./gas-flows/TestGasFeeFlow.cjs");
39
- const AccountsApiRemoteTransactionSource_1 = require("./helpers/AccountsApiRemoteTransactionSource.cjs");
39
+ const EtherscanRemoteTransactionSource_1 = require("./helpers/EtherscanRemoteTransactionSource.cjs");
40
40
  const GasFeePoller_1 = require("./helpers/GasFeePoller.cjs");
41
41
  const IncomingTransactionHelper_1 = require("./helpers/IncomingTransactionHelper.cjs");
42
42
  const MultichainTrackingHelper_1 = require("./helpers/MultichainTrackingHelper.cjs");
@@ -70,7 +70,7 @@ const metadata = {
70
70
  persist: true,
71
71
  anonymous: false,
72
72
  },
73
- lastFetchedTimestamps: {
73
+ lastFetchedBlockNumbers: {
74
74
  persist: true,
75
75
  anonymous: false,
76
76
  },
@@ -111,7 +111,7 @@ function getDefaultTransactionControllerState() {
111
111
  return {
112
112
  methodData: {},
113
113
  transactions: [],
114
- lastFetchedTimestamps: {},
114
+ lastFetchedBlockNumbers: {},
115
115
  submitHistory: [],
116
116
  };
117
117
  }
@@ -263,20 +263,30 @@ class TransactionController extends base_controller_1.BaseController {
263
263
  isMultichainEnabled,
264
264
  provider,
265
265
  nonceTracker: this.nonceTracker,
266
+ incomingTransactionOptions: incomingTransactions,
266
267
  findNetworkClientIdByChainId,
267
268
  getNetworkClientById: ((networkClientId) => {
268
269
  return this.messagingSystem.call(`NetworkController:getNetworkClientById`, networkClientId);
269
270
  }),
270
271
  getNetworkClientRegistry,
272
+ removeIncomingTransactionHelperListeners: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_removeIncomingTransactionHelperListeners).bind(this),
271
273
  removePendingTransactionTrackerListeners: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_removePendingTransactionTrackerListeners).bind(this),
272
274
  createNonceTracker: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_createNonceTracker).bind(this),
275
+ createIncomingTransactionHelper: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_createIncomingTransactionHelper).bind(this),
273
276
  createPendingTransactionTracker: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_createPendingTransactionTracker).bind(this),
274
277
  onNetworkStateChange: (listener) => {
275
278
  this.messagingSystem.subscribe('NetworkController:stateChange', listener);
276
279
  },
277
280
  }), "f");
278
281
  __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").initialize();
279
- this.incomingTransactionHelper = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_createIncomingTransactionHelper).call(this);
282
+ const etherscanRemoteTransactionSource = new EtherscanRemoteTransactionSource_1.EtherscanRemoteTransactionSource({
283
+ apiKeysByChainId: incomingTransactions.etherscanApiKeysByChainId,
284
+ includeTokenTransfers: incomingTransactions.includeTokenTransfers,
285
+ });
286
+ this.incomingTransactionHelper = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_createIncomingTransactionHelper).call(this, {
287
+ blockTracker,
288
+ etherscanRemoteTransactionSource,
289
+ });
280
290
  this.pendingTransactionTracker = __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_createPendingTransactionTracker).call(this, {
281
291
  provider,
282
292
  blockTracker,
@@ -453,20 +463,27 @@ class TransactionController extends base_controller_1.BaseController {
453
463
  startIncomingTransactionPolling(networkClientIds = []) {
454
464
  if (networkClientIds.length === 0) {
455
465
  this.incomingTransactionHelper.start();
466
+ return;
456
467
  }
468
+ __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").startIncomingTransactionPolling(networkClientIds);
457
469
  }
458
470
  stopIncomingTransactionPolling(networkClientIds = []) {
459
471
  if (networkClientIds.length === 0) {
460
472
  this.incomingTransactionHelper.stop();
473
+ return;
461
474
  }
475
+ __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").stopIncomingTransactionPolling(networkClientIds);
462
476
  }
463
477
  stopAllIncomingTransactionPolling() {
464
478
  this.incomingTransactionHelper.stop();
479
+ __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").stopAllIncomingTransactionPolling();
465
480
  }
466
481
  async updateIncomingTransactions(networkClientIds = []) {
467
482
  if (networkClientIds.length === 0) {
468
483
  await this.incomingTransactionHelper.update();
484
+ return;
469
485
  }
486
+ await __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").updateIncomingTransactions(networkClientIds);
470
487
  }
471
488
  /**
472
489
  * Attempts to cancel a transaction based on its ID by setting its status to "rejected"
@@ -594,45 +611,23 @@ class TransactionController extends base_controller_1.BaseController {
594
611
  * wiped on current network.
595
612
  */
596
613
  wipeTransactions(ignoreNetwork, address) {
597
- (0, logger_1.projectLogger)('Wiping transactions', { ignoreNetwork, address });
598
614
  /* istanbul ignore next */
599
615
  if (ignoreNetwork && !address) {
600
616
  this.update((state) => {
601
617
  state.transactions = [];
602
- state.lastFetchedTimestamps = {};
603
618
  });
604
619
  return;
605
620
  }
606
621
  const currentChainId = this.getChainId();
607
- const { lastFetchedTimestamps, transactions } = this.state;
608
- const newTransactions = transactions.filter((tx) => {
609
- const { chainId, txParams } = tx;
622
+ const newTransactions = this.state.transactions.filter(({ chainId, txParams }) => {
610
623
  const isMatchingNetwork = ignoreNetwork || chainId === currentChainId;
611
624
  if (!isMatchingNetwork) {
612
625
  return true;
613
626
  }
614
- const isMatchingAddress = !address ||
615
- txParams.from?.toLowerCase() === address.toLowerCase() ||
616
- txParams.to?.toLowerCase() === address.toLowerCase();
617
- if (isMatchingAddress) {
618
- (0, logger_1.projectLogger)('Removing transaction', tx);
619
- }
627
+ const isMatchingAddress = !address || txParams.from?.toLowerCase() === address.toLowerCase();
620
628
  return !isMatchingAddress;
621
629
  });
622
- const newLastFetchedTimestamps = Object.keys(lastFetchedTimestamps).reduce((acc, key) => {
623
- const timestamp = lastFetchedTimestamps[key];
624
- const isMatchingNetwork = ignoreNetwork || key.startsWith(`${currentChainId}#`);
625
- const isMatchingAddress = !address || key.endsWith(`#${address.toLowerCase()}`);
626
- if (!isMatchingNetwork || !isMatchingAddress) {
627
- acc[key] = timestamp;
628
- }
629
- else {
630
- (0, logger_1.projectLogger)('Removing last fetched timestamp', { key, timestamp });
631
- }
632
- return acc;
633
- }, {});
634
630
  this.update((state) => {
635
- state.lastFetchedTimestamps = newLastFetchedTimestamps;
636
631
  state.transactions = this.trimTransactionsForState(newTransactions);
637
632
  });
638
633
  }
@@ -1523,20 +1518,24 @@ class TransactionController extends base_controller_1.BaseController {
1523
1518
  };
1524
1519
  return common_1.Common.custom(customChainParams);
1525
1520
  }
1526
- onIncomingTransactions(incomingTransactions) {
1521
+ onIncomingTransactions({ added, updated, }) {
1527
1522
  this.update((state) => {
1528
1523
  const { transactions: currentTransactions } = state;
1529
- state.transactions = this.trimTransactionsForState([
1530
- ...incomingTransactions,
1531
- ...currentTransactions,
1532
- ]);
1524
+ const updatedTransactions = [
1525
+ ...added,
1526
+ ...currentTransactions.map((originalTransaction) => {
1527
+ const updatedTransaction = updated.find(({ hash }) => hash === originalTransaction.hash);
1528
+ return updatedTransaction ?? originalTransaction;
1529
+ }),
1530
+ ];
1531
+ state.transactions = this.trimTransactionsForState(updatedTransactions);
1533
1532
  });
1534
- this.messagingSystem.publish(`${controllerName}:incomingTransactionsReceived`, incomingTransactions);
1535
1533
  }
1536
- onUpdatedLastFetchedTimestamp({ key, timestamp, }) {
1534
+ onUpdatedLastFetchedBlockNumbers({ lastFetchedBlockNumbers, blockNumber, }) {
1537
1535
  this.update((state) => {
1538
- state.lastFetchedTimestamps[key] = timestamp;
1536
+ state.lastFetchedBlockNumbers = lastFetchedBlockNumbers;
1539
1537
  });
1538
+ this.messagingSystem.publish(`${controllerName}:incomingTransactionBlockReceived`, blockNumber);
1540
1539
  }
1541
1540
  generateDappSuggestedGasFees(txParams, origin) {
1542
1541
  if (!origin || origin === controller_utils_1.ORIGIN_METAMASK) {
@@ -1863,14 +1862,18 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_in
1863
1862
  getPendingTransactions: __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getNonceTrackerPendingTransactions).bind(this, chainId),
1864
1863
  getConfirmedTransactions: this.getNonceTrackerTransactions.bind(this, types_1.TransactionStatus.confirmed),
1865
1864
  });
1866
- }, _TransactionController_createIncomingTransactionHelper = function _TransactionController_createIncomingTransactionHelper({ chainId, } = {}) {
1865
+ }, _TransactionController_createIncomingTransactionHelper = function _TransactionController_createIncomingTransactionHelper({ blockTracker, etherscanRemoteTransactionSource, chainId, }) {
1867
1866
  const incomingTransactionHelper = new IncomingTransactionHelper_1.IncomingTransactionHelper({
1867
+ blockTracker,
1868
1868
  getCurrentAccount: () => __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_getSelectedAccount).call(this),
1869
- getLastFetchedTimestamps: () => this.state.lastFetchedTimestamps,
1870
- getChainIds: chainId ? () => [chainId] : () => [this.getChainId()],
1869
+ getLastFetchedBlockNumbers: () => this.state.lastFetchedBlockNumbers,
1870
+ getLocalTransactions: () => this.state.transactions,
1871
+ getChainId: chainId ? () => chainId : this.getChainId.bind(this),
1871
1872
  isEnabled: __classPrivateFieldGet(this, _TransactionController_incomingTransactionOptions, "f").isEnabled,
1872
- remoteTransactionSource: new AccountsApiRemoteTransactionSource_1.AccountsApiRemoteTransactionSource(),
1873
+ queryEntireHistory: __classPrivateFieldGet(this, _TransactionController_incomingTransactionOptions, "f").queryEntireHistory,
1874
+ remoteTransactionSource: etherscanRemoteTransactionSource,
1873
1875
  transactionLimit: __classPrivateFieldGet(this, _TransactionController_transactionHistoryLimit, "f"),
1876
+ updateTransactions: __classPrivateFieldGet(this, _TransactionController_incomingTransactionOptions, "f").updateTransactions,
1874
1877
  });
1875
1878
  __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_addIncomingTransactionHelperListeners).call(this, incomingTransactionHelper);
1876
1879
  return incomingTransactionHelper;
@@ -1903,11 +1906,11 @@ _TransactionController_internalEvents = new WeakMap(), _TransactionController_in
1903
1906
  __classPrivateFieldGet(this, _TransactionController_instances, "m", _TransactionController_removeIncomingTransactionHelperListeners).call(this, this.incomingTransactionHelper);
1904
1907
  __classPrivateFieldGet(this, _TransactionController_multichainTrackingHelper, "f").stopAllTracking();
1905
1908
  }, _TransactionController_removeIncomingTransactionHelperListeners = function _TransactionController_removeIncomingTransactionHelperListeners(incomingTransactionHelper) {
1906
- incomingTransactionHelper.hub.removeAllListeners('incoming-transactions');
1907
- incomingTransactionHelper.hub.removeAllListeners('updated-last-fetched-timestamp');
1909
+ incomingTransactionHelper.hub.removeAllListeners('transactions');
1910
+ incomingTransactionHelper.hub.removeAllListeners('updatedLastFetchedBlockNumbers');
1908
1911
  }, _TransactionController_addIncomingTransactionHelperListeners = function _TransactionController_addIncomingTransactionHelperListeners(incomingTransactionHelper) {
1909
- incomingTransactionHelper.hub.on('incoming-transactions', this.onIncomingTransactions.bind(this));
1910
- incomingTransactionHelper.hub.on('updated-last-fetched-timestamp', this.onUpdatedLastFetchedTimestamp.bind(this));
1912
+ incomingTransactionHelper.hub.on('transactions', this.onIncomingTransactions.bind(this));
1913
+ incomingTransactionHelper.hub.on('updatedLastFetchedBlockNumbers', this.onUpdatedLastFetchedBlockNumbers.bind(this));
1911
1914
  }, _TransactionController_removePendingTransactionTrackerListeners = function _TransactionController_removePendingTransactionTrackerListeners(pendingTransactionTracker) {
1912
1915
  pendingTransactionTracker.hub.removeAllListeners('transaction-confirmed');
1913
1916
  pendingTransactionTracker.hub.removeAllListeners('transaction-dropped');