@metamask-previews/transaction-controller 67.0.0-preview-cf351fcd3 → 67.0.0-preview-35bdba6

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 (70) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/TransactionController-method-action-types.cjs.map +1 -1
  3. package/dist/TransactionController-method-action-types.d.cts +1 -25
  4. package/dist/TransactionController-method-action-types.d.cts.map +1 -1
  5. package/dist/TransactionController-method-action-types.d.mts +1 -25
  6. package/dist/TransactionController-method-action-types.d.mts.map +1 -1
  7. package/dist/TransactionController-method-action-types.mjs.map +1 -1
  8. package/dist/TransactionController.cjs +10 -83
  9. package/dist/TransactionController.cjs.map +1 -1
  10. package/dist/TransactionController.d.cts +4 -34
  11. package/dist/TransactionController.d.cts.map +1 -1
  12. package/dist/TransactionController.d.mts +4 -34
  13. package/dist/TransactionController.d.mts.map +1 -1
  14. package/dist/TransactionController.mjs +10 -83
  15. package/dist/TransactionController.mjs.map +1 -1
  16. package/dist/api/accounts-api.cjs +1 -42
  17. package/dist/api/accounts-api.cjs.map +1 -1
  18. package/dist/api/accounts-api.d.cts +0 -51
  19. package/dist/api/accounts-api.d.cts.map +1 -1
  20. package/dist/api/accounts-api.d.mts +0 -51
  21. package/dist/api/accounts-api.d.mts.map +1 -1
  22. package/dist/api/accounts-api.mjs +0 -40
  23. package/dist/api/accounts-api.mjs.map +1 -1
  24. package/dist/helpers/MultichainTrackingHelper.cjs +29 -8
  25. package/dist/helpers/MultichainTrackingHelper.cjs.map +1 -1
  26. package/dist/helpers/MultichainTrackingHelper.d.cts +2 -2
  27. package/dist/helpers/MultichainTrackingHelper.d.cts.map +1 -1
  28. package/dist/helpers/MultichainTrackingHelper.d.mts +2 -2
  29. package/dist/helpers/MultichainTrackingHelper.d.mts.map +1 -1
  30. package/dist/helpers/MultichainTrackingHelper.mjs +29 -8
  31. package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -1
  32. package/dist/index.cjs +1 -3
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.cts +2 -3
  35. package/dist/index.d.cts.map +1 -1
  36. package/dist/index.d.mts +2 -3
  37. package/dist/index.d.mts.map +1 -1
  38. package/dist/index.mjs +0 -1
  39. package/dist/index.mjs.map +1 -1
  40. package/dist/types.cjs.map +1 -1
  41. package/dist/types.d.cts +0 -1
  42. package/dist/types.d.cts.map +1 -1
  43. package/dist/types.d.mts +0 -1
  44. package/dist/types.d.mts.map +1 -1
  45. package/dist/types.mjs.map +1 -1
  46. package/dist/utils/feature-flags.cjs +14 -33
  47. package/dist/utils/feature-flags.cjs.map +1 -1
  48. package/dist/utils/feature-flags.d.cts +1 -25
  49. package/dist/utils/feature-flags.d.cts.map +1 -1
  50. package/dist/utils/feature-flags.d.mts +1 -25
  51. package/dist/utils/feature-flags.d.mts.map +1 -1
  52. package/dist/utils/feature-flags.mjs +13 -30
  53. package/dist/utils/feature-flags.mjs.map +1 -1
  54. package/package.json +5 -5
  55. package/dist/helpers/AccountsApiRemoteTransactionSource.cjs +0 -159
  56. package/dist/helpers/AccountsApiRemoteTransactionSource.cjs.map +0 -1
  57. package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts +0 -12
  58. package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts.map +0 -1
  59. package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts +0 -12
  60. package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts.map +0 -1
  61. package/dist/helpers/AccountsApiRemoteTransactionSource.mjs +0 -159
  62. package/dist/helpers/AccountsApiRemoteTransactionSource.mjs.map +0 -1
  63. package/dist/helpers/IncomingTransactionHelper.cjs +0 -306
  64. package/dist/helpers/IncomingTransactionHelper.cjs.map +0 -1
  65. package/dist/helpers/IncomingTransactionHelper.d.cts +0 -45
  66. package/dist/helpers/IncomingTransactionHelper.d.cts.map +0 -1
  67. package/dist/helpers/IncomingTransactionHelper.d.mts +0 -45
  68. package/dist/helpers/IncomingTransactionHelper.d.mts.map +0 -1
  69. package/dist/helpers/IncomingTransactionHelper.mjs +0 -299
  70. package/dist/helpers/IncomingTransactionHelper.mjs.map +0 -1
