@metamask/transaction-controller 62.18.0 → 62.19.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.
- package/CHANGELOG.md +8 -1
- package/dist/helpers/IncomingTransactionHelper.cjs +10 -8
- package/dist/helpers/IncomingTransactionHelper.cjs.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.d.cts.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.d.mts.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.mjs +11 -9
- package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -1
- package/dist/utils/feature-flags.cjs +5 -4
- package/dist/utils/feature-flags.cjs.map +1 -1
- package/dist/utils/feature-flags.d.cts +2 -2
- package/dist/utils/feature-flags.d.cts.map +1 -1
- package/dist/utils/feature-flags.d.mts +2 -2
- package/dist/utils/feature-flags.d.mts.map +1 -1
- package/dist/utils/feature-flags.mjs +3 -2
- package/dist/utils/feature-flags.mjs.map +1 -1
- package/package.json +1 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [62.19.0]
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- Rename remote feature flag `useWebsockets` to `useBackendWebSocketService` ([#8028](https://github.com/MetaMask/core/pull/8028))
|
|
15
|
+
|
|
10
16
|
## [62.18.0]
|
|
11
17
|
|
|
12
18
|
### Added
|
|
@@ -2180,7 +2186,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
2180
2186
|
|
|
2181
2187
|
All changes listed after this point were applied to this package following the monorepo conversion.
|
|
2182
2188
|
|
|
2183
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@62.
|
|
2189
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@62.19.0...HEAD
|
|
2190
|
+
[62.19.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@62.18.0...@metamask/transaction-controller@62.19.0
|
|
2184
2191
|
[62.18.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@62.17.1...@metamask/transaction-controller@62.18.0
|
|
2185
2192
|
[62.17.1]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@62.17.0...@metamask/transaction-controller@62.17.1
|
|
2186
2193
|
[62.17.0]: https://github.com/MetaMask/core/compare/@metamask/transaction-controller@62.16.0...@metamask/transaction-controller@62.17.0
|
|
@@ -13,7 +13,7 @@ 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,
|
|
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_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
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.IncomingTransactionHelper = exports.WebSocketState = void 0;
|
|
19
19
|
// This package purposefully relies on Node's EventEmitter module.
|
|
@@ -44,7 +44,7 @@ class IncomingTransactionHelper {
|
|
|
44
44
|
_IncomingTransactionHelper_timeoutId.set(this, void 0);
|
|
45
45
|
_IncomingTransactionHelper_trimTransactions.set(this, void 0);
|
|
46
46
|
_IncomingTransactionHelper_updateTransactions.set(this, void 0);
|
|
47
|
-
|
|
47
|
+
_IncomingTransactionHelper_useBackendWebSocketService.set(this, void 0);
|
|
48
48
|
// Chains that need polling (start with all supported, remove as they come up)
|
|
49
49
|
_IncomingTransactionHelper_chainsToPoll.set(this, [...AccountsApiRemoteTransactionSource_1.SUPPORTED_CHAIN_IDS]);
|
|
50
50
|
_IncomingTransactionHelper_connectionStateChangedHandler.set(this, (connectionInfo) => {
|
|
@@ -71,15 +71,15 @@ class IncomingTransactionHelper {
|
|
|
71
71
|
__classPrivateFieldSet(this, _IncomingTransactionHelper_remoteTransactionSource, remoteTransactionSource, "f");
|
|
72
72
|
__classPrivateFieldSet(this, _IncomingTransactionHelper_trimTransactions, trimTransactions, "f");
|
|
73
73
|
__classPrivateFieldSet(this, _IncomingTransactionHelper_updateTransactions, updateTransactions, "f");
|
|
74
|
-
__classPrivateFieldSet(this,
|
|
75
|
-
if (__classPrivateFieldGet(this,
|
|
74
|
+
__classPrivateFieldSet(this, _IncomingTransactionHelper_useBackendWebSocketService, (0, feature_flags_1.isIncomingTransactionsUseBackendWebSocketServiceEnabled)(messenger), "f");
|
|
75
|
+
if (__classPrivateFieldGet(this, _IncomingTransactionHelper_useBackendWebSocketService, "f")) {
|
|
76
76
|
__classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f").subscribe('BackendWebSocketService:connectionStateChanged', __classPrivateFieldGet(this, _IncomingTransactionHelper_connectionStateChangedHandler, "f"));
|
|
77
77
|
__classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f").subscribe('AccountActivityService:statusChanged', __classPrivateFieldGet(this, _IncomingTransactionHelper_statusChangedHandler, "f"));
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
start() {
|
|
81
81
|
// When websockets are disabled, allow normal polling (legacy mode)
|
|
82
|
-
if (__classPrivateFieldGet(this,
|
|
82
|
+
if (__classPrivateFieldGet(this, _IncomingTransactionHelper_useBackendWebSocketService, "f")) {
|
|
83
83
|
return;
|
|
84
84
|
}
|
|
85
85
|
__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_startPolling).call(this, true);
|
|
@@ -151,7 +151,7 @@ class IncomingTransactionHelper {
|
|
|
151
151
|
}
|
|
152
152
|
}
|
|
153
153
|
exports.IncomingTransactionHelper = IncomingTransactionHelper;
|
|
154
|
-
_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_updateTransactions = new WeakMap(),
|
|
154
|
+
_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_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) {
|
|
155
155
|
if (__classPrivateFieldGet(this, _IncomingTransactionHelper_isRunning, "f")) {
|
|
156
156
|
return;
|
|
157
157
|
}
|
|
@@ -209,7 +209,9 @@ _IncomingTransactionHelper_client = new WeakMap(), _IncomingTransactionHelper_ge
|
|
|
209
209
|
__classPrivateFieldSet(this, _IncomingTransactionHelper_isUpdating, true, "f");
|
|
210
210
|
try {
|
|
211
211
|
// When websockets enabled, only poll chains that are not confirmed up
|
|
212
|
-
const chainIds = __classPrivateFieldGet(this,
|
|
212
|
+
const chainIds = __classPrivateFieldGet(this, _IncomingTransactionHelper_useBackendWebSocketService, "f")
|
|
213
|
+
? __classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f")
|
|
214
|
+
: undefined;
|
|
213
215
|
await this.update({ chainIds, isInterval: true });
|
|
214
216
|
}
|
|
215
217
|
catch (error) {
|
|
@@ -243,7 +245,7 @@ _IncomingTransactionHelper_client = new WeakMap(), _IncomingTransactionHelper_ge
|
|
|
243
245
|
}
|
|
244
246
|
return tags?.length ? tags : undefined;
|
|
245
247
|
}, _IncomingTransactionHelper_onNetworkStatusChanged = function _IncomingTransactionHelper_onNetworkStatusChanged(chainIds, status) {
|
|
246
|
-
if (!__classPrivateFieldGet(this,
|
|
248
|
+
if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_useBackendWebSocketService, "f")) {
|
|
247
249
|
return;
|
|
248
250
|
}
|
|
249
251
|
let hasChanges = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IncomingTransactionHelper.cjs","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AccountsController } from '@metamask/accounts-controller';\nimport type {\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"]}
|
|
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 isIncomingTransactionsUseBackendWebSocketServiceEnabled,\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 #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 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.#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 +1 @@
|
|
|
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;
|
|
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;IA8BD,KAAK,IAAI,IAAI;IAmCb,IAAI,IAAI,IAAI;IA2GN,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"}
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;IA8BD,KAAK,IAAI,IAAI;IAmCb,IAAI,IAAI,IAAI;IA2GN,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,13 +9,13 @@ 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,
|
|
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_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;
|
|
13
13
|
// This package purposefully relies on Node's EventEmitter module.
|
|
14
14
|
// eslint-disable-next-line import-x/no-nodejs-modules
|
|
15
15
|
import EventEmitter from "events";
|
|
16
16
|
import { SUPPORTED_CHAIN_IDS } from "./AccountsApiRemoteTransactionSource.mjs";
|
|
17
17
|
import { incomingTransactionsLogger as log } from "../logger.mjs";
|
|
18
|
-
import { getIncomingTransactionsPollingInterval,
|
|
18
|
+
import { getIncomingTransactionsPollingInterval, isIncomingTransactionsUseBackendWebSocketServiceEnabled } from "../utils/feature-flags.mjs";
|
|
19
19
|
import { caip2ToHex } from "../utils/utils.mjs";
|
|
20
20
|
export var WebSocketState;
|
|
21
21
|
(function (WebSocketState) {
|
|
@@ -38,7 +38,7 @@ export class IncomingTransactionHelper {
|
|
|
38
38
|
_IncomingTransactionHelper_timeoutId.set(this, void 0);
|
|
39
39
|
_IncomingTransactionHelper_trimTransactions.set(this, void 0);
|
|
40
40
|
_IncomingTransactionHelper_updateTransactions.set(this, void 0);
|
|
41
|
-
|
|
41
|
+
_IncomingTransactionHelper_useBackendWebSocketService.set(this, void 0);
|
|
42
42
|
// Chains that need polling (start with all supported, remove as they come up)
|
|
43
43
|
_IncomingTransactionHelper_chainsToPoll.set(this, [...SUPPORTED_CHAIN_IDS]);
|
|
44
44
|
_IncomingTransactionHelper_connectionStateChangedHandler.set(this, (connectionInfo) => {
|
|
@@ -65,15 +65,15 @@ export class IncomingTransactionHelper {
|
|
|
65
65
|
__classPrivateFieldSet(this, _IncomingTransactionHelper_remoteTransactionSource, remoteTransactionSource, "f");
|
|
66
66
|
__classPrivateFieldSet(this, _IncomingTransactionHelper_trimTransactions, trimTransactions, "f");
|
|
67
67
|
__classPrivateFieldSet(this, _IncomingTransactionHelper_updateTransactions, updateTransactions, "f");
|
|
68
|
-
__classPrivateFieldSet(this,
|
|
69
|
-
if (__classPrivateFieldGet(this,
|
|
68
|
+
__classPrivateFieldSet(this, _IncomingTransactionHelper_useBackendWebSocketService, isIncomingTransactionsUseBackendWebSocketServiceEnabled(messenger), "f");
|
|
69
|
+
if (__classPrivateFieldGet(this, _IncomingTransactionHelper_useBackendWebSocketService, "f")) {
|
|
70
70
|
__classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f").subscribe('BackendWebSocketService:connectionStateChanged', __classPrivateFieldGet(this, _IncomingTransactionHelper_connectionStateChangedHandler, "f"));
|
|
71
71
|
__classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f").subscribe('AccountActivityService:statusChanged', __classPrivateFieldGet(this, _IncomingTransactionHelper_statusChangedHandler, "f"));
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
start() {
|
|
75
75
|
// When websockets are disabled, allow normal polling (legacy mode)
|
|
76
|
-
if (__classPrivateFieldGet(this,
|
|
76
|
+
if (__classPrivateFieldGet(this, _IncomingTransactionHelper_useBackendWebSocketService, "f")) {
|
|
77
77
|
return;
|
|
78
78
|
}
|
|
79
79
|
__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_startPolling).call(this, true);
|
|
@@ -144,7 +144,7 @@ export class IncomingTransactionHelper {
|
|
|
144
144
|
this.hub.emit('transactions', newTransactions);
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
|
-
_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_updateTransactions = new WeakMap(),
|
|
147
|
+
_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_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) {
|
|
148
148
|
if (__classPrivateFieldGet(this, _IncomingTransactionHelper_isRunning, "f")) {
|
|
149
149
|
return;
|
|
150
150
|
}
|
|
@@ -202,7 +202,9 @@ _IncomingTransactionHelper_client = new WeakMap(), _IncomingTransactionHelper_ge
|
|
|
202
202
|
__classPrivateFieldSet(this, _IncomingTransactionHelper_isUpdating, true, "f");
|
|
203
203
|
try {
|
|
204
204
|
// When websockets enabled, only poll chains that are not confirmed up
|
|
205
|
-
const chainIds = __classPrivateFieldGet(this,
|
|
205
|
+
const chainIds = __classPrivateFieldGet(this, _IncomingTransactionHelper_useBackendWebSocketService, "f")
|
|
206
|
+
? __classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f")
|
|
207
|
+
: undefined;
|
|
206
208
|
await this.update({ chainIds, isInterval: true });
|
|
207
209
|
}
|
|
208
210
|
catch (error) {
|
|
@@ -236,7 +238,7 @@ _IncomingTransactionHelper_client = new WeakMap(), _IncomingTransactionHelper_ge
|
|
|
236
238
|
}
|
|
237
239
|
return tags?.length ? tags : undefined;
|
|
238
240
|
}, _IncomingTransactionHelper_onNetworkStatusChanged = function _IncomingTransactionHelper_onNetworkStatusChanged(chainIds, status) {
|
|
239
|
-
if (!__classPrivateFieldGet(this,
|
|
241
|
+
if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_useBackendWebSocketService, "f")) {
|
|
240
242
|
return;
|
|
241
243
|
}
|
|
242
244
|
let hasChanges = false;
|
|
@@ -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 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"]}
|
|
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 isIncomingTransactionsUseBackendWebSocketServiceEnabled,\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 #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 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.#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,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.isIncomingTransactionsUseBackendWebSocketServiceEnabled = exports.getTimeoutAttempts = exports.getIncomingTransactionsPollingInterval = exports.getGasEstimateBuffer = exports.getGasEstimateFallback = exports.getGasFeeRandomisation = exports.getAcceleratedPollingParams = exports.getTransactionHistoryLimit = exports.getSubmitHistoryLimit = exports.getBatchSizeLimit = exports.getEIP7702UpgradeContractAddress = exports.getEIP7702ContractAddresses = exports.getEIP7702SupportedChains = exports.FeatureFlag = void 0;
|
|
4
4
|
const utils_1 = require("@metamask/utils");
|
|
5
5
|
const signature_1 = require("./signature.cjs");
|
|
6
6
|
const utils_2 = require("./utils.cjs");
|
|
@@ -223,11 +223,12 @@ exports.getTimeoutAttempts = getTimeoutAttempts;
|
|
|
223
223
|
* @param messenger - The controller messenger instance.
|
|
224
224
|
* @returns True if WebSocket updates are enabled, false otherwise.
|
|
225
225
|
*/
|
|
226
|
-
function
|
|
226
|
+
function isIncomingTransactionsUseBackendWebSocketServiceEnabled(messenger) {
|
|
227
227
|
const featureFlags = getFeatureFlags(messenger);
|
|
228
|
-
return (featureFlags?.[FeatureFlag.IncomingTransactions]
|
|
228
|
+
return (featureFlags?.[FeatureFlag.IncomingTransactions]
|
|
229
|
+
?.useBackendWebSocketService ?? false);
|
|
229
230
|
}
|
|
230
|
-
exports.
|
|
231
|
+
exports.isIncomingTransactionsUseBackendWebSocketServiceEnabled = isIncomingTransactionsUseBackendWebSocketServiceEnabled;
|
|
231
232
|
/**
|
|
232
233
|
* Retrieves the relevant feature flags from the remote feature flag controller.
|
|
233
234
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-flags.cjs","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport { isValidSignature } from './signature';\nimport { padHexToEvenLength } from './utils';\nimport { projectLogger } from '../logger';\nimport type { TransactionControllerMessenger } from '../TransactionController';\n\nconst DEFAULT_BATCH_SIZE_LIMIT = 10;\nconst DEFAULT_ACCELERATED_POLLING_COUNT_MAX = 10;\nconst DEFAULT_ACCELERATED_POLLING_INTERVAL_MS = 3 * 1000;\nconst DEFAULT_BLOCK_TIME = 12 * 1000;\nconst DEFAULT_GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT = 35;\nconst DEFAULT_GAS_ESTIMATE_BUFFER = 1;\nconst DEFAULT_INCOMING_TRANSACTIONS_POLLING_INTERVAL_MS = 1000 * 60 * 4; // 4 Minutes\nconst DEFAULT_SUBMIT_HISTORY_LIMIT = 100;\nconst DEFAULT_TRANSACTION_HISTORY_LIMIT = 40;\n\n/**\n * Feature flags supporting the transaction controller.\n */\nexport enum FeatureFlag {\n EIP7702 = 'confirmations_eip_7702',\n GasBuffer = 'confirmations_gas_buffer',\n IncomingTransactions = 'confirmations_incoming_transactions',\n Transactions = 'confirmations_transactions',\n}\n\ntype GasEstimateFallback = {\n /**\n * The fixed gas estimate fallback for a transaction.\n */\n fixed?: number;\n\n /**\n * The percentage multiplier gas estimate fallback for a transaction.\n */\n percentage?: number;\n};\n\nexport type TransactionControllerFeatureFlags = {\n /** Feature flags to support EIP-7702 / type-4 transactions. */\n [FeatureFlag.EIP7702]?: {\n /**\n * All contracts that support EIP-7702 batch transactions.\n * Keyed by chain ID.\n * First entry in each array is the contract that standard EOAs will be upgraded to.\n */\n contracts?: Record<\n Hex,\n {\n /** Address of the smart contract. */\n address: Hex;\n\n /** Signature to verify the contract is authentic. */\n signature: Hex;\n }[]\n >;\n\n /** Chains enabled for EIP-7702 batch transactions. */\n supportedChains?: Hex[];\n };\n\n /**\n * Buffers added to gas limit estimations.\n * Values are multipliers such as `1.5` meaning 150% of the original gas limit.\n */\n [FeatureFlag.GasBuffer]?: {\n /** Fallback buffer for all chains and transactions. */\n default?: number;\n\n /**\n * Buffer for included network RPCs only and not those added by user.\n * Takes priority over `default`.\n */\n included?: number;\n\n /** Buffers for specific chains. */\n perChainConfig?: {\n [chainId: Hex]: {\n /**\n * Buffer for the chain for all transactions.\n * Takes priority over non-chain `included`.\n */\n base?: number;\n\n /**\n * Buffer if network RPC is included and not added by user.\n * Takes priority over `base`.\n */\n included?: number;\n\n /**\n * Buffer for the chain for EIP-7702 / type 4 transactions only.\n * Only if `data` included and `to` matches `from`.\n * Takes priority over `included` and `base`.\n */\n eip7702?: number;\n };\n };\n };\n\n /** Incoming transaction configuration. */\n [FeatureFlag.IncomingTransactions]?: {\n /** Interval between requests to accounts API to retrieve incoming transactions. */\n pollingIntervalMs?: number;\n\n /** Whether to use WebSocket for event-driven transaction updates instead of polling. */\n useWebsockets?: boolean;\n };\n\n /** Miscellaneous feature flags to support the transaction controller. */\n [FeatureFlag.Transactions]?: {\n /** Maximum number of transactions that can be in an external batch. */\n batchSizeLimit?: number;\n\n /** Maximum number of entries in the submit history. */\n submitHistoryLimit?: number;\n\n /** Maximum number of transactions stored in state. */\n transactionHistoryLimit?: number;\n\n /**\n * Accelerated polling is used to speed up the polling process for\n * transactions that are not yet confirmed.\n */\n acceleratedPolling?: {\n /** Accelerated polling parameters on a per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: {\n /**\n * Block time in milliseconds.\n */\n blockTime?: number;\n\n /**\n * Maximum number of polling requests that can be made in a row, before\n * the normal polling resumes.\n */\n countMax?: number;\n\n /** Interval between polling requests in milliseconds. */\n intervalMs?: number;\n };\n };\n\n /** Default `countMax` in case no chain-specific parameter is set. */\n defaultCountMax?: number;\n\n /** Default `intervalMs` in case no chain-specific parameter is set. */\n defaultIntervalMs?: number;\n };\n\n gasFeeRandomisation?: {\n /** Randomised gas fee digits per chainId. */\n randomisedGasFeeDigits?: Record<Hex, number>;\n\n /** Number of digits to preserve for randomised gas fee digits. */\n preservedNumberOfDigits?: number;\n };\n\n /** Gas estimate fallback is used as a fallback in case of failure to obtain the gas estimate values. */\n gasEstimateFallback?: {\n /** Gas estimate fallback per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: GasEstimateFallback;\n };\n\n /**\n * Default gas estimate fallback.\n * This value is used when no specific gas estimate fallback is found for a chain ID.\n */\n default?: GasEstimateFallback;\n };\n\n /**\n * Number of attempts to wait before automatically marking a transaction as failed\n * if it has no receipt status and hash is not found on the network.\n */\n timeoutAttempts?: {\n /** Automatic fail threshold on a per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: number;\n };\n\n /**\n * Default automatic fail threshold.\n * This value is used when no specific threshold is found for a chain ID.\n */\n default?: number;\n };\n };\n};\n\nconst log = createModuleLogger(projectLogger, 'feature-flags');\n\n/**\n * Retrieves the supported EIP-7702 chains.\n *\n * @param messenger - The controller messenger instance.\n * @returns The supported chains.\n */\nexport function getEIP7702SupportedChains(\n messenger: TransactionControllerMessenger,\n): Hex[] {\n const featureFlags = getFeatureFlags(messenger);\n return featureFlags?.[FeatureFlag.EIP7702]?.supportedChains ?? [];\n}\n\n/**\n * Retrieves the supported EIP-7702 contract addresses for a given chain ID.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @param publicKey - The public key used to validate the contract authenticity.\n * @returns The supported contract addresses.\n */\nexport function getEIP7702ContractAddresses(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n publicKey: Hex,\n): Hex[] {\n const featureFlags = getFeatureFlags(messenger);\n\n const contracts =\n featureFlags?.[FeatureFlag.EIP7702]?.contracts?.[\n chainId.toLowerCase() as Hex\n ] ?? [];\n\n return contracts\n .filter((contract) =>\n isValidSignature(\n [contract.address, padHexToEvenLength(chainId) as Hex],\n contract.signature,\n publicKey,\n ),\n )\n .map((contract) => contract.address);\n}\n\n/**\n * Retrieves the EIP-7702 upgrade contract address.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @param publicKey - The public key used to validate the contract authenticity.\n * @returns The upgrade contract address.\n */\nexport function getEIP7702UpgradeContractAddress(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n publicKey: Hex,\n): Hex | undefined {\n return getEIP7702ContractAddresses(chainId, messenger, publicKey)?.[0];\n}\n\n/**\n * Retrieves the batch size limit.\n * Defaults to 10 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The batch size limit.\n */\nexport function getBatchSizeLimit(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.Transactions]?.batchSizeLimit ??\n DEFAULT_BATCH_SIZE_LIMIT\n );\n}\n\n/**\n * Retrieves the submit history limit.\n * Defaults to 100 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The submit history limit.\n */\nexport function getSubmitHistoryLimit(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.Transactions]?.submitHistoryLimit ??\n DEFAULT_SUBMIT_HISTORY_LIMIT\n );\n}\n\n/**\n * Retrieves the transaction history limit.\n * Defaults to 40 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The transaction history limit.\n */\nexport function getTransactionHistoryLimit(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.Transactions]?.transactionHistoryLimit ??\n DEFAULT_TRANSACTION_HISTORY_LIMIT\n );\n}\n\n/**\n * Retrieves the accelerated polling parameters for a given chain ID.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The accelerated polling parameters: `countMax` and `intervalMs`.\n */\nexport function getAcceleratedPollingParams(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): { blockTime: number; countMax: number; intervalMs: number } {\n const featureFlags = getFeatureFlags(messenger);\n\n const acceleratedPollingParams =\n featureFlags?.[FeatureFlag.Transactions]?.acceleratedPolling;\n\n const countMax =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.countMax ??\n acceleratedPollingParams?.defaultCountMax ??\n DEFAULT_ACCELERATED_POLLING_COUNT_MAX;\n\n const intervalMs =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.intervalMs ??\n acceleratedPollingParams?.defaultIntervalMs ??\n DEFAULT_ACCELERATED_POLLING_INTERVAL_MS;\n\n const blockTime =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.blockTime ??\n DEFAULT_BLOCK_TIME;\n\n return { blockTime, countMax, intervalMs };\n}\n\n/**\n * Retrieves the gas fee randomisation parameters.\n *\n * @param messenger - The controller messenger instance.\n * @returns The gas fee randomisation parameters.\n */\nexport function getGasFeeRandomisation(\n messenger: TransactionControllerMessenger,\n): {\n randomisedGasFeeDigits: Record<Hex, number>;\n preservedNumberOfDigits: number | undefined;\n} {\n const featureFlags = getFeatureFlags(messenger);\n\n const gasFeeRandomisation =\n featureFlags?.[FeatureFlag.Transactions]?.gasFeeRandomisation ?? {};\n\n return {\n randomisedGasFeeDigits: gasFeeRandomisation.randomisedGasFeeDigits ?? {},\n preservedNumberOfDigits: gasFeeRandomisation.preservedNumberOfDigits,\n };\n}\n\n/**\n * Retrieves the gas estimate fallback for a given chain ID.\n * Defaults to the default gas estimate fallback if not set.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The gas estimate fallback.\n */\nexport function getGasEstimateFallback(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): {\n fixed?: number;\n percentage: number;\n} {\n const featureFlags = getFeatureFlags(messenger);\n\n const gasEstimateFallbackFlags =\n featureFlags?.[FeatureFlag.Transactions]?.gasEstimateFallback;\n\n const chainFlags = gasEstimateFallbackFlags?.perChainConfig?.[chainId];\n\n const percentage =\n chainFlags?.percentage ??\n gasEstimateFallbackFlags?.default?.percentage ??\n DEFAULT_GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT;\n\n const fixed = chainFlags?.fixed ?? gasEstimateFallbackFlags?.default?.fixed;\n\n return { fixed, percentage };\n}\n\n/**\n * Retrieves the gas buffers for a given chain ID.\n *\n * @param request - The request object.\n * @param request.chainId - The chain ID.\n * @param request.isCustomRPC - Whether the network RPC is added by the user.\n * @param request.isUpgradeWithDataToSelf - Whether the transaction is an EIP-7702 upgrade with data to self.\n * @param request.messenger - The controller messenger instance.\n * @returns The gas buffers.\n */\nexport function getGasEstimateBuffer({\n chainId,\n isCustomRPC,\n isUpgradeWithDataToSelf,\n messenger,\n}: {\n chainId: Hex;\n isCustomRPC: boolean;\n isUpgradeWithDataToSelf: boolean;\n messenger: TransactionControllerMessenger;\n}): number {\n const featureFlags = getFeatureFlags(messenger);\n const gasBufferFlags = featureFlags?.[FeatureFlag.GasBuffer];\n const chainFlags = gasBufferFlags?.perChainConfig?.[chainId];\n const chainIncludedRPCBuffer = isCustomRPC ? undefined : chainFlags?.included;\n\n const defaultIncludedRPCBuffer = isCustomRPC\n ? undefined\n : gasBufferFlags?.included;\n\n const upgradeBuffer = isUpgradeWithDataToSelf\n ? chainFlags?.eip7702\n : undefined;\n\n return (\n upgradeBuffer ??\n chainIncludedRPCBuffer ??\n chainFlags?.base ??\n defaultIncludedRPCBuffer ??\n gasBufferFlags?.default ??\n DEFAULT_GAS_ESTIMATE_BUFFER\n );\n}\n\n/**\n * Retrieves the incoming transactions polling interval.\n * Defaults to 4 minutes if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The incoming transactions polling interval in milliseconds.\n */\nexport function getIncomingTransactionsPollingInterval(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n\n return (\n featureFlags?.[FeatureFlag.IncomingTransactions]?.pollingIntervalMs ??\n DEFAULT_INCOMING_TRANSACTIONS_POLLING_INTERVAL_MS\n );\n}\n\n/**\n * Retrieves the number of attempts to wait before automatically marking a transaction as dropped\n * if it has no receipt status.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The threshold number of attempts, or undefined if the feature is disabled.\n */\nexport function getTimeoutAttempts(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): number | undefined {\n const featureFlags = getFeatureFlags(messenger);\n\n const timeoutAttemptsFlags =\n featureFlags?.[FeatureFlag.Transactions]?.timeoutAttempts;\n\n return (\n timeoutAttemptsFlags?.perChainConfig?.[chainId] ??\n timeoutAttemptsFlags?.default\n );\n}\n\n/**\n * Checks if WebSocket-based transaction updates are enabled.\n * When enabled, incoming transactions are fetched via event-driven updates\n * instead of polling.\n *\n * @param messenger - The controller messenger instance.\n * @returns True if WebSocket updates are enabled, false otherwise.\n */\nexport function isIncomingTransactionsUseWebsocketsEnabled(\n messenger: TransactionControllerMessenger,\n): boolean {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.IncomingTransactions]?.useWebsockets ?? false\n );\n}\n\n/**\n * Retrieves the relevant feature flags from the remote feature flag controller.\n *\n * @param messenger - The messenger instance.\n * @returns The feature flags.\n */\nfunction getFeatureFlags(\n messenger: TransactionControllerMessenger,\n): TransactionControllerFeatureFlags {\n const featureFlags = messenger.call(\n 'RemoteFeatureFlagController:getState',\n ).remoteFeatureFlags;\n\n log('Retrieved feature flags', featureFlags);\n\n return featureFlags as TransactionControllerFeatureFlags;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"feature-flags.cjs","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport { isValidSignature } from './signature';\nimport { padHexToEvenLength } from './utils';\nimport { projectLogger } from '../logger';\nimport type { TransactionControllerMessenger } from '../TransactionController';\n\nconst DEFAULT_BATCH_SIZE_LIMIT = 10;\nconst DEFAULT_ACCELERATED_POLLING_COUNT_MAX = 10;\nconst DEFAULT_ACCELERATED_POLLING_INTERVAL_MS = 3 * 1000;\nconst DEFAULT_BLOCK_TIME = 12 * 1000;\nconst DEFAULT_GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT = 35;\nconst DEFAULT_GAS_ESTIMATE_BUFFER = 1;\nconst DEFAULT_INCOMING_TRANSACTIONS_POLLING_INTERVAL_MS = 1000 * 60 * 4; // 4 Minutes\nconst DEFAULT_SUBMIT_HISTORY_LIMIT = 100;\nconst DEFAULT_TRANSACTION_HISTORY_LIMIT = 40;\n\n/**\n * Feature flags supporting the transaction controller.\n */\nexport enum FeatureFlag {\n EIP7702 = 'confirmations_eip_7702',\n GasBuffer = 'confirmations_gas_buffer',\n IncomingTransactions = 'confirmations_incoming_transactions',\n Transactions = 'confirmations_transactions',\n}\n\ntype GasEstimateFallback = {\n /**\n * The fixed gas estimate fallback for a transaction.\n */\n fixed?: number;\n\n /**\n * The percentage multiplier gas estimate fallback for a transaction.\n */\n percentage?: number;\n};\n\nexport type TransactionControllerFeatureFlags = {\n /** Feature flags to support EIP-7702 / type-4 transactions. */\n [FeatureFlag.EIP7702]?: {\n /**\n * All contracts that support EIP-7702 batch transactions.\n * Keyed by chain ID.\n * First entry in each array is the contract that standard EOAs will be upgraded to.\n */\n contracts?: Record<\n Hex,\n {\n /** Address of the smart contract. */\n address: Hex;\n\n /** Signature to verify the contract is authentic. */\n signature: Hex;\n }[]\n >;\n\n /** Chains enabled for EIP-7702 batch transactions. */\n supportedChains?: Hex[];\n };\n\n /**\n * Buffers added to gas limit estimations.\n * Values are multipliers such as `1.5` meaning 150% of the original gas limit.\n */\n [FeatureFlag.GasBuffer]?: {\n /** Fallback buffer for all chains and transactions. */\n default?: number;\n\n /**\n * Buffer for included network RPCs only and not those added by user.\n * Takes priority over `default`.\n */\n included?: number;\n\n /** Buffers for specific chains. */\n perChainConfig?: {\n [chainId: Hex]: {\n /**\n * Buffer for the chain for all transactions.\n * Takes priority over non-chain `included`.\n */\n base?: number;\n\n /**\n * Buffer if network RPC is included and not added by user.\n * Takes priority over `base`.\n */\n included?: number;\n\n /**\n * Buffer for the chain for EIP-7702 / type 4 transactions only.\n * Only if `data` included and `to` matches `from`.\n * Takes priority over `included` and `base`.\n */\n eip7702?: number;\n };\n };\n };\n\n /** Incoming transaction configuration. */\n [FeatureFlag.IncomingTransactions]?: {\n /** Interval between requests to accounts API to retrieve incoming transactions. */\n pollingIntervalMs?: number;\n\n /** Whether to use WebSocket for event-driven transaction updates instead of polling. */\n useBackendWebSocketService?: boolean;\n };\n\n /** Miscellaneous feature flags to support the transaction controller. */\n [FeatureFlag.Transactions]?: {\n /** Maximum number of transactions that can be in an external batch. */\n batchSizeLimit?: number;\n\n /** Maximum number of entries in the submit history. */\n submitHistoryLimit?: number;\n\n /** Maximum number of transactions stored in state. */\n transactionHistoryLimit?: number;\n\n /**\n * Accelerated polling is used to speed up the polling process for\n * transactions that are not yet confirmed.\n */\n acceleratedPolling?: {\n /** Accelerated polling parameters on a per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: {\n /**\n * Block time in milliseconds.\n */\n blockTime?: number;\n\n /**\n * Maximum number of polling requests that can be made in a row, before\n * the normal polling resumes.\n */\n countMax?: number;\n\n /** Interval between polling requests in milliseconds. */\n intervalMs?: number;\n };\n };\n\n /** Default `countMax` in case no chain-specific parameter is set. */\n defaultCountMax?: number;\n\n /** Default `intervalMs` in case no chain-specific parameter is set. */\n defaultIntervalMs?: number;\n };\n\n gasFeeRandomisation?: {\n /** Randomised gas fee digits per chainId. */\n randomisedGasFeeDigits?: Record<Hex, number>;\n\n /** Number of digits to preserve for randomised gas fee digits. */\n preservedNumberOfDigits?: number;\n };\n\n /** Gas estimate fallback is used as a fallback in case of failure to obtain the gas estimate values. */\n gasEstimateFallback?: {\n /** Gas estimate fallback per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: GasEstimateFallback;\n };\n\n /**\n * Default gas estimate fallback.\n * This value is used when no specific gas estimate fallback is found for a chain ID.\n */\n default?: GasEstimateFallback;\n };\n\n /**\n * Number of attempts to wait before automatically marking a transaction as failed\n * if it has no receipt status and hash is not found on the network.\n */\n timeoutAttempts?: {\n /** Automatic fail threshold on a per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: number;\n };\n\n /**\n * Default automatic fail threshold.\n * This value is used when no specific threshold is found for a chain ID.\n */\n default?: number;\n };\n };\n};\n\nconst log = createModuleLogger(projectLogger, 'feature-flags');\n\n/**\n * Retrieves the supported EIP-7702 chains.\n *\n * @param messenger - The controller messenger instance.\n * @returns The supported chains.\n */\nexport function getEIP7702SupportedChains(\n messenger: TransactionControllerMessenger,\n): Hex[] {\n const featureFlags = getFeatureFlags(messenger);\n return featureFlags?.[FeatureFlag.EIP7702]?.supportedChains ?? [];\n}\n\n/**\n * Retrieves the supported EIP-7702 contract addresses for a given chain ID.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @param publicKey - The public key used to validate the contract authenticity.\n * @returns The supported contract addresses.\n */\nexport function getEIP7702ContractAddresses(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n publicKey: Hex,\n): Hex[] {\n const featureFlags = getFeatureFlags(messenger);\n\n const contracts =\n featureFlags?.[FeatureFlag.EIP7702]?.contracts?.[\n chainId.toLowerCase() as Hex\n ] ?? [];\n\n return contracts\n .filter((contract) =>\n isValidSignature(\n [contract.address, padHexToEvenLength(chainId) as Hex],\n contract.signature,\n publicKey,\n ),\n )\n .map((contract) => contract.address);\n}\n\n/**\n * Retrieves the EIP-7702 upgrade contract address.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @param publicKey - The public key used to validate the contract authenticity.\n * @returns The upgrade contract address.\n */\nexport function getEIP7702UpgradeContractAddress(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n publicKey: Hex,\n): Hex | undefined {\n return getEIP7702ContractAddresses(chainId, messenger, publicKey)?.[0];\n}\n\n/**\n * Retrieves the batch size limit.\n * Defaults to 10 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The batch size limit.\n */\nexport function getBatchSizeLimit(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.Transactions]?.batchSizeLimit ??\n DEFAULT_BATCH_SIZE_LIMIT\n );\n}\n\n/**\n * Retrieves the submit history limit.\n * Defaults to 100 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The submit history limit.\n */\nexport function getSubmitHistoryLimit(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.Transactions]?.submitHistoryLimit ??\n DEFAULT_SUBMIT_HISTORY_LIMIT\n );\n}\n\n/**\n * Retrieves the transaction history limit.\n * Defaults to 40 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The transaction history limit.\n */\nexport function getTransactionHistoryLimit(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.Transactions]?.transactionHistoryLimit ??\n DEFAULT_TRANSACTION_HISTORY_LIMIT\n );\n}\n\n/**\n * Retrieves the accelerated polling parameters for a given chain ID.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The accelerated polling parameters: `countMax` and `intervalMs`.\n */\nexport function getAcceleratedPollingParams(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): { blockTime: number; countMax: number; intervalMs: number } {\n const featureFlags = getFeatureFlags(messenger);\n\n const acceleratedPollingParams =\n featureFlags?.[FeatureFlag.Transactions]?.acceleratedPolling;\n\n const countMax =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.countMax ??\n acceleratedPollingParams?.defaultCountMax ??\n DEFAULT_ACCELERATED_POLLING_COUNT_MAX;\n\n const intervalMs =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.intervalMs ??\n acceleratedPollingParams?.defaultIntervalMs ??\n DEFAULT_ACCELERATED_POLLING_INTERVAL_MS;\n\n const blockTime =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.blockTime ??\n DEFAULT_BLOCK_TIME;\n\n return { blockTime, countMax, intervalMs };\n}\n\n/**\n * Retrieves the gas fee randomisation parameters.\n *\n * @param messenger - The controller messenger instance.\n * @returns The gas fee randomisation parameters.\n */\nexport function getGasFeeRandomisation(\n messenger: TransactionControllerMessenger,\n): {\n randomisedGasFeeDigits: Record<Hex, number>;\n preservedNumberOfDigits: number | undefined;\n} {\n const featureFlags = getFeatureFlags(messenger);\n\n const gasFeeRandomisation =\n featureFlags?.[FeatureFlag.Transactions]?.gasFeeRandomisation ?? {};\n\n return {\n randomisedGasFeeDigits: gasFeeRandomisation.randomisedGasFeeDigits ?? {},\n preservedNumberOfDigits: gasFeeRandomisation.preservedNumberOfDigits,\n };\n}\n\n/**\n * Retrieves the gas estimate fallback for a given chain ID.\n * Defaults to the default gas estimate fallback if not set.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The gas estimate fallback.\n */\nexport function getGasEstimateFallback(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): {\n fixed?: number;\n percentage: number;\n} {\n const featureFlags = getFeatureFlags(messenger);\n\n const gasEstimateFallbackFlags =\n featureFlags?.[FeatureFlag.Transactions]?.gasEstimateFallback;\n\n const chainFlags = gasEstimateFallbackFlags?.perChainConfig?.[chainId];\n\n const percentage =\n chainFlags?.percentage ??\n gasEstimateFallbackFlags?.default?.percentage ??\n DEFAULT_GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT;\n\n const fixed = chainFlags?.fixed ?? gasEstimateFallbackFlags?.default?.fixed;\n\n return { fixed, percentage };\n}\n\n/**\n * Retrieves the gas buffers for a given chain ID.\n *\n * @param request - The request object.\n * @param request.chainId - The chain ID.\n * @param request.isCustomRPC - Whether the network RPC is added by the user.\n * @param request.isUpgradeWithDataToSelf - Whether the transaction is an EIP-7702 upgrade with data to self.\n * @param request.messenger - The controller messenger instance.\n * @returns The gas buffers.\n */\nexport function getGasEstimateBuffer({\n chainId,\n isCustomRPC,\n isUpgradeWithDataToSelf,\n messenger,\n}: {\n chainId: Hex;\n isCustomRPC: boolean;\n isUpgradeWithDataToSelf: boolean;\n messenger: TransactionControllerMessenger;\n}): number {\n const featureFlags = getFeatureFlags(messenger);\n const gasBufferFlags = featureFlags?.[FeatureFlag.GasBuffer];\n const chainFlags = gasBufferFlags?.perChainConfig?.[chainId];\n const chainIncludedRPCBuffer = isCustomRPC ? undefined : chainFlags?.included;\n\n const defaultIncludedRPCBuffer = isCustomRPC\n ? undefined\n : gasBufferFlags?.included;\n\n const upgradeBuffer = isUpgradeWithDataToSelf\n ? chainFlags?.eip7702\n : undefined;\n\n return (\n upgradeBuffer ??\n chainIncludedRPCBuffer ??\n chainFlags?.base ??\n defaultIncludedRPCBuffer ??\n gasBufferFlags?.default ??\n DEFAULT_GAS_ESTIMATE_BUFFER\n );\n}\n\n/**\n * Retrieves the incoming transactions polling interval.\n * Defaults to 4 minutes if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The incoming transactions polling interval in milliseconds.\n */\nexport function getIncomingTransactionsPollingInterval(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n\n return (\n featureFlags?.[FeatureFlag.IncomingTransactions]?.pollingIntervalMs ??\n DEFAULT_INCOMING_TRANSACTIONS_POLLING_INTERVAL_MS\n );\n}\n\n/**\n * Retrieves the number of attempts to wait before automatically marking a transaction as dropped\n * if it has no receipt status.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The threshold number of attempts, or undefined if the feature is disabled.\n */\nexport function getTimeoutAttempts(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): number | undefined {\n const featureFlags = getFeatureFlags(messenger);\n\n const timeoutAttemptsFlags =\n featureFlags?.[FeatureFlag.Transactions]?.timeoutAttempts;\n\n return (\n timeoutAttemptsFlags?.perChainConfig?.[chainId] ??\n timeoutAttemptsFlags?.default\n );\n}\n\n/**\n * Checks if WebSocket-based transaction updates are enabled.\n * When enabled, incoming transactions are fetched via event-driven updates\n * instead of polling.\n *\n * @param messenger - The controller messenger instance.\n * @returns True if WebSocket updates are enabled, false otherwise.\n */\nexport function isIncomingTransactionsUseBackendWebSocketServiceEnabled(\n messenger: TransactionControllerMessenger,\n): boolean {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.IncomingTransactions]\n ?.useBackendWebSocketService ?? false\n );\n}\n\n/**\n * Retrieves the relevant feature flags from the remote feature flag controller.\n *\n * @param messenger - The messenger instance.\n * @returns The feature flags.\n */\nfunction getFeatureFlags(\n messenger: TransactionControllerMessenger,\n): TransactionControllerFeatureFlags {\n const featureFlags = messenger.call(\n 'RemoteFeatureFlagController:getState',\n ).remoteFeatureFlags;\n\n log('Retrieved feature flags', featureFlags);\n\n return featureFlags as TransactionControllerFeatureFlags;\n}\n"]}
|
|
@@ -75,7 +75,7 @@ export type TransactionControllerFeatureFlags = {
|
|
|
75
75
|
/** Interval between requests to accounts API to retrieve incoming transactions. */
|
|
76
76
|
pollingIntervalMs?: number;
|
|
77
77
|
/** Whether to use WebSocket for event-driven transaction updates instead of polling. */
|
|
78
|
-
|
|
78
|
+
useBackendWebSocketService?: boolean;
|
|
79
79
|
};
|
|
80
80
|
/** Miscellaneous feature flags to support the transaction controller. */
|
|
81
81
|
[FeatureFlag.Transactions]?: {
|
|
@@ -270,6 +270,6 @@ export declare function getTimeoutAttempts(chainId: Hex, messenger: TransactionC
|
|
|
270
270
|
* @param messenger - The controller messenger instance.
|
|
271
271
|
* @returns True if WebSocket updates are enabled, false otherwise.
|
|
272
272
|
*/
|
|
273
|
-
export declare function
|
|
273
|
+
export declare function isIncomingTransactionsUseBackendWebSocketServiceEnabled(messenger: TransactionControllerMessenger): boolean;
|
|
274
274
|
export {};
|
|
275
275
|
//# sourceMappingURL=feature-flags.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-flags.d.cts","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAY/E;;GAEG;AACH,oBAAY,WAAW;IACrB,OAAO,2BAA2B;IAClC,SAAS,6BAA6B;IACtC,oBAAoB,wCAAwC;IAC5D,YAAY,+BAA+B;CAC5C;AAED,KAAK,mBAAmB,GAAG;IACzB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,+DAA+D;IAC/D,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE;QACtB;;;;WAIG;QACH,SAAS,CAAC,EAAE,MAAM,CAChB,GAAG,EACH;YACE,qCAAqC;YACrC,OAAO,EAAE,GAAG,CAAC;YAEb,qDAAqD;YACrD,SAAS,EAAE,GAAG,CAAC;SAChB,EAAE,CACJ,CAAC;QAEF,sDAAsD;QACtD,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC;KACzB,CAAC;IAEF;;;OAGG;IACH,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE;QACxB,uDAAuD;QACvD,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;;WAGG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAElB,mCAAmC;QACnC,cAAc,CAAC,EAAE;YACf,CAAC,OAAO,EAAE,GAAG,GAAG;gBACd;;;mBAGG;gBACH,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEd;;;mBAGG;gBACH,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAElB;;;;mBAIG;gBACH,OAAO,CAAC,EAAE,MAAM,CAAC;aAClB,CAAC;SACH,CAAC;KACH,CAAC;IAEF,0CAA0C;IAC1C,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,EAAE;QACnC,mFAAmF;QACnF,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAE3B,wFAAwF;QACxF,
|
|
1
|
+
{"version":3,"file":"feature-flags.d.cts","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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"}
|
|
@@ -75,7 +75,7 @@ export type TransactionControllerFeatureFlags = {
|
|
|
75
75
|
/** Interval between requests to accounts API to retrieve incoming transactions. */
|
|
76
76
|
pollingIntervalMs?: number;
|
|
77
77
|
/** Whether to use WebSocket for event-driven transaction updates instead of polling. */
|
|
78
|
-
|
|
78
|
+
useBackendWebSocketService?: boolean;
|
|
79
79
|
};
|
|
80
80
|
/** Miscellaneous feature flags to support the transaction controller. */
|
|
81
81
|
[FeatureFlag.Transactions]?: {
|
|
@@ -270,6 +270,6 @@ export declare function getTimeoutAttempts(chainId: Hex, messenger: TransactionC
|
|
|
270
270
|
* @param messenger - The controller messenger instance.
|
|
271
271
|
* @returns True if WebSocket updates are enabled, false otherwise.
|
|
272
272
|
*/
|
|
273
|
-
export declare function
|
|
273
|
+
export declare function isIncomingTransactionsUseBackendWebSocketServiceEnabled(messenger: TransactionControllerMessenger): boolean;
|
|
274
274
|
export {};
|
|
275
275
|
//# sourceMappingURL=feature-flags.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-flags.d.mts","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAK3C,OAAO,KAAK,EAAE,8BAA8B,EAAE,qCAAiC;AAY/E;;GAEG;AACH,oBAAY,WAAW;IACrB,OAAO,2BAA2B;IAClC,SAAS,6BAA6B;IACtC,oBAAoB,wCAAwC;IAC5D,YAAY,+BAA+B;CAC5C;AAED,KAAK,mBAAmB,GAAG;IACzB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,+DAA+D;IAC/D,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE;QACtB;;;;WAIG;QACH,SAAS,CAAC,EAAE,MAAM,CAChB,GAAG,EACH;YACE,qCAAqC;YACrC,OAAO,EAAE,GAAG,CAAC;YAEb,qDAAqD;YACrD,SAAS,EAAE,GAAG,CAAC;SAChB,EAAE,CACJ,CAAC;QAEF,sDAAsD;QACtD,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC;KACzB,CAAC;IAEF;;;OAGG;IACH,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE;QACxB,uDAAuD;QACvD,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;;WAGG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAElB,mCAAmC;QACnC,cAAc,CAAC,EAAE;YACf,CAAC,OAAO,EAAE,GAAG,GAAG;gBACd;;;mBAGG;gBACH,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEd;;;mBAGG;gBACH,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAElB;;;;mBAIG;gBACH,OAAO,CAAC,EAAE,MAAM,CAAC;aAClB,CAAC;SACH,CAAC;KACH,CAAC;IAEF,0CAA0C;IAC1C,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,EAAE;QACnC,mFAAmF;QACnF,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAE3B,wFAAwF;QACxF,
|
|
1
|
+
{"version":3,"file":"feature-flags.d.mts","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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"}
|
|
@@ -208,9 +208,10 @@ export function getTimeoutAttempts(chainId, messenger) {
|
|
|
208
208
|
* @param messenger - The controller messenger instance.
|
|
209
209
|
* @returns True if WebSocket updates are enabled, false otherwise.
|
|
210
210
|
*/
|
|
211
|
-
export function
|
|
211
|
+
export function isIncomingTransactionsUseBackendWebSocketServiceEnabled(messenger) {
|
|
212
212
|
const featureFlags = getFeatureFlags(messenger);
|
|
213
|
-
return (featureFlags?.[FeatureFlag.IncomingTransactions]
|
|
213
|
+
return (featureFlags?.[FeatureFlag.IncomingTransactions]
|
|
214
|
+
?.useBackendWebSocketService ?? false);
|
|
214
215
|
}
|
|
215
216
|
/**
|
|
216
217
|
* Retrieves the relevant feature flags from the remote feature flag controller.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-flags.mjs","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport { isValidSignature } from './signature';\nimport { padHexToEvenLength } from './utils';\nimport { projectLogger } from '../logger';\nimport type { TransactionControllerMessenger } from '../TransactionController';\n\nconst DEFAULT_BATCH_SIZE_LIMIT = 10;\nconst DEFAULT_ACCELERATED_POLLING_COUNT_MAX = 10;\nconst DEFAULT_ACCELERATED_POLLING_INTERVAL_MS = 3 * 1000;\nconst DEFAULT_BLOCK_TIME = 12 * 1000;\nconst DEFAULT_GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT = 35;\nconst DEFAULT_GAS_ESTIMATE_BUFFER = 1;\nconst DEFAULT_INCOMING_TRANSACTIONS_POLLING_INTERVAL_MS = 1000 * 60 * 4; // 4 Minutes\nconst DEFAULT_SUBMIT_HISTORY_LIMIT = 100;\nconst DEFAULT_TRANSACTION_HISTORY_LIMIT = 40;\n\n/**\n * Feature flags supporting the transaction controller.\n */\nexport enum FeatureFlag {\n EIP7702 = 'confirmations_eip_7702',\n GasBuffer = 'confirmations_gas_buffer',\n IncomingTransactions = 'confirmations_incoming_transactions',\n Transactions = 'confirmations_transactions',\n}\n\ntype GasEstimateFallback = {\n /**\n * The fixed gas estimate fallback for a transaction.\n */\n fixed?: number;\n\n /**\n * The percentage multiplier gas estimate fallback for a transaction.\n */\n percentage?: number;\n};\n\nexport type TransactionControllerFeatureFlags = {\n /** Feature flags to support EIP-7702 / type-4 transactions. */\n [FeatureFlag.EIP7702]?: {\n /**\n * All contracts that support EIP-7702 batch transactions.\n * Keyed by chain ID.\n * First entry in each array is the contract that standard EOAs will be upgraded to.\n */\n contracts?: Record<\n Hex,\n {\n /** Address of the smart contract. */\n address: Hex;\n\n /** Signature to verify the contract is authentic. */\n signature: Hex;\n }[]\n >;\n\n /** Chains enabled for EIP-7702 batch transactions. */\n supportedChains?: Hex[];\n };\n\n /**\n * Buffers added to gas limit estimations.\n * Values are multipliers such as `1.5` meaning 150% of the original gas limit.\n */\n [FeatureFlag.GasBuffer]?: {\n /** Fallback buffer for all chains and transactions. */\n default?: number;\n\n /**\n * Buffer for included network RPCs only and not those added by user.\n * Takes priority over `default`.\n */\n included?: number;\n\n /** Buffers for specific chains. */\n perChainConfig?: {\n [chainId: Hex]: {\n /**\n * Buffer for the chain for all transactions.\n * Takes priority over non-chain `included`.\n */\n base?: number;\n\n /**\n * Buffer if network RPC is included and not added by user.\n * Takes priority over `base`.\n */\n included?: number;\n\n /**\n * Buffer for the chain for EIP-7702 / type 4 transactions only.\n * Only if `data` included and `to` matches `from`.\n * Takes priority over `included` and `base`.\n */\n eip7702?: number;\n };\n };\n };\n\n /** Incoming transaction configuration. */\n [FeatureFlag.IncomingTransactions]?: {\n /** Interval between requests to accounts API to retrieve incoming transactions. */\n pollingIntervalMs?: number;\n\n /** Whether to use WebSocket for event-driven transaction updates instead of polling. */\n useWebsockets?: boolean;\n };\n\n /** Miscellaneous feature flags to support the transaction controller. */\n [FeatureFlag.Transactions]?: {\n /** Maximum number of transactions that can be in an external batch. */\n batchSizeLimit?: number;\n\n /** Maximum number of entries in the submit history. */\n submitHistoryLimit?: number;\n\n /** Maximum number of transactions stored in state. */\n transactionHistoryLimit?: number;\n\n /**\n * Accelerated polling is used to speed up the polling process for\n * transactions that are not yet confirmed.\n */\n acceleratedPolling?: {\n /** Accelerated polling parameters on a per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: {\n /**\n * Block time in milliseconds.\n */\n blockTime?: number;\n\n /**\n * Maximum number of polling requests that can be made in a row, before\n * the normal polling resumes.\n */\n countMax?: number;\n\n /** Interval between polling requests in milliseconds. */\n intervalMs?: number;\n };\n };\n\n /** Default `countMax` in case no chain-specific parameter is set. */\n defaultCountMax?: number;\n\n /** Default `intervalMs` in case no chain-specific parameter is set. */\n defaultIntervalMs?: number;\n };\n\n gasFeeRandomisation?: {\n /** Randomised gas fee digits per chainId. */\n randomisedGasFeeDigits?: Record<Hex, number>;\n\n /** Number of digits to preserve for randomised gas fee digits. */\n preservedNumberOfDigits?: number;\n };\n\n /** Gas estimate fallback is used as a fallback in case of failure to obtain the gas estimate values. */\n gasEstimateFallback?: {\n /** Gas estimate fallback per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: GasEstimateFallback;\n };\n\n /**\n * Default gas estimate fallback.\n * This value is used when no specific gas estimate fallback is found for a chain ID.\n */\n default?: GasEstimateFallback;\n };\n\n /**\n * Number of attempts to wait before automatically marking a transaction as failed\n * if it has no receipt status and hash is not found on the network.\n */\n timeoutAttempts?: {\n /** Automatic fail threshold on a per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: number;\n };\n\n /**\n * Default automatic fail threshold.\n * This value is used when no specific threshold is found for a chain ID.\n */\n default?: number;\n };\n };\n};\n\nconst log = createModuleLogger(projectLogger, 'feature-flags');\n\n/**\n * Retrieves the supported EIP-7702 chains.\n *\n * @param messenger - The controller messenger instance.\n * @returns The supported chains.\n */\nexport function getEIP7702SupportedChains(\n messenger: TransactionControllerMessenger,\n): Hex[] {\n const featureFlags = getFeatureFlags(messenger);\n return featureFlags?.[FeatureFlag.EIP7702]?.supportedChains ?? [];\n}\n\n/**\n * Retrieves the supported EIP-7702 contract addresses for a given chain ID.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @param publicKey - The public key used to validate the contract authenticity.\n * @returns The supported contract addresses.\n */\nexport function getEIP7702ContractAddresses(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n publicKey: Hex,\n): Hex[] {\n const featureFlags = getFeatureFlags(messenger);\n\n const contracts =\n featureFlags?.[FeatureFlag.EIP7702]?.contracts?.[\n chainId.toLowerCase() as Hex\n ] ?? [];\n\n return contracts\n .filter((contract) =>\n isValidSignature(\n [contract.address, padHexToEvenLength(chainId) as Hex],\n contract.signature,\n publicKey,\n ),\n )\n .map((contract) => contract.address);\n}\n\n/**\n * Retrieves the EIP-7702 upgrade contract address.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @param publicKey - The public key used to validate the contract authenticity.\n * @returns The upgrade contract address.\n */\nexport function getEIP7702UpgradeContractAddress(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n publicKey: Hex,\n): Hex | undefined {\n return getEIP7702ContractAddresses(chainId, messenger, publicKey)?.[0];\n}\n\n/**\n * Retrieves the batch size limit.\n * Defaults to 10 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The batch size limit.\n */\nexport function getBatchSizeLimit(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.Transactions]?.batchSizeLimit ??\n DEFAULT_BATCH_SIZE_LIMIT\n );\n}\n\n/**\n * Retrieves the submit history limit.\n * Defaults to 100 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The submit history limit.\n */\nexport function getSubmitHistoryLimit(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.Transactions]?.submitHistoryLimit ??\n DEFAULT_SUBMIT_HISTORY_LIMIT\n );\n}\n\n/**\n * Retrieves the transaction history limit.\n * Defaults to 40 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The transaction history limit.\n */\nexport function getTransactionHistoryLimit(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.Transactions]?.transactionHistoryLimit ??\n DEFAULT_TRANSACTION_HISTORY_LIMIT\n );\n}\n\n/**\n * Retrieves the accelerated polling parameters for a given chain ID.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The accelerated polling parameters: `countMax` and `intervalMs`.\n */\nexport function getAcceleratedPollingParams(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): { blockTime: number; countMax: number; intervalMs: number } {\n const featureFlags = getFeatureFlags(messenger);\n\n const acceleratedPollingParams =\n featureFlags?.[FeatureFlag.Transactions]?.acceleratedPolling;\n\n const countMax =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.countMax ??\n acceleratedPollingParams?.defaultCountMax ??\n DEFAULT_ACCELERATED_POLLING_COUNT_MAX;\n\n const intervalMs =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.intervalMs ??\n acceleratedPollingParams?.defaultIntervalMs ??\n DEFAULT_ACCELERATED_POLLING_INTERVAL_MS;\n\n const blockTime =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.blockTime ??\n DEFAULT_BLOCK_TIME;\n\n return { blockTime, countMax, intervalMs };\n}\n\n/**\n * Retrieves the gas fee randomisation parameters.\n *\n * @param messenger - The controller messenger instance.\n * @returns The gas fee randomisation parameters.\n */\nexport function getGasFeeRandomisation(\n messenger: TransactionControllerMessenger,\n): {\n randomisedGasFeeDigits: Record<Hex, number>;\n preservedNumberOfDigits: number | undefined;\n} {\n const featureFlags = getFeatureFlags(messenger);\n\n const gasFeeRandomisation =\n featureFlags?.[FeatureFlag.Transactions]?.gasFeeRandomisation ?? {};\n\n return {\n randomisedGasFeeDigits: gasFeeRandomisation.randomisedGasFeeDigits ?? {},\n preservedNumberOfDigits: gasFeeRandomisation.preservedNumberOfDigits,\n };\n}\n\n/**\n * Retrieves the gas estimate fallback for a given chain ID.\n * Defaults to the default gas estimate fallback if not set.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The gas estimate fallback.\n */\nexport function getGasEstimateFallback(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): {\n fixed?: number;\n percentage: number;\n} {\n const featureFlags = getFeatureFlags(messenger);\n\n const gasEstimateFallbackFlags =\n featureFlags?.[FeatureFlag.Transactions]?.gasEstimateFallback;\n\n const chainFlags = gasEstimateFallbackFlags?.perChainConfig?.[chainId];\n\n const percentage =\n chainFlags?.percentage ??\n gasEstimateFallbackFlags?.default?.percentage ??\n DEFAULT_GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT;\n\n const fixed = chainFlags?.fixed ?? gasEstimateFallbackFlags?.default?.fixed;\n\n return { fixed, percentage };\n}\n\n/**\n * Retrieves the gas buffers for a given chain ID.\n *\n * @param request - The request object.\n * @param request.chainId - The chain ID.\n * @param request.isCustomRPC - Whether the network RPC is added by the user.\n * @param request.isUpgradeWithDataToSelf - Whether the transaction is an EIP-7702 upgrade with data to self.\n * @param request.messenger - The controller messenger instance.\n * @returns The gas buffers.\n */\nexport function getGasEstimateBuffer({\n chainId,\n isCustomRPC,\n isUpgradeWithDataToSelf,\n messenger,\n}: {\n chainId: Hex;\n isCustomRPC: boolean;\n isUpgradeWithDataToSelf: boolean;\n messenger: TransactionControllerMessenger;\n}): number {\n const featureFlags = getFeatureFlags(messenger);\n const gasBufferFlags = featureFlags?.[FeatureFlag.GasBuffer];\n const chainFlags = gasBufferFlags?.perChainConfig?.[chainId];\n const chainIncludedRPCBuffer = isCustomRPC ? undefined : chainFlags?.included;\n\n const defaultIncludedRPCBuffer = isCustomRPC\n ? undefined\n : gasBufferFlags?.included;\n\n const upgradeBuffer = isUpgradeWithDataToSelf\n ? chainFlags?.eip7702\n : undefined;\n\n return (\n upgradeBuffer ??\n chainIncludedRPCBuffer ??\n chainFlags?.base ??\n defaultIncludedRPCBuffer ??\n gasBufferFlags?.default ??\n DEFAULT_GAS_ESTIMATE_BUFFER\n );\n}\n\n/**\n * Retrieves the incoming transactions polling interval.\n * Defaults to 4 minutes if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The incoming transactions polling interval in milliseconds.\n */\nexport function getIncomingTransactionsPollingInterval(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n\n return (\n featureFlags?.[FeatureFlag.IncomingTransactions]?.pollingIntervalMs ??\n DEFAULT_INCOMING_TRANSACTIONS_POLLING_INTERVAL_MS\n );\n}\n\n/**\n * Retrieves the number of attempts to wait before automatically marking a transaction as dropped\n * if it has no receipt status.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The threshold number of attempts, or undefined if the feature is disabled.\n */\nexport function getTimeoutAttempts(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): number | undefined {\n const featureFlags = getFeatureFlags(messenger);\n\n const timeoutAttemptsFlags =\n featureFlags?.[FeatureFlag.Transactions]?.timeoutAttempts;\n\n return (\n timeoutAttemptsFlags?.perChainConfig?.[chainId] ??\n timeoutAttemptsFlags?.default\n );\n}\n\n/**\n * Checks if WebSocket-based transaction updates are enabled.\n * When enabled, incoming transactions are fetched via event-driven updates\n * instead of polling.\n *\n * @param messenger - The controller messenger instance.\n * @returns True if WebSocket updates are enabled, false otherwise.\n */\nexport function isIncomingTransactionsUseWebsocketsEnabled(\n messenger: TransactionControllerMessenger,\n): boolean {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.IncomingTransactions]?.useWebsockets ?? false\n );\n}\n\n/**\n * Retrieves the relevant feature flags from the remote feature flag controller.\n *\n * @param messenger - The messenger instance.\n * @returns The feature flags.\n */\nfunction getFeatureFlags(\n messenger: TransactionControllerMessenger,\n): TransactionControllerFeatureFlags {\n const featureFlags = messenger.call(\n 'RemoteFeatureFlagController:getState',\n ).remoteFeatureFlags;\n\n log('Retrieved feature flags', featureFlags);\n\n return featureFlags as TransactionControllerFeatureFlags;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"feature-flags.mjs","sourceRoot":"","sources":["../../src/utils/feature-flags.ts"],"names":[],"mappings":"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","sourcesContent":["import { createModuleLogger } from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\n\nimport { isValidSignature } from './signature';\nimport { padHexToEvenLength } from './utils';\nimport { projectLogger } from '../logger';\nimport type { TransactionControllerMessenger } from '../TransactionController';\n\nconst DEFAULT_BATCH_SIZE_LIMIT = 10;\nconst DEFAULT_ACCELERATED_POLLING_COUNT_MAX = 10;\nconst DEFAULT_ACCELERATED_POLLING_INTERVAL_MS = 3 * 1000;\nconst DEFAULT_BLOCK_TIME = 12 * 1000;\nconst DEFAULT_GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT = 35;\nconst DEFAULT_GAS_ESTIMATE_BUFFER = 1;\nconst DEFAULT_INCOMING_TRANSACTIONS_POLLING_INTERVAL_MS = 1000 * 60 * 4; // 4 Minutes\nconst DEFAULT_SUBMIT_HISTORY_LIMIT = 100;\nconst DEFAULT_TRANSACTION_HISTORY_LIMIT = 40;\n\n/**\n * Feature flags supporting the transaction controller.\n */\nexport enum FeatureFlag {\n EIP7702 = 'confirmations_eip_7702',\n GasBuffer = 'confirmations_gas_buffer',\n IncomingTransactions = 'confirmations_incoming_transactions',\n Transactions = 'confirmations_transactions',\n}\n\ntype GasEstimateFallback = {\n /**\n * The fixed gas estimate fallback for a transaction.\n */\n fixed?: number;\n\n /**\n * The percentage multiplier gas estimate fallback for a transaction.\n */\n percentage?: number;\n};\n\nexport type TransactionControllerFeatureFlags = {\n /** Feature flags to support EIP-7702 / type-4 transactions. */\n [FeatureFlag.EIP7702]?: {\n /**\n * All contracts that support EIP-7702 batch transactions.\n * Keyed by chain ID.\n * First entry in each array is the contract that standard EOAs will be upgraded to.\n */\n contracts?: Record<\n Hex,\n {\n /** Address of the smart contract. */\n address: Hex;\n\n /** Signature to verify the contract is authentic. */\n signature: Hex;\n }[]\n >;\n\n /** Chains enabled for EIP-7702 batch transactions. */\n supportedChains?: Hex[];\n };\n\n /**\n * Buffers added to gas limit estimations.\n * Values are multipliers such as `1.5` meaning 150% of the original gas limit.\n */\n [FeatureFlag.GasBuffer]?: {\n /** Fallback buffer for all chains and transactions. */\n default?: number;\n\n /**\n * Buffer for included network RPCs only and not those added by user.\n * Takes priority over `default`.\n */\n included?: number;\n\n /** Buffers for specific chains. */\n perChainConfig?: {\n [chainId: Hex]: {\n /**\n * Buffer for the chain for all transactions.\n * Takes priority over non-chain `included`.\n */\n base?: number;\n\n /**\n * Buffer if network RPC is included and not added by user.\n * Takes priority over `base`.\n */\n included?: number;\n\n /**\n * Buffer for the chain for EIP-7702 / type 4 transactions only.\n * Only if `data` included and `to` matches `from`.\n * Takes priority over `included` and `base`.\n */\n eip7702?: number;\n };\n };\n };\n\n /** Incoming transaction configuration. */\n [FeatureFlag.IncomingTransactions]?: {\n /** Interval between requests to accounts API to retrieve incoming transactions. */\n pollingIntervalMs?: number;\n\n /** Whether to use WebSocket for event-driven transaction updates instead of polling. */\n useBackendWebSocketService?: boolean;\n };\n\n /** Miscellaneous feature flags to support the transaction controller. */\n [FeatureFlag.Transactions]?: {\n /** Maximum number of transactions that can be in an external batch. */\n batchSizeLimit?: number;\n\n /** Maximum number of entries in the submit history. */\n submitHistoryLimit?: number;\n\n /** Maximum number of transactions stored in state. */\n transactionHistoryLimit?: number;\n\n /**\n * Accelerated polling is used to speed up the polling process for\n * transactions that are not yet confirmed.\n */\n acceleratedPolling?: {\n /** Accelerated polling parameters on a per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: {\n /**\n * Block time in milliseconds.\n */\n blockTime?: number;\n\n /**\n * Maximum number of polling requests that can be made in a row, before\n * the normal polling resumes.\n */\n countMax?: number;\n\n /** Interval between polling requests in milliseconds. */\n intervalMs?: number;\n };\n };\n\n /** Default `countMax` in case no chain-specific parameter is set. */\n defaultCountMax?: number;\n\n /** Default `intervalMs` in case no chain-specific parameter is set. */\n defaultIntervalMs?: number;\n };\n\n gasFeeRandomisation?: {\n /** Randomised gas fee digits per chainId. */\n randomisedGasFeeDigits?: Record<Hex, number>;\n\n /** Number of digits to preserve for randomised gas fee digits. */\n preservedNumberOfDigits?: number;\n };\n\n /** Gas estimate fallback is used as a fallback in case of failure to obtain the gas estimate values. */\n gasEstimateFallback?: {\n /** Gas estimate fallback per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: GasEstimateFallback;\n };\n\n /**\n * Default gas estimate fallback.\n * This value is used when no specific gas estimate fallback is found for a chain ID.\n */\n default?: GasEstimateFallback;\n };\n\n /**\n * Number of attempts to wait before automatically marking a transaction as failed\n * if it has no receipt status and hash is not found on the network.\n */\n timeoutAttempts?: {\n /** Automatic fail threshold on a per-chain basis. */\n perChainConfig?: {\n [chainId: Hex]: number;\n };\n\n /**\n * Default automatic fail threshold.\n * This value is used when no specific threshold is found for a chain ID.\n */\n default?: number;\n };\n };\n};\n\nconst log = createModuleLogger(projectLogger, 'feature-flags');\n\n/**\n * Retrieves the supported EIP-7702 chains.\n *\n * @param messenger - The controller messenger instance.\n * @returns The supported chains.\n */\nexport function getEIP7702SupportedChains(\n messenger: TransactionControllerMessenger,\n): Hex[] {\n const featureFlags = getFeatureFlags(messenger);\n return featureFlags?.[FeatureFlag.EIP7702]?.supportedChains ?? [];\n}\n\n/**\n * Retrieves the supported EIP-7702 contract addresses for a given chain ID.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @param publicKey - The public key used to validate the contract authenticity.\n * @returns The supported contract addresses.\n */\nexport function getEIP7702ContractAddresses(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n publicKey: Hex,\n): Hex[] {\n const featureFlags = getFeatureFlags(messenger);\n\n const contracts =\n featureFlags?.[FeatureFlag.EIP7702]?.contracts?.[\n chainId.toLowerCase() as Hex\n ] ?? [];\n\n return contracts\n .filter((contract) =>\n isValidSignature(\n [contract.address, padHexToEvenLength(chainId) as Hex],\n contract.signature,\n publicKey,\n ),\n )\n .map((contract) => contract.address);\n}\n\n/**\n * Retrieves the EIP-7702 upgrade contract address.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @param publicKey - The public key used to validate the contract authenticity.\n * @returns The upgrade contract address.\n */\nexport function getEIP7702UpgradeContractAddress(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n publicKey: Hex,\n): Hex | undefined {\n return getEIP7702ContractAddresses(chainId, messenger, publicKey)?.[0];\n}\n\n/**\n * Retrieves the batch size limit.\n * Defaults to 10 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The batch size limit.\n */\nexport function getBatchSizeLimit(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.Transactions]?.batchSizeLimit ??\n DEFAULT_BATCH_SIZE_LIMIT\n );\n}\n\n/**\n * Retrieves the submit history limit.\n * Defaults to 100 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The submit history limit.\n */\nexport function getSubmitHistoryLimit(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.Transactions]?.submitHistoryLimit ??\n DEFAULT_SUBMIT_HISTORY_LIMIT\n );\n}\n\n/**\n * Retrieves the transaction history limit.\n * Defaults to 40 if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The transaction history limit.\n */\nexport function getTransactionHistoryLimit(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.Transactions]?.transactionHistoryLimit ??\n DEFAULT_TRANSACTION_HISTORY_LIMIT\n );\n}\n\n/**\n * Retrieves the accelerated polling parameters for a given chain ID.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The accelerated polling parameters: `countMax` and `intervalMs`.\n */\nexport function getAcceleratedPollingParams(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): { blockTime: number; countMax: number; intervalMs: number } {\n const featureFlags = getFeatureFlags(messenger);\n\n const acceleratedPollingParams =\n featureFlags?.[FeatureFlag.Transactions]?.acceleratedPolling;\n\n const countMax =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.countMax ??\n acceleratedPollingParams?.defaultCountMax ??\n DEFAULT_ACCELERATED_POLLING_COUNT_MAX;\n\n const intervalMs =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.intervalMs ??\n acceleratedPollingParams?.defaultIntervalMs ??\n DEFAULT_ACCELERATED_POLLING_INTERVAL_MS;\n\n const blockTime =\n acceleratedPollingParams?.perChainConfig?.[chainId]?.blockTime ??\n DEFAULT_BLOCK_TIME;\n\n return { blockTime, countMax, intervalMs };\n}\n\n/**\n * Retrieves the gas fee randomisation parameters.\n *\n * @param messenger - The controller messenger instance.\n * @returns The gas fee randomisation parameters.\n */\nexport function getGasFeeRandomisation(\n messenger: TransactionControllerMessenger,\n): {\n randomisedGasFeeDigits: Record<Hex, number>;\n preservedNumberOfDigits: number | undefined;\n} {\n const featureFlags = getFeatureFlags(messenger);\n\n const gasFeeRandomisation =\n featureFlags?.[FeatureFlag.Transactions]?.gasFeeRandomisation ?? {};\n\n return {\n randomisedGasFeeDigits: gasFeeRandomisation.randomisedGasFeeDigits ?? {},\n preservedNumberOfDigits: gasFeeRandomisation.preservedNumberOfDigits,\n };\n}\n\n/**\n * Retrieves the gas estimate fallback for a given chain ID.\n * Defaults to the default gas estimate fallback if not set.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The gas estimate fallback.\n */\nexport function getGasEstimateFallback(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): {\n fixed?: number;\n percentage: number;\n} {\n const featureFlags = getFeatureFlags(messenger);\n\n const gasEstimateFallbackFlags =\n featureFlags?.[FeatureFlag.Transactions]?.gasEstimateFallback;\n\n const chainFlags = gasEstimateFallbackFlags?.perChainConfig?.[chainId];\n\n const percentage =\n chainFlags?.percentage ??\n gasEstimateFallbackFlags?.default?.percentage ??\n DEFAULT_GAS_ESTIMATE_FALLBACK_BLOCK_PERCENT;\n\n const fixed = chainFlags?.fixed ?? gasEstimateFallbackFlags?.default?.fixed;\n\n return { fixed, percentage };\n}\n\n/**\n * Retrieves the gas buffers for a given chain ID.\n *\n * @param request - The request object.\n * @param request.chainId - The chain ID.\n * @param request.isCustomRPC - Whether the network RPC is added by the user.\n * @param request.isUpgradeWithDataToSelf - Whether the transaction is an EIP-7702 upgrade with data to self.\n * @param request.messenger - The controller messenger instance.\n * @returns The gas buffers.\n */\nexport function getGasEstimateBuffer({\n chainId,\n isCustomRPC,\n isUpgradeWithDataToSelf,\n messenger,\n}: {\n chainId: Hex;\n isCustomRPC: boolean;\n isUpgradeWithDataToSelf: boolean;\n messenger: TransactionControllerMessenger;\n}): number {\n const featureFlags = getFeatureFlags(messenger);\n const gasBufferFlags = featureFlags?.[FeatureFlag.GasBuffer];\n const chainFlags = gasBufferFlags?.perChainConfig?.[chainId];\n const chainIncludedRPCBuffer = isCustomRPC ? undefined : chainFlags?.included;\n\n const defaultIncludedRPCBuffer = isCustomRPC\n ? undefined\n : gasBufferFlags?.included;\n\n const upgradeBuffer = isUpgradeWithDataToSelf\n ? chainFlags?.eip7702\n : undefined;\n\n return (\n upgradeBuffer ??\n chainIncludedRPCBuffer ??\n chainFlags?.base ??\n defaultIncludedRPCBuffer ??\n gasBufferFlags?.default ??\n DEFAULT_GAS_ESTIMATE_BUFFER\n );\n}\n\n/**\n * Retrieves the incoming transactions polling interval.\n * Defaults to 4 minutes if not set.\n *\n * @param messenger - The controller messenger instance.\n * @returns The incoming transactions polling interval in milliseconds.\n */\nexport function getIncomingTransactionsPollingInterval(\n messenger: TransactionControllerMessenger,\n): number {\n const featureFlags = getFeatureFlags(messenger);\n\n return (\n featureFlags?.[FeatureFlag.IncomingTransactions]?.pollingIntervalMs ??\n DEFAULT_INCOMING_TRANSACTIONS_POLLING_INTERVAL_MS\n );\n}\n\n/**\n * Retrieves the number of attempts to wait before automatically marking a transaction as dropped\n * if it has no receipt status.\n *\n * @param chainId - The chain ID.\n * @param messenger - The controller messenger instance.\n * @returns The threshold number of attempts, or undefined if the feature is disabled.\n */\nexport function getTimeoutAttempts(\n chainId: Hex,\n messenger: TransactionControllerMessenger,\n): number | undefined {\n const featureFlags = getFeatureFlags(messenger);\n\n const timeoutAttemptsFlags =\n featureFlags?.[FeatureFlag.Transactions]?.timeoutAttempts;\n\n return (\n timeoutAttemptsFlags?.perChainConfig?.[chainId] ??\n timeoutAttemptsFlags?.default\n );\n}\n\n/**\n * Checks if WebSocket-based transaction updates are enabled.\n * When enabled, incoming transactions are fetched via event-driven updates\n * instead of polling.\n *\n * @param messenger - The controller messenger instance.\n * @returns True if WebSocket updates are enabled, false otherwise.\n */\nexport function isIncomingTransactionsUseBackendWebSocketServiceEnabled(\n messenger: TransactionControllerMessenger,\n): boolean {\n const featureFlags = getFeatureFlags(messenger);\n return (\n featureFlags?.[FeatureFlag.IncomingTransactions]\n ?.useBackendWebSocketService ?? false\n );\n}\n\n/**\n * Retrieves the relevant feature flags from the remote feature flag controller.\n *\n * @param messenger - The messenger instance.\n * @returns The feature flags.\n */\nfunction getFeatureFlags(\n messenger: TransactionControllerMessenger,\n): TransactionControllerFeatureFlags {\n const featureFlags = messenger.call(\n 'RemoteFeatureFlagController:getState',\n ).remoteFeatureFlags;\n\n log('Retrieved feature flags', featureFlags);\n\n return featureFlags as TransactionControllerFeatureFlags;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask/transaction-controller",
|
|
3
|
-
"version": "62.
|
|
3
|
+
"version": "62.19.0",
|
|
4
4
|
"description": "Stores transactions alongside their periodically updated statuses and manages interactions such as approval and cancellation",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|
|
@@ -40,7 +40,6 @@
|
|
|
40
40
|
"build:docs": "typedoc",
|
|
41
41
|
"changelog:update": "../../scripts/update-changelog.sh @metamask/transaction-controller",
|
|
42
42
|
"changelog:validate": "../../scripts/validate-changelog.sh @metamask/transaction-controller",
|
|
43
|
-
"publish:preview": "yarn npm publish --tag preview",
|
|
44
43
|
"since-latest-release": "../../scripts/since-latest-release.sh",
|
|
45
44
|
"test": "NODE_OPTIONS=--experimental-vm-modules jest --reporters=jest-silent-reporter",
|
|
46
45
|
"test:clean": "NODE_OPTIONS=--experimental-vm-modules jest --clearCache",
|