@metamask-previews/transaction-controller 38.3.0-preview-7692db0d → 38.3.0-preview-de5d2fda

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 (83) hide show
  1. package/dist/TransactionController.cjs +44 -47
  2. package/dist/TransactionController.cjs.map +1 -1
  3. package/dist/TransactionController.d.cts +8 -8
  4. package/dist/TransactionController.d.cts.map +1 -1
  5. package/dist/TransactionController.d.mts +8 -8
  6. package/dist/TransactionController.d.mts.map +1 -1
  7. package/dist/TransactionController.mjs +44 -47
  8. package/dist/TransactionController.mjs.map +1 -1
  9. package/dist/api/accounts-api.cjs +61 -0
  10. package/dist/api/accounts-api.cjs.map +1 -0
  11. package/dist/api/accounts-api.d.cts +56 -0
  12. package/dist/api/accounts-api.d.cts.map +1 -0
  13. package/dist/api/accounts-api.d.mts +56 -0
  14. package/dist/api/accounts-api.d.mts.map +1 -0
  15. package/dist/api/accounts-api.mjs +56 -0
  16. package/dist/api/accounts-api.mjs.map +1 -0
  17. package/dist/helpers/AccountsApiRemoteTransactionSource.cjs +135 -0
  18. package/dist/helpers/AccountsApiRemoteTransactionSource.cjs.map +1 -0
  19. package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts +11 -0
  20. package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts.map +1 -0
  21. package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts +11 -0
  22. package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts.map +1 -0
  23. package/dist/helpers/AccountsApiRemoteTransactionSource.mjs +135 -0
  24. package/dist/helpers/AccountsApiRemoteTransactionSource.mjs.map +1 -0
  25. package/dist/helpers/IncomingTransactionHelper.cjs +96 -134
  26. package/dist/helpers/IncomingTransactionHelper.cjs.map +1 -1
  27. package/dist/helpers/IncomingTransactionHelper.d.cts +7 -12
  28. package/dist/helpers/IncomingTransactionHelper.d.cts.map +1 -1
  29. package/dist/helpers/IncomingTransactionHelper.d.mts +7 -12
  30. package/dist/helpers/IncomingTransactionHelper.d.mts.map +1 -1
  31. package/dist/helpers/IncomingTransactionHelper.mjs +96 -134
  32. package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -1
  33. package/dist/helpers/MultichainTrackingHelper.cjs +3 -66
  34. package/dist/helpers/MultichainTrackingHelper.cjs.map +1 -1
  35. package/dist/helpers/MultichainTrackingHelper.d.cts +1 -14
  36. package/dist/helpers/MultichainTrackingHelper.d.cts.map +1 -1
  37. package/dist/helpers/MultichainTrackingHelper.d.mts +1 -14
  38. package/dist/helpers/MultichainTrackingHelper.d.mts.map +1 -1
  39. package/dist/helpers/MultichainTrackingHelper.mjs +3 -66
  40. package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -1
  41. package/dist/helpers/PendingTransactionTracker.cjs +7 -9
  42. package/dist/helpers/PendingTransactionTracker.cjs.map +1 -1
  43. package/dist/helpers/PendingTransactionTracker.d.cts.map +1 -1
  44. package/dist/helpers/PendingTransactionTracker.d.mts.map +1 -1
  45. package/dist/helpers/PendingTransactionTracker.mjs +7 -9
  46. package/dist/helpers/PendingTransactionTracker.mjs.map +1 -1
  47. package/dist/index.cjs.map +1 -1
  48. package/dist/index.d.cts +1 -2
  49. package/dist/index.d.cts.map +1 -1
  50. package/dist/index.d.mts +1 -2
  51. package/dist/index.d.mts.map +1 -1
  52. package/dist/index.mjs.map +1 -1
  53. package/dist/types.cjs.map +1 -1
  54. package/dist/types.d.cts +7 -8
  55. package/dist/types.d.cts.map +1 -1
  56. package/dist/types.d.mts +7 -8
  57. package/dist/types.d.mts.map +1 -1
  58. package/dist/types.mjs.map +1 -1
  59. package/package.json +1 -1
  60. package/dist/helpers/EtherscanRemoteTransactionSource.cjs +0 -157
  61. package/dist/helpers/EtherscanRemoteTransactionSource.cjs.map +0 -1
  62. package/dist/helpers/EtherscanRemoteTransactionSource.d.cts +0 -16
  63. package/dist/helpers/EtherscanRemoteTransactionSource.d.cts.map +0 -1
  64. package/dist/helpers/EtherscanRemoteTransactionSource.d.mts +0 -16
  65. package/dist/helpers/EtherscanRemoteTransactionSource.d.mts.map +0 -1
  66. package/dist/helpers/EtherscanRemoteTransactionSource.mjs +0 -157
  67. package/dist/helpers/EtherscanRemoteTransactionSource.mjs.map +0 -1
  68. package/dist/helpers/TransactionPoller.cjs +0 -133
  69. package/dist/helpers/TransactionPoller.cjs.map +0 -1
  70. package/dist/helpers/TransactionPoller.d.cts +0 -31
  71. package/dist/helpers/TransactionPoller.d.cts.map +0 -1
  72. package/dist/helpers/TransactionPoller.d.mts +0 -31
  73. package/dist/helpers/TransactionPoller.d.mts.map +0 -1
  74. package/dist/helpers/TransactionPoller.mjs +0 -130
  75. package/dist/helpers/TransactionPoller.mjs.map +0 -1
  76. package/dist/utils/etherscan.cjs +0 -115
  77. package/dist/utils/etherscan.cjs.map +0 -1
  78. package/dist/utils/etherscan.d.cts +0 -74
  79. package/dist/utils/etherscan.d.cts.map +0 -1
  80. package/dist/utils/etherscan.d.mts +0 -74
  81. package/dist/utils/etherscan.d.mts.map +0 -1
  82. package/dist/utils/etherscan.mjs +0 -109
  83. package/dist/utils/etherscan.mjs.map +0 -1
@@ -13,57 +13,32 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
13
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
15
  };