@@ -1,159 +0,0 @@
1
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
- 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");
4
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
- };
6
- var _AccountsApiRemoteTransactionSource_instances, _AccountsApiRemoteTransactionSource_queryTransactions, _AccountsApiRemoteTransactionSource_filterTransactions, _AccountsApiRemoteTransactionSource_normalizeTransaction;
7
- function $importDefault(module) {
8
- if (module?.__esModule) {
9
- return module.default;
10
- }
11
- return module;
12
- }
13
- import { BNToHex } from "@metamask/controller-utils";
14
- import $BN from "bn.js";
15
- const BN = $importDefault($BN);
16
- import { v1 as random } from "uuid";
17
- import { getAccountTransactions } from "../api/accounts-api.mjs";
18
- import { CHAIN_IDS } from "../constants.mjs";
19
- import { createModuleLogger, incomingTransactionsLogger } from "../logger.mjs";
20
- import { TransactionStatus, TransactionType } from "../types.mjs";
21
- import { determineTransactionType } from "../utils/transaction-type.mjs";
22
- export const SUPPORTED_CHAIN_IDS = [
23
- CHAIN_IDS.MAINNET,
24
- CHAIN_IDS.POLYGON,
25
- CHAIN_IDS.BSC,
26
- CHAIN_IDS.LINEA_MAINNET,
27
- CHAIN_IDS.BASE,
28
- CHAIN_IDS.OPTIMISM,
29
- CHAIN_IDS.ARBITRUM,
30
- CHAIN_IDS.SCROLL,
31
- CHAIN_IDS.SEI,
32
- CHAIN_IDS.MONAD,
33
- CHAIN_IDS.HYPEREVM,
34
- ];
35
- const log = createModuleLogger(incomingTransactionsLogger, 'accounts-api-source');
36
- /**
37
- * A RemoteTransactionSource that fetches incoming transactions using the Accounts API.
38
- */
39
- export class AccountsApiRemoteTransactionSource {
40
- constructor() {
41
- _AccountsApiRemoteTransactionSource_instances.add(this);
42
- }
43
- getSupportedChains() {
44
- return SUPPORTED_CHAIN_IDS;
45
- }
46
- async fetchTransactions(request) {
47
- const { address, chainIds } = request;
48
- const responseTransactions = await __classPrivateFieldGet(this, _AccountsApiRemoteTransactionSource_instances, "m", _AccountsApiRemoteTransactionSource_queryTransactions).call(this, request, chainIds ?? SUPPORTED_CHAIN_IDS);
49
- log('Fetched transactions', responseTransactions.length, responseTransactions);
50
- const normalizedTransactions = await Promise.all(responseTransactions.map((tx) => __classPrivateFieldGet(this, _AccountsApiRemoteTransactionSource_instances, "m", _AccountsApiRemoteTransactionSource_normalizeTransaction).call(this, address, tx)));
51
- log('Normalized transactions', normalizedTransactions);
52
- const filteredTransactions = __classPrivateFieldGet(this, _AccountsApiRemoteTransactionSource_instances, "m", _AccountsApiRemoteTransactionSource_filterTransactions).call(this, request, normalizedTransactions);
53
- log('Filtered transactions', filteredTransactions.length, filteredTransactions);
54
- return filteredTransactions;
55
- }
56
- }
57
- _AccountsApiRemoteTransactionSource_instances = new WeakSet(), _AccountsApiRemoteTransactionSource_queryTransactions = async function _AccountsApiRemoteTransactionSource_queryTransactions(request, chainIds) {
58
- const { address, tags } = request;
59
- const transactions = [];
60
- try {
61
- const response = await getAccountTransactions({
62
- address,
63
- chainIds,
64
- sortDirection: 'DESC',
65
- tags,
66
- });
67
- if (response?.data) {
68
- transactions.push(...response.data);
69
- }
70
- }
71
- catch (error) {
72
- log('Error while fetching transactions', error);
73
- }
74
- return transactions;
75
- }, _AccountsApiRemoteTransactionSource_filterTransactions = function _AccountsApiRemoteTransactionSource_filterTransactions(request, transactions) {
76
- const { address, includeTokenTransfers, updateTransactions } = request;
77
- let filteredTransactions = transactions;
78
- if (!updateTransactions) {
79
- filteredTransactions = filteredTransactions.filter((tx) => tx.txParams.to === address);
80
- }
81
- if (!includeTokenTransfers) {
82
- filteredTransactions = filteredTransactions.filter((tx) => !tx.isTransfer);
83
- }
84
- return filteredTransactions;
85
- }, _AccountsApiRemoteTransactionSource_normalizeTransaction = async function _AccountsApiRemoteTransactionSource_normalizeTransaction(address, responseTransaction) {
86
- const blockNumber = String(responseTransaction.blockNumber);
87
- const chainId = `0x${responseTransaction.chainId.toString(16)}`;
88
- const { hash } = responseTransaction;
89
- const time = new Date(responseTransaction.timestamp).getTime();
90
- const id = random({ msecs: time });
91
- const { from } = responseTransaction;
92
- const gas = BNToHex(new BN(responseTransaction.gas));
93
- const gasPrice = BNToHex(new BN(responseTransaction.gasPrice));
94
- const gasUsed = BNToHex(new BN(responseTransaction.gasUsed));
95
- const nonce = BNToHex(new BN(responseTransaction.nonce));
96
- const data = responseTransaction.methodId;
97
- const type = TransactionType.incoming;
98
- const verifiedOnBlockchain = false;
99
- const status = responseTransaction.isError
100
- ? TransactionStatus.failed
101
- : TransactionStatus.confirmed;
102
- const valueTransfer = responseTransaction.valueTransfers.find((vt) => (vt.to.toLowerCase() === address.toLowerCase() ||
103
- vt.from.toLowerCase() === address.toLowerCase()) &&
104
- vt.contractAddress);
105
- const isIncomingTokenTransfer = valueTransfer?.to.toLowerCase() === address.toLowerCase() &&
106
- from.toLowerCase() !== address.toLowerCase();
107
- const isOutgoing = from.toLowerCase() === address.toLowerCase();
108
- const amount = valueTransfer?.amount;
109
- const contractAddress = valueTransfer?.contractAddress;
110
- const decimals = valueTransfer?.decimal;
111
- const symbol = valueTransfer?.symbol;
112
- const value = BNToHex(new BN(isIncomingTokenTransfer
113
- ? (valueTransfer?.amount ?? responseTransaction.value)
114
- : responseTransaction.value));
115
- const to = isIncomingTokenTransfer ? address : responseTransaction.to;
116
- const error = status === TransactionStatus.failed
117
- ? new Error('Transaction failed')
118
- : undefined;
119
- const transferInformation = valueTransfer
120
- ? {
121
- amount,
122
- contractAddress,
123
- decimals,
124
- symbol,
125
- }
126
- : undefined;
127
- const meta = {
128
- blockNumber,
129
- chainId,
130
- error,
131
- hash,
132
- id,
133
- isTransfer: isIncomingTokenTransfer,
134
- // Populated by TransactionController when added to state
135
- networkClientId: '',
136
- status,
137
- time,
138
- toSmartContract: false,
139
- transferInformation,
140
- txParams: {
141
- chainId,
142
- data,
143
- from,
144
- gas,
145
- gasPrice,
146
- gasUsed,
147
- nonce,
148
- to,
149
- value,
150
- },
151
- type,
152
- verifiedOnBlockchain,
153
- };
154
- if (isOutgoing) {
155
- meta.type = (await determineTransactionType(meta.txParams)).type;
156
- }
157
- return meta;
158
- };
159
- //# sourceMappingURL=AccountsApiRemoteTransactionSource.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AccountsApiRemoteTransactionSource.mjs","sourceRoot":"","sources":["../../src/helpers/AccountsApiRemoteTransactionSource.ts"],"names":[],"mappings":"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","sourcesContent":["import { BNToHex } from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\nimport BN from 'bn.js';\nimport { v1 as random } from 'uuid';\n\nimport type {\n GetAccountTransactionsResponse,\n TransactionResponse,\n} from '../api/accounts-api';\nimport { getAccountTransactions } from '../api/accounts-api';\nimport { CHAIN_IDS } from '../constants';\nimport { createModuleLogger, incomingTransactionsLogger } from '../logger';\nimport type {\n RemoteTransactionSource,\n RemoteTransactionSourceRequest,\n TransactionError,\n TransactionMeta,\n} from '../types';\nimport { TransactionStatus, TransactionType } from '../types';\nimport { determineTransactionType } from '../utils/transaction-type';\n\nexport const SUPPORTED_CHAIN_IDS: Hex[] = [\n CHAIN_IDS.MAINNET,\n CHAIN_IDS.POLYGON,\n CHAIN_IDS.BSC,\n CHAIN_IDS.LINEA_MAINNET,\n CHAIN_IDS.BASE,\n CHAIN_IDS.OPTIMISM,\n CHAIN_IDS.ARBITRUM,\n CHAIN_IDS.SCROLL,\n CHAIN_IDS.SEI,\n CHAIN_IDS.MONAD,\n CHAIN_IDS.HYPEREVM,\n];\n\nconst log = createModuleLogger(\n incomingTransactionsLogger,\n 'accounts-api-source',\n);\n\n/**\n * A RemoteTransactionSource that fetches incoming transactions using the Accounts API.\n */\nexport class AccountsApiRemoteTransactionSource implements RemoteTransactionSource {\n getSupportedChains(): Hex[] {\n return SUPPORTED_CHAIN_IDS;\n }\n\n async fetchTransactions(\n request: RemoteTransactionSourceRequest,\n ): Promise<TransactionMeta[]> {\n const { address, chainIds } = request;\n\n const responseTransactions = await this.#queryTransactions(\n request,\n chainIds ?? SUPPORTED_CHAIN_IDS,\n );\n\n log(\n 'Fetched transactions',\n responseTransactions.length,\n responseTransactions,\n );\n\n const normalizedTransactions = await Promise.all(\n responseTransactions.map((tx) => this.#normalizeTransaction(address, tx)),\n );\n\n log('Normalized transactions', normalizedTransactions);\n\n const filteredTransactions = this.#filterTransactions(\n request,\n normalizedTransactions,\n );\n\n log(\n 'Filtered transactions',\n filteredTransactions.length,\n filteredTransactions,\n );\n\n return filteredTransactions;\n }\n\n async #queryTransactions(\n request: RemoteTransactionSourceRequest,\n chainIds: Hex[],\n ): Promise<TransactionResponse[]> {\n const { address, tags } = request;\n const transactions: TransactionResponse[] = [];\n\n try {\n const response = await getAccountTransactions({\n address,\n chainIds,\n sortDirection: 'DESC',\n tags,\n });\n\n if (response?.data) {\n transactions.push(...response.data);\n }\n } catch (error) {\n log('Error while fetching transactions', error);\n }\n\n return transactions;\n }\n\n #filterTransactions(\n request: RemoteTransactionSourceRequest,\n transactions: TransactionMeta[],\n ): TransactionMeta[] {\n const { address, includeTokenTransfers, updateTransactions } = request;\n\n let filteredTransactions = transactions;\n\n if (!updateTransactions) {\n filteredTransactions = filteredTransactions.filter(\n (tx) => tx.txParams.to === address,\n );\n }\n\n if (!includeTokenTransfers) {\n filteredTransactions = filteredTransactions.filter(\n (tx) => !tx.isTransfer,\n );\n }\n\n return filteredTransactions;\n }\n\n async #normalizeTransaction(\n address: Hex,\n responseTransaction: GetAccountTransactionsResponse['data'][0],\n ): Promise<TransactionMeta> {\n const blockNumber = String(responseTransaction.blockNumber);\n const chainId = `0x${responseTransaction.chainId.toString(16)}` as const;\n const { hash } = responseTransaction;\n const time = new Date(responseTransaction.timestamp).getTime();\n const id = random({ msecs: time });\n const { from } = responseTransaction;\n const gas = BNToHex(new BN(responseTransaction.gas));\n const gasPrice = BNToHex(new BN(responseTransaction.gasPrice));\n const gasUsed = BNToHex(new BN(responseTransaction.gasUsed));\n const nonce = BNToHex(new BN(responseTransaction.nonce));\n const data = responseTransaction.methodId;\n const type = TransactionType.incoming;\n const verifiedOnBlockchain = false;\n\n const status = responseTransaction.isError\n ? TransactionStatus.failed\n : TransactionStatus.confirmed;\n\n const valueTransfer = responseTransaction.valueTransfers.find(\n (vt) =>\n (vt.to.toLowerCase() === address.toLowerCase() ||\n vt.from.toLowerCase() === address.toLowerCase()) &&\n vt.contractAddress,\n );\n\n const isIncomingTokenTransfer =\n valueTransfer?.to.toLowerCase() === address.toLowerCase() &&\n from.toLowerCase() !== address.toLowerCase();\n\n const isOutgoing = from.toLowerCase() === address.toLowerCase();\n const amount = valueTransfer?.amount;\n const contractAddress = valueTransfer?.contractAddress as string;\n const decimals = valueTransfer?.decimal as number;\n const symbol = valueTransfer?.symbol as string;\n\n const value = BNToHex(\n new BN(\n isIncomingTokenTransfer\n ? (valueTransfer?.amount ?? responseTransaction.value)\n : responseTransaction.value,\n ),\n );\n\n const to = isIncomingTokenTransfer ? address : responseTransaction.to;\n\n const error =\n status === TransactionStatus.failed\n ? new Error('Transaction failed')\n : (undefined as unknown as TransactionError);\n\n const transferInformation = valueTransfer\n ? {\n amount,\n contractAddress,\n decimals,\n symbol,\n }\n : undefined;\n\n const meta: TransactionMeta = {\n blockNumber,\n chainId,\n error,\n hash,\n id,\n isTransfer: isIncomingTokenTransfer,\n // Populated by TransactionController when added to state\n networkClientId: '',\n status,\n time,\n toSmartContract: false,\n transferInformation,\n txParams: {\n chainId,\n data,\n from,\n gas,\n gasPrice,\n gasUsed,\n nonce,\n to,\n value,\n },\n type,\n verifiedOnBlockchain,\n };\n\n if (isOutgoing) {\n meta.type = (await determineTransactionType(meta.txParams)).type;\n }\n\n return meta;\n }\n}\n"]}
@@ -1,306 +0,0 @@
1
- "use strict";
2
- var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
- if (kind === "m") throw new TypeError("Private method is not writable");
4
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
- };
8
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
- };
13
- var __importDefault = (this && this.__importDefault) || function (mod) {
14
- return (mod && mod.__esModule) ? mod : { "default": mod };
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_isTransactionHistoryRetrievalActive, _IncomingTransactionHelper_updateTransactions, _IncomingTransactionHelper_useBackendWebSocketService, _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
- Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.IncomingTransactionHelper = exports.WebSocketState = void 0;
19
- // This package purposefully relies on Node's EventEmitter module.
20
- // eslint-disable-next-line import-x/no-nodejs-modules
21
- const events_1 = __importDefault(require("events"));
22
- const logger_1 = require("../logger.cjs");
23
- const feature_flags_1 = require("../utils/feature-flags.cjs");
24
- const utils_1 = require("../utils/utils.cjs");
25
- const AccountsApiRemoteTransactionSource_1 = require("./AccountsApiRemoteTransactionSource.cjs");
26
- var WebSocketState;
27
- (function (WebSocketState) {
28
- WebSocketState["CONNECTED"] = "connected";
29
- WebSocketState["DISCONNECTED"] = "disconnected";
30
- })(WebSocketState || (exports.WebSocketState = WebSocketState = {}));
31
- const TAG_POLLING = 'automatic-polling';
32
- class IncomingTransactionHelper {
33
- constructor({ client, getCurrentAccount, getLocalTransactions, includeTokenTransfers, isEnabled, messenger, remoteTransactionSource, trimTransactions, updateTransactions, }) {
34
- _IncomingTransactionHelper_instances.add(this);
35
- _IncomingTransactionHelper_client.set(this, void 0);
36
- _IncomingTransactionHelper_getCurrentAccount.set(this, void 0);
37
- _IncomingTransactionHelper_getLocalTransactions.set(this, void 0);
38
- _IncomingTransactionHelper_includeTokenTransfers.set(this, void 0);
39
- _IncomingTransactionHelper_isEnabled.set(this, void 0);
40
- _IncomingTransactionHelper_isRunning.set(this, void 0);
41
- _IncomingTransactionHelper_isUpdating.set(this, void 0);
42
- _IncomingTransactionHelper_messenger.set(this, void 0);
43
- _IncomingTransactionHelper_remoteTransactionSource.set(this, void 0);
44
- _IncomingTransactionHelper_timeoutId.set(this, void 0);
45
- _IncomingTransactionHelper_trimTransactions.set(this, void 0);
46
- _IncomingTransactionHelper_isTransactionHistoryRetrievalActive.set(this, false);
47
- _IncomingTransactionHelper_updateTransactions.set(this, void 0);
48
- _IncomingTransactionHelper_useBackendWebSocketService.set(this, void 0);
49
- // Chains that need polling (start with all supported, remove as they come up)
50
- _IncomingTransactionHelper_chainsToPoll.set(this, [...AccountsApiRemoteTransactionSource_1.SUPPORTED_CHAIN_IDS]);
51
- _IncomingTransactionHelper_connectionStateChangedHandler.set(this, (connectionInfo) => {
52
- __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onConnectionStateChanged).call(this, connectionInfo);
53
- });
54
- _IncomingTransactionHelper_transactionUpdatedHandler.set(this, (transaction) => {
55
- __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onTransactionUpdated).call(this, transaction);
56
- });
57
- _IncomingTransactionHelper_selectedAccountChangedHandler.set(this, () => {
58
- __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onSelectedAccountChanged).call(this);
59
- });
60
- _IncomingTransactionHelper_statusChangedHandler.set(this, ({ chainIds, status, }) => {
61
- __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onNetworkStatusChanged).call(this, chainIds, status);
62
- });
63
- this.hub = new events_1.default();
64
- __classPrivateFieldSet(this, _IncomingTransactionHelper_client, client, "f");
65
- __classPrivateFieldSet(this, _IncomingTransactionHelper_getCurrentAccount, getCurrentAccount, "f");
66
- __classPrivateFieldSet(this, _IncomingTransactionHelper_getLocalTransactions, getLocalTransactions, "f");
67
- __classPrivateFieldSet(this, _IncomingTransactionHelper_includeTokenTransfers, includeTokenTransfers, "f");
68
- __classPrivateFieldSet(this, _IncomingTransactionHelper_isEnabled, isEnabled ?? (() => true), "f");
69
- __classPrivateFieldSet(this, _IncomingTransactionHelper_isRunning, false, "f");
70
- __classPrivateFieldSet(this, _IncomingTransactionHelper_isUpdating, false, "f");
71
- __classPrivateFieldSet(this, _IncomingTransactionHelper_messenger, messenger, "f");
72
- __classPrivateFieldSet(this, _IncomingTransactionHelper_remoteTransactionSource, remoteTransactionSource, "f");
73
- __classPrivateFieldSet(this, _IncomingTransactionHelper_trimTransactions, trimTransactions, "f");
74
- __classPrivateFieldSet(this, _IncomingTransactionHelper_updateTransactions, updateTransactions, "f");
75
- __classPrivateFieldSet(this, _IncomingTransactionHelper_useBackendWebSocketService, (0, feature_flags_1.isIncomingTransactionsUseBackendWebSocketServiceEnabled)(messenger), "f");
76
- if (__classPrivateFieldGet(this, _IncomingTransactionHelper_useBackendWebSocketService, "f")) {
77
- __classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f").subscribe('BackendWebSocketService:connectionStateChanged', __classPrivateFieldGet(this, _IncomingTransactionHelper_connectionStateChangedHandler, "f"));
78
- __classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f").subscribe('AccountActivityService:statusChanged', __classPrivateFieldGet(this, _IncomingTransactionHelper_statusChangedHandler, "f"));
79
- }
80
- }
81
- start() {
82
- // When websockets are disabled, allow normal polling (legacy mode)
83
- if (__classPrivateFieldGet(this, _IncomingTransactionHelper_useBackendWebSocketService, "f")) {
84
- return;
85
- }
86
- __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_startPolling).call(this, true);
87
- }
88
- stop() {
89
- if (__classPrivateFieldGet(this, _IncomingTransactionHelper_timeoutId, "f")) {
90
- clearTimeout(__classPrivateFieldGet(this, _IncomingTransactionHelper_timeoutId, "f"));
91
- }
92
- if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_isRunning, "f")) {
93
- return;
94
- }
95
- __classPrivateFieldSet(this, _IncomingTransactionHelper_isRunning, false, "f");
96
- (0, logger_1.incomingTransactionsLogger)('Stopped polling');
97
- }
98
- async update({ chainIds, isInterval, tags, } = {}) {
99
- const finalTags = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getTags).call(this, tags, isInterval);
100
- (0, logger_1.incomingTransactionsLogger)('Checking for incoming transactions', {
101
- isInterval: Boolean(isInterval),
102
- tags: finalTags,
103
- });
104
- if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_canStart).call(this)) {
105
- return;
106
- }
107
- const account = __classPrivateFieldGet(this, _IncomingTransactionHelper_getCurrentAccount, "f").call(this);
108
- const includeTokenTransfers = __classPrivateFieldGet(this, _IncomingTransactionHelper_includeTokenTransfers, "f") ?? true;
109
- const updateTransactions = __classPrivateFieldGet(this, _IncomingTransactionHelper_updateTransactions, "f") ?? false;
110
- let remoteTransactions = [];
111
- try {
112
- remoteTransactions =
113
- await __classPrivateFieldGet(this, _IncomingTransactionHelper_remoteTransactionSource, "f").fetchTransactions({
114
- address: account.address,
115
- chainIds,
116
- includeTokenTransfers,
117
- tags: finalTags,
118
- updateTransactions,
119
- });
120
- }
121
- catch (error) {
122
- (0, logger_1.incomingTransactionsLogger)('Error while fetching remote transactions', error);
123
- return;
124
- }
125
- if (!remoteTransactions.length) {
126
- return;
127
- }
128
- __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_sortTransactionsByTime).call(this, remoteTransactions);
129
- (0, logger_1.incomingTransactionsLogger)('Found potential transactions', remoteTransactions.length, remoteTransactions);
130
- const localTransactions = __classPrivateFieldGet(this, _IncomingTransactionHelper_getLocalTransactions, "f").call(this);
131
- const uniqueTransactions = remoteTransactions.filter((tx) => !localTransactions.some((currentTx) => currentTx.hash?.toLowerCase() === tx.hash?.toLowerCase() &&
132
- currentTx.txParams.from?.toLowerCase() ===
133
- tx.txParams.from?.toLowerCase() &&
134
- currentTx.type === tx.type));
135
- if (!uniqueTransactions.length) {
136
- (0, logger_1.incomingTransactionsLogger)('All transactions are already known');
137
- return;
138
- }
139
- (0, logger_1.incomingTransactionsLogger)('Found unique transactions', uniqueTransactions.length, uniqueTransactions);
140
- const trimmedTransactions = __classPrivateFieldGet(this, _IncomingTransactionHelper_trimTransactions, "f").call(this, [
141
- ...uniqueTransactions,
142
- ...localTransactions,
143
- ]);
144
- const uniqueTransactionIds = uniqueTransactions.map((tx) => tx.id);
145
- const newTransactions = trimmedTransactions.filter((tx) => uniqueTransactionIds.includes(tx.id));
146
- if (!newTransactions.length) {
147
- (0, logger_1.incomingTransactionsLogger)('All unique transactions truncated due to limit');
148
- return;
149
- }
150
- (0, logger_1.incomingTransactionsLogger)('Adding new transactions', newTransactions.length, newTransactions);
151
- this.hub.emit('transactions', newTransactions);
152
- }
153
- }
154
- exports.IncomingTransactionHelper = IncomingTransactionHelper;
155
- _IncomingTransactionHelper_client = new WeakMap(), _IncomingTransactionHelper_getCurrentAccount = new WeakMap(), _IncomingTransactionHelper_getLocalTransactions = new WeakMap(), _IncomingTransactionHelper_includeTokenTransfers = new WeakMap(), _IncomingTransactionHelper_isEnabled = new WeakMap(), _IncomingTransactionHelper_isRunning = new WeakMap(), _IncomingTransactionHelper_isUpdating = new WeakMap(), _IncomingTransactionHelper_messenger = new WeakMap(), _IncomingTransactionHelper_remoteTransactionSource = new WeakMap(), _IncomingTransactionHelper_timeoutId = new WeakMap(), _IncomingTransactionHelper_trimTransactions = new WeakMap(), _IncomingTransactionHelper_isTransactionHistoryRetrievalActive = new WeakMap(), _IncomingTransactionHelper_updateTransactions = new WeakMap(), _IncomingTransactionHelper_useBackendWebSocketService = new WeakMap(), _IncomingTransactionHelper_chainsToPoll = new WeakMap(), _IncomingTransactionHelper_connectionStateChangedHandler = new WeakMap(), _IncomingTransactionHelper_transactionUpdatedHandler = new WeakMap(), _IncomingTransactionHelper_selectedAccountChangedHandler = new WeakMap(), _IncomingTransactionHelper_statusChangedHandler = new WeakMap(), _IncomingTransactionHelper_instances = new WeakSet(), _IncomingTransactionHelper_startPolling = function _IncomingTransactionHelper_startPolling(initialPolling = false) {
156
- if (__classPrivateFieldGet(this, _IncomingTransactionHelper_isRunning, "f")) {
157
- return;
158
- }
159
- if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_canStart).call(this)) {
160
- return;
161
- }
162
- const interval = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getInterval).call(this);
163
- (0, logger_1.incomingTransactionsLogger)('Started polling', {
164
- interval,
165
- });
166
- __classPrivateFieldSet(this, _IncomingTransactionHelper_isRunning, true, "f");
167
- if (__classPrivateFieldGet(this, _IncomingTransactionHelper_isUpdating, "f")) {
168
- return;
169
- }
170
- __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onInterval).call(this).catch((error) => {
171
- (0, logger_1.incomingTransactionsLogger)(initialPolling ? 'Initial polling failed' : 'Polling failed', error);
172
- });
173
- }, _IncomingTransactionHelper_onConnectionStateChanged = function _IncomingTransactionHelper_onConnectionStateChanged(connectionInfo) {
174
- if (connectionInfo.state === WebSocketState.CONNECTED) {
175
- (0, logger_1.incomingTransactionsLogger)('WebSocket connected, starting enhanced mode');
176
- __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_startTransactionHistoryRetrieval).call(this);
177
- }
178
- else if (connectionInfo.state === WebSocketState.DISCONNECTED) {
179
- (0, logger_1.incomingTransactionsLogger)('WebSocket disconnected, stopping enhanced mode');
180
- __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_stopTransactionHistoryRetrieval).call(this);
181
- }
182
- }, _IncomingTransactionHelper_startTransactionHistoryRetrieval = function _IncomingTransactionHelper_startTransactionHistoryRetrieval() {
183
- if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_canStart).call(this)) {
184
- return;
185
- }
186
- if (__classPrivateFieldGet(this, _IncomingTransactionHelper_isTransactionHistoryRetrievalActive, "f")) {
187
- return;
188
- }
189
- (0, logger_1.incomingTransactionsLogger)('Started transaction history retrieval (event-driven)');
190
- __classPrivateFieldSet(this, _IncomingTransactionHelper_isTransactionHistoryRetrievalActive, true, "f");
191
- this.update().catch((error) => {
192
- (0, logger_1.incomingTransactionsLogger)('Initial update in transaction history retrieval failed', error);
193
- });
194
- __classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f").subscribe('AccountActivityService:transactionUpdated', __classPrivateFieldGet(this, _IncomingTransactionHelper_transactionUpdatedHandler, "f"));
195
- __classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f").subscribe('AccountsController:selectedAccountChange', __classPrivateFieldGet(this, _IncomingTransactionHelper_selectedAccountChangedHandler, "f"));
196
- }, _IncomingTransactionHelper_stopTransactionHistoryRetrieval = function _IncomingTransactionHelper_stopTransactionHistoryRetrieval() {
197
- if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_isTransactionHistoryRetrievalActive, "f")) {
198
- return;
199
- }
200
- (0, logger_1.incomingTransactionsLogger)('Stopped transaction history retrieval');
201
- __classPrivateFieldSet(this, _IncomingTransactionHelper_isTransactionHistoryRetrievalActive, false, "f");
202
- __classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f").unsubscribe('AccountActivityService:transactionUpdated', __classPrivateFieldGet(this, _IncomingTransactionHelper_transactionUpdatedHandler, "f"));
203
- __classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f").unsubscribe('AccountsController:selectedAccountChange', __classPrivateFieldGet(this, _IncomingTransactionHelper_selectedAccountChangedHandler, "f"));
204
- }, _IncomingTransactionHelper_onTransactionUpdated = function _IncomingTransactionHelper_onTransactionUpdated(transaction) {
205
- (0, logger_1.incomingTransactionsLogger)('Received relevant transaction update, triggering update', {
206
- txId: transaction.id,
207
- chain: transaction.chain,
208
- });
209
- this.update().catch((error) => {
210
- (0, logger_1.incomingTransactionsLogger)('Update after transaction event failed', error);
211
- });
212
- }, _IncomingTransactionHelper_onSelectedAccountChanged = function _IncomingTransactionHelper_onSelectedAccountChanged() {
213
- (0, logger_1.incomingTransactionsLogger)('Selected account changed, triggering update');
214
- this.update().catch((error) => {
215
- (0, logger_1.incomingTransactionsLogger)('Update after account change failed', error);
216
- });
217
- }, _IncomingTransactionHelper_onInterval = async function _IncomingTransactionHelper_onInterval() {
218
- __classPrivateFieldSet(this, _IncomingTransactionHelper_isUpdating, true, "f");
219
- try {
220
- // When websockets enabled, only poll chains that are not confirmed up
221
- const chainIds = __classPrivateFieldGet(this, _IncomingTransactionHelper_useBackendWebSocketService, "f")
222
- ? __classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f")
223
- : undefined;
224
- await this.update({ chainIds, isInterval: true });
225
- }
226
- catch (error) {
227
- console.error('Error while checking incoming transactions', error);
228
- }
229
- __classPrivateFieldSet(this, _IncomingTransactionHelper_isUpdating, false, "f");
230
- if (__classPrivateFieldGet(this, _IncomingTransactionHelper_isRunning, "f")) {
231
- if (__classPrivateFieldGet(this, _IncomingTransactionHelper_timeoutId, "f")) {
232
- clearTimeout(__classPrivateFieldGet(this, _IncomingTransactionHelper_timeoutId, "f"));
233
- }
234
- __classPrivateFieldSet(this, _IncomingTransactionHelper_timeoutId, setTimeout(
235
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
236
- () => __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onInterval).call(this), __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getInterval).call(this)), "f");
237
- }
238
- }, _IncomingTransactionHelper_sortTransactionsByTime = function _IncomingTransactionHelper_sortTransactionsByTime(transactions) {
239
- transactions.sort((a, b) => (a.time < b.time ? -1 : 1));
240
- }, _IncomingTransactionHelper_canStart = function _IncomingTransactionHelper_canStart() {
241
- return __classPrivateFieldGet(this, _IncomingTransactionHelper_isEnabled, "f").call(this);
242
- }, _IncomingTransactionHelper_getInterval = function _IncomingTransactionHelper_getInterval() {
243
- return (0, feature_flags_1.getIncomingTransactionsPollingInterval)(__classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f"));
244
- }, _IncomingTransactionHelper_getTags = function _IncomingTransactionHelper_getTags(requestTags, isInterval) {
245
- const tags = [];
246
- if (__classPrivateFieldGet(this, _IncomingTransactionHelper_client, "f")) {
247
- tags.push(__classPrivateFieldGet(this, _IncomingTransactionHelper_client, "f"));
248
- }
249
- if (requestTags?.length) {
250
- tags.push(...requestTags);
251
- }
252
- else if (isInterval) {
253
- tags.push(TAG_POLLING);
254
- }
255
- return tags?.length ? tags : undefined;
256
- }, _IncomingTransactionHelper_onNetworkStatusChanged = function _IncomingTransactionHelper_onNetworkStatusChanged(chainIds, status) {
257
- if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_useBackendWebSocketService, "f")) {
258
- return;
259
- }
260
- let hasChanges = false;
261
- for (const caip2ChainId of chainIds) {
262
- const hexChainId = (0, utils_1.caip2ToHex)(caip2ChainId);
263
- if (!hexChainId || !AccountsApiRemoteTransactionSource_1.SUPPORTED_CHAIN_IDS.includes(hexChainId)) {
264
- (0, logger_1.incomingTransactionsLogger)('Chain ID not recognized or not supported', {
265
- caip2ChainId,
266
- hexChainId,
267
- });
268
- continue;
269
- }
270
- if (status === 'up') {
271
- const index = __classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f").indexOf(hexChainId);
272
- if (index !== -1) {
273
- __classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f").splice(index, 1);
274
- hasChanges = true;
275
- (0, logger_1.incomingTransactionsLogger)('Supported network came up, removed from polling list', {
276
- chainId: hexChainId,
277
- });
278
- }
279
- }
280
- else if (status === 'down' &&
281
- !__classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f").includes(hexChainId)) {
282
- __classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f").push(hexChainId);
283
- hasChanges = true;
284
- (0, logger_1.incomingTransactionsLogger)('Supported network went down, added to polling list', {
285
- chainId: hexChainId,
286
- });
287
- }
288
- }
289
- if (!hasChanges) {
290
- (0, logger_1.incomingTransactionsLogger)('No changes to polling list', {
291
- chainsToPoll: __classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f"),
292
- });
293
- return;
294
- }
295
- if (__classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f").length === 0) {
296
- (0, logger_1.incomingTransactionsLogger)('Stopping fallback polling - all networks up');
297
- this.stop();
298
- }
299
- else {
300
- (0, logger_1.incomingTransactionsLogger)('Starting fallback polling - some networks need polling', {
301
- chainsToPoll: __classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f"),
302
- });
303
- __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_startPolling).call(this);
304
- }
305
- };
306
- //# sourceMappingURL=IncomingTransactionHelper.cjs.map
@@ -1 +0,0 @@
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 type { TransactionControllerMessenger } from '..';\nimport { incomingTransactionsLogger as log } from '../logger';\nimport type { RemoteTransactionSource, TransactionMeta } from '../types';\nimport {\n getIncomingTransactionsPollingInterval,\n isIncomingTransactionsUseBackendWebSocketServiceEnabled,\n} from '../utils/feature-flags';\nimport { caip2ToHex } from '../utils/utils';\nimport { SUPPORTED_CHAIN_IDS } from './AccountsApiRemoteTransactionSource';\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 #isTransactionHistoryRetrievalActive = false;\n\n readonly #updateTransactions?: boolean;\n\n readonly #useBackendWebSocketService: 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.#useBackendWebSocketService =\n isIncomingTransactionsUseBackendWebSocketServiceEnabled(messenger);\n\n if (this.#useBackendWebSocketService) {\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.#useBackendWebSocketService) {\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 if (this.#isTransactionHistoryRetrievalActive) {\n return;\n }\n\n log('Started transaction history retrieval (event-driven)');\n\n this.#isTransactionHistoryRetrievalActive = true;\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 if (!this.#isTransactionHistoryRetrievalActive) {\n return;\n }\n\n log('Stopped transaction history retrieval');\n\n this.#isTransactionHistoryRetrievalActive = false;\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.#useBackendWebSocketService\n ? this.#chainsToPoll\n : 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.#useBackendWebSocketService) {\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"]}
@@ -1,45 +0,0 @@
1
- /// <reference types="node" />
2
- import type { AccountsController } from "@metamask/accounts-controller";
3
- import type { Hex } from "@metamask/utils";
4
- import EventEmitter from "events";
5
- import type { TransactionControllerMessenger } from "../index.cjs";
6
- import type { RemoteTransactionSource, TransactionMeta } from "../types.cjs";
7
- export declare enum WebSocketState {
8
- CONNECTED = "connected",
9
- DISCONNECTED = "disconnected"
10
- }
11
- export type IncomingTransactionOptions = {
12
- /** Name of the client to include in requests. */
13
- client?: string;
14
- /** Whether to retrieve incoming token transfers. Defaults to false. */
15
- includeTokenTransfers?: boolean;
16
- /** Callback to determine if incoming transaction polling is enabled. */
17
- isEnabled?: () => boolean;
18
- /** @deprecated No longer used. */
19
- queryEntireHistory?: boolean;
20
- /** Whether to retrieve outgoing transactions. Defaults to false. */
21
- updateTransactions?: boolean;
22
- };
23
- export declare class IncomingTransactionHelper {
24
- #private;
25
- hub: EventEmitter;
26
- constructor({ client, getCurrentAccount, getLocalTransactions, includeTokenTransfers, isEnabled, messenger, remoteTransactionSource, trimTransactions, updateTransactions, }: {
27
- client?: string;
28
- getCurrentAccount: () => ReturnType<AccountsController['getSelectedAccount']>;
29
- getLocalTransactions: () => TransactionMeta[];
30
- includeTokenTransfers?: boolean;
31
- isEnabled?: () => boolean;
32
- messenger: TransactionControllerMessenger;
33
- remoteTransactionSource: RemoteTransactionSource;
34
- trimTransactions: (transactions: TransactionMeta[]) => TransactionMeta[];
35
- updateTransactions?: boolean;
36
- });
37
- start(): void;
38
- stop(): void;
39
- update({ chainIds, isInterval, tags, }?: {
40
- chainIds?: Hex[];
41
- isInterval?: boolean;
42
- tags?: string[];
43
- }): Promise<void>;
44
- }
45
- //# sourceMappingURL=IncomingTransactionHelper.d.cts.map
@@ -1 +0,0 @@
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;AAElC,OAAO,KAAK,EAAE,8BAA8B,EAAE,qBAAW;AAEzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,qBAAiB;AAQzE,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;gBA+DN,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;IA8BD,KAAK,IAAI,IAAI;IAmCb,IAAI,IAAI,IAAI;IAuHN,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"}