@metamask-previews/transaction-controller 66.0.1-preview-e37aff3 → 66.0.1-preview-c5f8cd0af
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 +23 -0
- package/dist/TransactionController-method-action-types.cjs.map +1 -1
- package/dist/TransactionController-method-action-types.d.cts +1 -25
- package/dist/TransactionController-method-action-types.d.cts.map +1 -1
- package/dist/TransactionController-method-action-types.d.mts +1 -25
- package/dist/TransactionController-method-action-types.d.mts.map +1 -1
- package/dist/TransactionController-method-action-types.mjs.map +1 -1
- package/dist/TransactionController.cjs +32 -191
- package/dist/TransactionController.cjs.map +1 -1
- package/dist/TransactionController.d.cts +12 -89
- package/dist/TransactionController.d.cts.map +1 -1
- package/dist/TransactionController.d.mts +12 -89
- package/dist/TransactionController.d.mts.map +1 -1
- package/dist/TransactionController.mjs +32 -191
- package/dist/TransactionController.mjs.map +1 -1
- package/dist/api/accounts-api.cjs +1 -42
- package/dist/api/accounts-api.cjs.map +1 -1
- package/dist/api/accounts-api.d.cts +0 -51
- package/dist/api/accounts-api.d.cts.map +1 -1
- package/dist/api/accounts-api.d.mts +0 -51
- package/dist/api/accounts-api.d.mts.map +1 -1
- package/dist/api/accounts-api.mjs +0 -40
- package/dist/api/accounts-api.mjs.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.cjs +27 -7
- package/dist/helpers/MultichainTrackingHelper.cjs.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.d.cts +0 -1
- package/dist/helpers/MultichainTrackingHelper.d.cts.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.d.mts +0 -1
- package/dist/helpers/MultichainTrackingHelper.d.mts.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.mjs +27 -7
- package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -1
- package/dist/helpers/PendingTransactionTracker.cjs +4 -82
- package/dist/helpers/PendingTransactionTracker.cjs.map +1 -1
- package/dist/helpers/PendingTransactionTracker.d.cts +1 -3
- package/dist/helpers/PendingTransactionTracker.d.cts.map +1 -1
- package/dist/helpers/PendingTransactionTracker.d.mts +1 -3
- package/dist/helpers/PendingTransactionTracker.d.mts.map +1 -1
- package/dist/helpers/PendingTransactionTracker.mjs +5 -83
- package/dist/helpers/PendingTransactionTracker.mjs.map +1 -1
- package/dist/index.cjs +1 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +0 -1
- package/dist/index.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +0 -15
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +0 -15
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/feature-flags.cjs +14 -33
- package/dist/utils/feature-flags.cjs.map +1 -1
- package/dist/utils/feature-flags.d.cts +1 -25
- package/dist/utils/feature-flags.d.cts.map +1 -1
- package/dist/utils/feature-flags.d.mts +1 -25
- package/dist/utils/feature-flags.d.mts.map +1 -1
- package/dist/utils/feature-flags.mjs +13 -30
- package/dist/utils/feature-flags.mjs.map +1 -1
- package/dist/utils/prepare.cjs +8 -4
- package/dist/utils/prepare.cjs.map +1 -1
- package/dist/utils/prepare.d.cts +5 -4
- package/dist/utils/prepare.d.cts.map +1 -1
- package/dist/utils/prepare.d.mts +5 -4
- package/dist/utils/prepare.d.mts.map +1 -1
- package/dist/utils/prepare.mjs +8 -4
- package/dist/utils/prepare.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.cjs +0 -159
- package/dist/helpers/AccountsApiRemoteTransactionSource.cjs.map +0 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts +0 -12
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts.map +0 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts +0 -12
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts.map +0 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.mjs +0 -159
- package/dist/helpers/AccountsApiRemoteTransactionSource.mjs.map +0 -1
- package/dist/helpers/IncomingTransactionHelper.cjs +0 -306
- package/dist/helpers/IncomingTransactionHelper.cjs.map +0 -1
- package/dist/helpers/IncomingTransactionHelper.d.cts +0 -45
- package/dist/helpers/IncomingTransactionHelper.d.cts.map +0 -1
- package/dist/helpers/IncomingTransactionHelper.d.mts +0 -45
- package/dist/helpers/IncomingTransactionHelper.d.mts.map +0 -1
- package/dist/helpers/IncomingTransactionHelper.mjs +0 -299
- package/dist/helpers/IncomingTransactionHelper.mjs.map +0 -1
|
@@ -1,299 +0,0 @@
|
|
|
1
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
-
};
|
|
7
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
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
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
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_isTransactionHistoryRetrievalActive, _IncomingTransactionHelper_updateTransactions, _IncomingTransactionHelper_useBackendWebSocketService, _IncomingTransactionHelper_chainsToPoll, _IncomingTransactionHelper_connectionStateChangedHandler, _IncomingTransactionHelper_transactionUpdatedHandler, _IncomingTransactionHelper_selectedAccountChangedHandler, _IncomingTransactionHelper_statusChangedHandler, _IncomingTransactionHelper_startPolling, _IncomingTransactionHelper_onConnectionStateChanged, _IncomingTransactionHelper_startTransactionHistoryRetrieval, _IncomingTransactionHelper_stopTransactionHistoryRetrieval, _IncomingTransactionHelper_onTransactionUpdated, _IncomingTransactionHelper_onSelectedAccountChanged, _IncomingTransactionHelper_onInterval, _IncomingTransactionHelper_sortTransactionsByTime, _IncomingTransactionHelper_canStart, _IncomingTransactionHelper_getInterval, _IncomingTransactionHelper_getTags, _IncomingTransactionHelper_onNetworkStatusChanged;
|
|
13
|
-
// This package purposefully relies on Node's EventEmitter module.
|
|
14
|
-
// eslint-disable-next-line import-x/no-nodejs-modules
|
|
15
|
-
import EventEmitter from "events";
|
|
16
|
-
import { incomingTransactionsLogger as log } from "../logger.mjs";
|
|
17
|
-
import { getIncomingTransactionsPollingInterval, isIncomingTransactionsUseBackendWebSocketServiceEnabled } from "../utils/feature-flags.mjs";
|
|
18
|
-
import { caip2ToHex } from "../utils/utils.mjs";
|
|
19
|
-
import { SUPPORTED_CHAIN_IDS } from "./AccountsApiRemoteTransactionSource.mjs";
|
|
20
|
-
export var WebSocketState;
|
|
21
|
-
(function (WebSocketState) {
|
|
22
|
-
WebSocketState["CONNECTED"] = "connected";
|
|
23
|
-
WebSocketState["DISCONNECTED"] = "disconnected";
|
|
24
|
-
})(WebSocketState || (WebSocketState = {}));
|
|
25
|
-
const TAG_POLLING = 'automatic-polling';
|
|
26
|
-
export class IncomingTransactionHelper {
|
|
27
|
-
constructor({ client, getCurrentAccount, getLocalTransactions, includeTokenTransfers, isEnabled, messenger, remoteTransactionSource, trimTransactions, updateTransactions, }) {
|
|
28
|
-
_IncomingTransactionHelper_instances.add(this);
|
|
29
|
-
_IncomingTransactionHelper_client.set(this, void 0);
|
|
30
|
-
_IncomingTransactionHelper_getCurrentAccount.set(this, void 0);
|
|
31
|
-
_IncomingTransactionHelper_getLocalTransactions.set(this, void 0);
|
|
32
|
-
_IncomingTransactionHelper_includeTokenTransfers.set(this, void 0);
|
|
33
|
-
_IncomingTransactionHelper_isEnabled.set(this, void 0);
|
|
34
|
-
_IncomingTransactionHelper_isRunning.set(this, void 0);
|
|
35
|
-
_IncomingTransactionHelper_isUpdating.set(this, void 0);
|
|
36
|
-
_IncomingTransactionHelper_messenger.set(this, void 0);
|
|
37
|
-
_IncomingTransactionHelper_remoteTransactionSource.set(this, void 0);
|
|
38
|
-
_IncomingTransactionHelper_timeoutId.set(this, void 0);
|
|
39
|
-
_IncomingTransactionHelper_trimTransactions.set(this, void 0);
|
|
40
|
-
_IncomingTransactionHelper_isTransactionHistoryRetrievalActive.set(this, false);
|
|
41
|
-
_IncomingTransactionHelper_updateTransactions.set(this, void 0);
|
|
42
|
-
_IncomingTransactionHelper_useBackendWebSocketService.set(this, void 0);
|
|
43
|
-
// Chains that need polling (start with all supported, remove as they come up)
|
|
44
|
-
_IncomingTransactionHelper_chainsToPoll.set(this, [...SUPPORTED_CHAIN_IDS]);
|
|
45
|
-
_IncomingTransactionHelper_connectionStateChangedHandler.set(this, (connectionInfo) => {
|
|
46
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onConnectionStateChanged).call(this, connectionInfo);
|
|
47
|
-
});
|
|
48
|
-
_IncomingTransactionHelper_transactionUpdatedHandler.set(this, (transaction) => {
|
|
49
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onTransactionUpdated).call(this, transaction);
|
|
50
|
-
});
|
|
51
|
-
_IncomingTransactionHelper_selectedAccountChangedHandler.set(this, () => {
|
|
52
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onSelectedAccountChanged).call(this);
|
|
53
|
-
});
|
|
54
|
-
_IncomingTransactionHelper_statusChangedHandler.set(this, ({ chainIds, status, }) => {
|
|
55
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onNetworkStatusChanged).call(this, chainIds, status);
|
|
56
|
-
});
|
|
57
|
-
this.hub = new EventEmitter();
|
|
58
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_client, client, "f");
|
|
59
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_getCurrentAccount, getCurrentAccount, "f");
|
|
60
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_getLocalTransactions, getLocalTransactions, "f");
|
|
61
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_includeTokenTransfers, includeTokenTransfers, "f");
|
|
62
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_isEnabled, isEnabled ?? (() => true), "f");
|
|
63
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_isRunning, false, "f");
|
|
64
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_isUpdating, false, "f");
|
|
65
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_messenger, messenger, "f");
|
|
66
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_remoteTransactionSource, remoteTransactionSource, "f");
|
|
67
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_trimTransactions, trimTransactions, "f");
|
|
68
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_updateTransactions, updateTransactions, "f");
|
|
69
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_useBackendWebSocketService, isIncomingTransactionsUseBackendWebSocketServiceEnabled(messenger), "f");
|
|
70
|
-
if (__classPrivateFieldGet(this, _IncomingTransactionHelper_useBackendWebSocketService, "f")) {
|
|
71
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f").subscribe('BackendWebSocketService:connectionStateChanged', __classPrivateFieldGet(this, _IncomingTransactionHelper_connectionStateChangedHandler, "f"));
|
|
72
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f").subscribe('AccountActivityService:statusChanged', __classPrivateFieldGet(this, _IncomingTransactionHelper_statusChangedHandler, "f"));
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
start() {
|
|
76
|
-
// When websockets are disabled, allow normal polling (legacy mode)
|
|
77
|
-
if (__classPrivateFieldGet(this, _IncomingTransactionHelper_useBackendWebSocketService, "f")) {
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_startPolling).call(this, true);
|
|
81
|
-
}
|
|
82
|
-
stop() {
|
|
83
|
-
if (__classPrivateFieldGet(this, _IncomingTransactionHelper_timeoutId, "f")) {
|
|
84
|
-
clearTimeout(__classPrivateFieldGet(this, _IncomingTransactionHelper_timeoutId, "f"));
|
|
85
|
-
}
|
|
86
|
-
if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_isRunning, "f")) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_isRunning, false, "f");
|
|
90
|
-
log('Stopped polling');
|
|
91
|
-
}
|
|
92
|
-
async update({ chainIds, isInterval, tags, } = {}) {
|
|
93
|
-
const finalTags = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getTags).call(this, tags, isInterval);
|
|
94
|
-
log('Checking for incoming transactions', {
|
|
95
|
-
isInterval: Boolean(isInterval),
|
|
96
|
-
tags: finalTags,
|
|
97
|
-
});
|
|
98
|
-
if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_canStart).call(this)) {
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
const account = __classPrivateFieldGet(this, _IncomingTransactionHelper_getCurrentAccount, "f").call(this);
|
|
102
|
-
const includeTokenTransfers = __classPrivateFieldGet(this, _IncomingTransactionHelper_includeTokenTransfers, "f") ?? true;
|
|
103
|
-
const updateTransactions = __classPrivateFieldGet(this, _IncomingTransactionHelper_updateTransactions, "f") ?? false;
|
|
104
|
-
let remoteTransactions = [];
|
|
105
|
-
try {
|
|
106
|
-
remoteTransactions =
|
|
107
|
-
await __classPrivateFieldGet(this, _IncomingTransactionHelper_remoteTransactionSource, "f").fetchTransactions({
|
|
108
|
-
address: account.address,
|
|
109
|
-
chainIds,
|
|
110
|
-
includeTokenTransfers,
|
|
111
|
-
tags: finalTags,
|
|
112
|
-
updateTransactions,
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
catch (error) {
|
|
116
|
-
log('Error while fetching remote transactions', error);
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
if (!remoteTransactions.length) {
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_sortTransactionsByTime).call(this, remoteTransactions);
|
|
123
|
-
log('Found potential transactions', remoteTransactions.length, remoteTransactions);
|
|
124
|
-
const localTransactions = __classPrivateFieldGet(this, _IncomingTransactionHelper_getLocalTransactions, "f").call(this);
|
|
125
|
-
const uniqueTransactions = remoteTransactions.filter((tx) => !localTransactions.some((currentTx) => currentTx.hash?.toLowerCase() === tx.hash?.toLowerCase() &&
|
|
126
|
-
currentTx.txParams.from?.toLowerCase() ===
|
|
127
|
-
tx.txParams.from?.toLowerCase() &&
|
|
128
|
-
currentTx.type === tx.type));
|
|
129
|
-
if (!uniqueTransactions.length) {
|
|
130
|
-
log('All transactions are already known');
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
log('Found unique transactions', uniqueTransactions.length, uniqueTransactions);
|
|
134
|
-
const trimmedTransactions = __classPrivateFieldGet(this, _IncomingTransactionHelper_trimTransactions, "f").call(this, [
|
|
135
|
-
...uniqueTransactions,
|
|
136
|
-
...localTransactions,
|
|
137
|
-
]);
|
|
138
|
-
const uniqueTransactionIds = uniqueTransactions.map((tx) => tx.id);
|
|
139
|
-
const newTransactions = trimmedTransactions.filter((tx) => uniqueTransactionIds.includes(tx.id));
|
|
140
|
-
if (!newTransactions.length) {
|
|
141
|
-
log('All unique transactions truncated due to limit');
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
log('Adding new transactions', newTransactions.length, newTransactions);
|
|
145
|
-
this.hub.emit('transactions', newTransactions);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
_IncomingTransactionHelper_client = new WeakMap(), _IncomingTransactionHelper_getCurrentAccount = new WeakMap(), _IncomingTransactionHelper_getLocalTransactions = new WeakMap(), _IncomingTransactionHelper_includeTokenTransfers = new WeakMap(), _IncomingTransactionHelper_isEnabled = new WeakMap(), _IncomingTransactionHelper_isRunning = new WeakMap(), _IncomingTransactionHelper_isUpdating = new WeakMap(), _IncomingTransactionHelper_messenger = new WeakMap(), _IncomingTransactionHelper_remoteTransactionSource = new WeakMap(), _IncomingTransactionHelper_timeoutId = new WeakMap(), _IncomingTransactionHelper_trimTransactions = new WeakMap(), _IncomingTransactionHelper_isTransactionHistoryRetrievalActive = new WeakMap(), _IncomingTransactionHelper_updateTransactions = new WeakMap(), _IncomingTransactionHelper_useBackendWebSocketService = new WeakMap(), _IncomingTransactionHelper_chainsToPoll = new WeakMap(), _IncomingTransactionHelper_connectionStateChangedHandler = new WeakMap(), _IncomingTransactionHelper_transactionUpdatedHandler = new WeakMap(), _IncomingTransactionHelper_selectedAccountChangedHandler = new WeakMap(), _IncomingTransactionHelper_statusChangedHandler = new WeakMap(), _IncomingTransactionHelper_instances = new WeakSet(), _IncomingTransactionHelper_startPolling = function _IncomingTransactionHelper_startPolling(initialPolling = false) {
|
|
149
|
-
if (__classPrivateFieldGet(this, _IncomingTransactionHelper_isRunning, "f")) {
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_canStart).call(this)) {
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
const interval = __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getInterval).call(this);
|
|
156
|
-
log('Started polling', {
|
|
157
|
-
interval,
|
|
158
|
-
});
|
|
159
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_isRunning, true, "f");
|
|
160
|
-
if (__classPrivateFieldGet(this, _IncomingTransactionHelper_isUpdating, "f")) {
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onInterval).call(this).catch((error) => {
|
|
164
|
-
log(initialPolling ? 'Initial polling failed' : 'Polling failed', error);
|
|
165
|
-
});
|
|
166
|
-
}, _IncomingTransactionHelper_onConnectionStateChanged = function _IncomingTransactionHelper_onConnectionStateChanged(connectionInfo) {
|
|
167
|
-
if (connectionInfo.state === WebSocketState.CONNECTED) {
|
|
168
|
-
log('WebSocket connected, starting enhanced mode');
|
|
169
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_startTransactionHistoryRetrieval).call(this);
|
|
170
|
-
}
|
|
171
|
-
else if (connectionInfo.state === WebSocketState.DISCONNECTED) {
|
|
172
|
-
log('WebSocket disconnected, stopping enhanced mode');
|
|
173
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_stopTransactionHistoryRetrieval).call(this);
|
|
174
|
-
}
|
|
175
|
-
}, _IncomingTransactionHelper_startTransactionHistoryRetrieval = function _IncomingTransactionHelper_startTransactionHistoryRetrieval() {
|
|
176
|
-
if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_canStart).call(this)) {
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
if (__classPrivateFieldGet(this, _IncomingTransactionHelper_isTransactionHistoryRetrievalActive, "f")) {
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
log('Started transaction history retrieval (event-driven)');
|
|
183
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_isTransactionHistoryRetrievalActive, true, "f");
|
|
184
|
-
this.update().catch((error) => {
|
|
185
|
-
log('Initial update in transaction history retrieval failed', error);
|
|
186
|
-
});
|
|
187
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f").subscribe('AccountActivityService:transactionUpdated', __classPrivateFieldGet(this, _IncomingTransactionHelper_transactionUpdatedHandler, "f"));
|
|
188
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f").subscribe('AccountsController:selectedAccountChange', __classPrivateFieldGet(this, _IncomingTransactionHelper_selectedAccountChangedHandler, "f"));
|
|
189
|
-
}, _IncomingTransactionHelper_stopTransactionHistoryRetrieval = function _IncomingTransactionHelper_stopTransactionHistoryRetrieval() {
|
|
190
|
-
if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_isTransactionHistoryRetrievalActive, "f")) {
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
log('Stopped transaction history retrieval');
|
|
194
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_isTransactionHistoryRetrievalActive, false, "f");
|
|
195
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f").unsubscribe('AccountActivityService:transactionUpdated', __classPrivateFieldGet(this, _IncomingTransactionHelper_transactionUpdatedHandler, "f"));
|
|
196
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f").unsubscribe('AccountsController:selectedAccountChange', __classPrivateFieldGet(this, _IncomingTransactionHelper_selectedAccountChangedHandler, "f"));
|
|
197
|
-
}, _IncomingTransactionHelper_onTransactionUpdated = function _IncomingTransactionHelper_onTransactionUpdated(transaction) {
|
|
198
|
-
log('Received relevant transaction update, triggering update', {
|
|
199
|
-
txId: transaction.id,
|
|
200
|
-
chain: transaction.chain,
|
|
201
|
-
});
|
|
202
|
-
this.update().catch((error) => {
|
|
203
|
-
log('Update after transaction event failed', error);
|
|
204
|
-
});
|
|
205
|
-
}, _IncomingTransactionHelper_onSelectedAccountChanged = function _IncomingTransactionHelper_onSelectedAccountChanged() {
|
|
206
|
-
log('Selected account changed, triggering update');
|
|
207
|
-
this.update().catch((error) => {
|
|
208
|
-
log('Update after account change failed', error);
|
|
209
|
-
});
|
|
210
|
-
}, _IncomingTransactionHelper_onInterval = async function _IncomingTransactionHelper_onInterval() {
|
|
211
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_isUpdating, true, "f");
|
|
212
|
-
try {
|
|
213
|
-
// When websockets enabled, only poll chains that are not confirmed up
|
|
214
|
-
const chainIds = __classPrivateFieldGet(this, _IncomingTransactionHelper_useBackendWebSocketService, "f")
|
|
215
|
-
? __classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f")
|
|
216
|
-
: undefined;
|
|
217
|
-
await this.update({ chainIds, isInterval: true });
|
|
218
|
-
}
|
|
219
|
-
catch (error) {
|
|
220
|
-
console.error('Error while checking incoming transactions', error);
|
|
221
|
-
}
|
|
222
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_isUpdating, false, "f");
|
|
223
|
-
if (__classPrivateFieldGet(this, _IncomingTransactionHelper_isRunning, "f")) {
|
|
224
|
-
if (__classPrivateFieldGet(this, _IncomingTransactionHelper_timeoutId, "f")) {
|
|
225
|
-
clearTimeout(__classPrivateFieldGet(this, _IncomingTransactionHelper_timeoutId, "f"));
|
|
226
|
-
}
|
|
227
|
-
__classPrivateFieldSet(this, _IncomingTransactionHelper_timeoutId, setTimeout(
|
|
228
|
-
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
229
|
-
() => __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_onInterval).call(this), __classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_getInterval).call(this)), "f");
|
|
230
|
-
}
|
|
231
|
-
}, _IncomingTransactionHelper_sortTransactionsByTime = function _IncomingTransactionHelper_sortTransactionsByTime(transactions) {
|
|
232
|
-
transactions.sort((a, b) => (a.time < b.time ? -1 : 1));
|
|
233
|
-
}, _IncomingTransactionHelper_canStart = function _IncomingTransactionHelper_canStart() {
|
|
234
|
-
return __classPrivateFieldGet(this, _IncomingTransactionHelper_isEnabled, "f").call(this);
|
|
235
|
-
}, _IncomingTransactionHelper_getInterval = function _IncomingTransactionHelper_getInterval() {
|
|
236
|
-
return getIncomingTransactionsPollingInterval(__classPrivateFieldGet(this, _IncomingTransactionHelper_messenger, "f"));
|
|
237
|
-
}, _IncomingTransactionHelper_getTags = function _IncomingTransactionHelper_getTags(requestTags, isInterval) {
|
|
238
|
-
const tags = [];
|
|
239
|
-
if (__classPrivateFieldGet(this, _IncomingTransactionHelper_client, "f")) {
|
|
240
|
-
tags.push(__classPrivateFieldGet(this, _IncomingTransactionHelper_client, "f"));
|
|
241
|
-
}
|
|
242
|
-
if (requestTags?.length) {
|
|
243
|
-
tags.push(...requestTags);
|
|
244
|
-
}
|
|
245
|
-
else if (isInterval) {
|
|
246
|
-
tags.push(TAG_POLLING);
|
|
247
|
-
}
|
|
248
|
-
return tags?.length ? tags : undefined;
|
|
249
|
-
}, _IncomingTransactionHelper_onNetworkStatusChanged = function _IncomingTransactionHelper_onNetworkStatusChanged(chainIds, status) {
|
|
250
|
-
if (!__classPrivateFieldGet(this, _IncomingTransactionHelper_useBackendWebSocketService, "f")) {
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
let hasChanges = false;
|
|
254
|
-
for (const caip2ChainId of chainIds) {
|
|
255
|
-
const hexChainId = caip2ToHex(caip2ChainId);
|
|
256
|
-
if (!hexChainId || !SUPPORTED_CHAIN_IDS.includes(hexChainId)) {
|
|
257
|
-
log('Chain ID not recognized or not supported', {
|
|
258
|
-
caip2ChainId,
|
|
259
|
-
hexChainId,
|
|
260
|
-
});
|
|
261
|
-
continue;
|
|
262
|
-
}
|
|
263
|
-
if (status === 'up') {
|
|
264
|
-
const index = __classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f").indexOf(hexChainId);
|
|
265
|
-
if (index !== -1) {
|
|
266
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f").splice(index, 1);
|
|
267
|
-
hasChanges = true;
|
|
268
|
-
log('Supported network came up, removed from polling list', {
|
|
269
|
-
chainId: hexChainId,
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
else if (status === 'down' &&
|
|
274
|
-
!__classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f").includes(hexChainId)) {
|
|
275
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f").push(hexChainId);
|
|
276
|
-
hasChanges = true;
|
|
277
|
-
log('Supported network went down, added to polling list', {
|
|
278
|
-
chainId: hexChainId,
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
if (!hasChanges) {
|
|
283
|
-
log('No changes to polling list', {
|
|
284
|
-
chainsToPoll: __classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f"),
|
|
285
|
-
});
|
|
286
|
-
return;
|
|
287
|
-
}
|
|
288
|
-
if (__classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f").length === 0) {
|
|
289
|
-
log('Stopping fallback polling - all networks up');
|
|
290
|
-
this.stop();
|
|
291
|
-
}
|
|
292
|
-
else {
|
|
293
|
-
log('Starting fallback polling - some networks need polling', {
|
|
294
|
-
chainsToPoll: __classPrivateFieldGet(this, _IncomingTransactionHelper_chainsToPoll, "f"),
|
|
295
|
-
});
|
|
296
|
-
__classPrivateFieldGet(this, _IncomingTransactionHelper_instances, "m", _IncomingTransactionHelper_startPolling).call(this);
|
|
297
|
-
}
|
|
298
|
-
};
|
|
299
|
-
//# sourceMappingURL=IncomingTransactionHelper.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
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 type { TransactionControllerMessenger } from '..';\nimport { incomingTransactionsLogger as log } from '../logger';\nimport type { RemoteTransactionSource, TransactionMeta } from '../types';\nimport {\n getIncomingTransactionsPollingInterval,\n isIncomingTransactionsUseBackendWebSocketServiceEnabled,\n} from '../utils/feature-flags';\nimport { caip2ToHex } from '../utils/utils';\nimport { SUPPORTED_CHAIN_IDS } from './AccountsApiRemoteTransactionSource';\n\nexport enum WebSocketState {\n CONNECTED = 'connected',\n DISCONNECTED = 'disconnected',\n}\n\nexport type IncomingTransactionOptions = {\n /** Name of the client to include in requests. */\n client?: string;\n\n /** Whether to retrieve incoming token transfers. Defaults to false. */\n includeTokenTransfers?: boolean;\n\n /** Callback to determine if incoming transaction polling is enabled. */\n isEnabled?: () => boolean;\n\n /** @deprecated No longer used. */\n queryEntireHistory?: boolean;\n\n /** Whether to retrieve outgoing transactions. Defaults to false. */\n updateTransactions?: boolean;\n};\n\nconst TAG_POLLING = 'automatic-polling';\n\nexport class IncomingTransactionHelper {\n hub: EventEmitter;\n\n readonly #client?: string;\n\n readonly #getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n\n readonly #getLocalTransactions: () => TransactionMeta[];\n\n readonly #includeTokenTransfers?: boolean;\n\n readonly #isEnabled: () => boolean;\n\n #isRunning: boolean;\n\n #isUpdating: boolean;\n\n readonly #messenger: TransactionControllerMessenger;\n\n readonly #remoteTransactionSource: RemoteTransactionSource;\n\n #timeoutId?: unknown;\n\n readonly #trimTransactions: (\n transactions: TransactionMeta[],\n ) => TransactionMeta[];\n\n #isTransactionHistoryRetrievalActive = false;\n\n readonly #updateTransactions?: boolean;\n\n readonly #useBackendWebSocketService: boolean;\n\n // Chains that need polling (start with all supported, remove as they come up)\n readonly #chainsToPoll: Hex[] = [...SUPPORTED_CHAIN_IDS];\n\n readonly #connectionStateChangedHandler = (\n connectionInfo: WebSocketConnectionInfo,\n ): void => {\n this.#onConnectionStateChanged(connectionInfo);\n };\n\n readonly #transactionUpdatedHandler = (\n transaction: AccountActivityTransaction,\n ): void => {\n this.#onTransactionUpdated(transaction);\n };\n\n readonly #selectedAccountChangedHandler = (): void => {\n this.#onSelectedAccountChanged();\n };\n\n readonly #statusChangedHandler = ({\n chainIds,\n status,\n }: {\n chainIds: string[];\n status: 'up' | 'down';\n }): void => {\n this.#onNetworkStatusChanged(chainIds, status);\n };\n\n constructor({\n client,\n getCurrentAccount,\n getLocalTransactions,\n includeTokenTransfers,\n isEnabled,\n messenger,\n remoteTransactionSource,\n trimTransactions,\n updateTransactions,\n }: {\n client?: string;\n getCurrentAccount: () => ReturnType<\n AccountsController['getSelectedAccount']\n >;\n getLocalTransactions: () => TransactionMeta[];\n includeTokenTransfers?: boolean;\n isEnabled?: () => boolean;\n messenger: TransactionControllerMessenger;\n remoteTransactionSource: RemoteTransactionSource;\n trimTransactions: (transactions: TransactionMeta[]) => TransactionMeta[];\n updateTransactions?: boolean;\n }) {\n this.hub = new EventEmitter();\n\n this.#client = client;\n this.#getCurrentAccount = getCurrentAccount;\n this.#getLocalTransactions = getLocalTransactions;\n this.#includeTokenTransfers = includeTokenTransfers;\n this.#isEnabled = isEnabled ?? ((): boolean => true);\n this.#isRunning = false;\n this.#isUpdating = false;\n this.#messenger = messenger;\n this.#remoteTransactionSource = remoteTransactionSource;\n this.#trimTransactions = trimTransactions;\n this.#updateTransactions = updateTransactions;\n this.#useBackendWebSocketService =\n isIncomingTransactionsUseBackendWebSocketServiceEnabled(messenger);\n\n if (this.#useBackendWebSocketService) {\n this.#messenger.subscribe(\n 'BackendWebSocketService:connectionStateChanged',\n this.#connectionStateChangedHandler,\n );\n\n this.#messenger.subscribe(\n 'AccountActivityService:statusChanged',\n this.#statusChangedHandler,\n );\n }\n }\n\n start(): void {\n // When websockets are disabled, allow normal polling (legacy mode)\n if (this.#useBackendWebSocketService) {\n return;\n }\n\n this.#startPolling(true);\n }\n\n #startPolling(initialPolling = false): void {\n if (this.#isRunning) {\n return;\n }\n\n if (!this.#canStart()) {\n return;\n }\n\n const interval = this.#getInterval();\n\n log('Started polling', {\n interval,\n });\n\n this.#isRunning = true;\n\n if (this.#isUpdating) {\n return;\n }\n\n this.#onInterval().catch((error) => {\n log(initialPolling ? 'Initial polling failed' : 'Polling failed', error);\n });\n }\n\n stop(): void {\n if (this.#timeoutId) {\n clearTimeout(this.#timeoutId as number);\n }\n\n if (!this.#isRunning) {\n return;\n }\n\n this.#isRunning = false;\n\n log('Stopped polling');\n }\n\n #onConnectionStateChanged(connectionInfo: WebSocketConnectionInfo): void {\n if (connectionInfo.state === WebSocketState.CONNECTED) {\n log('WebSocket connected, starting enhanced mode');\n this.#startTransactionHistoryRetrieval();\n } else if (connectionInfo.state === WebSocketState.DISCONNECTED) {\n log('WebSocket disconnected, stopping enhanced mode');\n this.#stopTransactionHistoryRetrieval();\n }\n }\n\n #startTransactionHistoryRetrieval(): void {\n if (!this.#canStart()) {\n return;\n }\n\n if (this.#isTransactionHistoryRetrievalActive) {\n return;\n }\n\n log('Started transaction history retrieval (event-driven)');\n\n this.#isTransactionHistoryRetrievalActive = true;\n\n this.update().catch((error) => {\n log('Initial update in transaction history retrieval failed', error);\n });\n\n this.#messenger.subscribe(\n 'AccountActivityService:transactionUpdated',\n this.#transactionUpdatedHandler,\n );\n\n this.#messenger.subscribe(\n 'AccountsController:selectedAccountChange',\n this.#selectedAccountChangedHandler,\n );\n }\n\n #stopTransactionHistoryRetrieval(): void {\n if (!this.#isTransactionHistoryRetrievalActive) {\n return;\n }\n\n log('Stopped transaction history retrieval');\n\n this.#isTransactionHistoryRetrievalActive = false;\n\n this.#messenger.unsubscribe(\n 'AccountActivityService:transactionUpdated',\n this.#transactionUpdatedHandler,\n );\n\n this.#messenger.unsubscribe(\n 'AccountsController:selectedAccountChange',\n this.#selectedAccountChangedHandler,\n );\n }\n\n #onTransactionUpdated(transaction: AccountActivityTransaction): void {\n log('Received relevant transaction update, triggering update', {\n txId: transaction.id,\n chain: transaction.chain,\n });\n\n this.update().catch((error) => {\n log('Update after transaction event failed', error);\n });\n }\n\n #onSelectedAccountChanged(): void {\n log('Selected account changed, triggering update');\n\n this.update().catch((error) => {\n log('Update after account change failed', error);\n });\n }\n\n async #onInterval(): Promise<void> {\n this.#isUpdating = true;\n\n try {\n // When websockets enabled, only poll chains that are not confirmed up\n const chainIds = this.#useBackendWebSocketService\n ? this.#chainsToPoll\n : undefined;\n await this.update({ chainIds, isInterval: true });\n } catch (error) {\n console.error('Error while checking incoming transactions', error);\n }\n\n this.#isUpdating = false;\n\n if (this.#isRunning) {\n if (this.#timeoutId) {\n clearTimeout(this.#timeoutId as number);\n }\n\n this.#timeoutId = setTimeout(\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n () => this.#onInterval(),\n this.#getInterval(),\n );\n }\n }\n\n async update({\n chainIds,\n isInterval,\n tags,\n }: {\n chainIds?: Hex[];\n isInterval?: boolean;\n tags?: string[];\n } = {}): Promise<void> {\n const finalTags = this.#getTags(tags, isInterval);\n\n log('Checking for incoming transactions', {\n isInterval: Boolean(isInterval),\n tags: finalTags,\n });\n\n if (!this.#canStart()) {\n return;\n }\n\n const account = this.#getCurrentAccount();\n const includeTokenTransfers = this.#includeTokenTransfers ?? true;\n const updateTransactions = this.#updateTransactions ?? false;\n\n let remoteTransactions: TransactionMeta[] = [];\n\n try {\n remoteTransactions =\n await this.#remoteTransactionSource.fetchTransactions({\n address: account.address as Hex,\n chainIds,\n includeTokenTransfers,\n tags: finalTags,\n updateTransactions,\n });\n } catch (error: unknown) {\n log('Error while fetching remote transactions', error);\n return;\n }\n\n if (!remoteTransactions.length) {\n return;\n }\n\n this.#sortTransactionsByTime(remoteTransactions);\n\n log(\n 'Found potential transactions',\n remoteTransactions.length,\n remoteTransactions,\n );\n\n const localTransactions = this.#getLocalTransactions();\n\n const uniqueTransactions = remoteTransactions.filter(\n (tx) =>\n !localTransactions.some(\n (currentTx) =>\n currentTx.hash?.toLowerCase() === tx.hash?.toLowerCase() &&\n currentTx.txParams.from?.toLowerCase() ===\n tx.txParams.from?.toLowerCase() &&\n currentTx.type === tx.type,\n ),\n );\n\n if (!uniqueTransactions.length) {\n log('All transactions are already known');\n return;\n }\n\n log(\n 'Found unique transactions',\n uniqueTransactions.length,\n uniqueTransactions,\n );\n\n const trimmedTransactions = this.#trimTransactions([\n ...uniqueTransactions,\n ...localTransactions,\n ]);\n\n const uniqueTransactionIds = uniqueTransactions.map((tx) => tx.id);\n\n const newTransactions = trimmedTransactions.filter((tx) =>\n uniqueTransactionIds.includes(tx.id),\n );\n\n if (!newTransactions.length) {\n log('All unique transactions truncated due to limit');\n return;\n }\n\n log('Adding new transactions', newTransactions.length, newTransactions);\n\n this.hub.emit('transactions', newTransactions);\n }\n\n #sortTransactionsByTime(transactions: TransactionMeta[]): void {\n transactions.sort((a, b) => (a.time < b.time ? -1 : 1));\n }\n\n #canStart(): boolean {\n return this.#isEnabled();\n }\n\n #getInterval(): number {\n return getIncomingTransactionsPollingInterval(this.#messenger);\n }\n\n #getTags(\n requestTags: string[] | undefined,\n isInterval: boolean | undefined,\n ): string[] | undefined {\n const tags = [];\n\n if (this.#client) {\n tags.push(this.#client);\n }\n\n if (requestTags?.length) {\n tags.push(...requestTags);\n } else if (isInterval) {\n tags.push(TAG_POLLING);\n }\n\n return tags?.length ? tags : undefined;\n }\n\n #onNetworkStatusChanged(chainIds: string[], status: 'up' | 'down'): void {\n if (!this.#useBackendWebSocketService) {\n return;\n }\n\n let hasChanges = false;\n\n for (const caip2ChainId of chainIds) {\n const hexChainId = caip2ToHex(caip2ChainId);\n\n if (!hexChainId || !SUPPORTED_CHAIN_IDS.includes(hexChainId)) {\n log('Chain ID not recognized or not supported', {\n caip2ChainId,\n hexChainId,\n });\n continue;\n }\n\n if (status === 'up') {\n const index = this.#chainsToPoll.indexOf(hexChainId);\n if (index !== -1) {\n this.#chainsToPoll.splice(index, 1);\n hasChanges = true;\n log('Supported network came up, removed from polling list', {\n chainId: hexChainId,\n });\n }\n } else if (\n status === 'down' &&\n !this.#chainsToPoll.includes(hexChainId)\n ) {\n this.#chainsToPoll.push(hexChainId);\n hasChanges = true;\n log('Supported network went down, added to polling list', {\n chainId: hexChainId,\n });\n }\n }\n\n if (!hasChanges) {\n log('No changes to polling list', {\n chainsToPoll: this.#chainsToPoll,\n });\n return;\n }\n\n if (this.#chainsToPoll.length === 0) {\n log('Stopping fallback polling - all networks up');\n this.stop();\n } else {\n log('Starting fallback polling - some networks need polling', {\n chainsToPoll: this.#chainsToPoll,\n });\n this.#startPolling();\n }\n }\n}\n"]}
|