16
- var _IncomingTransactionHelper_instances, _IncomingTransactionHelper_blockTracker, _IncomingTransactionHelper_getCurrentAccount, _IncomingTransactionHelper_getLastFetchedBlockNumbers, _IncomingTransactionHelper_getLocalTransactions, _IncomingTransactionHelper_getChainId, _IncomingTransactionHelper_isEnabled, _IncomingTransactionHelper_isRunning, _IncomingTransactionHelper_mutex, _IncomingTransactionHelper_onLatestBlock, _IncomingTransactionHelper_queryEntireHistory, _IncomingTransactionHelper_remoteTransactionSource, _IncomingTransactionHelper_transactionLimit, _IncomingTransactionHelper_updateTransactions, _IncomingTransactionHelper_sortTransactionsByTime, _IncomingTransactionHelper_getNewTransactions, _IncomingTransactionHelper_getUpdatedTransactions, _IncomingTransactionHelper_isTransactionOutdated, _IncomingTransactionHelper_getLastFetchedBlockNumberDec, _IncomingTransactionHelper_getFromBlock, _IncomingTransactionHelper_updateLastFetchedBlockNumber, _IncomingTransactionHelper_getBlockNumberKey, _IncomingTransactionHelper_canStart;
16
+ var _IncomingTransactionHelper_instances, _IncomingTransactionHelper_getCurrentAccount, _IncomingTransactionHelper_getLastFetchedTimestamps, _IncomingTransactionHelper_getChainIds, _IncomingTransactionHelper_isEnabled, _IncomingTransactionHelper_isRunning, _IncomingTransactionHelper_remoteTransactionSource, _IncomingTransactionHelper_timeoutId, _IncomingTransactionHelper_transactionLimit, _IncomingTransactionHelper_onInterval, _IncomingTransactionHelper_sortTransactionsByTime, _IncomingTransactionHelper_getStartTimestampByChainId, _IncomingTransactionHelper_getLastFetchedTimestamp, _IncomingTransactionHelper_updateLastFetchedTimestamp, _IncomingTransactionHelper_getTimestampKey, _IncomingTransactionHelper_canStart, _IncomingTransactionHelper_getTimestampSeconds;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.IncomingTransactionHelper = void 0;
19
- const async_mutex_1 = require("async-mutex");
20
19
  const events_1 = __importDefault(require("events"));
21
20
  const logger_1 = require("../logger.cjs");
22
- const RECENT_HISTORY_BLOCK_RANGE = 10;
23
- // TODO: Replace `any` with type
24
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
- const UPDATE_CHECKS = [
26
- (txMeta) => txMeta.status,
27
- (txMeta) => txMeta.txParams.gasUsed,
28
- ];
21
+ const FIRST_QUERY_HISTORY_DURATION = 1000 * 60 * 60 * 24 * 2; // 2 Days
22
+ const INTERVAL = 1000 * 30; // 30 Seconds
29
23
  class IncomingTransactionHelper {
30
- constructor({ blockTracker, getCurrentAccount, getLastFetchedBlockNumbers, getLocalTransactions, getChainId, isEnabled, queryEntireHistory, remoteTransactionSource, transactionLimit, updateTransactions, }) {
24
+ constructor({ getCurrentAccount, getLastFetchedTimestamps, getChainIds, isEnabled, remoteTransactionSource, transactionLimit, }) {
31
25
  _IncomingTransactionHelper_instances.add(this);
32
- _IncomingTransactionHelper_blockTracker.set(this, void 0);
33
26
  _IncomingTransactionHelper_getCurrentAccount.set(this, void 0);
34
- _IncomingTransactionHelper_getLastFetchedBlockNumbers.set(this, void 0);
35
- _IncomingTransactionHelper_getLocalTransactions.set(this, void 0);
36
- _IncomingTransactionHelper_getChainId.set(this, void 0);
27
+ _IncomingTransactionHelper_getLastFetchedTimestamps.set(this, void 0);
28
+ _IncomingTransactionHelper_getChainIds.set(this, void 0);
37
29
  _IncomingTransactionHelper_isEnabled.set(this, void 0);
38
30
  _IncomingTransactionHelper_isRunning.set(this, void 0);
39
- _IncomingTransactionHelper_mutex.set(this, new async_mutex_1.Mutex());
40
- _IncomingTransactionHelper_onLatestBlock.set(this, void 0);
41
- _IncomingTransactionHelper_queryEntireHistory.set(this, void 0);
42
31
  _IncomingTransactionHelper_remoteTransactionSource.set(this, void 0);
32
+ _IncomingTransactionHelper_timeoutId.set(this, void 0);
43
33
  _IncomingTransactionHelper_transactionLimit.set(this, void 0);
44
- _IncomingTransactionHelper_updateTransactions.set(this, void 0);
45
34
  this.hub = new events_1.default();
46
- __classPrivateFieldSet(this, _IncomingTransactionHelper_blockTracker, blockTracker, "f");
47
35
  __classPrivateFieldSet(this, _IncomingTransactionHelper_getCurrentAccount, getCurrentAccount, "f");
48
- __classPrivateFieldSet(this, _IncomingTransactionHelper_getLastFetchedBlockNumbers, getLastFetchedBlockNumbers, "f");
49
- __classPrivateFieldSet(this, _IncomingTransactionHelper_getLocalTransactions, getLocalTransactions || (() => []), "f");
50
- __classPrivateFieldSet(this, _IncomingTransactionHelper_getChainId, getChainId, "f");
36
+ __classPrivateFieldSet(this, _IncomingTransactionHelper_getLastFetchedTimestamps, getLastFetchedTimestamps, "f");
37
+ __classPrivateFieldSet(this, _IncomingTransactionHelper_getChainIds, getChainIds, "f");
51
38
  __classPrivateFieldSet(this, _IncomingTransactionHelper_isEnabled, isEnabled ?? (() => true), "f");
52
39
  __classPrivateFieldSet(this, _IncomingTransactionHelper_isRunning, false, "f");
53
- __classPrivateFieldSet(this, _IncomingTransactionHelper_queryEntireHistory, queryEntireHistory ?? true, "f");
54
40
  __classPrivateFieldSet(this, _IncomingTransactionHelper_remoteTransactionSource, remoteTransactionSource, "f");
55
41
  __classPrivateFieldSet(this, _IncomingTransactionHelper_transactionLimit, transactionLimit, "f");
56
- __classPrivateFieldSet(this, _IncomingTransactionHelper_updateTransactions, updateTransactions ?? false, "f");
57
- // Using a property instead of a method to provide a listener reference
58
- // with the correct scope that we can remove later if stopped.
59
- __classPrivateFieldSet(this, _IncomingTransactionHelper_onLatestBlock, async (blockNumberHex) => {
60
- try {
61
- await this.update(blockNumberHex);
62
- }
63
- catch (error) {
64
- console.error('Error while checking incoming transactions', error);
65
- }
66
- }, "f");
67
42
  }
68
43
  start() {
69
44
  if (__classPrivateFieldGet(this, _IncomingTransactionHelper_isRunning, "f")) {
@@ -72,128 +47,115 @@ class IncomingTransactionHelper {
72
47
  if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_canStart).call(this)) {
73
48
  return;
74
49
  }
75
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
76
50
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
77
- __classPrivateFieldGet(this, _IncomingTransactionHelper_blockTracker, "f").addListener('latest', __classPrivateFieldGet(this, _IncomingTransactionHelper_onLatestBlock, "f"));
51
+ __classPrivateFieldSet(this, _IncomingTransactionHelper_timeoutId, setTimeout(() => __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onInterval).call(this), INTERVAL), "f");
78
52
  __classPrivateFieldSet(this, _IncomingTransactionHelper_isRunning, true, "f");
53
+ (0, logger_1.incomingTransactionsLogger)('Started polling');
79
54
  }
80
55
  stop() {
81
- // TODO: Either fix this lint violation or explain why it's necessary to ignore.
82
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
83
- __classPrivateFieldGet(this, _IncomingTransactionHelper_blockTracker, "f").removeListener('latest', __classPrivateFieldGet(this, _IncomingTransactionHelper_onLatestBlock, "f"));
56
+ if (__classPrivateFieldGet(this, _IncomingTransactionHelper_timeoutId, "f")) {
57
+ clearTimeout(__classPrivateFieldGet(this, _IncomingTransactionHelper_timeoutId, "f"));
58
+ }
59
+ if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_isRunning, "f")) {
60
+ return;
61
+ }
84
62
  __classPrivateFieldSet(this, _IncomingTransactionHelper_isRunning, false, "f");
