@metamask/transaction-controller 62.14.0 → 62.16.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 (46) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/dist/TransactionController.cjs +2 -1
  3. package/dist/TransactionController.cjs.map +1 -1
  4. package/dist/TransactionController.d.cts.map +1 -1
  5. package/dist/TransactionController.d.mts.map +1 -1
  6. package/dist/TransactionController.mjs +2 -1
  7. package/dist/TransactionController.mjs.map +1 -1
  8. package/dist/helpers/IncomingTransactionHelper.cjs +11 -19
  9. package/dist/helpers/IncomingTransactionHelper.cjs.map +1 -1
  10. package/dist/helpers/IncomingTransactionHelper.d.cts +4 -0
  11. package/dist/helpers/IncomingTransactionHelper.d.cts.map +1 -1
  12. package/dist/helpers/IncomingTransactionHelper.d.mts +4 -0
  13. package/dist/helpers/IncomingTransactionHelper.d.mts.map +1 -1
  14. package/dist/helpers/IncomingTransactionHelper.mjs +8 -16
  15. package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -1
  16. package/dist/helpers/TransactionPoller.cjs +47 -11
  17. package/dist/helpers/TransactionPoller.cjs.map +1 -1
  18. package/dist/helpers/TransactionPoller.d.cts.map +1 -1
  19. package/dist/helpers/TransactionPoller.d.mts.map +1 -1
  20. package/dist/helpers/TransactionPoller.mjs +47 -11
  21. package/dist/helpers/TransactionPoller.mjs.map +1 -1
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.cts +1 -1
  24. package/dist/index.d.cts.map +1 -1
  25. package/dist/index.d.mts +1 -1
  26. package/dist/index.d.mts.map +1 -1
  27. package/dist/index.mjs.map +1 -1
  28. package/dist/types.cjs.map +1 -1
  29. package/dist/types.d.cts +19 -0
  30. package/dist/types.d.cts.map +1 -1
  31. package/dist/types.d.mts +19 -0
  32. package/dist/types.d.mts.map +1 -1
  33. package/dist/types.mjs.map +1 -1
  34. package/dist/utils/batch.cjs +2 -1
  35. package/dist/utils/batch.cjs.map +1 -1
  36. package/dist/utils/batch.mjs +2 -1
  37. package/dist/utils/batch.mjs.map +1 -1
  38. package/dist/utils/utils.cjs +21 -1
  39. package/dist/utils/utils.cjs.map +1 -1
  40. package/dist/utils/utils.d.cts +7 -0
  41. package/dist/utils/utils.d.cts.map +1 -1
  42. package/dist/utils/utils.d.mts +7 -0
  43. package/dist/utils/utils.d.mts.map +1 -1
  44. package/dist/utils/utils.mjs +20 -1
  45. package/dist/utils/utils.mjs.map +1 -1
  46. package/package.json +2 -2
@@ -13,18 +13,21 @@ 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_client, _IncomingTransactionHelper_getCurrentAccount, _IncomingTransactionHelper_getLocalTransactions, _IncomingTransactionHelper_includeTokenTransfers, _IncomingTransactionHelper_isEnabled, _IncomingTransactionHelper_isRunning, _IncomingTransactionHelper_isUpdating, _IncomingTransactionHelper_messenger, _IncomingTransactionHelper_remoteTransactionSource, _IncomingTransactionHelper_timeoutId, _IncomingTransactionHelper_trimTransactions, _IncomingTransactionHelper_updateTransactions, _IncomingTransactionHelper_useWebsockets, _IncomingTransactionHelper_chainsToPoll, _IncomingTransactionHelper_connectionStateChangedHandler, _IncomingTransactionHelper_transactionUpdatedHandler, _IncomingTransactionHelper_selectedAccountChangedHandler, _IncomingTransactionHelper_statusChangedHandler, _IncomingTransactionHelper_startPolling, _IncomingTransactionHelper_onConnectionStateChanged, _IncomingTransactionHelper_startTransactionHistoryRetrieval, _IncomingTransactionHelper_stopTransactionHistoryRetrieval, _IncomingTransactionHelper_onTransactionUpdated, _IncomingTransactionHelper_onSelectedAccountChanged, _IncomingTransactionHelper_onInterval, _IncomingTransactionHelper_sortTransactionsByTime, _IncomingTransactionHelper_canStart, _IncomingTransactionHelper_getInterval, _IncomingTransactionHelper_getTags, _IncomingTransactionHelper_caip2ToHex, _IncomingTransactionHelper_onNetworkStatusChanged;
16
+ var _IncomingTransactionHelper_instances, _IncomingTransactionHelper_client, _IncomingTransactionHelper_getCurrentAccount, _IncomingTransactionHelper_getLocalTransactions, _IncomingTransactionHelper_includeTokenTransfers, _IncomingTransactionHelper_isEnabled, _IncomingTransactionHelper_isRunning, _IncomingTransactionHelper_isUpdating, _IncomingTransactionHelper_messenger, _IncomingTransactionHelper_remoteTransactionSource, _IncomingTransactionHelper_timeoutId, _IncomingTransactionHelper_trimTransactions, _IncomingTransactionHelper_updateTransactions, _IncomingTransactionHelper_useWebsockets, _IncomingTransactionHelper_chainsToPoll, _IncomingTransactionHelper_connectionStateChangedHandler, _IncomingTransactionHelper_transactionUpdatedHandler, _IncomingTransactionHelper_selectedAccountChangedHandler, _IncomingTransactionHelper_statusChangedHandler, _IncomingTransactionHelper_startPolling, _IncomingTransactionHelper_onConnectionStateChanged, _IncomingTransactionHelper_startTransactionHistoryRetrieval, _IncomingTransactionHelper_stopTransactionHistoryRetrieval, _IncomingTransactionHelper_onTransactionUpdated, _IncomingTransactionHelper_onSelectedAccountChanged, _IncomingTransactionHelper_onInterval, _IncomingTransactionHelper_sortTransactionsByTime, _IncomingTransactionHelper_canStart, _IncomingTransactionHelper_getInterval, _IncomingTransactionHelper_getTags, _IncomingTransactionHelper_onNetworkStatusChanged;
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.IncomingTransactionHelper = void 0;
19
- const controller_utils_1 = require("@metamask/controller-utils");
20
- const core_backend_1 = require("@metamask/core-backend");
21
- const utils_1 = require("@metamask/utils");
18
+ exports.IncomingTransactionHelper = exports.WebSocketState = void 0;
22
19
  // This package purposefully relies on Node's EventEmitter module.
23
20
  // eslint-disable-next-line import-x/no-nodejs-modules
24
21
  const events_1 = __importDefault(require("events"));
25
22
  const AccountsApiRemoteTransactionSource_1 = require("./AccountsApiRemoteTransactionSource.cjs");
26
23
  const logger_1 = require("../logger.cjs");
27
24
  const feature_flags_1 = require("../utils/feature-flags.cjs");
25
+ const utils_1 = require("../utils/utils.cjs");
26
+ var WebSocketState;
27
+ (function (WebSocketState) {
28
+ WebSocketState["CONNECTED"] = "connected";
29
+ WebSocketState["DISCONNECTED"] = "disconnected";
30
+ })(WebSocketState || (exports.WebSocketState = WebSocketState = {}));
28
31
  const TAG_POLLING = 'automatic-polling';
29
32
  class IncomingTransactionHelper {
30
33
  constructor({ client, getCurrentAccount, getLocalTransactions, includeTokenTransfers, isEnabled, messenger, remoteTransactionSource, trimTransactions, updateTransactions, }) {
@@ -167,11 +170,11 @@ _IncomingTransactionHelper_client = new WeakMap(), _IncomingTransactionHelper_ge
167
170
  (0, logger_1.incomingTransactionsLogger)(initialPolling ? 'Initial polling failed' : 'Polling failed', error);
168
171
  });
169
172
  }, _IncomingTransactionHelper_onConnectionStateChanged = function _IncomingTransactionHelper_onConnectionStateChanged(connectionInfo) {
170
- if (connectionInfo.state === core_backend_1.WebSocketState.CONNECTED) {
173
+ if (connectionInfo.state === WebSocketState.CONNECTED) {
171
174
  (0, logger_1.incomingTransactionsLogger)('WebSocket connected, starting enhanced mode');
172
175
  __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_startTransactionHistoryRetrieval).call(this);
173
176
  }
174
- else if (connectionInfo.state === core_backend_1.WebSocketState.DISCONNECTED) {
177
+ else if (connectionInfo.state === WebSocketState.DISCONNECTED) {
175
178
  (0, logger_1.incomingTransactionsLogger)('WebSocket disconnected, stopping enhanced mode');
176
179
  __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_stopTransactionHistoryRetrieval).call(this);
177
180
  }
@@ -239,24 +242,13 @@ _IncomingTransactionHelper_client = new WeakMap(), _IncomingTransactionHelper_ge
239
242
  tags.push(TAG_POLLING);
240
243
  }
241
244
  return tags?.length ? tags : undefined;
242
- }, _IncomingTransactionHelper_caip2ToHex = function _IncomingTransactionHelper_caip2ToHex(caip2ChainId) {
243
- if (!(0, utils_1.isCaipChainId)(caip2ChainId)) {
244
- return undefined;
245
- }
246
- try {
247
- const { reference } = (0, utils_1.parseCaipChainId)(caip2ChainId);
248
- return (0, controller_utils_1.toHex)(reference);
249
- }
250
- catch {
251
- return undefined;
252
- }
253
245
  }, _IncomingTransactionHelper_onNetworkStatusChanged = function _IncomingTransactionHelper_onNetworkStatusChanged(chainIds, status) {
254
246
  if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_useWebsockets, "f")) {
255
247
  return;
256
248
  }
257
249
  let hasChanges = false;
