@metamask/transaction-controller 21.2.0 → 23.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -1
- package/dist/TransactionController.d.ts +113 -113
- package/dist/TransactionController.d.ts.map +1 -1
- package/dist/TransactionController.js +315 -181
- package/dist/TransactionController.js.map +1 -1
- package/dist/helpers/EtherscanRemoteTransactionSource.d.ts.map +1 -1
- package/dist/helpers/EtherscanRemoteTransactionSource.js +28 -8
- package/dist/helpers/EtherscanRemoteTransactionSource.js.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.d.ts +17 -3
- package/dist/helpers/IncomingTransactionHelper.d.ts.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.js +17 -14
- package/dist/helpers/IncomingTransactionHelper.js.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.d.ts +72 -0
- package/dist/helpers/MultichainTrackingHelper.d.ts.map +1 -0
- package/dist/helpers/MultichainTrackingHelper.js +292 -0
- package/dist/helpers/MultichainTrackingHelper.js.map +1 -0
- package/dist/helpers/PendingTransactionTracker.d.ts +13 -7
- package/dist/helpers/PendingTransactionTracker.d.ts.map +1 -1
- package/dist/helpers/PendingTransactionTracker.js +43 -23
- package/dist/helpers/PendingTransactionTracker.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/etherscan.d.ts +7 -0
- package/dist/utils/etherscan.d.ts.map +1 -1
- package/dist/utils/etherscan.js +17 -6
- package/dist/utils/etherscan.js.map +1 -1
- package/dist/utils/gas-fees.d.ts +4 -3
- package/dist/utils/gas-fees.d.ts.map +1 -1
- package/dist/utils/gas-fees.js +6 -2
- package/dist/utils/gas-fees.js.map +1 -1
- package/dist/utils/gas.d.ts +3 -2
- package/dist/utils/gas.d.ts.map +1 -1
- package/dist/utils/gas.js +4 -5
- package/dist/utils/gas.js.map +1 -1
- package/dist/utils/nonce.d.ts +3 -3
- package/dist/utils/nonce.d.ts.map +1 -1
- package/dist/utils/nonce.js +3 -3
- package/dist/utils/nonce.js.map +1 -1
- package/package.json +9 -8
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
12
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
13
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
14
|
+
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");
|
|
15
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
16
|
+
};
|
|
17
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
18
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
19
|
+
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");
|
|
20
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
21
|
+
};
|
|
22
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
23
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
24
|
+
};
|
|
25
|
+
var _MultichainTrackingHelper_instances, _MultichainTrackingHelper_isMultichainEnabled, _MultichainTrackingHelper_provider, _MultichainTrackingHelper_nonceTracker, _MultichainTrackingHelper_incomingTransactionOptions, _MultichainTrackingHelper_findNetworkClientIdByChainId, _MultichainTrackingHelper_getNetworkClientById, _MultichainTrackingHelper_getNetworkClientRegistry, _MultichainTrackingHelper_removeIncomingTransactionHelperListeners, _MultichainTrackingHelper_removePendingTransactionTrackerListeners, _MultichainTrackingHelper_createNonceTracker, _MultichainTrackingHelper_createIncomingTransactionHelper, _MultichainTrackingHelper_createPendingTransactionTracker, _MultichainTrackingHelper_nonceMutexesByChainId, _MultichainTrackingHelper_trackingMap, _MultichainTrackingHelper_etherscanRemoteTransactionSourcesMap, _MultichainTrackingHelper_refreshTrackingMap, _MultichainTrackingHelper_stopTrackingByNetworkClientId, _MultichainTrackingHelper_startTrackingByNetworkClientId, _MultichainTrackingHelper_refreshEtherscanRemoteTransactionSources;
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.MultichainTrackingHelper = void 0;
|
|
28
|
+
const eth_query_1 = __importDefault(require("@metamask/eth-query"));
|
|
29
|
+
const async_mutex_1 = require("async-mutex");
|
|
30
|
+
const logger_1 = require("../logger");
|
|
31
|
+
const EtherscanRemoteTransactionSource_1 = require("./EtherscanRemoteTransactionSource");
|
|
32
|
+
class MultichainTrackingHelper {
|
|
33
|
+
constructor({ isMultichainEnabled, provider, nonceTracker, incomingTransactionOptions, findNetworkClientIdByChainId, getNetworkClientById, getNetworkClientRegistry, removeIncomingTransactionHelperListeners, removePendingTransactionTrackerListeners, createNonceTracker, createIncomingTransactionHelper, createPendingTransactionTracker, onNetworkStateChange, }) {
|
|
34
|
+
_MultichainTrackingHelper_instances.add(this);
|
|
35
|
+
_MultichainTrackingHelper_isMultichainEnabled.set(this, void 0);
|
|
36
|
+
_MultichainTrackingHelper_provider.set(this, void 0);
|
|
37
|
+
_MultichainTrackingHelper_nonceTracker.set(this, void 0);
|
|
38
|
+
_MultichainTrackingHelper_incomingTransactionOptions.set(this, void 0);
|
|
39
|
+
_MultichainTrackingHelper_findNetworkClientIdByChainId.set(this, void 0);
|
|
40
|
+
_MultichainTrackingHelper_getNetworkClientById.set(this, void 0);
|
|
41
|
+
_MultichainTrackingHelper_getNetworkClientRegistry.set(this, void 0);
|
|
42
|
+
_MultichainTrackingHelper_removeIncomingTransactionHelperListeners.set(this, void 0);
|
|
43
|
+
_MultichainTrackingHelper_removePendingTransactionTrackerListeners.set(this, void 0);
|
|
44
|
+
_MultichainTrackingHelper_createNonceTracker.set(this, void 0);
|
|
45
|
+
_MultichainTrackingHelper_createIncomingTransactionHelper.set(this, void 0);
|
|
46
|
+
_MultichainTrackingHelper_createPendingTransactionTracker.set(this, void 0);
|
|
47
|
+
_MultichainTrackingHelper_nonceMutexesByChainId.set(this, new Map());
|
|
48
|
+
_MultichainTrackingHelper_trackingMap.set(this, new Map());
|
|
49
|
+
_MultichainTrackingHelper_etherscanRemoteTransactionSourcesMap.set(this, new Map());
|
|
50
|
+
this.checkForPendingTransactionAndStartPolling = () => {
|
|
51
|
+
for (const [, trackers] of __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f")) {
|
|
52
|
+
trackers.pendingTransactionTracker.startIfPendingTransactions();
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
_MultichainTrackingHelper_refreshTrackingMap.set(this, (networkClients) => {
|
|
56
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_refreshEtherscanRemoteTransactionSources, "f").call(this, networkClients);
|
|
57
|
+
const networkClientIds = Object.keys(networkClients);
|
|
58
|
+
const existingNetworkClientIds = Array.from(__classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").keys());
|
|
59
|
+
// Remove tracking for NetworkClientIds that no longer exist
|
|
60
|
+
const networkClientIdsToRemove = existingNetworkClientIds.filter((id) => !networkClientIds.includes(id));
|
|
61
|
+
networkClientIdsToRemove.forEach((id) => {
|
|
62
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_instances, "m", _MultichainTrackingHelper_stopTrackingByNetworkClientId).call(this, id);
|
|
63
|
+
});
|
|
64
|
+
// Start tracking new NetworkClientIds from the registry
|
|
65
|
+
const networkClientIdsToAdd = networkClientIds.filter((id) => !existingNetworkClientIds.includes(id));
|
|
66
|
+
networkClientIdsToAdd.forEach((id) => {
|
|
67
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_instances, "m", _MultichainTrackingHelper_startTrackingByNetworkClientId).call(this, id);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
_MultichainTrackingHelper_refreshEtherscanRemoteTransactionSources.set(this, (networkClients) => {
|
|
71
|
+
// this will be prettier when we have consolidated network clients with a single chainId:
|
|
72
|
+
// check if there are still other network clients using the same chainId
|
|
73
|
+
// if not remove the etherscanRemoteTransaction source from the map
|
|
74
|
+
const chainIdsInRegistry = new Set();
|
|
75
|
+
Object.values(networkClients).forEach((networkClient) => chainIdsInRegistry.add(networkClient.configuration.chainId));
|
|
76
|
+
const existingChainIds = Array.from(__classPrivateFieldGet(this, _MultichainTrackingHelper_etherscanRemoteTransactionSourcesMap, "f").keys());
|
|
77
|
+
const chainIdsToRemove = existingChainIds.filter((chainId) => !chainIdsInRegistry.has(chainId));
|
|
78
|
+
chainIdsToRemove.forEach((chainId) => {
|
|
79
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_etherscanRemoteTransactionSourcesMap, "f").delete(chainId);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_isMultichainEnabled, isMultichainEnabled, "f");
|
|
83
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_provider, provider, "f");
|
|
84
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_nonceTracker, nonceTracker, "f");
|
|
85
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_incomingTransactionOptions, incomingTransactionOptions, "f");
|
|
86
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_findNetworkClientIdByChainId, findNetworkClientIdByChainId, "f");
|
|
87
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_getNetworkClientById, getNetworkClientById, "f");
|
|
88
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_getNetworkClientRegistry, getNetworkClientRegistry, "f");
|
|
89
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_removeIncomingTransactionHelperListeners, removeIncomingTransactionHelperListeners, "f");
|
|
90
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_removePendingTransactionTrackerListeners, removePendingTransactionTrackerListeners, "f");
|
|
91
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_createNonceTracker, createNonceTracker, "f");
|
|
92
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_createIncomingTransactionHelper, createIncomingTransactionHelper, "f");
|
|
93
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_createPendingTransactionTracker, createPendingTransactionTracker, "f");
|
|
94
|
+
onNetworkStateChange((_, patches) => {
|
|
95
|
+
if (__classPrivateFieldGet(this, _MultichainTrackingHelper_isMultichainEnabled, "f")) {
|
|
96
|
+
const networkClients = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientRegistry, "f").call(this);
|
|
97
|
+
patches.forEach(({ op, path }) => {
|
|
98
|
+
if (op === 'remove' && path[0] === 'networkConfigurations') {
|
|
99
|
+
const networkClientId = path[1];
|
|
100
|
+
delete networkClients[networkClientId];
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_refreshTrackingMap, "f").call(this, networkClients);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
initialize() {
|
|
108
|
+
if (!__classPrivateFieldGet(this, _MultichainTrackingHelper_isMultichainEnabled, "f")) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
const networkClients = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientRegistry, "f").call(this);
|
|
112
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_refreshTrackingMap, "f").call(this, networkClients);
|
|
113
|
+
}
|
|
114
|
+
has(networkClientId) {
|
|
115
|
+
return __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").has(networkClientId);
|
|
116
|
+
}
|
|
117
|
+
getEthQuery({ networkClientId, chainId, } = {}) {
|
|
118
|
+
if (!__classPrivateFieldGet(this, _MultichainTrackingHelper_isMultichainEnabled, "f")) {
|
|
119
|
+
return new eth_query_1.default(__classPrivateFieldGet(this, _MultichainTrackingHelper_provider, "f"));
|
|
120
|
+
}
|
|
121
|
+
let networkClient;
|
|
122
|
+
if (networkClientId) {
|
|
123
|
+
try {
|
|
124
|
+
networkClient = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientById, "f").call(this, networkClientId);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
(0, logger_1.incomingTransactionsLogger)('failed to get network client by networkClientId');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (!networkClient && chainId) {
|
|
131
|
+
try {
|
|
132
|
+
networkClientId = __classPrivateFieldGet(this, _MultichainTrackingHelper_findNetworkClientIdByChainId, "f").call(this, chainId);
|
|
133
|
+
networkClient = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientById, "f").call(this, networkClientId);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
(0, logger_1.incomingTransactionsLogger)('failed to get network client by chainId');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (networkClient) {
|
|
140
|
+
return new eth_query_1.default(networkClient.provider);
|
|
141
|
+
}
|
|
142
|
+
// NOTE(JL): we're not ready to drop globally selected ethQuery yet.
|
|
143
|
+
// Some calls to getEthQuery only have access to optional networkClientId
|
|
144
|
+
// throw new Error('failed to get eth query instance');
|
|
145
|
+
return new eth_query_1.default(__classPrivateFieldGet(this, _MultichainTrackingHelper_provider, "f"));
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Gets the mutex intended to guard the nonceTracker for a particular chainId and key .
|
|
149
|
+
*
|
|
150
|
+
* @param opts - The options object.
|
|
151
|
+
* @param opts.chainId - The hex chainId.
|
|
152
|
+
* @param opts.key - The hex address (or constant) pertaining to the chainId
|
|
153
|
+
* @returns Mutex instance for the given chainId and key pair
|
|
154
|
+
*/
|
|
155
|
+
acquireNonceLockForChainIdKey({ chainId, key = 'global', }) {
|
|
156
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
157
|
+
let nonceMutexesForChainId = __classPrivateFieldGet(this, _MultichainTrackingHelper_nonceMutexesByChainId, "f").get(chainId);
|
|
158
|
+
if (!nonceMutexesForChainId) {
|
|
159
|
+
nonceMutexesForChainId = new Map();
|
|
160
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_nonceMutexesByChainId, "f").set(chainId, nonceMutexesForChainId);
|
|
161
|
+
}
|
|
162
|
+
let nonceMutexForKey = nonceMutexesForChainId.get(key);
|
|
163
|
+
if (!nonceMutexForKey) {
|
|
164
|
+
nonceMutexForKey = new async_mutex_1.Mutex();
|
|
165
|
+
nonceMutexesForChainId.set(key, nonceMutexForKey);
|
|
166
|
+
}
|
|
167
|
+
return yield nonceMutexForKey.acquire();
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Gets the next nonce according to the nonce-tracker.
|
|
172
|
+
* Ensure `releaseLock` is called once processing of the `nonce` value is complete.
|
|
173
|
+
*
|
|
174
|
+
* @param address - The hex string address for the transaction.
|
|
175
|
+
* @param networkClientId - The network client ID for the transaction, used to fetch the correct nonce tracker.
|
|
176
|
+
* @returns object with the `nextNonce` `nonceDetails`, and the releaseLock.
|
|
177
|
+
*/
|
|
178
|
+
getNonceLock(address, networkClientId) {
|
|
179
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
180
|
+
let releaseLockForChainIdKey;
|
|
181
|
+
let nonceTracker = __classPrivateFieldGet(this, _MultichainTrackingHelper_nonceTracker, "f");
|
|
182
|
+
if (networkClientId && __classPrivateFieldGet(this, _MultichainTrackingHelper_isMultichainEnabled, "f")) {
|
|
183
|
+
const networkClient = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientById, "f").call(this, networkClientId);
|
|
184
|
+
releaseLockForChainIdKey = yield this.acquireNonceLockForChainIdKey({
|
|
185
|
+
chainId: networkClient.configuration.chainId,
|
|
186
|
+
key: address,
|
|
187
|
+
});
|
|
188
|
+
const trackers = __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").get(networkClientId);
|
|
189
|
+
if (!trackers) {
|
|
190
|
+
throw new Error('missing nonceTracker for networkClientId');
|
|
191
|
+
}
|
|
192
|
+
nonceTracker = trackers.nonceTracker;
|
|
193
|
+
}
|
|
194
|
+
// Acquires the lock for the chainId + address and the nonceLock from the nonceTracker, then
|
|
195
|
+
// couples them together by replacing the nonceLock's releaseLock method with
|
|
196
|
+
// an anonymous function that calls releases both the original nonceLock and the
|
|
197
|
+
// lock for the chainId.
|
|
198
|
+
try {
|
|
199
|
+
const nonceLock = yield nonceTracker.getNonceLock(address);
|
|
200
|
+
return Object.assign(Object.assign({}, nonceLock), { releaseLock: () => {
|
|
201
|
+
nonceLock.releaseLock();
|
|
202
|
+
releaseLockForChainIdKey === null || releaseLockForChainIdKey === void 0 ? void 0 : releaseLockForChainIdKey();
|
|
203
|
+
} });
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
releaseLockForChainIdKey === null || releaseLockForChainIdKey === void 0 ? void 0 : releaseLockForChainIdKey();
|
|
207
|
+
throw err;
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
startIncomingTransactionPolling(networkClientIds = []) {
|
|
212
|
+
networkClientIds.forEach((networkClientId) => {
|
|
213
|
+
var _a;
|
|
214
|
+
(_a = __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").get(networkClientId)) === null || _a === void 0 ? void 0 : _a.incomingTransactionHelper.start();
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
stopIncomingTransactionPolling(networkClientIds = []) {
|
|
218
|
+
networkClientIds.forEach((networkClientId) => {
|
|
219
|
+
var _a;
|
|
220
|
+
(_a = __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").get(networkClientId)) === null || _a === void 0 ? void 0 : _a.incomingTransactionHelper.stop();
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
stopAllIncomingTransactionPolling() {
|
|
224
|
+
for (const [, trackers] of __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f")) {
|
|
225
|
+
trackers.incomingTransactionHelper.stop();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
updateIncomingTransactions(networkClientIds = []) {
|
|
229
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
230
|
+
const promises = yield Promise.allSettled(networkClientIds.map((networkClientId) => __awaiter(this, void 0, void 0, function* () {
|
|
231
|
+
var _a;
|
|
232
|
+
return yield ((_a = __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f")
|
|
233
|
+
.get(networkClientId)) === null || _a === void 0 ? void 0 : _a.incomingTransactionHelper.update());
|
|
234
|
+
})));
|
|
235
|
+
promises
|
|
236
|
+
.filter((result) => result.status === 'rejected')
|
|
237
|
+
.forEach((result) => {
|
|
238
|
+
(0, logger_1.incomingTransactionsLogger)('failed to update incoming transactions', result.reason);
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
stopAllTracking() {
|
|
243
|
+
for (const [networkClientId] of __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f")) {
|
|
244
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_instances, "m", _MultichainTrackingHelper_stopTrackingByNetworkClientId).call(this, networkClientId);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
exports.MultichainTrackingHelper = MultichainTrackingHelper;
|
|
249
|
+
_MultichainTrackingHelper_isMultichainEnabled = new WeakMap(), _MultichainTrackingHelper_provider = new WeakMap(), _MultichainTrackingHelper_nonceTracker = new WeakMap(), _MultichainTrackingHelper_incomingTransactionOptions = new WeakMap(), _MultichainTrackingHelper_findNetworkClientIdByChainId = new WeakMap(), _MultichainTrackingHelper_getNetworkClientById = new WeakMap(), _MultichainTrackingHelper_getNetworkClientRegistry = new WeakMap(), _MultichainTrackingHelper_removeIncomingTransactionHelperListeners = new WeakMap(), _MultichainTrackingHelper_removePendingTransactionTrackerListeners = new WeakMap(), _MultichainTrackingHelper_createNonceTracker = new WeakMap(), _MultichainTrackingHelper_createIncomingTransactionHelper = new WeakMap(), _MultichainTrackingHelper_createPendingTransactionTracker = new WeakMap(), _MultichainTrackingHelper_nonceMutexesByChainId = new WeakMap(), _MultichainTrackingHelper_trackingMap = new WeakMap(), _MultichainTrackingHelper_etherscanRemoteTransactionSourcesMap = new WeakMap(), _MultichainTrackingHelper_refreshTrackingMap = new WeakMap(), _MultichainTrackingHelper_refreshEtherscanRemoteTransactionSources = new WeakMap(), _MultichainTrackingHelper_instances = new WeakSet(), _MultichainTrackingHelper_stopTrackingByNetworkClientId = function _MultichainTrackingHelper_stopTrackingByNetworkClientId(networkClientId) {
|
|
250
|
+
const trackers = __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").get(networkClientId);
|
|
251
|
+
if (trackers) {
|
|
252
|
+
trackers.pendingTransactionTracker.stop();
|
|
253
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_removePendingTransactionTrackerListeners, "f").call(this, trackers.pendingTransactionTracker);
|
|
254
|
+
trackers.incomingTransactionHelper.stop();
|
|
255
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_removeIncomingTransactionHelperListeners, "f").call(this, trackers.incomingTransactionHelper);
|
|
256
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").delete(networkClientId);
|
|
257
|
+
}
|
|
258
|
+
}, _MultichainTrackingHelper_startTrackingByNetworkClientId = function _MultichainTrackingHelper_startTrackingByNetworkClientId(networkClientId) {
|
|
259
|
+
const trackers = __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").get(networkClientId);
|
|
260
|
+
if (trackers) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
const { provider, blockTracker, configuration: { chainId }, } = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientById, "f").call(this, networkClientId);
|
|
264
|
+
let etherscanRemoteTransactionSource = __classPrivateFieldGet(this, _MultichainTrackingHelper_etherscanRemoteTransactionSourcesMap, "f").get(chainId);
|
|
265
|
+
if (!etherscanRemoteTransactionSource) {
|
|
266
|
+
etherscanRemoteTransactionSource = new EtherscanRemoteTransactionSource_1.EtherscanRemoteTransactionSource({
|
|
267
|
+
includeTokenTransfers: __classPrivateFieldGet(this, _MultichainTrackingHelper_incomingTransactionOptions, "f").includeTokenTransfers,
|
|
268
|
+
});
|
|
269
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_etherscanRemoteTransactionSourcesMap, "f").set(chainId, etherscanRemoteTransactionSource);
|
|
270
|
+
}
|
|
271
|
+
const nonceTracker = __classPrivateFieldGet(this, _MultichainTrackingHelper_createNonceTracker, "f").call(this, {
|
|
272
|
+
provider,
|
|
273
|
+
blockTracker,
|
|
274
|
+
chainId,
|
|
275
|
+
});
|
|
276
|
+
const incomingTransactionHelper = __classPrivateFieldGet(this, _MultichainTrackingHelper_createIncomingTransactionHelper, "f").call(this, {
|
|
277
|
+
blockTracker,
|
|
278
|
+
etherscanRemoteTransactionSource,
|
|
279
|
+
chainId,
|
|
280
|
+
});
|
|
281
|
+
const pendingTransactionTracker = __classPrivateFieldGet(this, _MultichainTrackingHelper_createPendingTransactionTracker, "f").call(this, {
|
|
282
|
+
provider,
|
|
283
|
+
blockTracker,
|
|
284
|
+
chainId,
|
|
285
|
+
});
|
|
286
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").set(networkClientId, {
|
|
287
|
+
nonceTracker,
|
|
288
|
+
incomingTransactionHelper,
|
|
289
|
+
pendingTransactionTracker,
|
|
290
|
+
});
|
|
291
|
+
};
|
|
292
|
+
//# sourceMappingURL=MultichainTrackingHelper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultichainTrackingHelper.js","sourceRoot":"","sources":["../../src/helpers/MultichainTrackingHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import EthQuery from '@metamask/eth-query';\nimport type {\n NetworkClientId,\n NetworkController,\n NetworkClient,\n BlockTracker,\n Provider,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport type { NonceLock, NonceTracker } from 'nonce-tracker';\n\nimport { incomingTransactionsLogger as log } from '../logger';\nimport { EtherscanRemoteTransactionSource } from './EtherscanRemoteTransactionSource';\nimport type {\n IncomingTransactionHelper,\n IncomingTransactionOptions,\n} from './IncomingTransactionHelper';\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\nexport type MultichainTrackingHelperOptions = {\n isMultichainEnabled: boolean;\n provider: Provider;\n nonceTracker: NonceTracker;\n incomingTransactionOptions: IncomingTransactionOptions;\n\n findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n getNetworkClientById: NetworkController['getNetworkClientById'];\n getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n removeIncomingTransactionHelperListeners: (\n IncomingTransactionHelper: IncomingTransactionHelper,\n ) => void;\n removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId?: Hex;\n }) => NonceTracker;\n createIncomingTransactionHelper: (opts: {\n blockTracker: BlockTracker;\n etherscanRemoteTransactionSource: EtherscanRemoteTransactionSource;\n chainId?: Hex;\n }) => IncomingTransactionHelper;\n createPendingTransactionTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId?: Hex;\n }) => PendingTransactionTracker;\n onNetworkStateChange: (\n listener: (\n ...payload: NetworkControllerStateChangeEvent['payload']\n ) => void,\n ) => void;\n};\n\nexport class MultichainTrackingHelper {\n #isMultichainEnabled: boolean;\n\n readonly #provider: Provider;\n\n readonly #nonceTracker: NonceTracker;\n\n readonly #incomingTransactionOptions: IncomingTransactionOptions;\n\n readonly #findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n\n readonly #getNetworkClientById: NetworkController['getNetworkClientById'];\n\n readonly #getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n readonly #removeIncomingTransactionHelperListeners: (\n IncomingTransactionHelper: IncomingTransactionHelper,\n ) => void;\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 #createIncomingTransactionHelper: (opts: {\n blockTracker: BlockTracker;\n chainId?: Hex;\n etherscanRemoteTransactionSource: EtherscanRemoteTransactionSource;\n }) => IncomingTransactionHelper;\n\n readonly #createPendingTransactionTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId?: Hex;\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 incomingTransactionHelper: IncomingTransactionHelper;\n }\n > = new Map();\n\n readonly #etherscanRemoteTransactionSourcesMap: Map<\n Hex,\n EtherscanRemoteTransactionSource\n > = new Map();\n\n constructor({\n isMultichainEnabled,\n provider,\n nonceTracker,\n incomingTransactionOptions,\n findNetworkClientIdByChainId,\n getNetworkClientById,\n getNetworkClientRegistry,\n removeIncomingTransactionHelperListeners,\n removePendingTransactionTrackerListeners,\n createNonceTracker,\n createIncomingTransactionHelper,\n createPendingTransactionTracker,\n onNetworkStateChange,\n }: MultichainTrackingHelperOptions) {\n this.#isMultichainEnabled = isMultichainEnabled;\n this.#provider = provider;\n this.#nonceTracker = nonceTracker;\n this.#incomingTransactionOptions = incomingTransactionOptions;\n\n this.#findNetworkClientIdByChainId = findNetworkClientIdByChainId;\n this.#getNetworkClientById = getNetworkClientById;\n this.#getNetworkClientRegistry = getNetworkClientRegistry;\n\n this.#removeIncomingTransactionHelperListeners =\n removeIncomingTransactionHelperListeners;\n this.#removePendingTransactionTrackerListeners =\n removePendingTransactionTrackerListeners;\n this.#createNonceTracker = createNonceTracker;\n this.#createIncomingTransactionHelper = createIncomingTransactionHelper;\n this.#createPendingTransactionTracker = createPendingTransactionTracker;\n\n onNetworkStateChange((_, patches) => {\n if (this.#isMultichainEnabled) {\n const networkClients = this.#getNetworkClientRegistry();\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\n initialize() {\n if (!this.#isMultichainEnabled) {\n return;\n }\n const networkClients = this.#getNetworkClientRegistry();\n this.#refreshTrackingMap(networkClients);\n }\n\n has(networkClientId: NetworkClientId) {\n return this.#trackingMap.has(networkClientId);\n }\n\n getEthQuery({\n networkClientId,\n chainId,\n }: {\n networkClientId?: NetworkClientId;\n chainId?: Hex;\n } = {}): EthQuery {\n if (!this.#isMultichainEnabled) {\n return new EthQuery(this.#provider);\n }\n let networkClient: NetworkClient | undefined;\n\n if (networkClientId) {\n try {\n networkClient = this.#getNetworkClientById(networkClientId);\n } catch (err) {\n log('failed to get network client by networkClientId');\n }\n }\n if (!networkClient && chainId) {\n try {\n networkClientId = this.#findNetworkClientIdByChainId(chainId);\n networkClient = this.#getNetworkClientById(networkClientId);\n } catch (err) {\n log('failed to get network client by chainId');\n }\n }\n\n if (networkClient) {\n return new EthQuery(networkClient.provider);\n }\n\n // NOTE(JL): we're not ready to drop globally selected ethQuery yet.\n // Some calls to getEthQuery only have access to optional networkClientId\n // throw new Error('failed to get eth query instance');\n return new EthQuery(this.#provider);\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 let releaseLockForChainIdKey: (() => void) | undefined;\n let nonceTracker = this.#nonceTracker;\n if (networkClientId && this.#isMultichainEnabled) {\n const networkClient = this.#getNetworkClientById(networkClientId);\n releaseLockForChainIdKey = await this.acquireNonceLockForChainIdKey({\n chainId: networkClient.configuration.chainId,\n key: address,\n });\n const trackers = this.#trackingMap.get(networkClientId);\n if (!trackers) {\n throw new Error('missing nonceTracker for networkClientId');\n }\n nonceTracker = trackers.nonceTracker;\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 return {\n ...nonceLock,\n releaseLock: () => {\n nonceLock.releaseLock();\n releaseLockForChainIdKey?.();\n },\n };\n } catch (err) {\n releaseLockForChainIdKey?.();\n throw err;\n }\n }\n\n startIncomingTransactionPolling(networkClientIds: NetworkClientId[] = []) {\n networkClientIds.forEach((networkClientId) => {\n this.#trackingMap.get(networkClientId)?.incomingTransactionHelper.start();\n });\n }\n\n stopIncomingTransactionPolling(networkClientIds: NetworkClientId[] = []) {\n networkClientIds.forEach((networkClientId) => {\n this.#trackingMap.get(networkClientId)?.incomingTransactionHelper.stop();\n });\n }\n\n stopAllIncomingTransactionPolling() {\n for (const [, trackers] of this.#trackingMap) {\n trackers.incomingTransactionHelper.stop();\n }\n }\n\n async updateIncomingTransactions(networkClientIds: NetworkClientId[] = []) {\n const promises = await Promise.allSettled(\n networkClientIds.map(async (networkClientId) => {\n return await this.#trackingMap\n .get(networkClientId)\n ?.incomingTransactionHelper.update();\n }),\n );\n\n promises\n .filter((result) => result.status === 'rejected')\n .forEach((result) => {\n log(\n 'failed to update incoming transactions',\n (result as PromiseRejectedResult).reason,\n );\n });\n }\n\n checkForPendingTransactionAndStartPolling = () => {\n for (const [, trackers] of this.#trackingMap) {\n trackers.pendingTransactionTracker.startIfPendingTransactions();\n }\n };\n\n stopAllTracking() {\n for (const [networkClientId] of this.#trackingMap) {\n this.#stopTrackingByNetworkClientId(networkClientId);\n }\n }\n\n #refreshTrackingMap = (networkClients: NetworkClientRegistry) => {\n this.#refreshEtherscanRemoteTransactionSources(networkClients);\n\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 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 networkClientIdsToAdd.forEach((id) => {\n this.#startTrackingByNetworkClientId(id);\n });\n };\n\n #stopTrackingByNetworkClientId(networkClientId: NetworkClientId) {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n trackers.pendingTransactionTracker.stop();\n this.#removePendingTransactionTrackerListeners(\n trackers.pendingTransactionTracker,\n );\n trackers.incomingTransactionHelper.stop();\n this.#removeIncomingTransactionHelperListeners(\n trackers.incomingTransactionHelper,\n );\n this.#trackingMap.delete(networkClientId);\n }\n }\n\n #startTrackingByNetworkClientId(networkClientId: NetworkClientId) {\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 let etherscanRemoteTransactionSource =\n this.#etherscanRemoteTransactionSourcesMap.get(chainId);\n if (!etherscanRemoteTransactionSource) {\n etherscanRemoteTransactionSource = new EtherscanRemoteTransactionSource({\n includeTokenTransfers:\n this.#incomingTransactionOptions.includeTokenTransfers,\n });\n this.#etherscanRemoteTransactionSourcesMap.set(\n chainId,\n etherscanRemoteTransactionSource,\n );\n }\n\n const nonceTracker = this.#createNonceTracker({\n provider,\n blockTracker,\n chainId,\n });\n\n const incomingTransactionHelper = this.#createIncomingTransactionHelper({\n blockTracker,\n etherscanRemoteTransactionSource,\n chainId,\n });\n\n const pendingTransactionTracker = this.#createPendingTransactionTracker({\n provider,\n blockTracker,\n chainId,\n });\n\n this.#trackingMap.set(networkClientId, {\n nonceTracker,\n incomingTransactionHelper,\n pendingTransactionTracker,\n });\n }\n\n #refreshEtherscanRemoteTransactionSources = (\n networkClients: NetworkClientRegistry,\n ) => {\n // this will be prettier when we have consolidated network clients with a single chainId:\n // check if there are still other network clients using the same chainId\n // if not remove the etherscanRemoteTransaction source from the map\n const chainIdsInRegistry = new Set();\n Object.values(networkClients).forEach((networkClient) =>\n chainIdsInRegistry.add(networkClient.configuration.chainId),\n );\n const existingChainIds = Array.from(\n this.#etherscanRemoteTransactionSourcesMap.keys(),\n );\n const chainIdsToRemove = existingChainIds.filter(\n (chainId) => !chainIdsInRegistry.has(chainId),\n );\n\n chainIdsToRemove.forEach((chainId) => {\n this.#etherscanRemoteTransactionSourcesMap.delete(chainId);\n });\n };\n}\n"]}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import type EthQuery from '@metamask/eth-query';
|
|
3
|
-
import type { BlockTracker } from '@metamask/network-controller';
|
|
3
|
+
import type { BlockTracker, NetworkClientId } from '@metamask/network-controller';
|
|
4
4
|
import EventEmitter from 'events';
|
|
5
|
-
import type { NonceTracker } from 'nonce-tracker';
|
|
6
5
|
import type { TransactionMeta } from '../types';
|
|
7
6
|
declare type Events = {
|
|
8
7
|
'transaction-confirmed': [txMeta: TransactionMeta];
|
|
@@ -17,21 +16,28 @@ export interface PendingTransactionTrackerEventEmitter extends EventEmitter {
|
|
|
17
16
|
export declare class PendingTransactionTracker {
|
|
18
17
|
#private;
|
|
19
18
|
hub: PendingTransactionTrackerEventEmitter;
|
|
20
|
-
constructor({ approveTransaction, blockTracker, getChainId, getEthQuery, getTransactions, isResubmitEnabled,
|
|
19
|
+
constructor({ approveTransaction, blockTracker, getChainId, getEthQuery, getTransactions, isResubmitEnabled, getGlobalLock, publishTransaction, hooks, }: {
|
|
21
20
|
approveTransaction: (transactionId: string) => Promise<void>;
|
|
22
21
|
blockTracker: BlockTracker;
|
|
23
22
|
getChainId: () => string;
|
|
24
|
-
getEthQuery: () => EthQuery;
|
|
23
|
+
getEthQuery: (networkClientId?: NetworkClientId) => EthQuery;
|
|
25
24
|
getTransactions: () => TransactionMeta[];
|
|
26
25
|
isResubmitEnabled?: boolean;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
publishTransaction: (rawTx: string) => Promise<string>;
|
|
26
|
+
getGlobalLock: () => Promise<() => void>;
|
|
27
|
+
publishTransaction: (ethQuery: EthQuery, rawTx: string) => Promise<string>;
|
|
30
28
|
hooks?: {
|
|
31
29
|
beforeCheckPendingTransaction?: (transactionMeta: TransactionMeta) => boolean;
|
|
32
30
|
beforePublish?: (transactionMeta: TransactionMeta) => boolean;
|
|
33
31
|
};
|
|
34
32
|
});
|
|
33
|
+
startIfPendingTransactions: () => void;
|
|
34
|
+
/**
|
|
35
|
+
* Force checks the network if the given transaction is confirmed and updates it's status.
|
|
36
|
+
*
|
|
37
|
+
* @param txMeta - The transaction to check
|
|
38
|
+
*/
|
|
39
|
+
forceCheckTransaction(txMeta: TransactionMeta): Promise<void>;
|
|
40
|
+
stop(): void;
|
|
35
41
|
}
|
|
36
42
|
export {};
|
|
37
43
|
//# sourceMappingURL=PendingTransactionTracker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PendingTransactionTracker.d.ts","sourceRoot":"","sources":["../../src/helpers/PendingTransactionTracker.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"PendingTransactionTracker.d.ts","sourceRoot":"","sources":["../../src/helpers/PendingTransactionTracker.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EAChB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,YAAY,MAAM,QAAQ,CAAC;AAGlC,OAAO,KAAK,EAAE,eAAe,EAAsB,MAAM,UAAU,CAAC;AA6BpE,aAAK,MAAM,GAAG;IACZ,uBAAuB,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACnD,qBAAqB,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACjD,oBAAoB,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC9D,qBAAqB,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;CAChE,CAAC;AAKF,MAAM,WAAW,qCAAsC,SAAQ,YAAY;IACzE,EAAE,CAAC,CAAC,SAAS,MAAM,MAAM,EACvB,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GACrC,IAAI,CAAC;IAER,IAAI,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;CACzE;AAED,qBAAa,yBAAyB;;IACpC,GAAG,EAAE,qCAAqC,CAAC;gBA8B/B,EACV,kBAAkB,EAClB,YAAY,EACZ,UAAU,EACV,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,KAAK,GACN,EAAE;QACD,kBAAkB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7D,YAAY,EAAE,YAAY,CAAC;QAC3B,UAAU,EAAE,MAAM,MAAM,CAAC;QACzB,WAAW,EAAE,CAAC,eAAe,CAAC,EAAE,eAAe,KAAK,QAAQ,CAAC;QAC7D,eAAe,EAAE,MAAM,eAAe,EAAE,CAAC;QACzC,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;QACzC,kBAAkB,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3E,KAAK,CAAC,EAAE;YACN,6BAA6B,CAAC,EAAE,CAC9B,eAAe,EAAE,eAAe,KAC7B,OAAO,CAAC;YACb,aAAa,CAAC,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,OAAO,CAAC;SAC/D,CAAC;KACH;IAmBD,0BAA0B,aAQxB;IAEF;;;;OAIG;IACG,qBAAqB,CAAC,MAAM,EAAE,eAAe;IAwBnD,IAAI;CAoXL"}
|
|
@@ -22,7 +22,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
22
22
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
23
23
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
24
24
|
};
|
|
25
|
-
var _PendingTransactionTracker_instances, _PendingTransactionTracker_approveTransaction, _PendingTransactionTracker_blockTracker, _PendingTransactionTracker_droppedBlockCountByHash, _PendingTransactionTracker_getChainId, _PendingTransactionTracker_getEthQuery, _PendingTransactionTracker_getTransactions, _PendingTransactionTracker_isResubmitEnabled, _PendingTransactionTracker_listener,
|
|
25
|
+
var _PendingTransactionTracker_instances, _PendingTransactionTracker_approveTransaction, _PendingTransactionTracker_blockTracker, _PendingTransactionTracker_droppedBlockCountByHash, _PendingTransactionTracker_getChainId, _PendingTransactionTracker_getEthQuery, _PendingTransactionTracker_getTransactions, _PendingTransactionTracker_isResubmitEnabled, _PendingTransactionTracker_listener, _PendingTransactionTracker_getGlobalLock, _PendingTransactionTracker_publishTransaction, _PendingTransactionTracker_running, _PendingTransactionTracker_beforeCheckPendingTransaction, _PendingTransactionTracker_beforePublish, _PendingTransactionTracker_start, _PendingTransactionTracker_onLatestBlock, _PendingTransactionTracker_checkTransactions, _PendingTransactionTracker_resubmitTransactions, _PendingTransactionTracker_isKnownTransactionError, _PendingTransactionTracker_resubmitTransaction, _PendingTransactionTracker_isResubmitDue, _PendingTransactionTracker_checkTransaction, _PendingTransactionTracker_onTransactionConfirmed, _PendingTransactionTracker_isTransactionDropped, _PendingTransactionTracker_isNonceTaken, _PendingTransactionTracker_getPendingTransactions, _PendingTransactionTracker_warnTransaction, _PendingTransactionTracker_failTransaction, _PendingTransactionTracker_dropTransaction, _PendingTransactionTracker_updateTransaction, _PendingTransactionTracker_getTransactionReceipt, _PendingTransactionTracker_getBlockByHash, _PendingTransactionTracker_getNetworkTransactionCount, _PendingTransactionTracker_getCurrentChainTransactions;
|
|
26
26
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
27
|
exports.PendingTransactionTracker = void 0;
|
|
28
28
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
@@ -48,7 +48,7 @@ const KNOWN_TRANSACTION_ERRORS = [
|
|
|
48
48
|
];
|
|
49
49
|
const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'pending-transactions');
|
|
50
50
|
class PendingTransactionTracker {
|
|
51
|
-
constructor({ approveTransaction, blockTracker, getChainId, getEthQuery, getTransactions, isResubmitEnabled,
|
|
51
|
+
constructor({ approveTransaction, blockTracker, getChainId, getEthQuery, getTransactions, isResubmitEnabled, getGlobalLock, publishTransaction, hooks, }) {
|
|
52
52
|
var _a, _b;
|
|
53
53
|
_PendingTransactionTracker_instances.add(this);
|
|
54
54
|
_PendingTransactionTracker_approveTransaction.set(this, void 0);
|
|
@@ -61,12 +61,20 @@ class PendingTransactionTracker {
|
|
|
61
61
|
// TODO: Replace `any` with type
|
|
62
62
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
63
63
|
_PendingTransactionTracker_listener.set(this, void 0);
|
|
64
|
-
|
|
65
|
-
_PendingTransactionTracker_onStateChange.set(this, void 0);
|
|
64
|
+
_PendingTransactionTracker_getGlobalLock.set(this, void 0);
|
|
66
65
|
_PendingTransactionTracker_publishTransaction.set(this, void 0);
|
|
67
66
|
_PendingTransactionTracker_running.set(this, void 0);
|
|
68
67
|
_PendingTransactionTracker_beforeCheckPendingTransaction.set(this, void 0);
|
|
69
68
|
_PendingTransactionTracker_beforePublish.set(this, void 0);
|
|
69
|
+
this.startIfPendingTransactions = () => {
|
|
70
|
+
const pendingTransactions = __classPrivateFieldGet(this, _PendingTransactionTracker_instances, "m", _PendingTransactionTracker_getPendingTransactions).call(this);
|
|
71
|
+
if (pendingTransactions.length) {
|
|
72
|
+
__classPrivateFieldGet(this, _PendingTransactionTracker_instances, "m", _PendingTransactionTracker_start).call(this);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
this.stop();
|
|
76
|
+
}
|
|
77
|
+
};
|
|
70
78
|
this.hub = new events_1.default();
|
|
71
79
|
__classPrivateFieldSet(this, _PendingTransactionTracker_approveTransaction, approveTransaction, "f");
|
|
72
80
|
__classPrivateFieldSet(this, _PendingTransactionTracker_blockTracker, blockTracker, "f");
|
|
@@ -76,41 +84,52 @@ class PendingTransactionTracker {
|
|
|
76
84
|
__classPrivateFieldSet(this, _PendingTransactionTracker_getTransactions, getTransactions, "f");
|
|
77
85
|
__classPrivateFieldSet(this, _PendingTransactionTracker_isResubmitEnabled, isResubmitEnabled !== null && isResubmitEnabled !== void 0 ? isResubmitEnabled : true, "f");
|
|
78
86
|
__classPrivateFieldSet(this, _PendingTransactionTracker_listener, __classPrivateFieldGet(this, _PendingTransactionTracker_instances, "m", _PendingTransactionTracker_onLatestBlock).bind(this), "f");
|
|
79
|
-
__classPrivateFieldSet(this,
|
|
80
|
-
__classPrivateFieldSet(this, _PendingTransactionTracker_onStateChange, onStateChange, "f");
|
|
87
|
+
__classPrivateFieldSet(this, _PendingTransactionTracker_getGlobalLock, getGlobalLock, "f");
|
|
81
88
|
__classPrivateFieldSet(this, _PendingTransactionTracker_publishTransaction, publishTransaction, "f");
|
|
82
89
|
__classPrivateFieldSet(this, _PendingTransactionTracker_running, false, "f");
|
|
83
90
|
__classPrivateFieldSet(this, _PendingTransactionTracker_beforePublish, (_a = hooks === null || hooks === void 0 ? void 0 : hooks.beforePublish) !== null && _a !== void 0 ? _a : (() => true), "f");
|
|
84
91
|
__classPrivateFieldSet(this, _PendingTransactionTracker_beforeCheckPendingTransaction, (_b = hooks === null || hooks === void 0 ? void 0 : hooks.beforeCheckPendingTransaction) !== null && _b !== void 0 ? _b : (() => true), "f");
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Force checks the network if the given transaction is confirmed and updates it's status.
|
|
95
|
+
*
|
|
96
|
+
* @param txMeta - The transaction to check
|
|
97
|
+
*/
|
|
98
|
+
forceCheckTransaction(txMeta) {
|
|
99
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
100
|
+
const releaseLock = yield __classPrivateFieldGet(this, _PendingTransactionTracker_getGlobalLock, "f").call(this);
|
|
101
|
+
try {
|
|
102
|
+
yield __classPrivateFieldGet(this, _PendingTransactionTracker_instances, "m", _PendingTransactionTracker_checkTransaction).call(this, txMeta);
|
|
89
103
|
}
|
|
90
|
-
|
|
91
|
-
|
|
104
|
+
catch (error) {
|
|
105
|
+
/* istanbul ignore next */
|
|
106
|
+
log('Failed to check transaction', error);
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
releaseLock();
|
|
92
110
|
}
|
|
93
111
|
});
|
|
94
112
|
}
|
|
113
|
+
stop() {
|
|
114
|
+
if (!__classPrivateFieldGet(this, _PendingTransactionTracker_running, "f")) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
__classPrivateFieldGet(this, _PendingTransactionTracker_blockTracker, "f").removeListener('latest', __classPrivateFieldGet(this, _PendingTransactionTracker_listener, "f"));
|
|
118
|
+
__classPrivateFieldSet(this, _PendingTransactionTracker_running, false, "f");
|
|
119
|
+
log('Stopped polling');
|
|
120
|
+
}
|
|
95
121
|
}
|
|
96
122
|
exports.PendingTransactionTracker = PendingTransactionTracker;
|
|
97
|
-
_PendingTransactionTracker_approveTransaction = new WeakMap(), _PendingTransactionTracker_blockTracker = new WeakMap(), _PendingTransactionTracker_droppedBlockCountByHash = new WeakMap(), _PendingTransactionTracker_getChainId = new WeakMap(), _PendingTransactionTracker_getEthQuery = new WeakMap(), _PendingTransactionTracker_getTransactions = new WeakMap(), _PendingTransactionTracker_isResubmitEnabled = new WeakMap(), _PendingTransactionTracker_listener = new WeakMap(),
|
|
123
|
+
_PendingTransactionTracker_approveTransaction = new WeakMap(), _PendingTransactionTracker_blockTracker = new WeakMap(), _PendingTransactionTracker_droppedBlockCountByHash = new WeakMap(), _PendingTransactionTracker_getChainId = new WeakMap(), _PendingTransactionTracker_getEthQuery = new WeakMap(), _PendingTransactionTracker_getTransactions = new WeakMap(), _PendingTransactionTracker_isResubmitEnabled = new WeakMap(), _PendingTransactionTracker_listener = new WeakMap(), _PendingTransactionTracker_getGlobalLock = new WeakMap(), _PendingTransactionTracker_publishTransaction = new WeakMap(), _PendingTransactionTracker_running = new WeakMap(), _PendingTransactionTracker_beforeCheckPendingTransaction = new WeakMap(), _PendingTransactionTracker_beforePublish = new WeakMap(), _PendingTransactionTracker_instances = new WeakSet(), _PendingTransactionTracker_start = function _PendingTransactionTracker_start() {
|
|
98
124
|
if (__classPrivateFieldGet(this, _PendingTransactionTracker_running, "f")) {
|
|
99
125
|
return;
|
|
100
126
|
}
|
|
101
127
|
__classPrivateFieldGet(this, _PendingTransactionTracker_blockTracker, "f").on('latest', __classPrivateFieldGet(this, _PendingTransactionTracker_listener, "f"));
|
|
102
128
|
__classPrivateFieldSet(this, _PendingTransactionTracker_running, true, "f");
|
|
103
129
|
log('Started polling');
|
|
104
|
-
}, _PendingTransactionTracker_stop = function _PendingTransactionTracker_stop() {
|
|
105
|
-
if (!__classPrivateFieldGet(this, _PendingTransactionTracker_running, "f")) {
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
__classPrivateFieldGet(this, _PendingTransactionTracker_blockTracker, "f").removeListener('latest', __classPrivateFieldGet(this, _PendingTransactionTracker_listener, "f"));
|
|
109
|
-
__classPrivateFieldSet(this, _PendingTransactionTracker_running, false, "f");
|
|
110
|
-
log('Stopped polling');
|
|
111
130
|
}, _PendingTransactionTracker_onLatestBlock = function _PendingTransactionTracker_onLatestBlock(latestBlockNumber) {
|
|
112
131
|
return __awaiter(this, void 0, void 0, function* () {
|
|
113
|
-
const
|
|
132
|
+
const releaseLock = yield __classPrivateFieldGet(this, _PendingTransactionTracker_getGlobalLock, "f").call(this);
|
|
114
133
|
try {
|
|
115
134
|
yield __classPrivateFieldGet(this, _PendingTransactionTracker_instances, "m", _PendingTransactionTracker_checkTransactions).call(this);
|
|
116
135
|
}
|
|
@@ -119,7 +138,7 @@ _PendingTransactionTracker_approveTransaction = new WeakMap(), _PendingTransacti
|
|
|
119
138
|
log('Failed to check transactions', error);
|
|
120
139
|
}
|
|
121
140
|
finally {
|
|
122
|
-
|
|
141
|
+
releaseLock();
|
|
123
142
|
}
|
|
124
143
|
try {
|
|
125
144
|
yield __classPrivateFieldGet(this, _PendingTransactionTracker_instances, "m", _PendingTransactionTracker_resubmitTransactions).call(this, latestBlockNumber);
|
|
@@ -194,7 +213,8 @@ _PendingTransactionTracker_approveTransaction = new WeakMap(), _PendingTransacti
|
|
|
194
213
|
yield __classPrivateFieldGet(this, _PendingTransactionTracker_approveTransaction, "f").call(this, txMeta.id);
|
|
195
214
|
return;
|
|
196
215
|
}
|
|
197
|
-
|
|
216
|
+
const ethQuery = __classPrivateFieldGet(this, _PendingTransactionTracker_getEthQuery, "f").call(this, txMeta.networkClientId);
|
|
217
|
+
yield __classPrivateFieldGet(this, _PendingTransactionTracker_publishTransaction, "f").call(this, ethQuery, rawTx);
|
|
198
218
|
txMeta.retryCount = ((_a = txMeta.retryCount) !== null && _a !== void 0 ? _a : 0) + 1;
|
|
199
219
|
__classPrivateFieldGet(this, _PendingTransactionTracker_instances, "m", _PendingTransactionTracker_updateTransaction).call(this, txMeta, 'PendingTransactionTracker:transaction-retry - Retry count increased');
|
|
200
220
|
});
|