63
+ (0, logger_1.incomingTransactionsLogger)('Stopped polling');
85
64
  }
86
- async update(latestBlockNumberHex) {
87
- const releaseLock = await __classPrivateFieldGet(this, _IncomingTransactionHelper_mutex, "f").acquire();
88
- (0, logger_1.incomingTransactionsLogger)('Checking for incoming transactions');
65
+ async update({ isInterval } = {}) {
66
+ (0, logger_1.incomingTransactionsLogger)('Checking for incoming transactions', {
67
+ isInterval: Boolean(isInterval),
68
+ });
69
+ if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_canStart).call(this)) {
70
+ return;
71
+ }
72
+ const account = __classPrivateFieldGet(this, _IncomingTransactionHelper_getCurrentAccount, "f").call(this);
73
+ const chainIds = __classPrivateFieldGet(this, _IncomingTransactionHelper_getChainIds, "f").call(this);
74
+ const startTimestampByChainId = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getStartTimestampByChainId).call(this, chainIds);
75
+ let remoteTransactions = [];
89
76
  try {
90
- if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_canStart).call(this)) {
91
- return;
92
- }
93
- const latestBlockNumber = parseInt(latestBlockNumberHex || (await __classPrivateFieldGet(this, _IncomingTransactionHelper_blockTracker, "f").getLatestBlock()), 16);
94
- const additionalLastFetchedKeys = __classPrivateFieldGet(this, _IncomingTransactionHelper_remoteTransactionSource, "f").getLastBlockVariations?.() ?? [];
95
- const fromBlock = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getFromBlock).call(this, latestBlockNumber);
96
- const account = __classPrivateFieldGet(this, _IncomingTransactionHelper_getCurrentAccount, "f").call(this);
97
- const currentChainId = __classPrivateFieldGet(this, _IncomingTransactionHelper_getChainId, "f").call(this);
98
- let remoteTransactions = [];
99
- try {
100
- remoteTransactions =
101
- await __classPrivateFieldGet(this, _IncomingTransactionHelper_remoteTransactionSource, "f").fetchTransactions({
102
- address: account.address,
103
- currentChainId,
104
- fromBlock,
105
- limit: __classPrivateFieldGet(this, _IncomingTransactionHelper_transactionLimit, "f"),
106
- });
107
- // TODO: Replace `any` with type
108
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
109
- }
110
- catch (error) {
111
- (0, logger_1.incomingTransactionsLogger)('Error while fetching remote transactions', error);
112
- return;
113
- }
114
- if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_updateTransactions, "f")) {
115
- const address = account.address.toLowerCase();
116
- remoteTransactions = remoteTransactions.filter((tx) => tx.txParams.to?.toLowerCase() === address);
117
- }
118
- const localTransactions = !__classPrivateFieldGet(this, _IncomingTransactionHelper_updateTransactions, "f")
119
- ? []
120
- : __classPrivateFieldGet(this, _IncomingTransactionHelper_getLocalTransactions, "f").call(this);
121
- const newTransactions = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getNewTransactions).call(this, remoteTransactions, localTransactions);
122
- const updatedTransactions = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getUpdatedTransactions).call(this, remoteTransactions, localTransactions);
123
- if (newTransactions.length > 0 || updatedTransactions.length > 0) {
124
- __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_sortTransactionsByTime).call(this, newTransactions);
125
- __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_sortTransactionsByTime).call(this, updatedTransactions);
126
- (0, logger_1.incomingTransactionsLogger)('Found incoming transactions', {
127
- new: newTransactions,
128
- updated: updatedTransactions,
77
+ remoteTransactions =
78
+ await __classPrivateFieldGet(this, _IncomingTransactionHelper_remoteTransactionSource, "f").fetchTransactions({
79
+ address: account.address,
80
+ chainIds,
81
+ startTimestampByChainId,
82
+ limit: __classPrivateFieldGet(this, _IncomingTransactionHelper_transactionLimit, "f"),
129
83
  });
130
- this.hub.emit('transactions', {
131
- added: newTransactions,
132
- updated: updatedTransactions,
133
- });
134
- }
135
- __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_updateLastFetchedBlockNumber).call(this, remoteTransactions, additionalLastFetchedKeys);
136
84
  }
137
- finally {
138
- releaseLock();
85
+ catch (error) {
86
+ (0, logger_1.incomingTransactionsLogger)('Error while fetching remote transactions', error);
87
+ return;
88
+ }
89
+ if (remoteTransactions.length > 0) {
90
+ __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_sortTransactionsByTime).call(this, remoteTransactions);
91
+ (0, logger_1.incomingTransactionsLogger)('Found incoming transactions', { remoteTransactions });
92
+ this.hub.emit('incoming-transactions', remoteTransactions);
93
+ }
94
+ for (const chainId of chainIds) {
95
+ __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_updateLastFetchedTimestamp).call(this, chainId, remoteTransactions);
139
96
  }
140
97
  }
141
98
  }
142
99
  exports.IncomingTransactionHelper = IncomingTransactionHelper;
