@metamask-previews/transaction-controller 67.0.0-preview-35bdba6 → 67.0.0-preview-4c8178e11
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 +0 -13
- package/dist/TransactionController-method-action-types.cjs.map +1 -1
- package/dist/TransactionController-method-action-types.d.cts +25 -1
- package/dist/TransactionController-method-action-types.d.cts.map +1 -1
- package/dist/TransactionController-method-action-types.d.mts +25 -1
- 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 +83 -10
- package/dist/TransactionController.cjs.map +1 -1
- package/dist/TransactionController.d.cts +34 -4
- package/dist/TransactionController.d.cts.map +1 -1
- package/dist/TransactionController.d.mts +34 -4
- package/dist/TransactionController.d.mts.map +1 -1
- package/dist/TransactionController.mjs +83 -10
- package/dist/TransactionController.mjs.map +1 -1
- package/dist/api/accounts-api.cjs +42 -1
- package/dist/api/accounts-api.cjs.map +1 -1
- package/dist/api/accounts-api.d.cts +51 -0
- package/dist/api/accounts-api.d.cts.map +1 -1
- package/dist/api/accounts-api.d.mts +51 -0
- package/dist/api/accounts-api.d.mts.map +1 -1
- package/dist/api/accounts-api.mjs +40 -0
- package/dist/api/accounts-api.mjs.map +1 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.cjs +159 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.cjs.map +1 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts +12 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts.map +1 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts +12 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts.map +1 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.mjs +159 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.mjs.map +1 -0
- package/dist/helpers/IncomingTransactionHelper.cjs +306 -0
- package/dist/helpers/IncomingTransactionHelper.cjs.map +1 -0
- package/dist/helpers/IncomingTransactionHelper.d.cts +45 -0
- package/dist/helpers/IncomingTransactionHelper.d.cts.map +1 -0
- package/dist/helpers/IncomingTransactionHelper.d.mts +45 -0
- package/dist/helpers/IncomingTransactionHelper.d.mts.map +1 -0
- package/dist/helpers/IncomingTransactionHelper.mjs +299 -0
- package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -0
- package/dist/helpers/MultichainTrackingHelper.cjs +8 -29
- package/dist/helpers/MultichainTrackingHelper.cjs.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.d.cts +2 -2
- package/dist/helpers/MultichainTrackingHelper.d.cts.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.d.mts +2 -2
- package/dist/helpers/MultichainTrackingHelper.d.mts.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.mjs +8 -29
- package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -1
- package/dist/index.cjs +3 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -0
- package/dist/index.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +1 -0
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +1 -0
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/feature-flags.cjs +33 -14
- package/dist/utils/feature-flags.cjs.map +1 -1
- package/dist/utils/feature-flags.d.cts +25 -1
- package/dist/utils/feature-flags.d.cts.map +1 -1
- package/dist/utils/feature-flags.d.mts +25 -1
- package/dist/utils/feature-flags.d.mts.map +1 -1
- package/dist/utils/feature-flags.mjs +30 -13
- package/dist/utils/feature-flags.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { AccountsController } from "@metamask/accounts-controller";
|
|
3
|
+
import type { Hex } from "@metamask/utils";
|
|
4
|
+
import EventEmitter from "events";
|
|
5
|
+
import type { TransactionControllerMessenger } from "../index.mjs";
|
|
6
|
+
import type { RemoteTransactionSource, TransactionMeta } from "../types.mjs";
|
|
7
|
+
export declare enum WebSocketState {
|
|
8
|
+
CONNECTED = "connected",
|
|
9
|
+
DISCONNECTED = "disconnected"
|
|
10
|
+
}
|
|
11
|
+
export type IncomingTransactionOptions = {
|
|
12
|
+
/** Name of the client to include in requests. */
|
|
13
|
+
client?: string;
|
|
14
|
+
/** Whether to retrieve incoming token transfers. Defaults to false. */
|
|
15
|
+
includeTokenTransfers?: boolean;
|
|
16
|
+
/** Callback to determine if incoming transaction polling is enabled. */
|
|
17
|
+
isEnabled?: () => boolean;
|
|
18
|
+
/** @deprecated No longer used. */
|
|
19
|
+
queryEntireHistory?: boolean;
|
|
20
|
+
/** Whether to retrieve outgoing transactions. Defaults to false. */
|
|
21
|
+
updateTransactions?: boolean;
|
|
22
|
+
};
|
|
23
|
+
export declare class IncomingTransactionHelper {
|
|
24
|
+
#private;
|
|
25
|
+
hub: EventEmitter;
|
|
26
|
+
constructor({ client, getCurrentAccount, getLocalTransactions, includeTokenTransfers, isEnabled, messenger, remoteTransactionSource, trimTransactions, updateTransactions, }: {
|
|
27
|
+
client?: string;
|
|
28
|
+
getCurrentAccount: () => ReturnType<AccountsController['getSelectedAccount']>;
|
|
29
|
+
getLocalTransactions: () => TransactionMeta[];
|
|
30
|
+
includeTokenTransfers?: boolean;
|
|
31
|
+
isEnabled?: () => boolean;
|
|
32
|
+
messenger: TransactionControllerMessenger;
|
|
33
|
+
remoteTransactionSource: RemoteTransactionSource;
|
|
34
|
+
trimTransactions: (transactions: TransactionMeta[]) => TransactionMeta[];
|
|
35
|
+
updateTransactions?: boolean;
|
|
36
|
+
});
|
|
37
|
+
start(): void;
|
|
38
|
+
stop(): void;
|
|
39
|
+
update({ chainIds, isInterval, tags, }?: {
|
|
40
|
+
chainIds?: Hex[];
|
|
41
|
+
isInterval?: boolean;
|
|
42
|
+
tags?: string[];
|
|
43
|
+
}): Promise<void>;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=IncomingTransactionHelper.d.mts.map
|
|
@@ -0,0 +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;AAElC,OAAO,KAAK,EAAE,8BAA8B,EAAE,qBAAW;AAEzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,qBAAiB;AAQzE,oBAAY,cAAc;IACxB,SAAS,cAAc;IACvB,YAAY,iBAAiB;CAC9B;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,uEAAuE;IACvE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAE1B,kCAAkC;IAClC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAIF,qBAAa,yBAAyB;;IACpC,GAAG,EAAE,YAAY,CAAC;gBA+DN,EACV,MAAM,EACN,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,SAAS,EACT,SAAS,EACT,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GACnB,EAAE;QACD,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,iBAAiB,EAAE,MAAM,UAAU,CACjC,kBAAkB,CAAC,oBAAoB,CAAC,CACzC,CAAC;QACF,oBAAoB,EAAE,MAAM,eAAe,EAAE,CAAC;QAC9C,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;QAC1B,SAAS,EAAE,8BAA8B,CAAC;QAC1C,uBAAuB,EAAE,uBAAuB,CAAC;QACjD,gBAAgB,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,CAAC;QACzE,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B;IA8BD,KAAK,IAAI,IAAI;IAmCb,IAAI,IAAI,IAAI;IAuHN,MAAM,CAAC,EACX,QAAQ,EACR,UAAU,EACV,IAAI,GACL,GAAE;QACD,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;KACZ,GAAG,OAAO,CAAC,IAAI,CAAC;CAgLvB"}
|
|
@@ -0,0 +1,299 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IncomingTransactionHelper.mjs","sourceRoot":"","sources":["../../src/helpers/IncomingTransactionHelper.ts"],"names":[],"mappings":";;;;;;;;;;;;AAMA,kEAAkE;AAClE,sDAAsD;AACtD,OAAO,YAAY,eAAe;AAGlC,OAAO,EAAE,0BAA0B,IAAI,GAAG,EAAE,sBAAkB;AAE9D,OAAO,EACL,sCAAsC,EACtC,uDAAuD,EACxD,mCAA+B;AAChC,OAAO,EAAE,UAAU,EAAE,2BAAuB;AAC5C,OAAO,EAAE,mBAAmB,EAAE,iDAA6C;AAE3E,MAAM,CAAN,IAAY,cAGX;AAHD,WAAY,cAAc;IACxB,yCAAuB,CAAA;IACvB,+CAA6B,CAAA;AAC/B,CAAC,EAHW,cAAc,KAAd,cAAc,QAGzB;AAmBD,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAExC,MAAM,OAAO,yBAAyB;IAgEpC,YAAY,EACV,MAAM,EACN,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,SAAS,EACT,SAAS,EACT,uBAAuB,EACvB,gBAAgB,EAChB,kBAAkB,GAanB;;QAnFQ,oDAAiB;QAEjB,+DAEP;QAEO,kEAA+C;QAE/C,mEAAiC;QAEjC,uDAA0B;QAEnC,uDAAoB;QAEpB,wDAAqB;QAEZ,uDAA2C;QAE3C,qEAAkD;QAE3D,uDAAqB;QAEZ,8DAEc;QAEvB,yEAAuC,KAAK,EAAC;QAEpC,gEAA8B;QAE9B,wEAAqC;QAE9C,8EAA8E;QACrE,kDAAuB,CAAC,GAAG,mBAAmB,CAAC,EAAC;QAEhD,mEAAiC,CACxC,cAAuC,EACjC,EAAE;YACR,uBAAA,IAAI,iGAA0B,MAA9B,IAAI,EAA2B,cAAc,CAAC,CAAC;QACjD,CAAC,EAAC;QAEO,+DAA6B,CACpC,WAAuC,EACjC,EAAE;YACR,uBAAA,IAAI,6FAAsB,MAA1B,IAAI,EAAuB,WAAW,CAAC,CAAC;QAC1C,CAAC,EAAC;QAEO,mEAAiC,GAAS,EAAE;YACnD,uBAAA,IAAI,iGAA0B,MAA9B,IAAI,CAA4B,CAAC;QACnC,CAAC,EAAC;QAEO,0DAAwB,CAAC,EAChC,QAAQ,EACR,MAAM,GAIP,EAAQ,EAAE;YACT,uBAAA,IAAI,+FAAwB,MAA5B,IAAI,EAAyB,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjD,CAAC,EAAC;QAyBA,IAAI,CAAC,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;QAE9B,uBAAA,IAAI,qCAAW,MAAM,MAAA,CAAC;QACtB,uBAAA,IAAI,gDAAsB,iBAAiB,MAAA,CAAC;QAC5C,uBAAA,IAAI,mDAAyB,oBAAoB,MAAA,CAAC;QAClD,uBAAA,IAAI,oDAA0B,qBAAqB,MAAA,CAAC;QACpD,uBAAA,IAAI,wCAAc,SAAS,IAAI,CAAC,GAAY,EAAE,CAAC,IAAI,CAAC,MAAA,CAAC;QACrD,uBAAA,IAAI,wCAAc,KAAK,MAAA,CAAC;QACxB,uBAAA,IAAI,yCAAe,KAAK,MAAA,CAAC;QACzB,uBAAA,IAAI,wCAAc,SAAS,MAAA,CAAC;QAC5B,uBAAA,IAAI,sDAA4B,uBAAuB,MAAA,CAAC;QACxD,uBAAA,IAAI,+CAAqB,gBAAgB,MAAA,CAAC;QAC1C,uBAAA,IAAI,iDAAuB,kBAAkB,MAAA,CAAC;QAC9C,uBAAA,IAAI,yDACF,uDAAuD,CAAC,SAAS,CAAC,MAAA,CAAC;QAErE,IAAI,uBAAA,IAAI,6DAA4B,EAAE,CAAC;YACrC,uBAAA,IAAI,4CAAW,CAAC,SAAS,CACvB,gDAAgD,EAChD,uBAAA,IAAI,gEAA+B,CACpC,CAAC;YAEF,uBAAA,IAAI,4CAAW,CAAC,SAAS,CACvB,sCAAsC,EACtC,uBAAA,IAAI,uDAAsB,CAC3B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK;QACH,mEAAmE;QACnE,IAAI,uBAAA,IAAI,6DAA4B,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QAED,uBAAA,IAAI,qFAAc,MAAlB,IAAI,EAAe,IAAI,CAAC,CAAC;IAC3B,CAAC;IA4BD,IAAI;QACF,IAAI,uBAAA,IAAI,4CAAW,EAAE,CAAC;YACpB,YAAY,CAAC,uBAAA,IAAI,4CAAqB,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,uBAAA,IAAI,4CAAW,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,uBAAA,IAAI,wCAAc,KAAK,MAAA,CAAC;QAExB,GAAG,CAAC,iBAAiB,CAAC,CAAC;IACzB,CAAC;IA2GD,KAAK,CAAC,MAAM,CAAC,EACX,QAAQ,EACR,UAAU,EACV,IAAI,MAKF,EAAE;QACJ,MAAM,SAAS,GAAG,uBAAA,IAAI,gFAAS,MAAb,IAAI,EAAU,IAAI,EAAE,UAAU,CAAC,CAAC;QAElD,GAAG,CAAC,oCAAoC,EAAE;YACxC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC;YAC/B,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QAEH,IAAI,CAAC,uBAAA,IAAI,iFAAU,MAAd,IAAI,CAAY,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,uBAAA,IAAI,oDAAmB,MAAvB,IAAI,CAAqB,CAAC;QAC1C,MAAM,qBAAqB,GAAG,uBAAA,IAAI,wDAAuB,IAAI,IAAI,CAAC;QAClE,MAAM,kBAAkB,GAAG,uBAAA,IAAI,qDAAoB,IAAI,KAAK,CAAC;QAE7D,IAAI,kBAAkB,GAAsB,EAAE,CAAC;QAE/C,IAAI,CAAC;YACH,kBAAkB;gBAChB,MAAM,uBAAA,IAAI,0DAAyB,CAAC,iBAAiB,CAAC;oBACpD,OAAO,EAAE,OAAO,CAAC,OAAc;oBAC/B,QAAQ;oBACR,qBAAqB;oBACrB,IAAI,EAAE,SAAS;oBACf,kBAAkB;iBACnB,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,GAAG,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAC;YACvD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,uBAAA,IAAI,+FAAwB,MAA5B,IAAI,EAAyB,kBAAkB,CAAC,CAAC;QAEjD,GAAG,CACD,8BAA8B,EAC9B,kBAAkB,CAAC,MAAM,EACzB,kBAAkB,CACnB,CAAC;QAEF,MAAM,iBAAiB,GAAG,uBAAA,IAAI,uDAAsB,MAA1B,IAAI,CAAwB,CAAC;QAEvD,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,MAAM,CAClD,CAAC,EAAE,EAAE,EAAE,CACL,CAAC,iBAAiB,CAAC,IAAI,CACrB,CAAC,SAAS,EAAE,EAAE,CACZ,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE;YACxD,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE;gBACpC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE;YACjC,SAAS,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,CAC7B,CACJ,CAAC;QAEF,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;YAC/B,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,GAAG,CACD,2BAA2B,EAC3B,kBAAkB,CAAC,MAAM,EACzB,kBAAkB,CACnB,CAAC;QAEF,MAAM,mBAAmB,GAAG,uBAAA,IAAI,mDAAkB,MAAtB,IAAI,EAAmB;YACjD,GAAG,kBAAkB;YACrB,GAAG,iBAAiB;SACrB,CAAC,CAAC;QAEH,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAEnE,MAAM,eAAe,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CACxD,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CACrC,CAAC;QAEF,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;YAC5B,GAAG,CAAC,gDAAgD,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAED,GAAG,CAAC,yBAAyB,EAAE,eAAe,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QAExE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IACjD,CAAC;CAyFF;+zCAzUe,cAAc,GAAG,KAAK;IAClC,IAAI,uBAAA,IAAI,4CAAW,EAAE,CAAC;QACpB,OAAO;IACT,CAAC;IAED,IAAI,CAAC,uBAAA,IAAI,iFAAU,MAAd,IAAI,CAAY,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,uBAAA,IAAI,oFAAa,MAAjB,IAAI,CAAe,CAAC;IAErC,GAAG,CAAC,iBAAiB,EAAE;QACrB,QAAQ;KACT,CAAC,CAAC;IAEH,uBAAA,IAAI,wCAAc,IAAI,MAAA,CAAC;IAEvB,IAAI,uBAAA,IAAI,6CAAY,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IAED,uBAAA,IAAI,mFAAY,MAAhB,IAAI,CAAc,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACjC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC,qHAgByB,cAAuC;IAC/D,IAAI,cAAc,CAAC,KAAK,KAAK,cAAc,CAAC,SAAS,EAAE,CAAC;QACtD,GAAG,CAAC,6CAA6C,CAAC,CAAC;QACnD,uBAAA,IAAI,yGAAkC,MAAtC,IAAI,CAAoC,CAAC;IAC3C,CAAC;SAAM,IAAI,cAAc,CAAC,KAAK,KAAK,cAAc,CAAC,YAAY,EAAE,CAAC;QAChE,GAAG,CAAC,gDAAgD,CAAC,CAAC;QACtD,uBAAA,IAAI,wGAAiC,MAArC,IAAI,CAAmC,CAAC;IAC1C,CAAC;AACH,CAAC;IAGC,IAAI,CAAC,uBAAA,IAAI,iFAAU,MAAd,IAAI,CAAY,EAAE,CAAC;QACtB,OAAO;IACT,CAAC;IAED,IAAI,uBAAA,IAAI,sEAAqC,EAAE,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,GAAG,CAAC,sDAAsD,CAAC,CAAC;IAE5D,uBAAA,IAAI,kEAAwC,IAAI,MAAA,CAAC;IAEjD,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,GAAG,CAAC,wDAAwD,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,uBAAA,IAAI,4CAAW,CAAC,SAAS,CACvB,2CAA2C,EAC3C,uBAAA,IAAI,4DAA2B,CAChC,CAAC;IAEF,uBAAA,IAAI,4CAAW,CAAC,SAAS,CACvB,0CAA0C,EAC1C,uBAAA,IAAI,gEAA+B,CACpC,CAAC;AACJ,CAAC;IAGC,IAAI,CAAC,uBAAA,IAAI,sEAAqC,EAAE,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,GAAG,CAAC,uCAAuC,CAAC,CAAC;IAE7C,uBAAA,IAAI,kEAAwC,KAAK,MAAA,CAAC;IAElD,uBAAA,IAAI,4CAAW,CAAC,WAAW,CACzB,2CAA2C,EAC3C,uBAAA,IAAI,4DAA2B,CAChC,CAAC;IAEF,uBAAA,IAAI,4CAAW,CAAC,WAAW,CACzB,0CAA0C,EAC1C,uBAAA,IAAI,gEAA+B,CACpC,CAAC;AACJ,CAAC,6GAEqB,WAAuC;IAC3D,GAAG,CAAC,yDAAyD,EAAE;QAC7D,IAAI,EAAE,WAAW,CAAC,EAAE;QACpB,KAAK,EAAE,WAAW,CAAC,KAAK;KACzB,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,GAAG,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC;IAGC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAEnD,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,GAAG,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,0CAED,KAAK;IACH,uBAAA,IAAI,yCAAe,IAAI,MAAA,CAAC;IAExB,IAAI,CAAC;QACH,sEAAsE;QACtE,MAAM,QAAQ,GAAG,uBAAA,IAAI,6DAA4B;YAC/C,CAAC,CAAC,uBAAA,IAAI,+CAAc;YACpB,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;IACrE,CAAC;IAED,uBAAA,IAAI,yCAAe,KAAK,MAAA,CAAC;IAEzB,IAAI,uBAAA,IAAI,4CAAW,EAAE,CAAC;QACpB,IAAI,uBAAA,IAAI,4CAAW,EAAE,CAAC;YACpB,YAAY,CAAC,uBAAA,IAAI,4CAAqB,CAAC,CAAC;QAC1C,CAAC;QAED,uBAAA,IAAI,wCAAc,UAAU;QAC1B,kEAAkE;QAClE,GAAG,EAAE,CAAC,uBAAA,IAAI,mFAAY,MAAhB,IAAI,CAAc,EACxB,uBAAA,IAAI,oFAAa,MAAjB,IAAI,CAAe,CACpB,MAAA,CAAC;IACJ,CAAC;AACH,CAAC,iHAmGuB,YAA+B;IACrD,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;IAGC,OAAO,uBAAA,IAAI,4CAAW,MAAf,IAAI,CAAa,CAAC;AAC3B,CAAC;IAGC,OAAO,sCAAsC,CAAC,uBAAA,IAAI,4CAAW,CAAC,CAAC;AACjE,CAAC,mFAGC,WAAiC,EACjC,UAA+B;IAE/B,MAAM,IAAI,GAAG,EAAE,CAAC;IAEhB,IAAI,uBAAA,IAAI,yCAAQ,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,uBAAA,IAAI,yCAAQ,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,WAAW,EAAE,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;IAC5B,CAAC;SAAM,IAAI,UAAU,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACzC,CAAC,iHAEuB,QAAkB,EAAE,MAAqB;IAC/D,IAAI,CAAC,uBAAA,IAAI,6DAA4B,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IAED,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,KAAK,MAAM,YAAY,IAAI,QAAQ,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;QAE5C,IAAI,CAAC,UAAU,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7D,GAAG,CAAC,0CAA0C,EAAE;gBAC9C,YAAY;gBACZ,UAAU;aACX,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,uBAAA,IAAI,+CAAc,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACrD,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjB,uBAAA,IAAI,+CAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACpC,UAAU,GAAG,IAAI,CAAC;gBAClB,GAAG,CAAC,sDAAsD,EAAE;oBAC1D,OAAO,EAAE,UAAU;iBACpB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,IACL,MAAM,KAAK,MAAM;YACjB,CAAC,uBAAA,IAAI,+CAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,EACxC,CAAC;YACD,uBAAA,IAAI,+CAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACpC,UAAU,GAAG,IAAI,CAAC;YAClB,GAAG,CAAC,oDAAoD,EAAE;gBACxD,OAAO,EAAE,UAAU;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,GAAG,CAAC,4BAA4B,EAAE;YAChC,YAAY,EAAE,uBAAA,IAAI,+CAAc;SACjC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,IAAI,uBAAA,IAAI,+CAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,wDAAwD,EAAE;YAC5D,YAAY,EAAE,uBAAA,IAAI,+CAAc;SACjC,CAAC,CAAC;QACH,uBAAA,IAAI,qFAAc,MAAlB,IAAI,CAAgB,CAAC;IACvB,CAAC;AACH,CAAC","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"]}
|
|
@@ -10,14 +10,14 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
12
|
};
|
|
13
|
-
var _MultichainTrackingHelper_instances, _MultichainTrackingHelper_findNetworkClientIdByChainId, _MultichainTrackingHelper_getNetworkClientById, _MultichainTrackingHelper_getNetworkClientRegistry, _MultichainTrackingHelper_removePendingTransactionTrackerListeners, _MultichainTrackingHelper_createNonceTracker, _MultichainTrackingHelper_createPendingTransactionTracker,
|
|
13
|
+
var _MultichainTrackingHelper_instances, _MultichainTrackingHelper_findNetworkClientIdByChainId, _MultichainTrackingHelper_getNetworkClientById, _MultichainTrackingHelper_getNetworkClientRegistry, _MultichainTrackingHelper_removePendingTransactionTrackerListeners, _MultichainTrackingHelper_createNonceTracker, _MultichainTrackingHelper_createPendingTransactionTracker, _MultichainTrackingHelper_nonceMutexesByChainId, _MultichainTrackingHelper_trackingMap, _MultichainTrackingHelper_refreshTrackingMap, _MultichainTrackingHelper_stopTrackingByNetworkClientId, _MultichainTrackingHelper_startTrackingByNetworkClientId;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.MultichainTrackingHelper = void 0;
|
|
16
16
|
const async_mutex_1 = require("async-mutex");
|
|
17
17
|
const logger_1 = require("../logger.cjs");
|
|
18
18
|
const log = (0, logger_1.createModuleLogger)(logger_1.projectLogger, 'multichain-tracking');
|
|
19
19
|
class MultichainTrackingHelper {
|
|
20
|
-
constructor({ findNetworkClientIdByChainId, getNetworkClientById, getNetworkClientRegistry, removePendingTransactionTrackerListeners, createNonceTracker, createPendingTransactionTracker, onNetworkStateChange,
|
|
20
|
+
constructor({ findNetworkClientIdByChainId, getNetworkClientById, getNetworkClientRegistry, removePendingTransactionTrackerListeners, createNonceTracker, createPendingTransactionTracker, onNetworkStateChange, }) {
|
|
21
21
|
_MultichainTrackingHelper_instances.add(this);
|
|
22
22
|
_MultichainTrackingHelper_findNetworkClientIdByChainId.set(this, void 0);
|
|
23
23
|
_MultichainTrackingHelper_getNetworkClientById.set(this, void 0);
|
|
@@ -25,8 +25,6 @@ class MultichainTrackingHelper {
|
|
|
25
25
|
_MultichainTrackingHelper_removePendingTransactionTrackerListeners.set(this, void 0);
|
|
26
26
|
_MultichainTrackingHelper_createNonceTracker.set(this, void 0);
|
|
27
27
|
_MultichainTrackingHelper_createPendingTransactionTracker.set(this, void 0);
|
|
28
|
-
_MultichainTrackingHelper_initialized.set(this, false);
|
|
29
|
-
_MultichainTrackingHelper_initInterval.set(this, void 0);
|
|
30
28
|
_MultichainTrackingHelper_nonceMutexesByChainId.set(this, new Map());
|
|
31
29
|
_MultichainTrackingHelper_trackingMap.set(this, new Map());
|
|
32
30
|
this.checkForPendingTransactionAndStartPolling = () => {
|
|
@@ -61,9 +59,6 @@ class MultichainTrackingHelper {
|
|
|
61
59
|
__classPrivateFieldSet(this, _MultichainTrackingHelper_createNonceTracker, createNonceTracker, "f");
|
|
62
60
|
__classPrivateFieldSet(this, _MultichainTrackingHelper_createPendingTransactionTracker, createPendingTransactionTracker, "f");
|
|
63
61
|
onNetworkStateChange((_, patches) => {
|
|
64
|
-
if (!__classPrivateFieldGet(this, _MultichainTrackingHelper_initialized, "f")) {
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
62
|
const networkClients = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientRegistry, "f").call(this);
|
|
68
63
|
patches.forEach(({ op, path }) => {
|
|
69
64
|
if (op === 'remove' && path[0] === 'networkConfigurations') {
|
|
@@ -73,7 +68,11 @@ class MultichainTrackingHelper {
|
|
|
73
68
|
});
|
|
74
69
|
__classPrivateFieldGet(this, _MultichainTrackingHelper_refreshTrackingMap, "f").call(this, networkClients);
|
|
75
70
|
});
|
|
76
|
-
|
|
71
|
+
}
|
|
72
|
+
initialize() {
|
|
73
|
+
const networkClients = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientRegistry, "f").call(this);
|
|
74
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_refreshTrackingMap, "f").call(this, networkClients);
|
|
75
|
+
log('Initialized');
|
|
77
76
|
}
|
|
78
77
|
has(networkClientId) {
|
|
79
78
|
return __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").has(networkClientId);
|
|
@@ -138,10 +137,6 @@ class MultichainTrackingHelper {
|
|
|
138
137
|
}
|
|
139
138
|
}
|
|
140
139
|
stopAllTracking() {
|
|
141
|
-
if (__classPrivateFieldGet(this, _MultichainTrackingHelper_initInterval, "f")) {
|
|
142
|
-
clearInterval(__classPrivateFieldGet(this, _MultichainTrackingHelper_initInterval, "f"));
|
|
143
|
-
__classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, undefined, "f");
|
|
144
|
-
}
|
|
145
140
|
for (const [networkClientId] of __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f")) {
|
|
146
141
|
__classPrivateFieldGet(this, _MultichainTrackingHelper_instances, "m", _MultichainTrackingHelper_stopTrackingByNetworkClientId).call(this, networkClientId);
|
|
147
142
|
}
|
|
@@ -174,23 +169,7 @@ class MultichainTrackingHelper {
|
|
|
174
169
|
}
|
|
175
170
|
}
|
|
176
171
|
exports.MultichainTrackingHelper = MultichainTrackingHelper;
|
|
177
|
-
_MultichainTrackingHelper_findNetworkClientIdByChainId = new WeakMap(), _MultichainTrackingHelper_getNetworkClientById = new WeakMap(), _MultichainTrackingHelper_getNetworkClientRegistry = new WeakMap(), _MultichainTrackingHelper_removePendingTransactionTrackerListeners = new WeakMap(), _MultichainTrackingHelper_createNonceTracker = new WeakMap(), _MultichainTrackingHelper_createPendingTransactionTracker = new WeakMap(),
|
|
178
|
-
log('Waiting for NetworkController to be available');
|
|
179
|
-
__classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, setInterval(() => {
|
|
180
|
-
try {
|
|
181
|
-
const networkClients = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientRegistry, "f").call(this);
|
|
182
|
-
clearInterval(__classPrivateFieldGet(this, _MultichainTrackingHelper_initInterval, "f"));
|
|
183
|
-
__classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, undefined, "f");
|
|
184
|
-
__classPrivateFieldGet(this, _MultichainTrackingHelper_refreshTrackingMap, "f").call(this, networkClients);
|
|
185
|
-
__classPrivateFieldSet(this, _MultichainTrackingHelper_initialized, true, "f");
|
|
186
|
-
log('Initialized');
|
|
187
|
-
onInitialized();
|
|
188
|
-
}
|
|
189
|
-
catch {
|
|
190
|
-
log('NetworkController not yet available, retrying');
|
|
191
|
-
}
|
|
192
|
-
}, 10), "f");
|
|
193
|
-
}, _MultichainTrackingHelper_stopTrackingByNetworkClientId = function _MultichainTrackingHelper_stopTrackingByNetworkClientId(networkClientId) {
|
|
172
|
+
_MultichainTrackingHelper_findNetworkClientIdByChainId = new WeakMap(), _MultichainTrackingHelper_getNetworkClientById = new WeakMap(), _MultichainTrackingHelper_getNetworkClientRegistry = new WeakMap(), _MultichainTrackingHelper_removePendingTransactionTrackerListeners = new WeakMap(), _MultichainTrackingHelper_createNonceTracker = new WeakMap(), _MultichainTrackingHelper_createPendingTransactionTracker = new WeakMap(), _MultichainTrackingHelper_nonceMutexesByChainId = new WeakMap(), _MultichainTrackingHelper_trackingMap = new WeakMap(), _MultichainTrackingHelper_refreshTrackingMap = new WeakMap(), _MultichainTrackingHelper_instances = new WeakSet(), _MultichainTrackingHelper_stopTrackingByNetworkClientId = function _MultichainTrackingHelper_stopTrackingByNetworkClientId(networkClientId) {
|
|
194
173
|
const trackers = __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").get(networkClientId);
|
|
195
174
|
if (trackers) {
|
|
196
175
|
trackers.pendingTransactionTracker.stop();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultichainTrackingHelper.cjs","sourceRoot":"","sources":["../../src/helpers/MultichainTrackingHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n NetworkClientId,\n NetworkController,\n NetworkClient,\n BlockTracker,\n Provider,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport type { NonceLock, NonceTracker } from '@metamask/nonce-tracker';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\n\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { PendingTransactionTracker } from './PendingTransactionTracker';\n\n/**\n * Registry of network clients provided by the NetworkController\n */\ntype NetworkClientRegistry = ReturnType<\n NetworkController['getNetworkClientRegistry']\n>;\n\nconst log = createModuleLogger(projectLogger, 'multichain-tracking');\n\nexport type MultichainTrackingHelperOptions = {\n findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n getNetworkClientById: NetworkController['getNetworkClientById'];\n getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }) => NonceTracker;\n createPendingTransactionTracker: (opts: {\n blockTracker: BlockTracker;\n networkClientId: NetworkClientId;\n }) => PendingTransactionTracker;\n onNetworkStateChange: (\n listener: (\n ...payload: NetworkControllerStateChangeEvent['payload']\n ) => void,\n ) => void;\n onInitialized: () => void;\n};\n\nexport class MultichainTrackingHelper {\n readonly #findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n\n readonly #getNetworkClientById: NetworkController['getNetworkClientById'];\n\n readonly #getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n readonly #removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n\n readonly #createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }) => NonceTracker;\n\n readonly #createPendingTransactionTracker: (opts: {\n blockTracker: BlockTracker;\n networkClientId: NetworkClientId;\n }) => PendingTransactionTracker;\n\n #initialized = false;\n\n #initInterval?: ReturnType<typeof setInterval>;\n\n readonly #nonceMutexesByChainId = new Map<Hex, Map<string, Mutex>>();\n\n readonly #trackingMap: Map<\n NetworkClientId,\n {\n nonceTracker: NonceTracker;\n pendingTransactionTracker: PendingTransactionTracker;\n }\n > = new Map();\n\n constructor({\n findNetworkClientIdByChainId,\n getNetworkClientById,\n getNetworkClientRegistry,\n removePendingTransactionTrackerListeners,\n createNonceTracker,\n createPendingTransactionTracker,\n onNetworkStateChange,\n onInitialized,\n }: MultichainTrackingHelperOptions) {\n this.#findNetworkClientIdByChainId = findNetworkClientIdByChainId;\n this.#getNetworkClientById = getNetworkClientById;\n this.#getNetworkClientRegistry = getNetworkClientRegistry;\n\n this.#removePendingTransactionTrackerListeners =\n removePendingTransactionTrackerListeners;\n this.#createNonceTracker = createNonceTracker;\n this.#createPendingTransactionTracker = createPendingTransactionTracker;\n\n onNetworkStateChange((_, patches) => {\n if (!this.#initialized) {\n return;\n }\n\n const networkClients = this.#getNetworkClientRegistry();\n\n patches.forEach(({ op, path }) => {\n if (op === 'remove' && path[0] === 'networkConfigurations') {\n const networkClientId = path[1] as NetworkClientId;\n delete networkClients[networkClientId];\n }\n });\n\n this.#refreshTrackingMap(networkClients);\n });\n\n this.#waitForNetworkController(onInitialized);\n }\n\n #waitForNetworkController(onInitialized: () => void): void {\n log('Waiting for NetworkController to be available');\n\n this.#initInterval = setInterval(() => {\n try {\n const networkClients = this.#getNetworkClientRegistry();\n clearInterval(this.#initInterval);\n this.#initInterval = undefined;\n this.#refreshTrackingMap(networkClients);\n this.#initialized = true;\n log('Initialized');\n onInitialized();\n } catch {\n log('NetworkController not yet available, retrying');\n }\n }, 10);\n }\n\n has(networkClientId: NetworkClientId): boolean {\n return this.#trackingMap.has(networkClientId);\n }\n\n /**\n * Gets the mutex intended to guard the nonceTracker for a particular chainId and key .\n *\n * @param opts - The options object.\n * @param opts.chainId - The hex chainId.\n * @param opts.key - The hex address (or constant) pertaining to the chainId\n * @returns Mutex instance for the given chainId and key pair\n */\n async acquireNonceLockForChainIdKey({\n chainId,\n key = 'global',\n }: {\n chainId: Hex;\n key?: string;\n }): Promise<() => void> {\n let nonceMutexesForChainId = this.#nonceMutexesByChainId.get(chainId);\n if (!nonceMutexesForChainId) {\n nonceMutexesForChainId = new Map<string, Mutex>();\n this.#nonceMutexesByChainId.set(chainId, nonceMutexesForChainId);\n }\n let nonceMutexForKey = nonceMutexesForChainId.get(key);\n if (!nonceMutexForKey) {\n nonceMutexForKey = new Mutex();\n nonceMutexesForChainId.set(key, nonceMutexForKey);\n }\n\n return await nonceMutexForKey.acquire();\n }\n\n /**\n * Gets the next nonce according to the nonce-tracker.\n * Ensure `releaseLock` is called once processing of the `nonce` value is complete.\n *\n * @param address - The hex string address for the transaction.\n * @param networkClientId - The network client ID for the transaction, used to fetch the correct nonce tracker.\n * @returns object with the `nextNonce` `nonceDetails`, and the releaseLock.\n */\n async getNonceLock(\n address: string,\n networkClientId: NetworkClientId,\n ): Promise<NonceLock> {\n const networkClient = this.#getNetworkClientById(networkClientId);\n\n const releaseLockForChainIdKey = await this.acquireNonceLockForChainIdKey({\n chainId: networkClient.configuration.chainId,\n key: address,\n });\n\n const nonceTracker = this.#trackingMap.get(networkClientId)?.nonceTracker;\n\n if (!nonceTracker) {\n throw new Error(\n `Missing nonce tracker for network client ID - ${networkClientId}`,\n );\n }\n\n // Acquires the lock for the chainId + address and the nonceLock from the nonceTracker, then\n // couples them together by replacing the nonceLock's releaseLock method with\n // an anonymous function that calls releases both the original nonceLock and the\n // lock for the chainId.\n try {\n const nonceLock = await nonceTracker.getNonceLock(address);\n\n const releaseLock = (): void => {\n nonceLock.releaseLock();\n releaseLockForChainIdKey?.();\n };\n\n return {\n ...nonceLock,\n releaseLock,\n };\n } catch (error) {\n releaseLockForChainIdKey?.();\n throw error;\n }\n }\n\n checkForPendingTransactionAndStartPolling = (): void => {\n for (const [, trackers] of this.#trackingMap) {\n trackers.pendingTransactionTracker.startIfPendingTransactions();\n }\n };\n\n stopAllTracking(): void {\n if (this.#initInterval) {\n clearInterval(this.#initInterval);\n this.#initInterval = undefined;\n }\n\n for (const [networkClientId] of this.#trackingMap) {\n this.#stopTrackingByNetworkClientId(networkClientId);\n }\n }\n\n getNetworkClient({\n chainId,\n networkClientId: requestNetworkClientId,\n }: {\n chainId?: Hex;\n networkClientId?: NetworkClientId;\n }): NetworkClient & { id: NetworkClientId } {\n if (!requestNetworkClientId && !chainId) {\n throw new Error(\n 'Cannot locate network client without networkClientId or chainId',\n );\n }\n\n let networkClient: NetworkClient | undefined;\n let networkClientId = requestNetworkClientId;\n\n try {\n if (requestNetworkClientId) {\n networkClient = this.#getNetworkClientById(requestNetworkClientId);\n }\n } catch (error) {\n log('No network client found with ID', requestNetworkClientId);\n\n if (!chainId) {\n throw error;\n }\n }\n\n if (!networkClient && chainId) {\n networkClientId = this.#findNetworkClientIdByChainId(chainId);\n networkClient = this.#getNetworkClientById(networkClientId);\n }\n\n return {\n ...(networkClient as NetworkClient),\n id: networkClientId as NetworkClientId,\n };\n }\n\n readonly #refreshTrackingMap = (\n networkClients: NetworkClientRegistry,\n ): void => {\n const networkClientIds = Object.keys(networkClients);\n const existingNetworkClientIds = Array.from(this.#trackingMap.keys());\n\n // Remove tracking for NetworkClientIds that no longer exist\n const networkClientIdsToRemove = existingNetworkClientIds.filter(\n (id) => !networkClientIds.includes(id),\n );\n\n networkClientIdsToRemove.forEach((id) => {\n this.#stopTrackingByNetworkClientId(id);\n });\n\n // Start tracking new NetworkClientIds from the registry\n const networkClientIdsToAdd = networkClientIds.filter(\n (id) => !existingNetworkClientIds.includes(id),\n );\n\n networkClientIdsToAdd.forEach((id) => {\n this.#startTrackingByNetworkClientId(id);\n });\n\n if (networkClientIdsToAdd.length) {\n log('Added trackers', networkClientIdsToAdd);\n }\n\n if (networkClientIdsToRemove.length) {\n log('Removed trackers', networkClientIdsToRemove);\n }\n };\n\n #stopTrackingByNetworkClientId(networkClientId: NetworkClientId): void {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n trackers.pendingTransactionTracker.stop();\n this.#removePendingTransactionTrackerListeners(\n trackers.pendingTransactionTracker,\n );\n this.#trackingMap.delete(networkClientId);\n }\n }\n\n #startTrackingByNetworkClientId(networkClientId: NetworkClientId): void {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n return;\n }\n\n const {\n provider,\n blockTracker,\n configuration: { chainId },\n } = this.#getNetworkClientById(networkClientId);\n\n const nonceTracker = this.#createNonceTracker({\n provider,\n blockTracker,\n chainId,\n });\n\n const pendingTransactionTracker = this.#createPendingTransactionTracker({\n blockTracker,\n networkClientId,\n });\n\n this.#trackingMap.set(networkClientId, {\n nonceTracker,\n pendingTransactionTracker,\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MultichainTrackingHelper.cjs","sourceRoot":"","sources":["../../src/helpers/MultichainTrackingHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n NetworkClientId,\n NetworkController,\n NetworkClient,\n BlockTracker,\n Provider,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport type { NonceLock, NonceTracker } from '@metamask/nonce-tracker';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\n\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { PendingTransactionTracker } from './PendingTransactionTracker';\n\n/**\n * Registry of network clients provided by the NetworkController\n */\ntype NetworkClientRegistry = ReturnType<\n NetworkController['getNetworkClientRegistry']\n>;\n\nconst log = createModuleLogger(projectLogger, 'multichain-tracking');\n\nexport type MultichainTrackingHelperOptions = {\n findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n getNetworkClientById: NetworkController['getNetworkClientById'];\n getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }) => NonceTracker;\n createPendingTransactionTracker: (opts: {\n blockTracker: BlockTracker;\n networkClientId: NetworkClientId;\n }) => PendingTransactionTracker;\n onNetworkStateChange: (\n listener: (\n ...payload: NetworkControllerStateChangeEvent['payload']\n ) => void,\n ) => void;\n};\n\nexport class MultichainTrackingHelper {\n readonly #findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n\n readonly #getNetworkClientById: NetworkController['getNetworkClientById'];\n\n readonly #getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n readonly #removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n\n readonly #createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }) => NonceTracker;\n\n readonly #createPendingTransactionTracker: (opts: {\n blockTracker: BlockTracker;\n networkClientId: NetworkClientId;\n }) => PendingTransactionTracker;\n\n readonly #nonceMutexesByChainId = new Map<Hex, Map<string, Mutex>>();\n\n readonly #trackingMap: Map<\n NetworkClientId,\n {\n nonceTracker: NonceTracker;\n pendingTransactionTracker: PendingTransactionTracker;\n }\n > = new Map();\n\n constructor({\n findNetworkClientIdByChainId,\n getNetworkClientById,\n getNetworkClientRegistry,\n removePendingTransactionTrackerListeners,\n createNonceTracker,\n createPendingTransactionTracker,\n onNetworkStateChange,\n }: MultichainTrackingHelperOptions) {\n this.#findNetworkClientIdByChainId = findNetworkClientIdByChainId;\n this.#getNetworkClientById = getNetworkClientById;\n this.#getNetworkClientRegistry = getNetworkClientRegistry;\n\n this.#removePendingTransactionTrackerListeners =\n removePendingTransactionTrackerListeners;\n this.#createNonceTracker = createNonceTracker;\n this.#createPendingTransactionTracker = createPendingTransactionTracker;\n\n onNetworkStateChange((_, patches) => {\n const networkClients = this.#getNetworkClientRegistry();\n\n patches.forEach(({ op, path }) => {\n if (op === 'remove' && path[0] === 'networkConfigurations') {\n const networkClientId = path[1] as NetworkClientId;\n delete networkClients[networkClientId];\n }\n });\n\n this.#refreshTrackingMap(networkClients);\n });\n }\n\n initialize(): void {\n const networkClients = this.#getNetworkClientRegistry();\n\n this.#refreshTrackingMap(networkClients);\n\n log('Initialized');\n }\n\n has(networkClientId: NetworkClientId): boolean {\n return this.#trackingMap.has(networkClientId);\n }\n\n /**\n * Gets the mutex intended to guard the nonceTracker for a particular chainId and key .\n *\n * @param opts - The options object.\n * @param opts.chainId - The hex chainId.\n * @param opts.key - The hex address (or constant) pertaining to the chainId\n * @returns Mutex instance for the given chainId and key pair\n */\n async acquireNonceLockForChainIdKey({\n chainId,\n key = 'global',\n }: {\n chainId: Hex;\n key?: string;\n }): Promise<() => void> {\n let nonceMutexesForChainId = this.#nonceMutexesByChainId.get(chainId);\n if (!nonceMutexesForChainId) {\n nonceMutexesForChainId = new Map<string, Mutex>();\n this.#nonceMutexesByChainId.set(chainId, nonceMutexesForChainId);\n }\n let nonceMutexForKey = nonceMutexesForChainId.get(key);\n if (!nonceMutexForKey) {\n nonceMutexForKey = new Mutex();\n nonceMutexesForChainId.set(key, nonceMutexForKey);\n }\n\n return await nonceMutexForKey.acquire();\n }\n\n /**\n * Gets the next nonce according to the nonce-tracker.\n * Ensure `releaseLock` is called once processing of the `nonce` value is complete.\n *\n * @param address - The hex string address for the transaction.\n * @param networkClientId - The network client ID for the transaction, used to fetch the correct nonce tracker.\n * @returns object with the `nextNonce` `nonceDetails`, and the releaseLock.\n */\n async getNonceLock(\n address: string,\n networkClientId: NetworkClientId,\n ): Promise<NonceLock> {\n const networkClient = this.#getNetworkClientById(networkClientId);\n\n const releaseLockForChainIdKey = await this.acquireNonceLockForChainIdKey({\n chainId: networkClient.configuration.chainId,\n key: address,\n });\n\n const nonceTracker = this.#trackingMap.get(networkClientId)?.nonceTracker;\n\n if (!nonceTracker) {\n throw new Error(\n `Missing nonce tracker for network client ID - ${networkClientId}`,\n );\n }\n\n // Acquires the lock for the chainId + address and the nonceLock from the nonceTracker, then\n // couples them together by replacing the nonceLock's releaseLock method with\n // an anonymous function that calls releases both the original nonceLock and the\n // lock for the chainId.\n try {\n const nonceLock = await nonceTracker.getNonceLock(address);\n\n const releaseLock = (): void => {\n nonceLock.releaseLock();\n releaseLockForChainIdKey?.();\n };\n\n return {\n ...nonceLock,\n releaseLock,\n };\n } catch (error) {\n releaseLockForChainIdKey?.();\n throw error;\n }\n }\n\n checkForPendingTransactionAndStartPolling = (): void => {\n for (const [, trackers] of this.#trackingMap) {\n trackers.pendingTransactionTracker.startIfPendingTransactions();\n }\n };\n\n stopAllTracking(): void {\n for (const [networkClientId] of this.#trackingMap) {\n this.#stopTrackingByNetworkClientId(networkClientId);\n }\n }\n\n getNetworkClient({\n chainId,\n networkClientId: requestNetworkClientId,\n }: {\n chainId?: Hex;\n networkClientId?: NetworkClientId;\n }): NetworkClient & { id: NetworkClientId } {\n if (!requestNetworkClientId && !chainId) {\n throw new Error(\n 'Cannot locate network client without networkClientId or chainId',\n );\n }\n\n let networkClient: NetworkClient | undefined;\n let networkClientId = requestNetworkClientId;\n\n try {\n if (requestNetworkClientId) {\n networkClient = this.#getNetworkClientById(requestNetworkClientId);\n }\n } catch (error) {\n log('No network client found with ID', requestNetworkClientId);\n\n if (!chainId) {\n throw error;\n }\n }\n\n if (!networkClient && chainId) {\n networkClientId = this.#findNetworkClientIdByChainId(chainId);\n networkClient = this.#getNetworkClientById(networkClientId);\n }\n\n return {\n ...(networkClient as NetworkClient),\n id: networkClientId as NetworkClientId,\n };\n }\n\n readonly #refreshTrackingMap = (\n networkClients: NetworkClientRegistry,\n ): void => {\n const networkClientIds = Object.keys(networkClients);\n const existingNetworkClientIds = Array.from(this.#trackingMap.keys());\n\n // Remove tracking for NetworkClientIds that no longer exist\n const networkClientIdsToRemove = existingNetworkClientIds.filter(\n (id) => !networkClientIds.includes(id),\n );\n\n networkClientIdsToRemove.forEach((id) => {\n this.#stopTrackingByNetworkClientId(id);\n });\n\n // Start tracking new NetworkClientIds from the registry\n const networkClientIdsToAdd = networkClientIds.filter(\n (id) => !existingNetworkClientIds.includes(id),\n );\n\n networkClientIdsToAdd.forEach((id) => {\n this.#startTrackingByNetworkClientId(id);\n });\n\n if (networkClientIdsToAdd.length) {\n log('Added trackers', networkClientIdsToAdd);\n }\n\n if (networkClientIdsToRemove.length) {\n log('Removed trackers', networkClientIdsToRemove);\n }\n };\n\n #stopTrackingByNetworkClientId(networkClientId: NetworkClientId): void {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n trackers.pendingTransactionTracker.stop();\n this.#removePendingTransactionTrackerListeners(\n trackers.pendingTransactionTracker,\n );\n this.#trackingMap.delete(networkClientId);\n }\n }\n\n #startTrackingByNetworkClientId(networkClientId: NetworkClientId): void {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n return;\n }\n\n const {\n provider,\n blockTracker,\n configuration: { chainId },\n } = this.#getNetworkClientById(networkClientId);\n\n const nonceTracker = this.#createNonceTracker({\n provider,\n blockTracker,\n chainId,\n });\n\n const pendingTransactionTracker = this.#createPendingTransactionTracker({\n blockTracker,\n networkClientId,\n });\n\n this.#trackingMap.set(networkClientId, {\n nonceTracker,\n pendingTransactionTracker,\n });\n }\n}\n"]}
|
|
@@ -17,11 +17,11 @@ export type MultichainTrackingHelperOptions = {
|
|
|
17
17
|
networkClientId: NetworkClientId;
|
|
18
18
|
}) => PendingTransactionTracker;
|
|
19
19
|
onNetworkStateChange: (listener: (...payload: NetworkControllerStateChangeEvent['payload']) => void) => void;
|
|
20
|
-
onInitialized: () => void;
|
|
21
20
|
};
|
|
22
21
|
export declare class MultichainTrackingHelper {
|
|
23
22
|
#private;
|
|
24
|
-
constructor({ findNetworkClientIdByChainId, getNetworkClientById, getNetworkClientRegistry, removePendingTransactionTrackerListeners, createNonceTracker, createPendingTransactionTracker, onNetworkStateChange,
|
|
23
|
+
constructor({ findNetworkClientIdByChainId, getNetworkClientById, getNetworkClientRegistry, removePendingTransactionTrackerListeners, createNonceTracker, createPendingTransactionTracker, onNetworkStateChange, }: MultichainTrackingHelperOptions);
|
|
24
|
+
initialize(): void;
|
|
25
25
|
has(networkClientId: NetworkClientId): boolean;
|
|
26
26
|
/**
|
|
27
27
|
* Gets the mutex intended to guard the nonceTracker for a particular chainId and key .
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultichainTrackingHelper.d.cts","sourceRoot":"","sources":["../../src/helpers/MultichainTrackingHelper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,iCAAiC,EAClC,qCAAqC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,gCAAgC;AACvE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,wCAAoC;AAW7E,MAAM,MAAM,+BAA+B,GAAG;IAC5C,4BAA4B,EAAE,iBAAiB,CAAC,8BAA8B,CAAC,CAAC;IAChF,oBAAoB,EAAE,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;IAChE,wBAAwB,EAAE,iBAAiB,CAAC,0BAA0B,CAAC,CAAC;IAExE,wCAAwC,EAAE,CACxC,yBAAyB,EAAE,yBAAyB,KACjD,IAAI,CAAC;IACV,kBAAkB,EAAE,CAAC,IAAI,EAAE;QACzB,QAAQ,EAAE,QAAQ,CAAC;QACnB,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC;KACd,KAAK,YAAY,CAAC;IACnB,+BAA+B,EAAE,CAAC,IAAI,EAAE;QACtC,YAAY,EAAE,YAAY,CAAC;QAC3B,eAAe,EAAE,eAAe,CAAC;KAClC,KAAK,yBAAyB,CAAC;IAChC,oBAAoB,EAAE,CACpB,QAAQ,EAAE,CACR,GAAG,OAAO,EAAE,iCAAiC,CAAC,SAAS,CAAC,KACrD,IAAI,KACN,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"MultichainTrackingHelper.d.cts","sourceRoot":"","sources":["../../src/helpers/MultichainTrackingHelper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,iCAAiC,EAClC,qCAAqC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,gCAAgC;AACvE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,wCAAoC;AAW7E,MAAM,MAAM,+BAA+B,GAAG;IAC5C,4BAA4B,EAAE,iBAAiB,CAAC,8BAA8B,CAAC,CAAC;IAChF,oBAAoB,EAAE,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;IAChE,wBAAwB,EAAE,iBAAiB,CAAC,0BAA0B,CAAC,CAAC;IAExE,wCAAwC,EAAE,CACxC,yBAAyB,EAAE,yBAAyB,KACjD,IAAI,CAAC;IACV,kBAAkB,EAAE,CAAC,IAAI,EAAE;QACzB,QAAQ,EAAE,QAAQ,CAAC;QACnB,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC;KACd,KAAK,YAAY,CAAC;IACnB,+BAA+B,EAAE,CAAC,IAAI,EAAE;QACtC,YAAY,EAAE,YAAY,CAAC;QAC3B,eAAe,EAAE,eAAe,CAAC;KAClC,KAAK,yBAAyB,CAAC;IAChC,oBAAoB,EAAE,CACpB,QAAQ,EAAE,CACR,GAAG,OAAO,EAAE,iCAAiC,CAAC,SAAS,CAAC,KACrD,IAAI,KACN,IAAI,CAAC;CACX,CAAC;AAEF,qBAAa,wBAAwB;;gBAgCvB,EACV,4BAA4B,EAC5B,oBAAoB,EACpB,wBAAwB,EACxB,wCAAwC,EACxC,kBAAkB,EAClB,+BAA+B,EAC/B,oBAAoB,GACrB,EAAE,+BAA+B;IAwBlC,UAAU,IAAI,IAAI;IAQlB,GAAG,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO;IAI9C;;;;;;;OAOG;IACG,6BAA6B,CAAC,EAClC,OAAO,EACP,GAAc,GACf,EAAE;QACD,OAAO,EAAE,GAAG,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAevB;;;;;;;OAOG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,SAAS,CAAC;IAsCrB,yCAAyC,QAAO,IAAI,CAIlD;IAEF,eAAe,IAAI,IAAI;IAMvB,gBAAgB,CAAC,EACf,OAAO,EACP,eAAe,EAAE,sBAAsB,GACxC,EAAE;QACD,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,eAAe,CAAC,EAAE,eAAe,CAAC;KACnC,GAAG,aAAa,GAAG;QAAE,EAAE,EAAE,eAAe,CAAA;KAAE;CAyG5C"}
|
|
@@ -17,11 +17,11 @@ export type MultichainTrackingHelperOptions = {
|
|
|
17
17
|
networkClientId: NetworkClientId;
|
|
18
18
|
}) => PendingTransactionTracker;
|
|
19
19
|
onNetworkStateChange: (listener: (...payload: NetworkControllerStateChangeEvent['payload']) => void) => void;
|
|
20
|
-
onInitialized: () => void;
|
|
21
20
|
};
|
|
22
21
|
export declare class MultichainTrackingHelper {
|
|
23
22
|
#private;
|
|
24
|
-
constructor({ findNetworkClientIdByChainId, getNetworkClientById, getNetworkClientRegistry, removePendingTransactionTrackerListeners, createNonceTracker, createPendingTransactionTracker, onNetworkStateChange,
|
|
23
|
+
constructor({ findNetworkClientIdByChainId, getNetworkClientById, getNetworkClientRegistry, removePendingTransactionTrackerListeners, createNonceTracker, createPendingTransactionTracker, onNetworkStateChange, }: MultichainTrackingHelperOptions);
|
|
24
|
+
initialize(): void;
|
|
25
25
|
has(networkClientId: NetworkClientId): boolean;
|
|
26
26
|
/**
|
|
27
27
|
* Gets the mutex intended to guard the nonceTracker for a particular chainId and key .
|