258
250
  for (const caip2ChainId of chainIds) {
259
- const hexChainId = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_caip2ToHex).call(this, caip2ChainId);
251
+ const hexChainId = (0, utils_1.caip2ToHex)(caip2ChainId);
260
252
  if (!hexChainId || !AccountsApiRemoteTransactionSource_1.SUPPORTED_CHAIN_IDS.includes(hexChainId)) {
261
253
  (0, logger_1.incomingTransactionsLogger)('Chain ID not recognized or not supported', {
262
254
  caip2ChainId,
@@ -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 { toHex } from '@metamask/controller-utils';\nimport type {\n Transaction as AccountActivityTransaction,\n WebSocketConnectionInfo,\n} from '@metamask/core-backend';\nimport { WebSocketState } from '@metamask/core-backend';\nimport type { Hex } from '@metamask/utils';\nimport { isCaipChainId, parseCaipChainId } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport EventEmitter from 'events';\n\nimport { SUPPORTED_CHAIN_IDS } from './AccountsApiRemoteTransactionSource';\nimport type { TransactionControllerMessenger } from '..';\nimport { incomingTransactionsLogger as log } from '../logger';\nimport type { RemoteTransactionSource, TransactionMeta } from '../types';\nimport {\n getIncomingTransactionsPollingInterval,\n isIncomingTransactionsUseWebsocketsEnabled,\n} from '../utils/feature-flags';\n\nexport type IncomingTransactionOptions = {\n /** Name of the client to include in requests. */\n client?: string;\n\n /** Whether to retrieve incoming token transfers. Defaults to false. */\n includeTokenTransfers?: boolean;\n\n /** Callback to determine if incoming transaction polling is enabled. */\n isEnabled?: () => boolean;\n\n /** @deprecated No longer used. */\n queryEntireHistory?: boolean;\n\n /** Whether to retrieve outgoing transactions. Defaults to false. */\n updateTransactions?: boolean;\n};\n\nconst TAG_POLLING = 'automatic-polling';\n\nexport class IncomingTransactionHelper {\n hub: EventEmitter;\n\n readonly #client?: string;\n\n readonly #getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n\n readonly #getLocalTransactions: () => TransactionMeta[];\n\n readonly #includeTokenTransfers?: boolean;\n\n readonly #isEnabled: () => boolean;\n\n #isRunning: boolean;\n\n #isUpdating: boolean;\n\n readonly #messenger: TransactionControllerMessenger;\n\n readonly #remoteTransactionSource: RemoteTransactionSource;\n\n #timeoutId?: unknown;\n\n readonly #trimTransactions: (\n transactions: TransactionMeta[],\n ) => TransactionMeta[];\n\n readonly #updateTransactions?: boolean;\n\n readonly #useWebsockets: boolean;\n\n // Chains that need polling (start with all supported, remove as they come up)\n readonly #chainsToPoll: Hex[] = [...SUPPORTED_CHAIN_IDS];\n\n readonly #connectionStateChangedHandler = (\n connectionInfo: WebSocketConnectionInfo,\n ): void => {\n this.#onConnectionStateChanged(connectionInfo);\n };\n\n readonly #transactionUpdatedHandler = (\n transaction: AccountActivityTransaction,\n ): void => {\n this.#onTransactionUpdated(transaction);\n };\n\n readonly #selectedAccountChangedHandler = (): void => {\n this.#onSelectedAccountChanged();\n };\n\n readonly #statusChangedHandler = ({\n chainIds,\n status,\n }: {\n chainIds: string[];\n status: 'up' | 'down';\n }): void => {\n this.#onNetworkStatusChanged(chainIds, status);\n };\n\n constructor({\n client,\n getCurrentAccount,\n getLocalTransactions,\n includeTokenTransfers,\n isEnabled,\n messenger,\n remoteTransactionSource,\n trimTransactions,\n updateTransactions,\n }: {\n client?: string;\n getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n getLocalTransactions: () => TransactionMeta[];\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n messenger: TransactionControllerMessenger;\n remoteTransactionSource: RemoteTransactionSource;\n trimTransactions: (transactions: TransactionMeta[]) => TransactionMeta[];\n updateTransactions?: boolean;\n }) {\n this.hub = new EventEmitter();\n\n this.#client = client;\n this.#getCurrentAccount = getCurrentAccount;\n this.#getLocalTransactions = getLocalTransactions;\n this.#includeTokenTransfers = includeTokenTransfers;\n this.#isEnabled = isEnabled ?? ((): boolean => true);\n this.#isRunning = false;\n this.#isUpdating = false;\n this.#messenger = messenger;\n this.#remoteTransactionSource = remoteTransactionSource;\n this.#trimTransactions = trimTransactions;\n this.#updateTransactions = updateTransactions;\n this.#useWebsockets = isIncomingTransactionsUseWebsocketsEnabled(messenger);\n\n if (this.#useWebsockets) {\n this.#messenger.subscribe(\n 'BackendWebSocketService:connectionStateChanged',\n this.#connectionStateChangedHandler,\n );\n\n this.#messenger.subscribe(\n 'AccountActivityService:statusChanged',\n this.#statusChangedHandler,\n );\n }\n }\n\n start(): void {\n // When websockets are disabled, allow normal polling (legacy mode)\n if (this.#useWebsockets) {\n return;\n }\n\n this.#startPolling(true);\n }\n\n #startPolling(initialPolling = false): void {\n if (this.#isRunning) {\n return;\n }\n\n if (!this.#canStart()) {\n return;\n }\n\n const interval = this.#getInterval();\n\n log('Started polling', {\n interval,\n });\n\n this.#isRunning = true;\n\n if (this.#isUpdating) {\n return;\n }\n\n this.#onInterval().catch((error) => {\n log(initialPolling ? 'Initial polling failed' : 'Polling failed', error);\n });\n }\n\n stop(): void {\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 #onConnectionStateChanged(connectionInfo: WebSocketConnectionInfo): void {\n if (connectionInfo.state === WebSocketState.CONNECTED) {\n log('WebSocket connected, starting enhanced mode');\n this.#startTransactionHistoryRetrieval();\n } else if (connectionInfo.state === WebSocketState.DISCONNECTED) {\n log('WebSocket disconnected, stopping enhanced mode');\n this.#stopTransactionHistoryRetrieval();\n }\n }\n\n #startTransactionHistoryRetrieval(): void {\n if (!this.#canStart()) {\n return;\n }\n\n log('Started transaction history retrieval (event-driven)');\n\n this.update().catch((error) => {\n log('Initial update in transaction history retrieval failed', error);\n });\n\n this.#messenger.subscribe(\n 'AccountActivityService:transactionUpdated',\n this.#transactionUpdatedHandler,\n );\n\n this.#messenger.subscribe(\n 'AccountsController:selectedAccountChange',\n this.#selectedAccountChangedHandler,\n );\n }\n\n #stopTransactionHistoryRetrieval(): void {\n log('Stopped transaction history retrieval');\n\n this.#messenger.unsubscribe(\n 'AccountActivityService:transactionUpdated',\n this.#transactionUpdatedHandler,\n );\n\n this.#messenger.unsubscribe(\n 'AccountsController:selectedAccountChange',\n this.#selectedAccountChangedHandler,\n );\n }\n\n #onTransactionUpdated(transaction: AccountActivityTransaction): void {\n log('Received relevant transaction update, triggering update', {\n txId: transaction.id,\n chain: transaction.chain,\n });\n\n this.update().catch((error) => {\n log('Update after transaction event failed', error);\n });\n }\n\n #onSelectedAccountChanged(): void {\n log('Selected account changed, triggering update');\n\n this.update().catch((error) => {\n log('Update after account change failed', error);\n });\n }\n\n async #onInterval(): Promise<void> {\n this.#isUpdating = true;\n\n try {\n // When websockets enabled, only poll chains that are not confirmed up\n const chainIds = this.#useWebsockets ? this.#chainsToPoll : undefined;\n await this.update({ chainIds, isInterval: true });\n } catch (error) {\n console.error('Error while checking incoming transactions', error);\n }\n\n this.#isUpdating = false;\n\n if (this.#isRunning) {\n if (this.#timeoutId) {\n clearTimeout(this.#timeoutId as number);\n }\n\n this.#timeoutId = setTimeout(\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n () => this.#onInterval(),\n this.#getInterval(),\n );\n }\n }\n\n async update({\n chainIds,\n isInterval,\n tags,\n }: {\n chainIds?: Hex[];\n isInterval?: boolean;\n tags?: string[];\n } = {}): Promise<void> {\n const finalTags = this.#getTags(tags, isInterval);\n\n log('Checking for incoming transactions', {\n isInterval: Boolean(isInterval),\n tags: finalTags,\n });\n\n if (!this.#canStart()) {\n return;\n }\n\n const account = this.#getCurrentAccount();\n const includeTokenTransfers = this.#includeTokenTransfers ?? true;\n const updateTransactions = this.#updateTransactions ?? false;\n\n let remoteTransactions: TransactionMeta[] = [];\n\n try {\n remoteTransactions =\n await this.#remoteTransactionSource.fetchTransactions({\n address: account.address as Hex,\n chainIds,\n includeTokenTransfers,\n tags: finalTags,\n updateTransactions,\n });\n } catch (error: unknown) {\n log('Error while fetching remote transactions', error);\n return;\n }\n\n if (!remoteTransactions.length) {\n return;\n }\n\n this.#sortTransactionsByTime(remoteTransactions);\n\n log(\n 'Found potential transactions',\n remoteTransactions.length,\n remoteTransactions,\n );\n\n const localTransactions = this.#getLocalTransactions();\n\n const uniqueTransactions = remoteTransactions.filter(\n (tx) =>\n !localTransactions.some(\n (currentTx) =>\n currentTx.hash?.toLowerCase() === tx.hash?.toLowerCase() &&\n currentTx.txParams.from?.toLowerCase() ===\n tx.txParams.from?.toLowerCase() &&\n currentTx.type === tx.type,\n ),\n );\n\n if (!uniqueTransactions.length) {\n log('All transactions are already known');\n return;\n }\n\n log(\n 'Found unique transactions',\n uniqueTransactions.length,\n uniqueTransactions,\n );\n\n const trimmedTransactions = this.#trimTransactions([\n ...uniqueTransactions,\n ...localTransactions,\n ]);\n\n const uniqueTransactionIds = uniqueTransactions.map((tx) => tx.id);\n\n const newTransactions = trimmedTransactions.filter((tx) =>\n uniqueTransactionIds.includes(tx.id),\n );\n\n if (!newTransactions.length) {\n log('All unique transactions truncated due to limit');\n return;\n }\n\n log('Adding new transactions', newTransactions.length, newTransactions);\n\n this.hub.emit('transactions', newTransactions);\n }\n\n #sortTransactionsByTime(transactions: TransactionMeta[]): void {\n transactions.sort((a, b) => (a.time < b.time ? -1 : 1));\n }\n\n #canStart(): boolean {\n return this.#isEnabled();\n }\n\n #getInterval(): number {\n return getIncomingTransactionsPollingInterval(this.#messenger);\n }\n\n #getTags(\n requestTags: string[] | undefined,\n isInterval: boolean | undefined,\n ): string[] | undefined {\n const tags = [];\n\n if (this.#client) {\n tags.push(this.#client);\n }\n\n if (requestTags?.length) {\n tags.push(...requestTags);\n } else if (isInterval) {\n tags.push(TAG_POLLING);\n }\n\n return tags?.length ? tags : undefined;\n }\n\n /**\n * Convert CAIP-2 chain ID to hex format.\n *\n * @param caip2ChainId - Chain ID in CAIP-2 format (e.g., 'eip155:1')\n * @returns Hex chain ID (e.g., '0x1') or undefined if invalid format\n */\n #caip2ToHex(caip2ChainId: string): Hex | undefined {\n if (!isCaipChainId(caip2ChainId)) {\n return undefined;\n }\n try {\n const { reference } = parseCaipChainId(caip2ChainId);\n return toHex(reference);\n } catch {\n return undefined;\n }\n }\n\n #onNetworkStatusChanged(chainIds: string[], status: 'up' | 'down'): void {\n if (!this.#useWebsockets) {\n return;\n }\n\n let hasChanges = false;\n\n for (const caip2ChainId of chainIds) {\n const hexChainId = this.#caip2ToHex(caip2ChainId);\n\n if (!hexChainId || !SUPPORTED_CHAIN_IDS.includes(hexChainId)) {\n log('Chain ID not recognized or not supported', {\n caip2ChainId,\n hexChainId,\n });\n continue;\n }\n\n if (status === 'up') {\n const index = this.#chainsToPoll.indexOf(hexChainId);\n if (index !== -1) {\n this.#chainsToPoll.splice(index, 1);\n hasChanges = true;\n log('Supported network came up, removed from polling list', {\n chainId: hexChainId,\n });\n }\n } else if (\n status === 'down' &&\n !this.#chainsToPoll.includes(hexChainId)\n ) {\n this.#chainsToPoll.push(hexChainId);\n hasChanges = true;\n log('Supported network went down, added to polling list', {\n chainId: hexChainId,\n });\n }\n }\n\n if (!hasChanges) {\n log('No changes to polling list', {\n chainsToPoll: this.#chainsToPoll,\n });\n return;\n }\n\n if (this.#chainsToPoll.length === 0) {\n log('Stopping fallback polling - all networks up');\n this.stop();\n } else {\n log('Starting fallback polling - some networks need polling', {\n chainsToPoll: this.#chainsToPoll,\n });\n this.#startPolling();\n }\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 {\n Transaction as AccountActivityTransaction,\n WebSocketConnectionInfo,\n} from '@metamask/core-backend';\nimport type { Hex } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport EventEmitter from 'events';\n\nimport { SUPPORTED_CHAIN_IDS } from './AccountsApiRemoteTransactionSource';\nimport type { TransactionControllerMessenger } from '..';\nimport { incomingTransactionsLogger as log } from '../logger';\nimport type { RemoteTransactionSource, TransactionMeta } from '../types';\nimport {\n getIncomingTransactionsPollingInterval,\n isIncomingTransactionsUseWebsocketsEnabled,\n} from '../utils/feature-flags';\nimport { caip2ToHex } from '../utils/utils';\n\nexport enum WebSocketState {\n CONNECTED = 'connected',\n DISCONNECTED = 'disconnected',\n}\n\nexport type IncomingTransactionOptions = {\n /** Name of the client to include in requests. */\n client?: string;\n\n /** Whether to retrieve incoming token transfers. Defaults to false. */\n includeTokenTransfers?: boolean;\n\n /** Callback to determine if incoming transaction polling is enabled. */\n isEnabled?: () => boolean;\n\n /** @deprecated No longer used. */\n queryEntireHistory?: boolean;\n\n /** Whether to retrieve outgoing transactions. Defaults to false. */\n updateTransactions?: boolean;\n};\n\nconst TAG_POLLING = 'automatic-polling';\n\nexport class IncomingTransactionHelper {\n hub: EventEmitter;\n\n readonly #client?: string;\n\n readonly #getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n\n readonly #getLocalTransactions: () => TransactionMeta[];\n\n readonly #includeTokenTransfers?: boolean;\n\n readonly #isEnabled: () => boolean;\n\n #isRunning: boolean;\n\n #isUpdating: boolean;\n\n readonly #messenger: TransactionControllerMessenger;\n\n readonly #remoteTransactionSource: RemoteTransactionSource;\n\n #timeoutId?: unknown;\n\n readonly #trimTransactions: (\n transactions: TransactionMeta[],\n ) => TransactionMeta[];\n\n readonly #updateTransactions?: boolean;\n\n readonly #useWebsockets: boolean;\n\n // Chains that need polling (start with all supported, remove as they come up)\n readonly #chainsToPoll: Hex[] = [...SUPPORTED_CHAIN_IDS];\n\n readonly #connectionStateChangedHandler = (\n connectionInfo: WebSocketConnectionInfo,\n ): void => {\n this.#onConnectionStateChanged(connectionInfo);\n };\n\n readonly #transactionUpdatedHandler = (\n transaction: AccountActivityTransaction,\n ): void => {\n this.#onTransactionUpdated(transaction);\n };\n\n readonly #selectedAccountChangedHandler = (): void => {\n this.#onSelectedAccountChanged();\n };\n\n readonly #statusChangedHandler = ({\n chainIds,\n status,\n }: {\n chainIds: string[];\n status: 'up' | 'down';\n }): void => {\n this.#onNetworkStatusChanged(chainIds, status);\n };\n\n constructor({\n client,\n getCurrentAccount,\n getLocalTransactions,\n includeTokenTransfers,\n isEnabled,\n messenger,\n remoteTransactionSource,\n trimTransactions,\n updateTransactions,\n }: {\n client?: string;\n getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n getLocalTransactions: () => TransactionMeta[];\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n messenger: TransactionControllerMessenger;\n remoteTransactionSource: RemoteTransactionSource;\n trimTransactions: (transactions: TransactionMeta[]) => TransactionMeta[];\n updateTransactions?: boolean;\n }) {\n this.hub = new EventEmitter();\n\n this.#client = client;\n this.#getCurrentAccount = getCurrentAccount;\n this.#getLocalTransactions = getLocalTransactions;\n this.#includeTokenTransfers = includeTokenTransfers;\n this.#isEnabled = isEnabled ?? ((): boolean => true);\n this.#isRunning = false;\n this.#isUpdating = false;\n this.#messenger = messenger;\n this.#remoteTransactionSource = remoteTransactionSource;\n this.#trimTransactions = trimTransactions;\n this.#updateTransactions = updateTransactions;\n this.#useWebsockets = isIncomingTransactionsUseWebsocketsEnabled(messenger);\n\n if (this.#useWebsockets) {\n this.#messenger.subscribe(\n 'BackendWebSocketService:connectionStateChanged',\n this.#connectionStateChangedHandler,\n );\n\n this.#messenger.subscribe(\n 'AccountActivityService:statusChanged',\n this.#statusChangedHandler,\n );\n }\n }\n\n start(): void {\n // When websockets are disabled, allow normal polling (legacy mode)\n if (this.#useWebsockets) {\n return;\n }\n\n this.#startPolling(true);\n }\n\n #startPolling(initialPolling = false): void {\n if (this.#isRunning) {\n return;\n }\n\n if (!this.#canStart()) {\n return;\n }\n\n const interval = this.#getInterval();\n\n log('Started polling', {\n interval,\n });\n\n this.#isRunning = true;\n\n if (this.#isUpdating) {\n return;\n }\n\n this.#onInterval().catch((error) => {\n log(initialPolling ? 'Initial polling failed' : 'Polling failed', error);\n });\n }\n\n stop(): void {\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 #onConnectionStateChanged(connectionInfo: WebSocketConnectionInfo): void {\n if (connectionInfo.state === WebSocketState.CONNECTED) {\n log('WebSocket connected, starting enhanced mode');\n this.#startTransactionHistoryRetrieval();\n } else if (connectionInfo.state === WebSocketState.DISCONNECTED) {\n log('WebSocket disconnected, stopping enhanced mode');\n this.#stopTransactionHistoryRetrieval();\n }\n }\n\n #startTransactionHistoryRetrieval(): void {\n if (!this.#canStart()) {\n return;\n }\n\n log('Started transaction history retrieval (event-driven)');\n\n this.update().catch((error) => {\n log('Initial update in transaction history retrieval failed', error);\n });\n\n this.#messenger.subscribe(\n 'AccountActivityService:transactionUpdated',\n this.#transactionUpdatedHandler,\n );\n\n this.#messenger.subscribe(\n 'AccountsController:selectedAccountChange',\n this.#selectedAccountChangedHandler,\n );\n }\n\n #stopTransactionHistoryRetrieval(): void {\n log('Stopped transaction history retrieval');\n\n this.#messenger.unsubscribe(\n 'AccountActivityService:transactionUpdated',\n this.#transactionUpdatedHandler,\n );\n\n this.#messenger.unsubscribe(\n 'AccountsController:selectedAccountChange',\n this.#selectedAccountChangedHandler,\n );\n }\n\n #onTransactionUpdated(transaction: AccountActivityTransaction): void {\n log('Received relevant transaction update, triggering update', {\n txId: transaction.id,\n chain: transaction.chain,\n });\n\n this.update().catch((error) => {\n log('Update after transaction event failed', error);\n });\n }\n\n #onSelectedAccountChanged(): void {\n log('Selected account changed, triggering update');\n\n this.update().catch((error) => {\n log('Update after account change failed', error);\n });\n }\n\n async #onInterval(): Promise<void> {\n this.#isUpdating = true;\n\n try {\n // When websockets enabled, only poll chains that are not confirmed up\n const chainIds = this.#useWebsockets ? this.#chainsToPoll : undefined;\n await this.update({ chainIds, isInterval: true });\n } catch (error) {\n console.error('Error while checking incoming transactions', error);\n }\n\n this.#isUpdating = false;\n\n if (this.#isRunning) {\n if (this.#timeoutId) {\n clearTimeout(this.#timeoutId as number);\n }\n\n this.#timeoutId = setTimeout(\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n () => this.#onInterval(),\n this.#getInterval(),\n );\n }\n }\n\n async update({\n chainIds,\n isInterval,\n tags,\n }: {\n chainIds?: Hex[];\n isInterval?: boolean;\n tags?: string[];\n } = {}): Promise<void> {\n const finalTags = this.#getTags(tags, isInterval);\n\n log('Checking for incoming transactions', {\n isInterval: Boolean(isInterval),\n tags: finalTags,\n });\n\n if (!this.#canStart()) {\n return;\n }\n\n const account = this.#getCurrentAccount();\n const includeTokenTransfers = this.#includeTokenTransfers ?? true;\n const updateTransactions = this.#updateTransactions ?? false;\n\n let remoteTransactions: TransactionMeta[] = [];\n\n try {\n remoteTransactions =\n await this.#remoteTransactionSource.fetchTransactions({\n address: account.address as Hex,\n chainIds,\n includeTokenTransfers,\n tags: finalTags,\n updateTransactions,\n });\n } catch (error: unknown) {\n log('Error while fetching remote transactions', error);\n return;\n }\n\n if (!remoteTransactions.length) {\n return;\n }\n\n this.#sortTransactionsByTime(remoteTransactions);\n\n log(\n 'Found potential transactions',\n remoteTransactions.length,\n remoteTransactions,\n );\n\n const localTransactions = this.#getLocalTransactions();\n\n const uniqueTransactions = remoteTransactions.filter(\n (tx) =>\n !localTransactions.some(\n (currentTx) =>\n currentTx.hash?.toLowerCase() === tx.hash?.toLowerCase() &&\n currentTx.txParams.from?.toLowerCase() ===\n tx.txParams.from?.toLowerCase() &&\n currentTx.type === tx.type,\n ),\n );\n\n if (!uniqueTransactions.length) {\n log('All transactions are already known');\n return;\n }\n\n log(\n 'Found unique transactions',\n uniqueTransactions.length,\n uniqueTransactions,\n );\n\n const trimmedTransactions = this.#trimTransactions([\n ...uniqueTransactions,\n ...localTransactions,\n ]);\n\n const uniqueTransactionIds = uniqueTransactions.map((tx) => tx.id);\n\n const newTransactions = trimmedTransactions.filter((tx) =>\n uniqueTransactionIds.includes(tx.id),\n );\n\n if (!newTransactions.length) {\n log('All unique transactions truncated due to limit');\n return;\n }\n\n log('Adding new transactions', newTransactions.length, newTransactions);\n\n this.hub.emit('transactions', newTransactions);\n }\n\n #sortTransactionsByTime(transactions: TransactionMeta[]): void {\n transactions.sort((a, b) => (a.time < b.time ? -1 : 1));\n }\n\n #canStart(): boolean {\n return this.#isEnabled();\n }\n\n #getInterval(): number {\n return getIncomingTransactionsPollingInterval(this.#messenger);\n }\n\n #getTags(\n requestTags: string[] | undefined,\n isInterval: boolean | undefined,\n ): string[] | undefined {\n const tags = [];\n\n if (this.#client) {\n tags.push(this.#client);\n }\n\n if (requestTags?.length) {\n tags.push(...requestTags);\n } else if (isInterval) {\n tags.push(TAG_POLLING);\n }\n\n return tags?.length ? tags : undefined;\n }\n\n #onNetworkStatusChanged(chainIds: string[], status: 'up' | 'down'): void {\n if (!this.#useWebsockets) {\n return;\n }\n\n let hasChanges = false;\n\n for (const caip2ChainId of chainIds) {\n const hexChainId = caip2ToHex(caip2ChainId);\n\n if (!hexChainId || !SUPPORTED_CHAIN_IDS.includes(hexChainId)) {\n log('Chain ID not recognized or not supported', {\n caip2ChainId,\n hexChainId,\n });\n continue;\n }\n\n if (status === 'up') {\n const index = this.#chainsToPoll.indexOf(hexChainId);\n if (index !== -1) {\n this.#chainsToPoll.splice(index, 1);\n hasChanges = true;\n log('Supported network came up, removed from polling list', {\n chainId: hexChainId,\n });\n }\n } else if (\n status === 'down' &&\n !this.#chainsToPoll.includes(hexChainId)\n ) {\n this.#chainsToPoll.push(hexChainId);\n hasChanges = true;\n log('Supported network went down, added to polling list', {\n chainId: hexChainId,\n });\n }\n }\n\n if (!hasChanges) {\n log('No changes to polling list', {\n chainsToPoll: this.#chainsToPoll,\n });\n return;\n }\n\n if (this.#chainsToPoll.length === 0) {\n log('Stopping fallback polling - all networks up');\n this.stop();\n } else {\n log('Starting fallback polling - some networks need polling', {\n chainsToPoll: this.#chainsToPoll,\n });\n this.#startPolling();\n }\n }\n}\n"]}
@@ -4,6 +4,10 @@ import type { Hex } from "@metamask/utils";
4
4
  import EventEmitter from "events";
5
5
  import type { TransactionControllerMessenger } from "../index.cjs";
6
6
  import type { RemoteTransactionSource, TransactionMeta } from "../types.cjs";
7
+ export declare enum WebSocketState {
8
+ CONNECTED = "connected",
9
+ DISCONNECTED = "disconnected"
10
+ }
7
11
  export type IncomingTransactionOptions = {
8
12
  /** Name of the client to include in requests. */
9
13
  client?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"IncomingTransactionHelper.d.cts","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sCAAsC;AAOxE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,YAAY,eAAe;AAGlC,OAAO,KAAK,EAAE,8BAA8B,EAAE,qBAAW;AAEzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,qBAAiB;AAMzE,MAAM,MAAM,0BAA0B,GAAG;IACvC,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,uEAAuE;IACvE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAE1B,kCAAkC;IAClC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAIF,qBAAa,yBAAyB;;IACpC,GAAG,EAAE,YAAY,CAAC;gBA6DN,EACV,MAAM,EACN,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,SAAS,EACT,SAAS,EACT,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,EAAE;QACD,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,iBAAiB,EAAE,MAAM,UAAU,CACjC,kBAAkB,CAAC,oBAAoB,CAAC,CACzC,CAAC;QACF,oBAAoB,EAAE,MAAM,eAAe,EAAE,CAAC;QAC9C,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;QAC1B,SAAS,EAAE,8BAA8B,CAAC;QAC1C,uBAAuB,EAAE,uBAAuB,CAAC;QACjD,gBAAgB,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,CAAC;QACzE,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B;IA6BD,KAAK,IAAI,IAAI;IAmCb,IAAI,IAAI,IAAI;IAyGN,MAAM,CAAC,EACX,QAAQ,EACR,UAAU,EACV,IAAI,GACL,GAAE;QACD,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACZ,GAAG,OAAO,CAAC,IAAI,CAAC;CAkMvB"}
1
+ {"version":3,"file":"IncomingTransactionHelper.d.cts","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sCAAsC;AAKxE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAG3C,OAAO,YAAY,eAAe;AAGlC,OAAO,KAAK,EAAE,8BAA8B,EAAE,qBAAW;AAEzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,qBAAiB;AAOzE,oBAAY,cAAc;IACxB,SAAS,cAAc;IACvB,YAAY,iBAAiB;CAC9B;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,uEAAuE;IACvE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAE1B,kCAAkC;IAClC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAIF,qBAAa,yBAAyB;;IACpC,GAAG,EAAE,YAAY,CAAC;gBA6DN,EACV,MAAM,EACN,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,SAAS,EACT,SAAS,EACT,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,EAAE;QACD,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,iBAAiB,EAAE,MAAM,UAAU,CACjC,kBAAkB,CAAC,oBAAoB,CAAC,CACzC,CAAC;QACF,oBAAoB,EAAE,MAAM,eAAe,EAAE,CAAC;QAC9C,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;QAC1B,SAAS,EAAE,8BAA8B,CAAC;QAC1C,uBAAuB,EAAE,uBAAuB,CAAC;QACjD,gBAAgB,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,CAAC;QACzE,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B;IA6BD,KAAK,IAAI,IAAI;IAmCb,IAAI,IAAI,IAAI;IAyGN,MAAM,CAAC,EACX,QAAQ,EACR,UAAU,EACV,IAAI,GACL,GAAE;QACD,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACZ,GAAG,OAAO,CAAC,IAAI,CAAC;CAgLvB"}
@@ -4,6 +4,10 @@ import type { Hex } from "@metamask/utils";
4
4
  import EventEmitter from "events";
5
5
  import type { TransactionControllerMessenger } from "../index.mjs";
6
6
  import type { RemoteTransactionSource, TransactionMeta } from "../types.mjs";
7
+ export declare enum WebSocketState {
8
+ CONNECTED = "connected",
9
+ DISCONNECTED = "disconnected"
10
+ }
7
11
  export type IncomingTransactionOptions = {
8
12
  /** Name of the client to include in requests. */
9
13
  client?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"IncomingTransactionHelper.d.mts","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sCAAsC;AAOxE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,YAAY,eAAe;AAGlC,OAAO,KAAK,EAAE,8BAA8B,EAAE,qBAAW;AAEzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,qBAAiB;AAMzE,MAAM,MAAM,0BAA0B,GAAG;IACvC,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,uEAAuE;IACvE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAE1B,kCAAkC;IAClC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAIF,qBAAa,yBAAyB;;IACpC,GAAG,EAAE,YAAY,CAAC;gBA6DN,EACV,MAAM,EACN,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,SAAS,EACT,SAAS,EACT,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,EAAE;QACD,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,iBAAiB,EAAE,MAAM,UAAU,CACjC,kBAAkB,CAAC,oBAAoB,CAAC,CACzC,CAAC;QACF,oBAAoB,EAAE,MAAM,eAAe,EAAE,CAAC;QAC9C,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;QAC1B,SAAS,EAAE,8BAA8B,CAAC;QAC1C,uBAAuB,EAAE,uBAAuB,CAAC;QACjD,gBAAgB,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,CAAC;QACzE,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B;IA6BD,KAAK,IAAI,IAAI;IAmCb,IAAI,IAAI,IAAI;IAyGN,MAAM,CAAC,EACX,QAAQ,EACR,UAAU,EACV,IAAI,GACL,GAAE;QACD,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACZ,GAAG,OAAO,CAAC,IAAI,CAAC;CAkMvB"}
1
+ {"version":3,"file":"IncomingTransactionHelper.d.mts","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,sCAAsC;AAKxE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAG3C,OAAO,YAAY,eAAe;AAGlC,OAAO,KAAK,EAAE,8BAA8B,EAAE,qBAAW;AAEzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,qBAAiB;AAOzE,oBAAY,cAAc;IACxB,SAAS,cAAc;IACvB,YAAY,iBAAiB;CAC9B;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,uEAAuE;IACvE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAE1B,kCAAkC;IAClC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAIF,qBAAa,yBAAyB;;IACpC,GAAG,EAAE,YAAY,CAAC;gBA6DN,EACV,MAAM,EACN,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,SAAS,EACT,SAAS,EACT,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,EAAE;QACD,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,iBAAiB,EAAE,MAAM,UAAU,CACjC,kBAAkB,CAAC,oBAAoB,CAAC,CACzC,CAAC;QACF,oBAAoB,EAAE,MAAM,eAAe,EAAE,CAAC;QAC9C,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;QAC1B,SAAS,EAAE,8BAA8B,CAAC;QAC1C,uBAAuB,EAAE,uBAAuB,CAAC;QACjD,gBAAgB,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,CAAC;QACzE,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B;IA6BD,KAAK,IAAI,IAAI;IAmCb,IAAI,IAAI,IAAI;IAyGN,MAAM,CAAC,EACX,QAAQ,EACR,UAAU,EACV,IAAI,GACL,GAAE;QACD,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACZ,GAAG,OAAO,CAAC,IAAI,CAAC;CAgLvB"}
@@ -9,16 +9,19 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _IncomingTransactionHelper_instances, _IncomingTransactionHelper_client, _IncomingTransactionHelper_getCurrentAccount, _IncomingTransactionHelper_getLocalTransactions, _IncomingTransactionHelper_includeTokenTransfers, _IncomingTransactionHelper_isEnabled, _IncomingTransactionHelper_isRunning, _IncomingTransactionHelper_isUpdating, _IncomingTransactionHelper_messenger, _IncomingTransactionHelper_remoteTransactionSource, _IncomingTransactionHelper_timeoutId, _IncomingTransactionHelper_trimTransactions, _IncomingTransactionHelper_updateTransactions, _IncomingTransactionHelper_useWebsockets, _IncomingTransactionHelper_chainsToPoll, _IncomingTransactionHelper_connectionStateChangedHandler, _IncomingTransactionHelper_transactionUpdatedHandler, _IncomingTransactionHelper_selectedAccountChangedHandler, _IncomingTransactionHelper_statusChangedHandler, _IncomingTransactionHelper_startPolling, _IncomingTransactionHelper_onConnectionStateChanged, _IncomingTransactionHelper_startTransactionHistoryRetrieval, _IncomingTransactionHelper_stopTransactionHistoryRetrieval, _IncomingTransactionHelper_onTransactionUpdated, _IncomingTransactionHelper_onSelectedAccountChanged, _IncomingTransactionHelper_onInterval, _IncomingTransactionHelper_sortTransactionsByTime, _IncomingTransactionHelper_canStart, _IncomingTransactionHelper_getInterval, _IncomingTransactionHelper_getTags, _IncomingTransactionHelper_caip2ToHex, _IncomingTransactionHelper_onNetworkStatusChanged;
13
- import { toHex } from "@metamask/controller-utils";
14
- import { WebSocketState } from "@metamask/core-backend";
15
- import { isCaipChainId, parseCaipChainId } from "@metamask/utils";
12
+ var _IncomingTransactionHelper_instances, _IncomingTransactionHelper_client, _IncomingTransactionHelper_getCurrentAccount, _IncomingTransactionHelper_getLocalTransactions, _IncomingTransactionHelper_includeTokenTransfers, _IncomingTransactionHelper_isEnabled, _IncomingTransactionHelper_isRunning, _IncomingTransactionHelper_isUpdating, _IncomingTransactionHelper_messenger, _IncomingTransactionHelper_remoteTransactionSource, _IncomingTransactionHelper_timeoutId, _IncomingTransactionHelper_trimTransactions, _IncomingTransactionHelper_updateTransactions, _IncomingTransactionHelper_useWebsockets, _IncomingTransactionHelper_chainsToPoll, _IncomingTransactionHelper_connectionStateChangedHandler, _IncomingTransactionHelper_transactionUpdatedHandler, _IncomingTransactionHelper_selectedAccountChangedHandler, _IncomingTransactionHelper_statusChangedHandler, _IncomingTransactionHelper_startPolling, _IncomingTransactionHelper_onConnectionStateChanged, _IncomingTransactionHelper_startTransactionHistoryRetrieval, _IncomingTransactionHelper_stopTransactionHistoryRetrieval, _IncomingTransactionHelper_onTransactionUpdated, _IncomingTransactionHelper_onSelectedAccountChanged, _IncomingTransactionHelper_onInterval, _IncomingTransactionHelper_sortTransactionsByTime, _IncomingTransactionHelper_canStart, _IncomingTransactionHelper_getInterval, _IncomingTransactionHelper_getTags, _IncomingTransactionHelper_onNetworkStatusChanged;
16
13
  // This package purposefully relies on Node's EventEmitter module.
17
14
  // eslint-disable-next-line import-x/no-nodejs-modules
18
15
  import EventEmitter from "events";
19
16
  import { SUPPORTED_CHAIN_IDS } from "./AccountsApiRemoteTransactionSource.mjs";
20
17
  import { incomingTransactionsLogger as log } from "../logger.mjs";
21
18
  import { getIncomingTransactionsPollingInterval, isIncomingTransactionsUseWebsocketsEnabled } from "../utils/feature-flags.mjs";
19
+ import { caip2ToHex } from "../utils/utils.mjs";
20
+ export var WebSocketState;
21
+ (function (WebSocketState) {
22
+ WebSocketState["CONNECTED"] = "connected";
23
+ WebSocketState["DISCONNECTED"] = "disconnected";
24
+ })(WebSocketState || (WebSocketState = {}));
22
25
  const TAG_POLLING = 'automatic-polling';
23
26
  export class IncomingTransactionHelper {
24
27
  constructor({ client, getCurrentAccount, getLocalTransactions, includeTokenTransfers, isEnabled, messenger, remoteTransactionSource, trimTransactions, updateTransactions, }) {
@@ -232,24 +235,13 @@ _IncomingTransactionHelper_client = new WeakMap(), _IncomingTransactionHelper_ge
232
235
  tags.push(TAG_POLLING);
233
236
  }
234
237
  return tags?.length ? tags : undefined;
235
- }, _IncomingTransactionHelper_caip2ToHex = function _IncomingTransactionHelper_caip2ToHex(caip2ChainId) {
236
- if (!isCaipChainId(caip2ChainId)) {
237
- return undefined;
238
- }
239
- try {
240
- const { reference } = parseCaipChainId(caip2ChainId);
241
- return toHex(reference);
242
- }
243
- catch {
244
- return undefined;
245
- }
246
238
  }, _IncomingTransactionHelper_onNetworkStatusChanged = function _IncomingTransactionHelper_onNetworkStatusChanged(chainIds, status) {
247
239
  if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_useWebsockets, "f")) {
248
240
  return;
249
241
  }
250
242
  let hasChanges = false;
251
243
  for (const caip2ChainId of chainIds) {
252
- const hexChainId = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_caip2ToHex).call(this, caip2ChainId);
244
+ const hexChainId = caip2ToHex(caip2ChainId);
253
245
  if (!hexChainId || !SUPPORTED_CHAIN_IDS.includes(hexChainId)) {
254
246
  log('Chain ID not recognized or not supported', {
255
247
  caip2ChainId,
@@ -1 +1 @@
1
- {"version":3,"file":"IncomingTransactionHelper.mjs","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsController } from '@metamask/accounts-controller';\nimport { toHex } from '@metamask/controller-utils';\nimport type {\n Transaction as AccountActivityTransaction,\n WebSocketConnectionInfo,\n} from '@metamask/core-backend';\nimport { WebSocketState } from '@metamask/core-backend';\nimport type { Hex } from '@metamask/utils';\nimport { isCaipChainId, parseCaipChainId } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport EventEmitter from 'events';\n\nimport { SUPPORTED_CHAIN_IDS } from './AccountsApiRemoteTransactionSource';\nimport type { TransactionControllerMessenger } from '..';\nimport { incomingTransactionsLogger as log } from '../logger';\nimport type { RemoteTransactionSource, TransactionMeta } from '../types';\nimport {\n getIncomingTransactionsPollingInterval,\n isIncomingTransactionsUseWebsocketsEnabled,\n} from '../utils/feature-flags';\n\nexport type IncomingTransactionOptions = {\n /** Name of the client to include in requests. */\n client?: string;\n\n /** Whether to retrieve incoming token transfers. Defaults to false. */\n includeTokenTransfers?: boolean;\n\n /** Callback to determine if incoming transaction polling is enabled. */\n isEnabled?: () => boolean;\n\n /** @deprecated No longer used. */\n queryEntireHistory?: boolean;\n\n /** Whether to retrieve outgoing transactions. Defaults to false. */\n updateTransactions?: boolean;\n};\n\nconst TAG_POLLING = 'automatic-polling';\n\nexport class IncomingTransactionHelper {\n hub: EventEmitter;\n\n readonly #client?: string;\n\n readonly #getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n\n readonly #getLocalTransactions: () => TransactionMeta[];\n\n readonly #includeTokenTransfers?: boolean;\n\n readonly #isEnabled: () => boolean;\n\n #isRunning: boolean;\n\n #isUpdating: boolean;\n\n readonly #messenger: TransactionControllerMessenger;\n\n readonly #remoteTransactionSource: RemoteTransactionSource;\n\n #timeoutId?: unknown;\n\n readonly #trimTransactions: (\n transactions: TransactionMeta[],\n ) => TransactionMeta[];\n\n readonly #updateTransactions?: boolean;\n\n readonly #useWebsockets: boolean;\n\n // Chains that need polling (start with all supported, remove as they come up)\n readonly #chainsToPoll: Hex[] = [...SUPPORTED_CHAIN_IDS];\n\n readonly #connectionStateChangedHandler = (\n connectionInfo: WebSocketConnectionInfo,\n ): void => {\n this.#onConnectionStateChanged(connectionInfo);\n };\n\n readonly #transactionUpdatedHandler = (\n transaction: AccountActivityTransaction,\n ): void => {\n this.#onTransactionUpdated(transaction);\n };\n\n readonly #selectedAccountChangedHandler = (): void => {\n this.#onSelectedAccountChanged();\n };\n\n readonly #statusChangedHandler = ({\n chainIds,\n status,\n }: {\n chainIds: string[];\n status: 'up' | 'down';\n }): void => {\n this.#onNetworkStatusChanged(chainIds, status);\n };\n\n constructor({\n client,\n getCurrentAccount,\n getLocalTransactions,\n includeTokenTransfers,\n isEnabled,\n messenger,\n remoteTransactionSource,\n trimTransactions,\n updateTransactions,\n }: {\n client?: string;\n getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n getLocalTransactions: () => TransactionMeta[];\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n messenger: TransactionControllerMessenger;\n remoteTransactionSource: RemoteTransactionSource;\n trimTransactions: (transactions: TransactionMeta[]) => TransactionMeta[];\n updateTransactions?: boolean;\n }) {\n this.hub = new EventEmitter();\n\n this.#client = client;\n this.#getCurrentAccount = getCurrentAccount;\n this.#getLocalTransactions = getLocalTransactions;\n this.#includeTokenTransfers = includeTokenTransfers;\n this.#isEnabled = isEnabled ?? ((): boolean => true);\n this.#isRunning = false;\n this.#isUpdating = false;\n this.#messenger = messenger;\n this.#remoteTransactionSource = remoteTransactionSource;\n this.#trimTransactions = trimTransactions;\n this.#updateTransactions = updateTransactions;\n this.#useWebsockets = isIncomingTransactionsUseWebsocketsEnabled(messenger);\n\n if (this.#useWebsockets) {\n this.#messenger.subscribe(\n 'BackendWebSocketService:connectionStateChanged',\n this.#connectionStateChangedHandler,\n );\n\n this.#messenger.subscribe(\n 'AccountActivityService:statusChanged',\n this.#statusChangedHandler,\n );\n }\n }\n\n start(): void {\n // When websockets are disabled, allow normal polling (legacy mode)\n if (this.#useWebsockets) {\n return;\n }\n\n this.#startPolling(true);\n }\n\n #startPolling(initialPolling = false): void {\n if (this.#isRunning) {\n return;\n }\n\n if (!this.#canStart()) {\n return;\n }\n\n const interval = this.#getInterval();\n\n log('Started polling', {\n interval,\n });\n\n this.#isRunning = true;\n\n if (this.#isUpdating) {\n return;\n }\n\n this.#onInterval().catch((error) => {\n log(initialPolling ? 'Initial polling failed' : 'Polling failed', error);\n });\n }\n\n stop(): void {\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 #onConnectionStateChanged(connectionInfo: WebSocketConnectionInfo): void {\n if (connectionInfo.state === WebSocketState.CONNECTED) {\n log('WebSocket connected, starting enhanced mode');\n this.#startTransactionHistoryRetrieval();\n } else if (connectionInfo.state === WebSocketState.DISCONNECTED) {\n log('WebSocket disconnected, stopping enhanced mode');\n this.#stopTransactionHistoryRetrieval();\n }\n }\n\n #startTransactionHistoryRetrieval(): void {\n if (!this.#canStart()) {\n return;\n }\n\n log('Started transaction history retrieval (event-driven)');\n\n this.update().catch((error) => {\n log('Initial update in transaction history retrieval failed', error);\n });\n\n this.#messenger.subscribe(\n 'AccountActivityService:transactionUpdated',\n this.#transactionUpdatedHandler,\n );\n\n this.#messenger.subscribe(\n 'AccountsController:selectedAccountChange',\n this.#selectedAccountChangedHandler,\n );\n }\n\n #stopTransactionHistoryRetrieval(): void {\n log('Stopped transaction history retrieval');\n\n this.#messenger.unsubscribe(\n 'AccountActivityService:transactionUpdated',\n this.#transactionUpdatedHandler,\n );\n\n this.#messenger.unsubscribe(\n 'AccountsController:selectedAccountChange',\n this.#selectedAccountChangedHandler,\n );\n }\n\n #onTransactionUpdated(transaction: AccountActivityTransaction): void {\n log('Received relevant transaction update, triggering update', {\n txId: transaction.id,\n chain: transaction.chain,\n });\n\n this.update().catch((error) => {\n log('Update after transaction event failed', error);\n });\n }\n\n #onSelectedAccountChanged(): void {\n log('Selected account changed, triggering update');\n\n this.update().catch((error) => {\n log('Update after account change failed', error);\n });\n }\n\n async #onInterval(): Promise<void> {\n this.#isUpdating = true;\n\n try {\n // When websockets enabled, only poll chains that are not confirmed up\n const chainIds = this.#useWebsockets ? this.#chainsToPoll : undefined;\n await this.update({ chainIds, isInterval: true });\n } catch (error) {\n console.error('Error while checking incoming transactions', error);\n }\n\n this.#isUpdating = false;\n\n if (this.#isRunning) {\n if (this.#timeoutId) {\n clearTimeout(this.#timeoutId as number);\n }\n\n this.#timeoutId = setTimeout(\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n () => this.#onInterval(),\n this.#getInterval(),\n );\n }\n }\n\n async update({\n chainIds,\n isInterval,\n tags,\n }: {\n chainIds?: Hex[];\n isInterval?: boolean;\n tags?: string[];\n } = {}): Promise<void> {\n const finalTags = this.#getTags(tags, isInterval);\n\n log('Checking for incoming transactions', {\n isInterval: Boolean(isInterval),\n tags: finalTags,\n });\n\n if (!this.#canStart()) {\n return;\n }\n\n const account = this.#getCurrentAccount();\n const includeTokenTransfers = this.#includeTokenTransfers ?? true;\n const updateTransactions = this.#updateTransactions ?? false;\n\n let remoteTransactions: TransactionMeta[] = [];\n\n try {\n remoteTransactions =\n await this.#remoteTransactionSource.fetchTransactions({\n address: account.address as Hex,\n chainIds,\n includeTokenTransfers,\n tags: finalTags,\n updateTransactions,\n });\n } catch (error: unknown) {\n log('Error while fetching remote transactions', error);\n return;\n }\n\n if (!remoteTransactions.length) {\n return;\n }\n\n this.#sortTransactionsByTime(remoteTransactions);\n\n log(\n 'Found potential transactions',\n remoteTransactions.length,\n remoteTransactions,\n );\n\n const localTransactions = this.#getLocalTransactions();\n\n const uniqueTransactions = remoteTransactions.filter(\n (tx) =>\n !localTransactions.some(\n (currentTx) =>\n currentTx.hash?.toLowerCase() === tx.hash?.toLowerCase() &&\n currentTx.txParams.from?.toLowerCase() ===\n tx.txParams.from?.toLowerCase() &&\n currentTx.type === tx.type,\n ),\n );\n\n if (!uniqueTransactions.length) {\n log('All transactions are already known');\n return;\n }\n\n log(\n 'Found unique transactions',\n uniqueTransactions.length,\n uniqueTransactions,\n );\n\n const trimmedTransactions = this.#trimTransactions([\n ...uniqueTransactions,\n ...localTransactions,\n ]);\n\n const uniqueTransactionIds = uniqueTransactions.map((tx) => tx.id);\n\n const newTransactions = trimmedTransactions.filter((tx) =>\n uniqueTransactionIds.includes(tx.id),\n );\n\n if (!newTransactions.length) {\n log('All unique transactions truncated due to limit');\n return;\n }\n\n log('Adding new transactions', newTransactions.length, newTransactions);\n\n this.hub.emit('transactions', newTransactions);\n }\n\n #sortTransactionsByTime(transactions: TransactionMeta[]): void {\n transactions.sort((a, b) => (a.time < b.time ? -1 : 1));\n }\n\n #canStart(): boolean {\n return this.#isEnabled();\n }\n\n #getInterval(): number {\n return getIncomingTransactionsPollingInterval(this.#messenger);\n }\n\n #getTags(\n requestTags: string[] | undefined,\n isInterval: boolean | undefined,\n ): string[] | undefined {\n const tags = [];\n\n if (this.#client) {\n tags.push(this.#client);\n }\n\n if (requestTags?.length) {\n tags.push(...requestTags);\n } else if (isInterval) {\n tags.push(TAG_POLLING);\n }\n\n return tags?.length ? tags : undefined;\n }\n\n /**\n * Convert CAIP-2 chain ID to hex format.\n *\n * @param caip2ChainId - Chain ID in CAIP-2 format (e.g., 'eip155:1')\n * @returns Hex chain ID (e.g., '0x1') or undefined if invalid format\n */\n #caip2ToHex(caip2ChainId: string): Hex | undefined {\n if (!isCaipChainId(caip2ChainId)) {\n return undefined;\n }\n try {\n const { reference } = parseCaipChainId(caip2ChainId);\n return toHex(reference);\n } catch {\n return undefined;\n }\n }\n\n #onNetworkStatusChanged(chainIds: string[], status: 'up' | 'down'): void {\n if (!this.#useWebsockets) {\n return;\n }\n\n let hasChanges = false;\n\n for (const caip2ChainId of chainIds) {\n const hexChainId = this.#caip2ToHex(caip2ChainId);\n\n if (!hexChainId || !SUPPORTED_CHAIN_IDS.includes(hexChainId)) {\n log('Chain ID not recognized or not supported', {\n caip2ChainId,\n hexChainId,\n });\n continue;\n }\n\n if (status === 'up') {\n const index = this.#chainsToPoll.indexOf(hexChainId);\n if (index !== -1) {\n this.#chainsToPoll.splice(index, 1);\n hasChanges = true;\n log('Supported network came up, removed from polling list', {\n chainId: hexChainId,\n });\n }\n } else if (\n status === 'down' &&\n !this.#chainsToPoll.includes(hexChainId)\n ) {\n this.#chainsToPoll.push(hexChainId);\n hasChanges = true;\n log('Supported network went down, added to polling list', {\n chainId: hexChainId,\n });\n }\n }\n\n if (!hasChanges) {\n log('No changes to polling list', {\n chainsToPoll: this.#chainsToPoll,\n });\n return;\n }\n\n if (this.#chainsToPoll.length === 0) {\n log('Stopping fallback polling - all networks up');\n this.stop();\n } else {\n log('Starting fallback polling - some networks need polling', {\n chainsToPoll: this.#chainsToPoll,\n });\n this.#startPolling();\n }\n }\n}\n"]}
1
+ {"version":3,"file":"IncomingTransactionHelper.mjs","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsController } from '@metamask/accounts-controller';\nimport type {\n Transaction as AccountActivityTransaction,\n WebSocketConnectionInfo,\n} from '@metamask/core-backend';\nimport type { Hex } from '@metamask/utils';\n// This package purposefully relies on Node's EventEmitter module.\n// eslint-disable-next-line import-x/no-nodejs-modules\nimport EventEmitter from 'events';\n\nimport { SUPPORTED_CHAIN_IDS } from './AccountsApiRemoteTransactionSource';\nimport type { TransactionControllerMessenger } from '..';\nimport { incomingTransactionsLogger as log } from '../logger';\nimport type { RemoteTransactionSource, TransactionMeta } from '../types';\nimport {\n getIncomingTransactionsPollingInterval,\n isIncomingTransactionsUseWebsocketsEnabled,\n} from '../utils/feature-flags';\nimport { caip2ToHex } from '../utils/utils';\n\nexport enum WebSocketState {\n CONNECTED = 'connected',\n DISCONNECTED = 'disconnected',\n}\n\nexport type IncomingTransactionOptions = {\n /** Name of the client to include in requests. */\n client?: string;\n\n /** Whether to retrieve incoming token transfers. Defaults to false. */\n includeTokenTransfers?: boolean;\n\n /** Callback to determine if incoming transaction polling is enabled. */\n isEnabled?: () => boolean;\n\n /** @deprecated No longer used. */\n queryEntireHistory?: boolean;\n\n /** Whether to retrieve outgoing transactions. Defaults to false. */\n updateTransactions?: boolean;\n};\n\nconst TAG_POLLING = 'automatic-polling';\n\nexport class IncomingTransactionHelper {\n hub: EventEmitter;\n\n readonly #client?: string;\n\n readonly #getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n\n readonly #getLocalTransactions: () => TransactionMeta[];\n\n readonly #includeTokenTransfers?: boolean;\n\n readonly #isEnabled: () => boolean;\n\n #isRunning: boolean;\n\n #isUpdating: boolean;\n\n readonly #messenger: TransactionControllerMessenger;\n\n readonly #remoteTransactionSource: RemoteTransactionSource;\n\n #timeoutId?: unknown;\n\n readonly #trimTransactions: (\n transactions: TransactionMeta[],\n ) => TransactionMeta[];\n\n readonly #updateTransactions?: boolean;\n\n readonly #useWebsockets: boolean;\n\n // Chains that need polling (start with all supported, remove as they come up)\n readonly #chainsToPoll: Hex[] = [...SUPPORTED_CHAIN_IDS];\n\n readonly #connectionStateChangedHandler = (\n connectionInfo: WebSocketConnectionInfo,\n ): void => {\n this.#onConnectionStateChanged(connectionInfo);\n };\n\n readonly #transactionUpdatedHandler = (\n transaction: AccountActivityTransaction,\n ): void => {\n this.#onTransactionUpdated(transaction);\n };\n\n readonly #selectedAccountChangedHandler = (): void => {\n this.#onSelectedAccountChanged();\n };\n\n readonly #statusChangedHandler = ({\n chainIds,\n status,\n }: {\n chainIds: string[];\n status: 'up' | 'down';\n }): void => {\n this.#onNetworkStatusChanged(chainIds, status);\n };\n\n constructor({\n client,\n getCurrentAccount,\n getLocalTransactions,\n includeTokenTransfers,\n isEnabled,\n messenger,\n remoteTransactionSource,\n trimTransactions,\n updateTransactions,\n }: {\n client?: string;\n getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n getLocalTransactions: () => TransactionMeta[];\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n messenger: TransactionControllerMessenger;\n remoteTransactionSource: RemoteTransactionSource;\n trimTransactions: (transactions: TransactionMeta[]) => TransactionMeta[];\n updateTransactions?: boolean;\n }) {\n this.hub = new EventEmitter();\n\n this.#client = client;\n this.#getCurrentAccount = getCurrentAccount;\n this.#getLocalTransactions = getLocalTransactions;\n this.#includeTokenTransfers = includeTokenTransfers;\n this.#isEnabled = isEnabled ?? ((): boolean => true);\n this.#isRunning = false;\n this.#isUpdating = false;\n this.#messenger = messenger;\n this.#remoteTransactionSource = remoteTransactionSource;\n this.#trimTransactions = trimTransactions;\n this.#updateTransactions = updateTransactions;\n this.#useWebsockets = isIncomingTransactionsUseWebsocketsEnabled(messenger);\n\n if (this.#useWebsockets) {\n this.#messenger.subscribe(\n 'BackendWebSocketService:connectionStateChanged',\n this.#connectionStateChangedHandler,\n );\n\n this.#messenger.subscribe(\n 'AccountActivityService:statusChanged',\n this.#statusChangedHandler,\n );\n }\n }\n\n start(): void {\n // When websockets are disabled, allow normal polling (legacy mode)\n if (this.#useWebsockets) {\n return;\n }\n\n this.#startPolling(true);\n }\n\n #startPolling(initialPolling = false): void {\n if (this.#isRunning) {\n return;\n }\n\n if (!this.#canStart()) {\n return;\n }\n\n const interval = this.#getInterval();\n\n log('Started polling', {\n interval,\n });\n\n this.#isRunning = true;\n\n if (this.#isUpdating) {\n return;\n }\n\n this.#onInterval().catch((error) => {\n log(initialPolling ? 'Initial polling failed' : 'Polling failed', error);\n });\n }\n\n stop(): void {\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 #onConnectionStateChanged(connectionInfo: WebSocketConnectionInfo): void {\n if (connectionInfo.state === WebSocketState.CONNECTED) {\n log('WebSocket connected, starting enhanced mode');\n this.#startTransactionHistoryRetrieval();\n } else if (connectionInfo.state === WebSocketState.DISCONNECTED) {\n log('WebSocket disconnected, stopping enhanced mode');\n this.#stopTransactionHistoryRetrieval();\n }\n }\n\n #startTransactionHistoryRetrieval(): void {\n if (!this.#canStart()) {\n return;\n }\n\n log('Started transaction history retrieval (event-driven)');\n\n this.update().catch((error) => {\n log('Initial update in transaction history retrieval failed', error);\n });\n\n this.#messenger.subscribe(\n 'AccountActivityService:transactionUpdated',\n this.#transactionUpdatedHandler,\n );\n\n this.#messenger.subscribe(\n 'AccountsController:selectedAccountChange',\n this.#selectedAccountChangedHandler,\n );\n }\n\n #stopTransactionHistoryRetrieval(): void {\n log('Stopped transaction history retrieval');\n\n this.#messenger.unsubscribe(\n 'AccountActivityService:transactionUpdated',\n this.#transactionUpdatedHandler,\n );\n\n this.#messenger.unsubscribe(\n 'AccountsController:selectedAccountChange',\n this.#selectedAccountChangedHandler,\n );\n }\n\n #onTransactionUpdated(transaction: AccountActivityTransaction): void {\n log('Received relevant transaction update, triggering update', {\n txId: transaction.id,\n chain: transaction.chain,\n });\n\n this.update().catch((error) => {\n log('Update after transaction event failed', error);\n });\n }\n\n #onSelectedAccountChanged(): void {\n log('Selected account changed, triggering update');\n\n this.update().catch((error) => {\n log('Update after account change failed', error);\n });\n }\n\n async #onInterval(): Promise<void> {\n this.#isUpdating = true;\n\n try {\n // When websockets enabled, only poll chains that are not confirmed up\n const chainIds = this.#useWebsockets ? this.#chainsToPoll : undefined;\n await this.update({ chainIds, isInterval: true });\n } catch (error) {\n console.error('Error while checking incoming transactions', error);\n }\n\n this.#isUpdating = false;\n\n if (this.#isRunning) {\n if (this.#timeoutId) {\n clearTimeout(this.#timeoutId as number);\n }\n\n this.#timeoutId = setTimeout(\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n () => this.#onInterval(),\n this.#getInterval(),\n );\n }\n }\n\n async update({\n chainIds,\n isInterval,\n tags,\n }: {\n chainIds?: Hex[];\n isInterval?: boolean;\n tags?: string[];\n } = {}): Promise<void> {\n const finalTags = this.#getTags(tags, isInterval);\n\n log('Checking for incoming transactions', {\n isInterval: Boolean(isInterval),\n tags: finalTags,\n });\n\n if (!this.#canStart()) {\n return;\n }\n\n const account = this.#getCurrentAccount();\n const includeTokenTransfers = this.#includeTokenTransfers ?? true;\n const updateTransactions = this.#updateTransactions ?? false;\n\n let remoteTransactions: TransactionMeta[] = [];\n\n try {\n remoteTransactions =\n await this.#remoteTransactionSource.fetchTransactions({\n address: account.address as Hex,\n chainIds,\n includeTokenTransfers,\n tags: finalTags,\n updateTransactions,\n });\n } catch (error: unknown) {\n log('Error while fetching remote transactions', error);\n return;\n }\n\n if (!remoteTransactions.length) {\n return;\n }\n\n this.#sortTransactionsByTime(remoteTransactions);\n\n log(\n 'Found potential transactions',\n remoteTransactions.length,\n remoteTransactions,\n );\n\n const localTransactions = this.#getLocalTransactions();\n\n const uniqueTransactions = remoteTransactions.filter(\n (tx) =>\n !localTransactions.some(\n (currentTx) =>\n currentTx.hash?.toLowerCase() === tx.hash?.toLowerCase() &&\n currentTx.txParams.from?.toLowerCase() ===\n tx.txParams.from?.toLowerCase() &&\n currentTx.type === tx.type,\n ),\n );\n\n if (!uniqueTransactions.length) {\n log('All transactions are already known');\n return;\n }\n\n log(\n 'Found unique transactions',\n uniqueTransactions.length,\n uniqueTransactions,\n );\n\n const trimmedTransactions = this.#trimTransactions([\n ...uniqueTransactions,\n ...localTransactions,\n ]);\n\n const uniqueTransactionIds = uniqueTransactions.map((tx) => tx.id);\n\n const newTransactions = trimmedTransactions.filter((tx) =>\n uniqueTransactionIds.includes(tx.id),\n );\n\n if (!newTransactions.length) {\n log('All unique transactions truncated due to limit');\n return;\n }\n\n log('Adding new transactions', newTransactions.length, newTransactions);\n\n this.hub.emit('transactions', newTransactions);\n }\n\n #sortTransactionsByTime(transactions: TransactionMeta[]): void {\n transactions.sort((a, b) => (a.time < b.time ? -1 : 1));\n }\n\n #canStart(): boolean {\n return this.#isEnabled();\n }\n\n #getInterval(): number {\n return getIncomingTransactionsPollingInterval(this.#messenger);\n }\n\n #getTags(\n requestTags: string[] | undefined,\n isInterval: boolean | undefined,\n ): string[] | undefined {\n const tags = [];\n\n if (this.#client) {\n tags.push(this.#client);\n }\n\n if (requestTags?.length) {\n tags.push(...requestTags);\n } else if (isInterval) {\n tags.push(TAG_POLLING);\n }\n\n return tags?.length ? tags : undefined;\n }\n\n #onNetworkStatusChanged(chainIds: string[], status: 'up' | 'down'): void {\n if (!this.#useWebsockets) {\n return;\n }\n\n let hasChanges = false;\n\n for (const caip2ChainId of chainIds) {\n const hexChainId = caip2ToHex(caip2ChainId);\n\n if (!hexChainId || !SUPPORTED_CHAIN_IDS.includes(hexChainId)) {\n log('Chain ID not recognized or not supported', {\n caip2ChainId,\n hexChainId,\n });\n continue;\n }\n\n if (status === 'up') {\n const index = this.#chainsToPoll.indexOf(hexChainId);\n if (index !== -1) {\n this.#chainsToPoll.splice(index, 1);\n hasChanges = true;\n log('Supported network came up, removed from polling list', {\n chainId: hexChainId,\n });\n }\n } else if (\n status === 'down' &&\n !this.#chainsToPoll.includes(hexChainId)\n ) {\n this.#chainsToPoll.push(hexChainId);\n hasChanges = true;\n log('Supported network went down, added to polling list', {\n chainId: hexChainId,\n });\n }\n }\n\n if (!hasChanges) {\n log('No changes to polling list', {\n chainsToPoll: this.#chainsToPoll,\n });\n return;\n }\n\n if (this.#chainsToPoll.length === 0) {\n log('Stopping fallback polling - all networks up');\n this.stop();\n } else {\n log('Starting fallback polling - some networks need polling', {\n chainsToPoll: this.#chainsToPoll,\n });\n this.#startPolling();\n }\n }\n}\n"]}
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _TransactionPoller_instances, _TransactionPoller_acceleratedCount, _TransactionPoller_blockTracker, _TransactionPoller_chainId, _TransactionPoller_messenger, _TransactionPoller_blockTrackerListener, _TransactionPoller_listener, _TransactionPoller_pendingTransactions, _TransactionPoller_running, _TransactionPoller_timeout, _TransactionPoller_queue, _TransactionPoller_interval, _TransactionPoller_stopTimeout, _TransactionPoller_stopBlockTracker;
13
+ var _TransactionPoller_instances, _TransactionPoller_acceleratedCount, _TransactionPoller_blockTracker, _TransactionPoller_chainId, _TransactionPoller_messenger, _TransactionPoller_blockTrackerListener, _TransactionPoller_listener, _TransactionPoller_pendingTransactions, _TransactionPoller_running, _TransactionPoller_timeout, _TransactionPoller_queue, _TransactionPoller_interval, _TransactionPoller_stopTimeout, _TransactionPoller_stopBlockTracker, _TransactionPoller_transactionUpdatedHandler, _TransactionPoller_subscribeToTransactionUpdates, _TransactionPoller_unsubscribeFromTransactionUpdates;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.TransactionPoller = void 0;
16
16
  const utils_1 = require("@metamask/utils");
@@ -18,6 +18,12 @@ const lodash_1 = require("lodash");
18
18
  const logger_1 = require("../logger.cjs");
19
19
  const feature_flags_1 = require("../utils/feature-flags.cjs");
20
20
  const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'transaction-poller');
21
+ var IntervalTrigger;
22
+ (function (IntervalTrigger) {
23
+ IntervalTrigger["Accelerated"] = "Accelerated";
24
+ IntervalTrigger["BlockTracker"] = "BlockTracker";
25
+ IntervalTrigger["Websocket"] = "Websocket";
26
+ })(IntervalTrigger || (IntervalTrigger = {}));
21
27
  /**
22
28
  * Helper class to orchestrate when to poll pending transactions.
23
29
  * Initially starts polling via a timeout chain every 2 seconds up to 5 times.
@@ -35,6 +41,23 @@ class TransactionPoller {
35
41
  _TransactionPoller_pendingTransactions.set(this, void 0);
36
42
  _TransactionPoller_running.set(this, false);
37
43
  _TransactionPoller_timeout.set(this, void 0);
44
+ _TransactionPoller_transactionUpdatedHandler.set(this, (transaction) => {
45
+ if (!__classPrivateFieldGet(this, _TransactionPoller_running, "f")) {
46
+ return;
47
+ }
48
+ if (transaction.status !== 'confirmed' &&
49
+ transaction.status !== 'dropped' &&
50
+ transaction.status !== 'failed') {
51
+ return;
52
+ }
53
+ const isPendingTransaction = __classPrivateFieldGet(this, _TransactionPoller_pendingTransactions, "f")?.some((tx) => tx.hash?.toLowerCase() === transaction.id.toLowerCase());
54
+ if (!isPendingTransaction) {
55
+ return;
56
+ }
57
+ __classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_interval).call(this, IntervalTrigger.Websocket).catch(() => {
58
+ // Silently catch errors to prevent unhandled rejections
59
+ });
60
+ });
38
61
  __classPrivateFieldSet(this, _TransactionPoller_blockTracker, blockTracker, "f");
39
62
  __classPrivateFieldSet(this, _TransactionPoller_chainId, chainId, "f");
40
63
  __classPrivateFieldSet(this, _TransactionPoller_messenger, messenger, "f");
@@ -50,6 +73,7 @@ class TransactionPoller {
50
73
  }
51
74
  __classPrivateFieldSet(this, _TransactionPoller_listener, listener, "f");
52
75
  __classPrivateFieldSet(this, _TransactionPoller_running, true, "f");
76
+ __classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_subscribeToTransactionUpdates).call(this);
53
77
  __classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_queue).call(this);
54
78
  log('Started');
55
79
  }
@@ -67,6 +91,7 @@ class TransactionPoller {
67
91
  __classPrivateFieldSet(this, _TransactionPoller_pendingTransactions, undefined, "f");
68
92
  __classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_stopTimeout).call(this);
69
93
  __classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_stopBlockTracker).call(this);
94
+ __classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_unsubscribeFromTransactionUpdates).call(this);
70
95
  log('Stopped');
71
96
  }
72
97
  /**
@@ -93,14 +118,14 @@ class TransactionPoller {
93
118
  }
94
119
  }
95
120
  exports.TransactionPoller = TransactionPoller;
96
- _TransactionPoller_acceleratedCount = new WeakMap(), _TransactionPoller_blockTracker = new WeakMap(), _TransactionPoller_chainId = new WeakMap(), _TransactionPoller_messenger = new WeakMap(), _TransactionPoller_blockTrackerListener = new WeakMap(), _TransactionPoller_listener = new WeakMap(), _TransactionPoller_pendingTransactions = new WeakMap(), _TransactionPoller_running = new WeakMap(), _TransactionPoller_timeout = new WeakMap(), _TransactionPoller_instances = new WeakSet(), _TransactionPoller_queue = function _TransactionPoller_queue() {
121
+ _TransactionPoller_acceleratedCount = new WeakMap(), _TransactionPoller_blockTracker = new WeakMap(), _TransactionPoller_chainId = new WeakMap(), _TransactionPoller_messenger = new WeakMap(), _TransactionPoller_blockTrackerListener = new WeakMap(), _TransactionPoller_listener = new WeakMap(), _TransactionPoller_pendingTransactions = new WeakMap(), _TransactionPoller_running = new WeakMap(), _TransactionPoller_timeout = new WeakMap(), _TransactionPoller_transactionUpdatedHandler = new WeakMap(), _TransactionPoller_instances = new WeakSet(), _TransactionPoller_queue = function _TransactionPoller_queue() {
97
122
  if (!__classPrivateFieldGet(this, _TransactionPoller_running, "f")) {
98
123
  return;
99
124
  }
100
125
  const { countMax, intervalMs } = (0, feature_flags_1.getAcceleratedPollingParams)(__classPrivateFieldGet(this, _TransactionPoller_chainId, "f"), __classPrivateFieldGet(this, _TransactionPoller_messenger, "f"));
101
126
  if (__classPrivateFieldGet(this, _TransactionPoller_acceleratedCount, "f") >= countMax) {
102
127
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
103
- __classPrivateFieldSet(this, _TransactionPoller_blockTrackerListener, (latestBlockNumber) => __classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_interval).call(this, false, latestBlockNumber), "f");
128
+ __classPrivateFieldSet(this, _TransactionPoller_blockTrackerListener, (latestBlockNumber) => __classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_interval).call(this, IntervalTrigger.BlockTracker, latestBlockNumber), "f");
104
129
  __classPrivateFieldGet(this, _TransactionPoller_blockTracker, "f").on('latest', __classPrivateFieldGet(this, _TransactionPoller_blockTrackerListener, "f"));
105
130
  log('Added block tracker listener');
106
131
  return;
@@ -108,19 +133,26 @@ _TransactionPoller_acceleratedCount = new WeakMap(), _TransactionPoller_blockTra
108
133
  __classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_stopTimeout).call(this);
109
134
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
110
135
  __classPrivateFieldSet(this, _TransactionPoller_timeout, setTimeout(async () => {
111
- await __classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_interval).call(this, true);
136
+ await __classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_interval).call(this, IntervalTrigger.Accelerated);
112
137
  __classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_queue).call(this);
113
138
  }, intervalMs), "f");
114
- }, _TransactionPoller_interval = async function _TransactionPoller_interval(isAccelerated, latestBlockNumber) {
115
- if (isAccelerated) {
116
- log('Accelerated interval', __classPrivateFieldGet(this, _TransactionPoller_acceleratedCount, "f") + 1);
117
- }
118
- else {
119
- log('Block tracker interval', latestBlockNumber);
139
+ }, _TransactionPoller_interval = async function _TransactionPoller_interval(trigger, latestBlockNumber) {
140
+ switch (trigger) {
141
+ case IntervalTrigger.Websocket:
142
+ log('AccountActivityService:transactionUpdated received');
143
+ break;
144
+ case IntervalTrigger.Accelerated:
145
+ log('Accelerated interval', __classPrivateFieldGet(this, _TransactionPoller_acceleratedCount, "f") + 1);
146
+ break;
147
+ case IntervalTrigger.BlockTracker:
148
+ log('Block tracker interval', latestBlockNumber);
149
+ break;
150
+ default:
151
+ break;
120
152
  }
121
153
  const latestBlockNumberFinal = latestBlockNumber ?? (await __classPrivateFieldGet(this, _TransactionPoller_blockTracker, "f").getLatestBlock());
122
154
  await __classPrivateFieldGet(this, _TransactionPoller_listener, "f")?.call(this, latestBlockNumberFinal);
123
- if (isAccelerated && __classPrivateFieldGet(this, _TransactionPoller_running, "f")) {
155
+ if (trigger === IntervalTrigger.Accelerated && __classPrivateFieldGet(this, _TransactionPoller_running, "f")) {
124
156
  __classPrivateFieldSet(this, _TransactionPoller_acceleratedCount, __classPrivateFieldGet(this, _TransactionPoller_acceleratedCount, "f") + 1, "f");
125
157
  }
126
158
  }, _TransactionPoller_stopTimeout = function _TransactionPoller_stopTimeout() {
@@ -135,5 +167,9 @@ _TransactionPoller_acceleratedCount = new WeakMap(), _TransactionPoller_blockTra
135
167
  }
136
168
  __classPrivateFieldGet(this, _TransactionPoller_blockTracker, "f").removeListener('latest', __classPrivateFieldGet(this, _TransactionPoller_blockTrackerListener, "f"));
137
169
  __classPrivateFieldSet(this, _TransactionPoller_blockTrackerListener, undefined, "f");
170
+ }, _TransactionPoller_subscribeToTransactionUpdates = function _TransactionPoller_subscribeToTransactionUpdates() {
171
+ __classPrivateFieldGet(this, _TransactionPoller_messenger, "f").subscribe('AccountActivityService:transactionUpdated', __classPrivateFieldGet(this, _TransactionPoller_transactionUpdatedHandler, "f"));
172
+ }, _TransactionPoller_unsubscribeFromTransactionUpdates = function _TransactionPoller_unsubscribeFromTransactionUpdates() {
173
+ __classPrivateFieldGet(this, _TransactionPoller_messenger, "f").unsubscribe('AccountActivityService:transactionUpdated', __classPrivateFieldGet(this, _TransactionPoller_transactionUpdatedHandler, "f"));
138
174
  };
139
175
  //# sourceMappingURL=TransactionPoller.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionPoller.cjs","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BlockTracker } from '@metamask/network-controller';\nimport { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\nimport { isEqual } from 'lodash';\n\nimport { projectLogger } from '../logger';\nimport type { TransactionControllerMessenger } from '../TransactionController';\nimport type { TransactionMeta } from '../types';\nimport { getAcceleratedPollingParams } from '../utils/feature-flags';\n\nconst log = createModuleLogger(projectLogger, 'transaction-poller');\n\n/**\n * Helper class to orchestrate when to poll pending transactions.\n * Initially starts polling via a timeout chain every 2 seconds up to 5 times.\n * Following that, it will poll on every new block via the block tracker.\n */\nexport class TransactionPoller {\n #acceleratedCount = 0;\n\n readonly #blockTracker: BlockTracker;\n\n readonly #chainId: Hex;\n\n readonly #messenger: TransactionControllerMessenger;\n\n #blockTrackerListener?: (latestBlockNumber: string) => void;\n\n #listener?: (latestBlockNumber: string) => Promise<void>;\n\n #pendingTransactions?: TransactionMeta[];\n\n #running = false;\n\n #timeout?: NodeJS.Timeout;\n\n constructor({\n blockTracker,\n chainId,\n messenger,\n }: {\n blockTracker: BlockTracker;\n chainId: Hex;\n messenger: TransactionControllerMessenger;\n }) {\n this.#blockTracker = blockTracker;\n this.#chainId = chainId;\n this.#messenger = messenger;\n }\n\n /**\n * Start the poller with a listener that will be called on every interval.\n *\n * @param listener - The listener to call on every interval.\n */\n start(listener: (latestBlockNumber: string) => Promise<void>): void {\n if (this.#running) {\n return;\n }\n\n this.#listener = listener;\n this.#running = true;\n\n this.#queue();\n\n log('Started');\n }\n\n /**\n * Stop the poller.\n * Remove all timeouts and block tracker listeners.\n */\n stop(): void {\n if (!this.#running) {\n return;\n }\n\n this.#running = false;\n this.#listener = undefined;\n this.#acceleratedCount = 0;\n this.#pendingTransactions = undefined;\n\n this.#stopTimeout();\n this.#stopBlockTracker();\n\n log('Stopped');\n }\n\n /**\n * Notify the poller of the pending transactions being monitored.\n * This will reset to the accelerated polling and reset the count\n * when new transactions are added or removed.\n *\n * @param pendingTransactions - The pending transactions to poll.\n */\n setPendingTransactions(pendingTransactions: TransactionMeta[]): void {\n const currentPendingTransactionIds = (this.#pendingTransactions ?? []).map(\n (tx) => tx.id,\n );\n\n this.#pendingTransactions = pendingTransactions;\n\n const newPendingTransactionIds = pendingTransactions.map((tx) => tx.id);\n\n const hasUpdatedIds = !isEqual(\n currentPendingTransactionIds,\n newPendingTransactionIds,\n );\n\n if (!this.#running || !hasUpdatedIds) {\n return;\n }\n\n log('Detected new pending transactions', newPendingTransactionIds);\n\n this.#acceleratedCount = 0;\n\n if (this.#blockTrackerListener) {\n this.#stopBlockTracker();\n this.#queue();\n }\n }\n\n #queue(): void {\n if (!this.#running) {\n return;\n }\n\n const { countMax, intervalMs } = getAcceleratedPollingParams(\n this.#chainId,\n this.#messenger,\n );\n\n if (this.#acceleratedCount >= countMax) {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#blockTrackerListener = (latestBlockNumber): Promise<void> =>\n this.#interval(false, latestBlockNumber);\n\n this.#blockTracker.on('latest', this.#blockTrackerListener);\n\n log('Added block tracker listener');\n\n return;\n }\n\n this.#stopTimeout();\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#timeout = setTimeout(async () => {\n await this.#interval(true);\n this.#queue();\n }, intervalMs);\n }\n\n async #interval(\n isAccelerated: boolean,\n latestBlockNumber?: string,\n ): Promise<void> {\n if (isAccelerated) {\n log('Accelerated interval', this.#acceleratedCount + 1);\n } else {\n log('Block tracker interval', latestBlockNumber);\n }\n\n const latestBlockNumberFinal =\n latestBlockNumber ?? (await this.#blockTracker.getLatestBlock());\n\n await this.#listener?.(latestBlockNumberFinal);\n\n if (isAccelerated && this.#running) {\n this.#acceleratedCount += 1;\n }\n }\n\n #stopTimeout(): void {\n if (!this.#timeout) {\n return;\n }\n\n clearTimeout(this.#timeout);\n this.#timeout = undefined;\n }\n\n #stopBlockTracker(): void {\n if (!this.#blockTrackerListener) {\n return;\n }\n\n this.#blockTracker.removeListener('latest', this.#blockTrackerListener);\n this.#blockTrackerListener = undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"TransactionPoller.cjs","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Transaction } from '@metamask/core-backend';\nimport type { BlockTracker } from '@metamask/network-controller';\nimport { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\nimport { isEqual } from 'lodash';\n\nimport { projectLogger } from '../logger';\nimport type { TransactionControllerMessenger } from '../TransactionController';\nimport type { TransactionMeta } from '../types';\nimport { getAcceleratedPollingParams } from '../utils/feature-flags';\n\nconst log = createModuleLogger(projectLogger, 'transaction-poller');\n\nenum IntervalTrigger {\n Accelerated = 'Accelerated',\n BlockTracker = 'BlockTracker',\n Websocket = 'Websocket',\n}\n\n/**\n * Helper class to orchestrate when to poll pending transactions.\n * Initially starts polling via a timeout chain every 2 seconds up to 5 times.\n * Following that, it will poll on every new block via the block tracker.\n */\nexport class TransactionPoller {\n #acceleratedCount = 0;\n\n readonly #blockTracker: BlockTracker;\n\n readonly #chainId: Hex;\n\n readonly #messenger: TransactionControllerMessenger;\n\n #blockTrackerListener?: (latestBlockNumber: string) => void;\n\n #listener?: (latestBlockNumber: string) => Promise<void>;\n\n #pendingTransactions?: TransactionMeta[];\n\n #running = false;\n\n #timeout?: NodeJS.Timeout;\n\n constructor({\n blockTracker,\n chainId,\n messenger,\n }: {\n blockTracker: BlockTracker;\n chainId: Hex;\n messenger: TransactionControllerMessenger;\n }) {\n this.#blockTracker = blockTracker;\n this.#chainId = chainId;\n this.#messenger = messenger;\n }\n\n /**\n * Start the poller with a listener that will be called on every interval.\n *\n * @param listener - The listener to call on every interval.\n */\n start(listener: (latestBlockNumber: string) => Promise<void>): void {\n if (this.#running) {\n return;\n }\n\n this.#listener = listener;\n this.#running = true;\n\n this.#subscribeToTransactionUpdates();\n\n this.#queue();\n\n log('Started');\n }\n\n /**\n * Stop the poller.\n * Remove all timeouts and block tracker listeners.\n */\n stop(): void {\n if (!this.#running) {\n return;\n }\n\n this.#running = false;\n this.#listener = undefined;\n this.#acceleratedCount = 0;\n this.#pendingTransactions = undefined;\n\n this.#stopTimeout();\n this.#stopBlockTracker();\n this.#unsubscribeFromTransactionUpdates();\n\n log('Stopped');\n }\n\n /**\n * Notify the poller of the pending transactions being monitored.\n * This will reset to the accelerated polling and reset the count\n * when new transactions are added or removed.\n *\n * @param pendingTransactions - The pending transactions to poll.\n */\n setPendingTransactions(pendingTransactions: TransactionMeta[]): void {\n const currentPendingTransactionIds = (this.#pendingTransactions ?? []).map(\n (tx) => tx.id,\n );\n\n this.#pendingTransactions = pendingTransactions;\n\n const newPendingTransactionIds = pendingTransactions.map((tx) => tx.id);\n\n const hasUpdatedIds = !isEqual(\n currentPendingTransactionIds,\n newPendingTransactionIds,\n );\n\n if (!this.#running || !hasUpdatedIds) {\n return;\n }\n\n log('Detected new pending transactions', newPendingTransactionIds);\n\n this.#acceleratedCount = 0;\n\n if (this.#blockTrackerListener) {\n this.#stopBlockTracker();\n this.#queue();\n }\n }\n\n #queue(): void {\n if (!this.#running) {\n return;\n }\n\n const { countMax, intervalMs } = getAcceleratedPollingParams(\n this.#chainId,\n this.#messenger,\n );\n\n if (this.#acceleratedCount >= countMax) {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#blockTrackerListener = (latestBlockNumber): Promise<void> =>\n this.#interval(IntervalTrigger.BlockTracker, latestBlockNumber);\n\n this.#blockTracker.on('latest', this.#blockTrackerListener);\n\n log('Added block tracker listener');\n\n return;\n }\n\n this.#stopTimeout();\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#timeout = setTimeout(async () => {\n await this.#interval(IntervalTrigger.Accelerated);\n this.#queue();\n }, intervalMs);\n }\n\n async #interval(\n trigger: IntervalTrigger,\n latestBlockNumber?: string,\n ): Promise<void> {\n switch (trigger) {\n case IntervalTrigger.Websocket:\n log('AccountActivityService:transactionUpdated received');\n break;\n case IntervalTrigger.Accelerated:\n log('Accelerated interval', this.#acceleratedCount + 1);\n break;\n case IntervalTrigger.BlockTracker:\n log('Block tracker interval', latestBlockNumber);\n break;\n default:\n break;\n }\n\n const latestBlockNumberFinal =\n latestBlockNumber ?? (await this.#blockTracker.getLatestBlock());\n\n await this.#listener?.(latestBlockNumberFinal);\n\n if (trigger === IntervalTrigger.Accelerated && this.#running) {\n this.#acceleratedCount += 1;\n }\n }\n\n #stopTimeout(): void {\n if (!this.#timeout) {\n return;\n }\n\n clearTimeout(this.#timeout);\n this.#timeout = undefined;\n }\n\n #stopBlockTracker(): void {\n if (!this.#blockTrackerListener) {\n return;\n }\n\n this.#blockTracker.removeListener('latest', this.#blockTrackerListener);\n this.#blockTrackerListener = undefined;\n }\n\n readonly #transactionUpdatedHandler = (transaction: Transaction): void => {\n if (!this.#running) {\n return;\n }\n\n if (\n transaction.status !== 'confirmed' &&\n transaction.status !== 'dropped' &&\n transaction.status !== 'failed'\n ) {\n return;\n }\n\n const isPendingTransaction = this.#pendingTransactions?.some(\n (tx) => tx.hash?.toLowerCase() === transaction.id.toLowerCase(),\n );\n if (!isPendingTransaction) {\n return;\n }\n\n this.#interval(IntervalTrigger.Websocket).catch(() => {\n // Silently catch errors to prevent unhandled rejections\n });\n };\n\n #subscribeToTransactionUpdates(): void {\n this.#messenger.subscribe(\n 'AccountActivityService:transactionUpdated',\n this.#transactionUpdatedHandler,\n );\n }\n\n #unsubscribeFromTransactionUpdates(): void {\n this.#messenger.unsubscribe(\n 'AccountActivityService:transactionUpdated',\n this.#transactionUpdatedHandler,\n );\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionPoller.d.cts","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAqC;AAEjE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAiB;AAKhD;;;;GAIG;AACH,qBAAa,iBAAiB;;gBAmBhB,EACV,YAAY,EACZ,OAAO,EACP,SAAS,GACV,EAAE;QACD,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC;QACb,SAAS,EAAE,8BAA8B,CAAC;KAC3C;IAMD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAanE;;;OAGG;IACH,IAAI,IAAI,IAAI;IAgBZ;;;;;;OAMG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,eAAe,EAAE,GAAG,IAAI;CAgGrE"}
1
+ {"version":3,"file":"TransactionPoller.d.cts","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAqC;AAEjE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAiB;AAWhD;;;;GAIG;AACH,qBAAa,iBAAiB;;gBAmBhB,EACV,YAAY,EACZ,OAAO,EACP,SAAS,GACV,EAAE;QACD,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC;QACb,SAAS,EAAE,8BAA8B,CAAC;KAC3C;IAMD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAenE;;;OAGG;IACH,IAAI,IAAI,IAAI;IAiBZ;;;;;;OAMG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,eAAe,EAAE,GAAG,IAAI;CA+IrE"}
@@ -1 +1 @@
1
- {"version":3,"file":"TransactionPoller.d.mts","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAqC;AAEjE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAiB;AAKhD;;;;GAIG;AACH,qBAAa,iBAAiB;;gBAmBhB,EACV,YAAY,EACZ,OAAO,EACP,SAAS,GACV,EAAE;QACD,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC;QACb,SAAS,EAAE,8BAA8B,CAAC;KAC3C;IAMD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAanE;;;OAGG;IACH,IAAI,IAAI,IAAI;IAgBZ;;;;;;OAMG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,eAAe,EAAE,GAAG,IAAI;CAgGrE"}
1
+ {"version":3,"file":"TransactionPoller.d.mts","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAqC;AAEjE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAiB;AAWhD;;;;GAIG;AACH,qBAAa,iBAAiB;;gBAmBhB,EACV,YAAY,EACZ,OAAO,EACP,SAAS,GACV,EAAE;QACD,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC;QACb,SAAS,EAAE,8BAA8B,CAAC;KAC3C;IAMD;;;;OAIG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAenE;;;OAGG;IACH,IAAI,IAAI,IAAI;IAiBZ;;;;;;OAMG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,eAAe,EAAE,GAAG,IAAI;CA+IrE"}