143
- _IncomingTransactionHelper_blockTracker = new WeakMap(), _IncomingTransactionHelper_getCurrentAccount = new WeakMap(), _IncomingTransactionHelper_getLastFetchedBlockNumbers = new WeakMap(), _IncomingTransactionHelper_getLocalTransactions = new WeakMap(), _IncomingTransactionHelper_getChainId = new WeakMap(), _IncomingTransactionHelper_isEnabled = new WeakMap(), _IncomingTransactionHelper_isRunning = new WeakMap(), _IncomingTransactionHelper_mutex = new WeakMap(), _IncomingTransactionHelper_onLatestBlock = new WeakMap(), _IncomingTransactionHelper_queryEntireHistory = new WeakMap(), _IncomingTransactionHelper_remoteTransactionSource = new WeakMap(), _IncomingTransactionHelper_transactionLimit = new WeakMap(), _IncomingTransactionHelper_updateTransactions = new WeakMap(), _IncomingTransactionHelper_instances = new WeakSet(), _IncomingTransactionHelper_sortTransactionsByTime = function _IncomingTransactionHelper_sortTransactionsByTime(transactions) {
144
- transactions.sort((a, b) => (a.time < b.time ? -1 : 1));
145
- }, _IncomingTransactionHelper_getNewTransactions = function _IncomingTransactionHelper_getNewTransactions(remoteTxs, localTxs) {
146
- return remoteTxs.filter((tx) => !localTxs.some(({ hash }) => hash === tx.hash));
147
- }, _IncomingTransactionHelper_getUpdatedTransactions = function _IncomingTransactionHelper_getUpdatedTransactions(remoteTxs, localTxs) {
148
- return remoteTxs.filter((remoteTx) => localTxs.some((localTx) => remoteTx.hash === localTx.hash &&
149
- __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_isTransactionOutdated).call(this, remoteTx, localTx)));
150
- }, _IncomingTransactionHelper_isTransactionOutdated = function _IncomingTransactionHelper_isTransactionOutdated(remoteTx, localTx) {
151
- return UPDATE_CHECKS.some((getValue) => getValue(remoteTx) !== getValue(localTx));
152
- }, _IncomingTransactionHelper_getLastFetchedBlockNumberDec = function _IncomingTransactionHelper_getLastFetchedBlockNumberDec() {
153
- const additionalLastFetchedKeys = __classPrivateFieldGet(this, _IncomingTransactionHelper_remoteTransactionSource, "f").getLastBlockVariations?.() ?? [];
154
- const lastFetchedKey = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getBlockNumberKey).call(this, additionalLastFetchedKeys);
155
- const lastFetchedBlockNumbers = __classPrivateFieldGet(this, _IncomingTransactionHelper_getLastFetchedBlockNumbers, "f").call(this);
156
- return lastFetchedBlockNumbers[lastFetchedKey];
157
- }, _IncomingTransactionHelper_getFromBlock = function _IncomingTransactionHelper_getFromBlock(latestBlockNumber) {
158
- const lastFetchedBlockNumber = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getLastFetchedBlockNumberDec).call(this);
159
- if (lastFetchedBlockNumber) {
160
- return lastFetchedBlockNumber + 1;
100
+ _IncomingTransactionHelper_getCurrentAccount = new WeakMap(), _IncomingTransactionHelper_getLastFetchedTimestamps = new WeakMap(), _IncomingTransactionHelper_getChainIds = new WeakMap(), _IncomingTransactionHelper_isEnabled = new WeakMap(), _IncomingTransactionHelper_isRunning = new WeakMap(), _IncomingTransactionHelper_remoteTransactionSource = new WeakMap(), _IncomingTransactionHelper_timeoutId = new WeakMap(), _IncomingTransactionHelper_transactionLimit = new WeakMap(), _IncomingTransactionHelper_instances = new WeakSet(), _IncomingTransactionHelper_onInterval = async function _IncomingTransactionHelper_onInterval() {
101
+ try {
102
+ await this.update({ isInterval: true });
103
+ }
104
+ catch (error) {
105
+ console.error('Error while checking incoming transactions', error);
161
106
  }
162
- return __classPrivateFieldGet(this, _IncomingTransactionHelper_queryEntireHistory, "f")
163
- ? undefined
164
- : latestBlockNumber - RECENT_HISTORY_BLOCK_RANGE;
165
- }, _IncomingTransactionHelper_updateLastFetchedBlockNumber = function _IncomingTransactionHelper_updateLastFetchedBlockNumber(remoteTxs, additionalKeys) {
166
- let lastFetchedBlockNumber = -1;
167
- for (const tx of remoteTxs) {
168
- const currentBlockNumberValue = tx.blockNumber
169
- ? parseInt(tx.blockNumber, 10)
170
- : -1;
171
- lastFetchedBlockNumber = Math.max(lastFetchedBlockNumber, currentBlockNumberValue);
107
+ if (__classPrivateFieldGet(this, _IncomingTransactionHelper_isRunning, "f")) {
108
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
109
+ __classPrivateFieldSet(this, _IncomingTransactionHelper_timeoutId, setTimeout(() => __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onInterval).call(this), INTERVAL), "f");
110
+ }
111
+ }, _IncomingTransactionHelper_sortTransactionsByTime = function _IncomingTransactionHelper_sortTransactionsByTime(transactions) {
112
+ transactions.sort((a, b) => (a.time < b.time ? -1 : 1));
113
+ }, _IncomingTransactionHelper_getStartTimestampByChainId = function _IncomingTransactionHelper_getStartTimestampByChainId(chainIds) {
114
+ return chainIds.reduce((acc, chainId) => {
115
+ const lastFetchedTimestamp = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getLastFetchedTimestamp).call(this, chainId);
116
+ const startTimestamp = lastFetchedTimestamp
117
+ ? lastFetchedTimestamp + 1
118
+ : __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getTimestampSeconds).call(this, Date.now() - FIRST_QUERY_HISTORY_DURATION);
119
+ return { ...acc, [chainId]: startTimestamp };
120
+ }, {});
121
+ }, _IncomingTransactionHelper_getLastFetchedTimestamp = function _IncomingTransactionHelper_getLastFetchedTimestamp(chainId) {
122
+ const lastFetchedKey = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getTimestampKey).call(this, chainId);
123
+ const lastFetchedTimestamps = __classPrivateFieldGet(this, _IncomingTransactionHelper_getLastFetchedTimestamps, "f").call(this);
124
+ return lastFetchedTimestamps[lastFetchedKey];
125
+ }, _IncomingTransactionHelper_updateLastFetchedTimestamp = function _IncomingTransactionHelper_updateLastFetchedTimestamp(chainId, remoteTxs) {
126
+ const chainTxs = remoteTxs.filter((tx) => tx.chainId === chainId);
127
+ let lastFetchedTimestamp = -1;
128
+ for (const tx of chainTxs) {
129
+ const currentTimestamp = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getTimestampSeconds).call(this, tx.time);
130
+ lastFetchedTimestamp = Math.max(lastFetchedTimestamp, currentTimestamp);
172
131
  }
173
- if (lastFetchedBlockNumber === -1) {
132
+ if (lastFetchedTimestamp === -1) {
174
133
  return;
175
134
  }
176
- const lastFetchedKey = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getBlockNumberKey).call(this, additionalKeys);
177
- const lastFetchedBlockNumbers = __classPrivateFieldGet(this, _IncomingTransactionHelper_getLastFetchedBlockNumbers, "f").call(this);
178
- const previousValue = lastFetchedBlockNumbers[lastFetchedKey];
179
- if (previousValue >= lastFetchedBlockNumber) {
135
+ const lastFetchedKey = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getTimestampKey).call(this, chainId);
136
+ const lastFetchedTimestamps = __classPrivateFieldGet(this, _IncomingTransactionHelper_getLastFetchedTimestamps, "f").call(this);
137
+ const previousValue = lastFetchedTimestamps[lastFetchedKey];
138
+ if (previousValue >= lastFetchedTimestamp) {
180
139
  return;
181
140
  }
182
- this.hub.emit('updatedLastFetchedBlockNumbers', {
183
- lastFetchedBlockNumbers: {
184
- ...lastFetchedBlockNumbers,
185
- [lastFetchedKey]: lastFetchedBlockNumber,
186
- },
187
- blockNumber: lastFetchedBlockNumber,
141
+ (0, logger_1.incomingTransactionsLogger)('Updating last fetched timestamp', {
142
+ key: lastFetchedKey,
143
+ timestamp: lastFetchedTimestamp,
144
+ });
145
+ this.hub.emit('updated-last-fetched-timestamp', {
146
+ key: lastFetchedKey,
147
+ timestamp: lastFetchedTimestamp,
188
148
  });
189
- }, _IncomingTransactionHelper_getBlockNumberKey = function _IncomingTransactionHelper_getBlockNumberKey(additionalKeys) {
190
- const currentChainId = __classPrivateFieldGet(this, _IncomingTransactionHelper_getChainId, "f").call(this);
149
+ }, _IncomingTransactionHelper_getTimestampKey = function _IncomingTransactionHelper_getTimestampKey(chainId) {
191
150
  const currentAccount = __classPrivateFieldGet(this, _IncomingTransactionHelper_getCurrentAccount, "f").call(this)?.address.toLowerCase();
192
- return [currentChainId, currentAccount, ...additionalKeys].join('#');
151
+ return [chainId, currentAccount].join('#');
193
152
  }, _IncomingTransactionHelper_canStart = function _IncomingTransactionHelper_canStart() {
194
153
  const isEnabled = __classPrivateFieldGet(this, _IncomingTransactionHelper_isEnabled, "f").call(this);
195
- const currentChainId = __classPrivateFieldGet(this, _IncomingTransactionHelper_getChainId, "f").call(this);
196
- const isSupportedNetwork = __classPrivateFieldGet(this, _IncomingTransactionHelper_remoteTransactionSource, "f").isSupportedNetwork(currentChainId);
197
- return isEnabled && isSupportedNetwork;
154
+ const chainIds = __classPrivateFieldGet(this, _IncomingTransactionHelper_getChainIds, "f").call(this);
155
+ const supportedChainIds = __classPrivateFieldGet(this, _IncomingTransactionHelper_remoteTransactionSource, "f").getSupportedChains();
156
+ const isAnyChainSupported = chainIds.some((chainId) => supportedChainIds.includes(chainId));
157
+ return isEnabled && isAnyChainSupported;
158
+ }, _IncomingTransactionHelper_getTimestampSeconds = function _IncomingTransactionHelper_getTimestampSeconds(timestampMilliseconds) {
159
+ return Math.ceil(timestampMilliseconds / 1000);
198
160
  };
199
161
  //# sourceMappingURL=IncomingTransactionHelper.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"IncomingTransactionHelper.cjs","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsController } from '@metamask/accounts-controller';\nimport type { BlockTracker } from '@metamask/network-controller';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport EventEmitter from 'events';\n\nimport { incomingTransactionsLogger as log } from '../logger';\nimport type { RemoteTransactionSource, TransactionMeta } from '../types';\n\nconst RECENT_HISTORY_BLOCK_RANGE = 10;\n\n// TODO: Replace `any` with type\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst UPDATE_CHECKS: ((txMeta: TransactionMeta) => any)[] = [\n (txMeta) => txMeta.status,\n (txMeta) => txMeta.txParams.gasUsed,\n];\n\n/**\n * Configuration options for the IncomingTransactionHelper\n *\n * @property includeTokenTransfers - Whether or not to include ERC20 token transfers.\n * @property isEnabled - Whether or not incoming transaction retrieval is enabled.\n * @property queryEntireHistory - Whether to initially query the entire transaction history or only recent blocks.\n * @property updateTransactions - Whether to update local transactions using remote transaction data.\n */\nexport type IncomingTransactionOptions = {\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n queryEntireHistory?: boolean;\n updateTransactions?: boolean;\n};\n\nexport class IncomingTransactionHelper {\n hub: EventEmitter;\n\n #blockTracker: BlockTracker;\n\n #getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n\n #getLastFetchedBlockNumbers: () => Record<string, number>;\n\n #getLocalTransactions: () => TransactionMeta[];\n\n #getChainId: () => Hex;\n\n #isEnabled: () => boolean;\n\n #isRunning: boolean;\n\n #mutex = new Mutex();\n\n #onLatestBlock: (blockNumberHex: Hex) => Promise<void>;\n\n #queryEntireHistory: boolean;\n\n #remoteTransactionSource: RemoteTransactionSource;\n\n #transactionLimit?: number;\n\n #updateTransactions: boolean;\n\n constructor({\n blockTracker,\n getCurrentAccount,\n getLastFetchedBlockNumbers,\n getLocalTransactions,\n getChainId,\n isEnabled,\n queryEntireHistory,\n remoteTransactionSource,\n transactionLimit,\n updateTransactions,\n }: {\n blockTracker: BlockTracker;\n getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n getLastFetchedBlockNumbers: () => Record<string, number>;\n getLocalTransactions?: () => TransactionMeta[];\n getChainId: () => Hex;\n isEnabled?: () => boolean;\n queryEntireHistory?: boolean;\n remoteTransactionSource: RemoteTransactionSource;\n transactionLimit?: number;\n updateTransactions?: boolean;\n }) {\n this.hub = new EventEmitter();\n\n this.#blockTracker = blockTracker;\n this.#getCurrentAccount = getCurrentAccount;\n this.#getLastFetchedBlockNumbers = getLastFetchedBlockNumbers;\n this.#getLocalTransactions = getLocalTransactions || (() => []);\n this.#getChainId = getChainId;\n this.#isEnabled = isEnabled ?? (() => true);\n this.#isRunning = false;\n this.#queryEntireHistory = queryEntireHistory ?? true;\n this.#remoteTransactionSource = remoteTransactionSource;\n this.#transactionLimit = transactionLimit;\n this.#updateTransactions = updateTransactions ?? false;\n\n // Using a property instead of a method to provide a listener reference\n // with the correct scope that we can remove later if stopped.\n this.#onLatestBlock = async (blockNumberHex: Hex) => {\n try {\n await this.update(blockNumberHex);\n } catch (error) {\n console.error('Error while checking incoming transactions', error);\n }\n };\n }\n\n start() {\n if (this.#isRunning) {\n return;\n }\n\n if (!this.#canStart()) {\n return;\n }\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#blockTracker.addListener('latest', this.#onLatestBlock);\n this.#isRunning = true;\n }\n\n stop() {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#blockTracker.removeListener('latest', this.#onLatestBlock);\n this.#isRunning = false;\n }\n\n async update(latestBlockNumberHex?: Hex): Promise<void> {\n const releaseLock = await this.#mutex.acquire();\n\n log('Checking for incoming transactions');\n\n try {\n if (!this.#canStart()) {\n return;\n }\n\n const latestBlockNumber = parseInt(\n latestBlockNumberHex || (await this.#blockTracker.getLatestBlock()),\n 16,\n );\n\n const additionalLastFetchedKeys =\n this.#remoteTransactionSource.getLastBlockVariations?.() ?? [];\n\n const fromBlock = this.#getFromBlock(latestBlockNumber);\n const account = this.#getCurrentAccount();\n const currentChainId = this.#getChainId();\n\n let remoteTransactions = [];\n\n try {\n remoteTransactions =\n await this.#remoteTransactionSource.fetchTransactions({\n address: account.address,\n currentChainId,\n fromBlock,\n limit: this.#transactionLimit,\n });\n // TODO: Replace `any` with type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (error: any) {\n log('Error while fetching remote transactions', error);\n return;\n }\n if (!this.#updateTransactions) {\n const address = account.address.toLowerCase();\n remoteTransactions = remoteTransactions.filter(\n (tx) => tx.txParams.to?.toLowerCase() === address,\n );\n }\n\n const localTransactions = !this.#updateTransactions\n ? []\n : this.#getLocalTransactions();\n\n const newTransactions = this.#getNewTransactions(\n remoteTransactions,\n localTransactions,\n );\n\n const updatedTransactions = this.#getUpdatedTransactions(\n remoteTransactions,\n localTransactions,\n );\n\n if (newTransactions.length > 0 || updatedTransactions.length > 0) {\n this.#sortTransactionsByTime(newTransactions);\n this.#sortTransactionsByTime(updatedTransactions);\n\n log('Found incoming transactions', {\n new: newTransactions,\n updated: updatedTransactions,\n });\n\n this.hub.emit('transactions', {\n added: newTransactions,\n updated: updatedTransactions,\n });\n }\n this.#updateLastFetchedBlockNumber(\n remoteTransactions,\n additionalLastFetchedKeys,\n );\n } finally {\n releaseLock();\n }\n }\n\n #sortTransactionsByTime(transactions: TransactionMeta[]) {\n transactions.sort((a, b) => (a.time < b.time ? -1 : 1));\n }\n\n #getNewTransactions(\n remoteTxs: TransactionMeta[],\n localTxs: TransactionMeta[],\n ): TransactionMeta[] {\n return remoteTxs.filter(\n (tx) => !localTxs.some(({ hash }) => hash === tx.hash),\n );\n }\n\n #getUpdatedTransactions(\n remoteTxs: TransactionMeta[],\n localTxs: TransactionMeta[],\n ): TransactionMeta[] {\n return remoteTxs.filter((remoteTx) =>\n localTxs.some(\n (localTx) =>\n remoteTx.hash === localTx.hash &&\n this.#isTransactionOutdated(remoteTx, localTx),\n ),\n );\n }\n\n #isTransactionOutdated(\n remoteTx: TransactionMeta,\n localTx: TransactionMeta,\n ): boolean {\n return UPDATE_CHECKS.some(\n (getValue) => getValue(remoteTx) !== getValue(localTx),\n );\n }\n\n #getLastFetchedBlockNumberDec(): number {\n const additionalLastFetchedKeys =\n this.#remoteTransactionSource.getLastBlockVariations?.() ?? [];\n const lastFetchedKey = this.#getBlockNumberKey(additionalLastFetchedKeys);\n const lastFetchedBlockNumbers = this.#getLastFetchedBlockNumbers();\n return lastFetchedBlockNumbers[lastFetchedKey];\n }\n\n #getFromBlock(latestBlockNumber: number): number | undefined {\n const lastFetchedBlockNumber = this.#getLastFetchedBlockNumberDec();\n\n if (lastFetchedBlockNumber) {\n return lastFetchedBlockNumber + 1;\n }\n\n return this.#queryEntireHistory\n ? undefined\n : latestBlockNumber - RECENT_HISTORY_BLOCK_RANGE;\n }\n\n #updateLastFetchedBlockNumber(\n remoteTxs: TransactionMeta[],\n additionalKeys: string[],\n ) {\n let lastFetchedBlockNumber = -1;\n\n for (const tx of remoteTxs) {\n const currentBlockNumberValue = tx.blockNumber\n ? parseInt(tx.blockNumber, 10)\n : -1;\n\n lastFetchedBlockNumber = Math.max(\n lastFetchedBlockNumber,\n currentBlockNumberValue,\n );\n }\n\n if (lastFetchedBlockNumber === -1) {\n return;\n }\n\n const lastFetchedKey = this.#getBlockNumberKey(additionalKeys);\n const lastFetchedBlockNumbers = this.#getLastFetchedBlockNumbers();\n const previousValue = lastFetchedBlockNumbers[lastFetchedKey];\n\n if (previousValue >= lastFetchedBlockNumber) {\n return;\n }\n\n this.hub.emit('updatedLastFetchedBlockNumbers', {\n lastFetchedBlockNumbers: {\n ...lastFetchedBlockNumbers,\n [lastFetchedKey]: lastFetchedBlockNumber,\n },\n blockNumber: lastFetchedBlockNumber,\n });\n }\n\n #getBlockNumberKey(additionalKeys: string[]): string {\n const currentChainId = this.#getChainId();\n const currentAccount = this.#getCurrentAccount()?.address.toLowerCase();\n\n return [currentChainId, currentAccount, ...additionalKeys].join('#');\n }\n\n #canStart(): boolean {\n const isEnabled = this.#isEnabled();\n const currentChainId = this.#getChainId();\n\n const isSupportedNetwork =\n this.#remoteTransactionSource.isSupportedNetwork(currentChainId);\n\n return isEnabled && isSupportedNetwork;\n }\n}\n"]}
1
+ {"version":3,"file":"IncomingTransactionHelper.cjs","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsController } from '@metamask/accounts-controller';\nimport type { Hex } from '@metamask/utils';\nimport EventEmitter from 'events';\n\nimport { incomingTransactionsLogger as log } from '../logger';\nimport type { RemoteTransactionSource, TransactionMeta } from '../types';\n\n/**\n * Configuration options for the IncomingTransactionHelper\n *\n * @property includeTokenTransfers - Whether or not to include ERC20 token transfers.\n * @property isEnabled - Whether or not incoming transaction retrieval is enabled.\n */\nexport type IncomingTransactionOptions = {\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n};\n\nconst FIRST_QUERY_HISTORY_DURATION = 1000 * 60 * 60 * 24 * 2; // 2 Days\nconst INTERVAL = 1000 * 30; // 30 Seconds\n\nexport class IncomingTransactionHelper {\n hub: EventEmitter;\n\n #getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n\n #getLastFetchedTimestamps: () => Record<string, number>;\n\n #getChainIds: () => Hex[];\n\n #isEnabled: () => boolean;\n\n #isRunning: boolean;\n\n #remoteTransactionSource: RemoteTransactionSource;\n\n #timeoutId?: unknown;\n\n #transactionLimit?: number;\n\n constructor({\n getCurrentAccount,\n getLastFetchedTimestamps,\n getChainIds,\n isEnabled,\n remoteTransactionSource,\n transactionLimit,\n }: {\n getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n getLastFetchedTimestamps: () => Record<string, number>;\n getChainIds: () => Hex[];\n isEnabled?: () => boolean;\n queryEntireHistory?: boolean;\n remoteTransactionSource: RemoteTransactionSource;\n transactionLimit?: number;\n updateTransactions?: boolean;\n }) {\n this.hub = new EventEmitter();\n\n this.#getCurrentAccount = getCurrentAccount;\n this.#getLastFetchedTimestamps = getLastFetchedTimestamps;\n this.#getChainIds = getChainIds;\n this.#isEnabled = isEnabled ?? (() => true);\n this.#isRunning = false;\n this.#remoteTransactionSource = remoteTransactionSource;\n this.#transactionLimit = transactionLimit;\n }\n\n start() {\n if (this.#isRunning) {\n return;\n }\n\n if (!this.#canStart()) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#timeoutId = setTimeout(() => this.#onInterval(), INTERVAL);\n this.#isRunning = true;\n\n log('Started polling');\n }\n\n stop() {\n if (this.#timeoutId) {\n clearTimeout(this.#timeoutId as number);\n }\n\n if (!this.#isRunning) {\n return;\n }\n\n this.#isRunning = false;\n\n log('Stopped polling');\n }\n\n async #onInterval() {\n try {\n await this.update({ isInterval: true });\n } catch (error) {\n console.error('Error while checking incoming transactions', error);\n }\n\n if (this.#isRunning) {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#timeoutId = setTimeout(() => this.#onInterval(), INTERVAL);\n }\n }\n\n async update({ isInterval }: { isInterval?: boolean } = {}): Promise<void> {\n log('Checking for incoming transactions', {\n isInterval: Boolean(isInterval),\n });\n\n if (!this.#canStart()) {\n return;\n }\n\n const account = this.#getCurrentAccount();\n const chainIds = this.#getChainIds();\n const startTimestampByChainId = this.#getStartTimestampByChainId(chainIds);\n\n let remoteTransactions: TransactionMeta[] = [];\n\n try {\n remoteTransactions =\n await this.#remoteTransactionSource.fetchTransactions({\n address: account.address as Hex,\n chainIds,\n startTimestampByChainId,\n limit: this.#transactionLimit,\n });\n } catch (error: unknown) {\n log('Error while fetching remote transactions', error);\n return;\n }\n\n if (remoteTransactions.length > 0) {\n this.#sortTransactionsByTime(remoteTransactions);\n\n log('Found incoming transactions', { remoteTransactions });\n\n this.hub.emit('incoming-transactions', remoteTransactions);\n }\n\n for (const chainId of chainIds) {\n this.#updateLastFetchedTimestamp(chainId, remoteTransactions);\n }\n }\n\n #sortTransactionsByTime(transactions: TransactionMeta[]) {\n transactions.sort((a, b) => (a.time < b.time ? -1 : 1));\n }\n\n #getStartTimestampByChainId(chainIds: Hex[]): Record<Hex, number> {\n return chainIds.reduce((acc, chainId) => {\n const lastFetchedTimestamp = this.#getLastFetchedTimestamp(chainId);\n\n const startTimestamp = lastFetchedTimestamp\n ? lastFetchedTimestamp + 1\n : this.#getTimestampSeconds(Date.now() - FIRST_QUERY_HISTORY_DURATION);\n\n return { ...acc, [chainId]: startTimestamp };\n }, {});\n }\n\n #getLastFetchedTimestamp(chainId: Hex): number {\n const lastFetchedKey = this.#getTimestampKey(chainId);\n const lastFetchedTimestamps = this.#getLastFetchedTimestamps();\n return lastFetchedTimestamps[lastFetchedKey];\n }\n\n #updateLastFetchedTimestamp(chainId: Hex, remoteTxs: TransactionMeta[]) {\n const chainTxs = remoteTxs.filter((tx) => tx.chainId === chainId);\n let lastFetchedTimestamp = -1;\n\n for (const tx of chainTxs) {\n const currentTimestamp = this.#getTimestampSeconds(tx.time);\n lastFetchedTimestamp = Math.max(lastFetchedTimestamp, currentTimestamp);\n }\n\n if (lastFetchedTimestamp === -1) {\n return;\n }\n\n const lastFetchedKey = this.#getTimestampKey(chainId);\n const lastFetchedTimestamps = this.#getLastFetchedTimestamps();\n const previousValue = lastFetchedTimestamps[lastFetchedKey];\n\n if (previousValue >= lastFetchedTimestamp) {\n return;\n }\n\n log('Updating last fetched timestamp', {\n key: lastFetchedKey,\n timestamp: lastFetchedTimestamp,\n });\n\n this.hub.emit('updated-last-fetched-timestamp', {\n key: lastFetchedKey,\n timestamp: lastFetchedTimestamp,\n });\n }\n\n #getTimestampKey(chainId: Hex): string {\n const currentAccount = this.#getCurrentAccount()?.address.toLowerCase();\n return [chainId, currentAccount].join('#');\n }\n\n #canStart(): boolean {\n const isEnabled = this.#isEnabled();\n const chainIds = this.#getChainIds();\n\n const supportedChainIds =\n this.#remoteTransactionSource.getSupportedChains();\n\n const isAnyChainSupported = chainIds.some((chainId) =>\n supportedChainIds.includes(chainId),\n );\n\n return isEnabled && isAnyChainSupported;\n }\n\n #getTimestampSeconds(timestampMilliseconds: number): number {\n return Math.ceil(timestampMilliseconds / 1000);\n }\n}\n"]}
@@ -1,32 +1,25 @@
1
1
  /// <reference types="node" />
2
2
  import type { AccountsController } from "@metamask/accounts-controller";
3
- import type { BlockTracker } from "@metamask/network-controller";
4
3
  import type { Hex } from "@metamask/utils";
5
4
  import EventEmitter from "events";
6
- import type { RemoteTransactionSource, TransactionMeta } from "../types.cjs";
5
+ import type { RemoteTransactionSource } from "../types.cjs";
7
6
  /**
8
7
  * Configuration options for the IncomingTransactionHelper
9
8
  *
10
9
  * @property includeTokenTransfers - Whether or not to include ERC20 token transfers.
11
10
  * @property isEnabled - Whether or not incoming transaction retrieval is enabled.
12
- * @property queryEntireHistory - Whether to initially query the entire transaction history or only recent blocks.
13
- * @property updateTransactions - Whether to update local transactions using remote transaction data.
14
11
  */
15
12
  export type IncomingTransactionOptions = {
16
13
  includeTokenTransfers?: boolean;
17
14
  isEnabled?: () => boolean;
18
- queryEntireHistory?: boolean;
19
- updateTransactions?: boolean;
20
15
  };
21
16
  export declare class IncomingTransactionHelper {
22
17
  #private;
23
18
  hub: EventEmitter;
24
- constructor({ blockTracker, getCurrentAccount, getLastFetchedBlockNumbers, getLocalTransactions, getChainId, isEnabled, queryEntireHistory, remoteTransactionSource, transactionLimit, updateTransactions, }: {
25
- blockTracker: BlockTracker;
19
+ constructor({ getCurrentAccount, getLastFetchedTimestamps, getChainIds, isEnabled, remoteTransactionSource, transactionLimit, }: {
26
20
  getCurrentAccount: () => ReturnType<AccountsController['getSelectedAccount']>;
27
- getLastFetchedBlockNumbers: () => Record<string, number>;
28
- getLocalTransactions?: () => TransactionMeta[];
29
- getChainId: () => Hex;
21
+ getLastFetchedTimestamps: () => Record<string, number>;
22
+ getChainIds: () => Hex[];
30
23
  isEnabled?: () => boolean;
31
24
  queryEntireHistory?: boolean;
32
25
  remoteTransactionSource: RemoteTransactionSource;
@@ -35,6 +28,8 @@ export declare class IncomingTransactionHelper {
35
28
  });
36
29
  start(): void;
37
30
  stop(): void;
38
- update(latestBlockNumberHex?: Hex): Promise<void>;
31
+ update({ isInterval }?: {
32
+ isInterval?: boolean;
33
+ }): Promise<void>;
39
34
  }
40
35
  //# sourceMappingURL=IncomingTransactionHelper.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IncomingTransactionHelper.d.cts","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sCAAsC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAqC;AACjE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,YAAY,eAAe;AAGlC,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,qBAAiB;AAWzE;;;;;;;GAOG;AACH,MAAM,MAAM,0BAA0B,GAAG;IACvC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,qBAAa,yBAAyB;;IACpC,GAAG,EAAE,YAAY,CAAC;gBA8BN,EACV,YAAY,EACZ,iBAAiB,EACjB,0BAA0B,EAC1B,oBAAoB,EACpB,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,EAAE;QACD,YAAY,EAAE,YAAY,CAAC;QAC3B,iBAAiB,EAAE,MAAM,UAAU,CACjC,kBAAkB,CAAC,oBAAoB,CAAC,CACzC,CAAC;QACF,0BAA0B,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzD,oBAAoB,CAAC,EAAE,MAAM,eAAe,EAAE,CAAC;QAC/C,UAAU,EAAE,MAAM,GAAG,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;QAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,uBAAuB,EAAE,uBAAuB,CAAC;QACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B;IA0BD,KAAK;IAeL,IAAI;IAOE,MAAM,CAAC,oBAAoB,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CA+LxD"}
1
+ {"version":3,"file":"IncomingTransactionHelper.d.cts","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sCAAsC;AACxE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAC3C,OAAO,YAAY,eAAe;AAGlC,OAAO,KAAK,EAAE,uBAAuB,EAAmB,qBAAiB;AAEzE;;;;;GAKG;AACH,MAAM,MAAM,0BAA0B,GAAG;IACvC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;CAC3B,CAAC;AAKF,qBAAa,yBAAyB;;IACpC,GAAG,EAAE,YAAY,CAAC;gBAoBN,EACV,iBAAiB,EACjB,wBAAwB,EACxB,WAAW,EACX,SAAS,EACT,uBAAuB,EACvB,gBAAgB,GACjB,EAAE;QACD,iBAAiB,EAAE,MAAM,UAAU,CACjC,kBAAkB,CAAC,oBAAoB,CAAC,CACzC,CAAC;QACF,wBAAwB,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvD,WAAW,EAAE,MAAM,GAAG,EAAE,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;QAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,uBAAuB,EAAE,uBAAuB,CAAC;QACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B;IAYD,KAAK;IAgBL,IAAI;IA2BE,MAAM,CAAC,EAAE,UAAU,EAAE,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAqH3E"}
@@ -1,32 +1,25 @@
1
1
  /// <reference types="node" />
2
2
  import type { AccountsController } from "@metamask/accounts-controller";
3
- import type { BlockTracker } from "@metamask/network-controller";
4
3
  import type { Hex } from "@metamask/utils";
5
4
  import EventEmitter from "events";
6
- import type { RemoteTransactionSource, TransactionMeta } from "../types.mjs";
5
+ import type { RemoteTransactionSource } from "../types.mjs";
7
6
  /**
8
7
  * Configuration options for the IncomingTransactionHelper
9
8
  *
10
9
  * @property includeTokenTransfers - Whether or not to include ERC20 token transfers.
11
10
  * @property isEnabled - Whether or not incoming transaction retrieval is enabled.
12
- * @property queryEntireHistory - Whether to initially query the entire transaction history or only recent blocks.
13
- * @property updateTransactions - Whether to update local transactions using remote transaction data.
14
11
  */
15
12
  export type IncomingTransactionOptions = {
16
13
  includeTokenTransfers?: boolean;
17
14
  isEnabled?: () => boolean;
18
- queryEntireHistory?: boolean;
19
- updateTransactions?: boolean;
20
15
  };
21
16
  export declare class IncomingTransactionHelper {
22
17
  #private;
23
18
  hub: EventEmitter;
24
- constructor({ blockTracker, getCurrentAccount, getLastFetchedBlockNumbers, getLocalTransactions, getChainId, isEnabled, queryEntireHistory, remoteTransactionSource, transactionLimit, updateTransactions, }: {
25
- blockTracker: BlockTracker;
19
+ constructor({ getCurrentAccount, getLastFetchedTimestamps, getChainIds, isEnabled, remoteTransactionSource, transactionLimit, }: {
26
20
  getCurrentAccount: () => ReturnType<AccountsController['getSelectedAccount']>;
27
- getLastFetchedBlockNumbers: () => Record<string, number>;
28
- getLocalTransactions?: () => TransactionMeta[];
29
- getChainId: () => Hex;
21
+ getLastFetchedTimestamps: () => Record<string, number>;
22
+ getChainIds: () => Hex[];
30
23
  isEnabled?: () => boolean;
31
24
  queryEntireHistory?: boolean;
32
25
  remoteTransactionSource: RemoteTransactionSource;
@@ -35,6 +28,8 @@ export declare class IncomingTransactionHelper {
35
28
  });
36
29
  start(): void;
37
30
  stop(): void;
38
- update(latestBlockNumberHex?: Hex): Promise<void>;
31
+ update({ isInterval }?: {
32
+ isInterval?: boolean;
33
+ }): Promise<void>;
39
34
  }
40
35
  //# sourceMappingURL=IncomingTransactionHelper.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IncomingTransactionHelper.d.mts","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sCAAsC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAqC;AACjE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,YAAY,eAAe;AAGlC,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,qBAAiB;AAWzE;;;;;;;GAOG;AACH,MAAM,MAAM,0BAA0B,GAAG;IACvC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,qBAAa,yBAAyB;;IACpC,GAAG,EAAE,YAAY,CAAC;gBA8BN,EACV,YAAY,EACZ,iBAAiB,EACjB,0BAA0B,EAC1B,oBAAoB,EACpB,UAAU,EACV,SAAS,EACT,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,EAAE;QACD,YAAY,EAAE,YAAY,CAAC;QAC3B,iBAAiB,EAAE,MAAM,UAAU,CACjC,kBAAkB,CAAC,oBAAoB,CAAC,CACzC,CAAC;QACF,0BAA0B,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzD,oBAAoB,CAAC,EAAE,MAAM,eAAe,EAAE,CAAC;QAC/C,UAAU,EAAE,MAAM,GAAG,CAAC;QACtB,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;QAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,uBAAuB,EAAE,uBAAuB,CAAC;QACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B;IA0BD,KAAK;IAeL,IAAI;IAOE,MAAM,CAAC,oBAAoB,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CA+LxD"}
1
+ {"version":3,"file":"IncomingTransactionHelper.d.mts","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sCAAsC;AACxE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAC3C,OAAO,YAAY,eAAe;AAGlC,OAAO,KAAK,EAAE,uBAAuB,EAAmB,qBAAiB;AAEzE;;;;;GAKG;AACH,MAAM,MAAM,0BAA0B,GAAG;IACvC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;CAC3B,CAAC;AAKF,qBAAa,yBAAyB;;IACpC,GAAG,EAAE,YAAY,CAAC;gBAoBN,EACV,iBAAiB,EACjB,wBAAwB,EACxB,WAAW,EACX,SAAS,EACT,uBAAuB,EACvB,gBAAgB,GACjB,EAAE;QACD,iBAAiB,EAAE,MAAM,UAAU,CACjC,kBAAkB,CAAC,oBAAoB,CAAC,CACzC,CAAC;QACF,wBAAwB,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvD,WAAW,EAAE,MAAM,GAAG,EAAE,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;QAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,uBAAuB,EAAE,uBAAuB,CAAC;QACjD,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B;IAYD,KAAK;IAgBL,IAAI;IA2BE,MAAM,CAAC,EAAE,UAAU,EAAE,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAqH3E"}