@metamask-previews/transaction-controller 38.3.0-preview-7692db0d → 38.3.0-preview-de5d2fda
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/dist/TransactionController.cjs +44 -47
- package/dist/TransactionController.cjs.map +1 -1
- package/dist/TransactionController.d.cts +8 -8
- package/dist/TransactionController.d.cts.map +1 -1
- package/dist/TransactionController.d.mts +8 -8
- package/dist/TransactionController.d.mts.map +1 -1
- package/dist/TransactionController.mjs +44 -47
- package/dist/TransactionController.mjs.map +1 -1
- package/dist/api/accounts-api.cjs +61 -0
- package/dist/api/accounts-api.cjs.map +1 -0
- package/dist/api/accounts-api.d.cts +56 -0
- package/dist/api/accounts-api.d.cts.map +1 -0
- package/dist/api/accounts-api.d.mts +56 -0
- package/dist/api/accounts-api.d.mts.map +1 -0
- package/dist/api/accounts-api.mjs +56 -0
- package/dist/api/accounts-api.mjs.map +1 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.cjs +135 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.cjs.map +1 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts +11 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts.map +1 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts +11 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts.map +1 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.mjs +135 -0
- package/dist/helpers/AccountsApiRemoteTransactionSource.mjs.map +1 -0
- package/dist/helpers/IncomingTransactionHelper.cjs +96 -134
- package/dist/helpers/IncomingTransactionHelper.cjs.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.d.cts +7 -12
- package/dist/helpers/IncomingTransactionHelper.d.cts.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.d.mts +7 -12
- package/dist/helpers/IncomingTransactionHelper.d.mts.map +1 -1
- package/dist/helpers/IncomingTransactionHelper.mjs +96 -134
- package/dist/helpers/IncomingTransactionHelper.mjs.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.cjs +3 -66
- package/dist/helpers/MultichainTrackingHelper.cjs.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.d.cts +1 -14
- package/dist/helpers/MultichainTrackingHelper.d.cts.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.d.mts +1 -14
- package/dist/helpers/MultichainTrackingHelper.d.mts.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.mjs +3 -66
- package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -1
- package/dist/helpers/PendingTransactionTracker.cjs +7 -9
- package/dist/helpers/PendingTransactionTracker.cjs.map +1 -1
- package/dist/helpers/PendingTransactionTracker.d.cts.map +1 -1
- package/dist/helpers/PendingTransactionTracker.d.mts.map +1 -1
- package/dist/helpers/PendingTransactionTracker.mjs +7 -9
- package/dist/helpers/PendingTransactionTracker.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +7 -8
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +7 -8
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/helpers/EtherscanRemoteTransactionSource.cjs +0 -157
- package/dist/helpers/EtherscanRemoteTransactionSource.cjs.map +0 -1
- package/dist/helpers/EtherscanRemoteTransactionSource.d.cts +0 -16
- package/dist/helpers/EtherscanRemoteTransactionSource.d.cts.map +0 -1
- package/dist/helpers/EtherscanRemoteTransactionSource.d.mts +0 -16
- package/dist/helpers/EtherscanRemoteTransactionSource.d.mts.map +0 -1
- package/dist/helpers/EtherscanRemoteTransactionSource.mjs +0 -157
- package/dist/helpers/EtherscanRemoteTransactionSource.mjs.map +0 -1
- package/dist/helpers/TransactionPoller.cjs +0 -133
- package/dist/helpers/TransactionPoller.cjs.map +0 -1
- package/dist/helpers/TransactionPoller.d.cts +0 -31
- package/dist/helpers/TransactionPoller.d.cts.map +0 -1
- package/dist/helpers/TransactionPoller.d.mts +0 -31
- package/dist/helpers/TransactionPoller.d.mts.map +0 -1
- package/dist/helpers/TransactionPoller.mjs +0 -130
- package/dist/helpers/TransactionPoller.mjs.map +0 -1
- package/dist/utils/etherscan.cjs +0 -115
- package/dist/utils/etherscan.cjs.map +0 -1
- package/dist/utils/etherscan.d.cts +0 -74
- package/dist/utils/etherscan.d.cts.map +0 -1
- package/dist/utils/etherscan.d.mts +0 -74
- package/dist/utils/etherscan.d.mts.map +0 -1
- package/dist/utils/etherscan.mjs +0 -109
- package/dist/utils/etherscan.mjs.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/transaction-controller",
|
|
3
|
-
"version": "38.3.0-preview-
|
|
3
|
+
"version": "38.3.0-preview-de5d2fda",
|
|
4
4
|
"description": "Stores transactions alongside their periodically updated statuses and manages interactions such as approval and cancellation",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
-
};
|
|
8
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
-
};
|
|
13
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
-
};
|
|
16
|
-
var _EtherscanRemoteTransactionSource_instances, _EtherscanRemoteTransactionSource_apiKeysByChainId, _EtherscanRemoteTransactionSource_includeTokenTransfers, _EtherscanRemoteTransactionSource_isTokenRequestPending, _EtherscanRemoteTransactionSource_mutex, _EtherscanRemoteTransactionSource_releaseLockAfterInterval, _EtherscanRemoteTransactionSource_fetchNormalTransactions, _EtherscanRemoteTransactionSource_fetchTokenTransactions, _EtherscanRemoteTransactionSource_getResponseTransactions, _EtherscanRemoteTransactionSource_normalizeTransaction, _EtherscanRemoteTransactionSource_normalizeTokenTransaction, _EtherscanRemoteTransactionSource_normalizeTransactionBase;
|
|
17
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
-
exports.EtherscanRemoteTransactionSource = void 0;
|
|
19
|
-
const controller_utils_1 = require("@metamask/controller-utils");
|
|
20
|
-
const async_mutex_1 = require("async-mutex");
|
|
21
|
-
const bn_js_1 = __importDefault(require("bn.js"));
|
|
22
|
-
const uuid_1 = require("uuid");
|
|
23
|
-
const constants_1 = require("../constants.cjs");
|
|
24
|
-
const logger_1 = require("../logger.cjs");
|
|
25
|
-
const types_1 = require("../types.cjs");
|
|
26
|
-
const etherscan_1 = require("../utils/etherscan.cjs");
|
|
27
|
-
const ETHERSCAN_RATE_LIMIT_INTERVAL = 5000;
|
|
28
|
-
/**
|
|
29
|
-
* A RemoteTransactionSource that fetches transaction data from Etherscan.
|
|
30
|
-
*/
|
|
31
|
-
class EtherscanRemoteTransactionSource {
|
|
32
|
-
constructor({ apiKeysByChainId, includeTokenTransfers, } = {}) {
|
|
33
|
-
_EtherscanRemoteTransactionSource_instances.add(this);
|
|
34
|
-
_EtherscanRemoteTransactionSource_apiKeysByChainId.set(this, void 0);
|
|
35
|
-
_EtherscanRemoteTransactionSource_includeTokenTransfers.set(this, void 0);
|
|
36
|
-
_EtherscanRemoteTransactionSource_isTokenRequestPending.set(this, void 0);
|
|
37
|
-
_EtherscanRemoteTransactionSource_mutex.set(this, new async_mutex_1.Mutex());
|
|
38
|
-
_EtherscanRemoteTransactionSource_fetchNormalTransactions.set(this, async (request, etherscanRequest) => {
|
|
39
|
-
const { currentChainId } = request;
|
|
40
|
-
const etherscanTransactions = await (0, etherscan_1.fetchEtherscanTransactions)(etherscanRequest);
|
|
41
|
-
return __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_instances, "m", _EtherscanRemoteTransactionSource_getResponseTransactions).call(this, etherscanTransactions).map((tx) => __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_instances, "m", _EtherscanRemoteTransactionSource_normalizeTransaction).call(this, tx, currentChainId));
|
|
42
|
-
});
|
|
43
|
-
_EtherscanRemoteTransactionSource_fetchTokenTransactions.set(this, async (request, etherscanRequest) => {
|
|
44
|
-
const { currentChainId } = request;
|
|
45
|
-
const etherscanTransactions = await (0, etherscan_1.fetchEtherscanTokenTransactions)(etherscanRequest);
|
|
46
|
-
return __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_instances, "m", _EtherscanRemoteTransactionSource_getResponseTransactions).call(this, etherscanTransactions).map((tx) => __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_instances, "m", _EtherscanRemoteTransactionSource_normalizeTokenTransaction).call(this, tx, currentChainId));
|
|
47
|
-
});
|
|
48
|
-
__classPrivateFieldSet(this, _EtherscanRemoteTransactionSource_apiKeysByChainId, apiKeysByChainId, "f");
|
|
49
|
-
__classPrivateFieldSet(this, _EtherscanRemoteTransactionSource_includeTokenTransfers, includeTokenTransfers ?? true, "f");
|
|
50
|
-
__classPrivateFieldSet(this, _EtherscanRemoteTransactionSource_isTokenRequestPending, false, "f");
|
|
51
|
-
}
|
|
52
|
-
isSupportedNetwork(chainId) {
|
|
53
|
-
return Object.keys(constants_1.ETHERSCAN_SUPPORTED_NETWORKS).includes(chainId);
|
|
54
|
-
}
|
|
55
|
-
getLastBlockVariations() {
|
|
56
|
-
return [__classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_isTokenRequestPending, "f") ? 'token' : 'normal'];
|
|
57
|
-
}
|
|
58
|
-
async fetchTransactions(request) {
|
|
59
|
-
const releaseLock = await __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_mutex, "f").acquire();
|
|
60
|
-
const acquiredTime = Date.now();
|
|
61
|
-
const { currentChainId: chainId } = request;
|
|
62
|
-
const apiKey = __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_apiKeysByChainId, "f")?.[chainId];
|
|
63
|
-
if (apiKey) {
|
|
64
|
-
(0, logger_1.incomingTransactionsLogger)('Etherscan API key found for chain', chainId);
|
|
65
|
-
}
|
|
66
|
-
const etherscanRequest = {
|
|
67
|
-
...request,
|
|
68
|
-
apiKey,
|
|
69
|
-
chainId,
|
|
70
|
-
};
|
|
71
|
-
try {
|
|
72
|
-
const transactions = __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_isTokenRequestPending, "f")
|
|
73
|
-
? await __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_fetchTokenTransactions, "f").call(this, request, etherscanRequest)
|
|
74
|
-
: await __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_fetchNormalTransactions, "f").call(this, request, etherscanRequest);
|
|
75
|
-
if (__classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_includeTokenTransfers, "f")) {
|
|
76
|
-
__classPrivateFieldSet(this, _EtherscanRemoteTransactionSource_isTokenRequestPending, !__classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_isTokenRequestPending, "f"), "f");
|
|
77
|
-
}
|
|
78
|
-
return transactions;
|
|
79
|
-
}
|
|
80
|
-
finally {
|
|
81
|
-
__classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_instances, "m", _EtherscanRemoteTransactionSource_releaseLockAfterInterval).call(this, acquiredTime, releaseLock);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
exports.EtherscanRemoteTransactionSource = EtherscanRemoteTransactionSource;
|
|
86
|
-
_EtherscanRemoteTransactionSource_apiKeysByChainId = new WeakMap(), _EtherscanRemoteTransactionSource_includeTokenTransfers = new WeakMap(), _EtherscanRemoteTransactionSource_isTokenRequestPending = new WeakMap(), _EtherscanRemoteTransactionSource_mutex = new WeakMap(), _EtherscanRemoteTransactionSource_fetchNormalTransactions = new WeakMap(), _EtherscanRemoteTransactionSource_fetchTokenTransactions = new WeakMap(), _EtherscanRemoteTransactionSource_instances = new WeakSet(), _EtherscanRemoteTransactionSource_releaseLockAfterInterval = function _EtherscanRemoteTransactionSource_releaseLockAfterInterval(acquireTime, releaseLock) {
|
|
87
|
-
const elapsedTime = Date.now() - acquireTime;
|
|
88
|
-
const remainingTime = Math.max(0, ETHERSCAN_RATE_LIMIT_INTERVAL - elapsedTime);
|
|
89
|
-
// Wait for the remaining time if it hasn't been 5 seconds yet
|
|
90
|
-
if (remainingTime > 0) {
|
|
91
|
-
setTimeout(releaseLock, remainingTime);
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
releaseLock();
|
|
95
|
-
}
|
|
96
|
-
}, _EtherscanRemoteTransactionSource_getResponseTransactions = function _EtherscanRemoteTransactionSource_getResponseTransactions(response) {
|
|
97
|
-
let result = response.result;
|
|
98
|
-
if (response.status === '0') {
|
|
99
|
-
result = [];
|
|
100
|
-
if (response.result.length) {
|
|
101
|
-
(0, logger_1.incomingTransactionsLogger)('Ignored Etherscan request error', {
|
|
102
|
-
message: response.result,
|
|
103
|
-
type: __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_isTokenRequestPending, "f") ? 'token' : 'normal',
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return result;
|
|
108
|
-
}, _EtherscanRemoteTransactionSource_normalizeTransaction = function _EtherscanRemoteTransactionSource_normalizeTransaction(txMeta, currentChainId) {
|
|
109
|
-
const base = __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_instances, "m", _EtherscanRemoteTransactionSource_normalizeTransactionBase).call(this, txMeta, currentChainId);
|
|
110
|
-
return {
|
|
111
|
-
...base,
|
|
112
|
-
txParams: {
|
|
113
|
-
...base.txParams,
|
|
114
|
-
data: txMeta.input,
|
|
115
|
-
},
|
|
116
|
-
...(txMeta.isError === '0'
|
|
117
|
-
? { status: types_1.TransactionStatus.confirmed }
|
|
118
|
-
: {
|
|
119
|
-
error: new Error('Transaction failed'),
|
|
120
|
-
status: types_1.TransactionStatus.failed,
|
|
121
|
-
}),
|
|
122
|
-
};
|
|
123
|
-
}, _EtherscanRemoteTransactionSource_normalizeTokenTransaction = function _EtherscanRemoteTransactionSource_normalizeTokenTransaction(txMeta, currentChainId) {
|
|
124
|
-
const base = __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_instances, "m", _EtherscanRemoteTransactionSource_normalizeTransactionBase).call(this, txMeta, currentChainId);
|
|
125
|
-
return {
|
|
126
|
-
...base,
|
|
127
|
-
isTransfer: true,
|
|
128
|
-
transferInformation: {
|
|
129
|
-
contractAddress: txMeta.contractAddress,
|
|
130
|
-
decimals: Number(txMeta.tokenDecimal),
|
|
131
|
-
symbol: txMeta.tokenSymbol,
|
|
132
|
-
},
|
|
133
|
-
};
|
|
134
|
-
}, _EtherscanRemoteTransactionSource_normalizeTransactionBase = function _EtherscanRemoteTransactionSource_normalizeTransactionBase(txMeta, currentChainId) {
|
|
135
|
-
const time = parseInt(txMeta.timeStamp, 10) * 1000;
|
|
136
|
-
return {
|
|
137
|
-
blockNumber: txMeta.blockNumber,
|
|
138
|
-
chainId: currentChainId,
|
|
139
|
-
hash: txMeta.hash,
|
|
140
|
-
id: (0, uuid_1.v1)({ msecs: time }),
|
|
141
|
-
status: types_1.TransactionStatus.confirmed,
|
|
142
|
-
time,
|
|
143
|
-
txParams: {
|
|
144
|
-
chainId: currentChainId,
|
|
145
|
-
from: txMeta.from,
|
|
146
|
-
gas: (0, controller_utils_1.BNToHex)(new bn_js_1.default(txMeta.gas)),
|
|
147
|
-
gasPrice: (0, controller_utils_1.BNToHex)(new bn_js_1.default(txMeta.gasPrice)),
|
|
148
|
-
gasUsed: (0, controller_utils_1.BNToHex)(new bn_js_1.default(txMeta.gasUsed)),
|
|
149
|
-
nonce: (0, controller_utils_1.BNToHex)(new bn_js_1.default(txMeta.nonce)),
|
|
150
|
-
to: txMeta.to,
|
|
151
|
-
value: (0, controller_utils_1.BNToHex)(new bn_js_1.default(txMeta.value)),
|
|
152
|
-
},
|
|
153
|
-
type: types_1.TransactionType.incoming,
|
|
154
|
-
verifiedOnBlockchain: false,
|
|
155
|
-
};
|
|
156
|
-
};
|
|
157
|
-
//# sourceMappingURL=EtherscanRemoteTransactionSource.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EtherscanRemoteTransactionSource.cjs","sourceRoot":"","sources":["../../src/helpers/EtherscanRemoteTransactionSource.ts"],"names":[],"mappings":"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","sourcesContent":["import { BNToHex } from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport BN from 'bn.js';\nimport { v1 as random } from 'uuid';\n\nimport { ETHERSCAN_SUPPORTED_NETWORKS } from '../constants';\nimport { incomingTransactionsLogger as log } from '../logger';\nimport type {\n RemoteTransactionSource,\n RemoteTransactionSourceRequest,\n TransactionMeta,\n} from '../types';\nimport { TransactionStatus, TransactionType } from '../types';\nimport {\n fetchEtherscanTokenTransactions,\n fetchEtherscanTransactions,\n} from '../utils/etherscan';\nimport type {\n EtherscanTokenTransactionMeta,\n EtherscanTransactionMeta,\n EtherscanTransactionMetaBase,\n EtherscanTransactionRequest,\n EtherscanTransactionResponse,\n} from '../utils/etherscan';\n\nconst ETHERSCAN_RATE_LIMIT_INTERVAL = 5000;\n\n/**\n * A RemoteTransactionSource that fetches transaction data from Etherscan.\n */\nexport class EtherscanRemoteTransactionSource\n implements RemoteTransactionSource\n{\n #apiKeysByChainId?: Record<Hex, string>;\n\n #includeTokenTransfers: boolean;\n\n #isTokenRequestPending: boolean;\n\n #mutex = new Mutex();\n\n constructor({\n apiKeysByChainId,\n includeTokenTransfers,\n }: {\n apiKeysByChainId?: Record<Hex, string>;\n includeTokenTransfers?: boolean;\n } = {}) {\n this.#apiKeysByChainId = apiKeysByChainId;\n this.#includeTokenTransfers = includeTokenTransfers ?? true;\n this.#isTokenRequestPending = false;\n }\n\n isSupportedNetwork(chainId: Hex): boolean {\n return Object.keys(ETHERSCAN_SUPPORTED_NETWORKS).includes(chainId);\n }\n\n getLastBlockVariations(): string[] {\n return [this.#isTokenRequestPending ? 'token' : 'normal'];\n }\n\n async fetchTransactions(\n request: RemoteTransactionSourceRequest,\n ): Promise<TransactionMeta[]> {\n const releaseLock = await this.#mutex.acquire();\n const acquiredTime = Date.now();\n const { currentChainId: chainId } = request;\n const apiKey = this.#apiKeysByChainId?.[chainId];\n\n if (apiKey) {\n log('Etherscan API key found for chain', chainId);\n }\n\n const etherscanRequest: EtherscanTransactionRequest = {\n ...request,\n apiKey,\n chainId,\n };\n\n try {\n const transactions = this.#isTokenRequestPending\n ? await this.#fetchTokenTransactions(request, etherscanRequest)\n : await this.#fetchNormalTransactions(request, etherscanRequest);\n\n if (this.#includeTokenTransfers) {\n this.#isTokenRequestPending = !this.#isTokenRequestPending;\n }\n\n return transactions;\n } finally {\n this.#releaseLockAfterInterval(acquiredTime, releaseLock);\n }\n }\n\n #releaseLockAfterInterval(acquireTime: number, releaseLock: () => void) {\n const elapsedTime = Date.now() - acquireTime;\n const remainingTime = Math.max(\n 0,\n ETHERSCAN_RATE_LIMIT_INTERVAL - elapsedTime,\n );\n // Wait for the remaining time if it hasn't been 5 seconds yet\n if (remainingTime > 0) {\n setTimeout(releaseLock, remainingTime);\n } else {\n releaseLock();\n }\n }\n\n #fetchNormalTransactions = async (\n request: RemoteTransactionSourceRequest,\n etherscanRequest: EtherscanTransactionRequest,\n ) => {\n const { currentChainId } = request;\n\n const etherscanTransactions = await fetchEtherscanTransactions(\n etherscanRequest,\n );\n\n return this.#getResponseTransactions(etherscanTransactions).map((tx) =>\n this.#normalizeTransaction(tx, currentChainId),\n );\n };\n\n #fetchTokenTransactions = async (\n request: RemoteTransactionSourceRequest,\n etherscanRequest: EtherscanTransactionRequest,\n ) => {\n const { currentChainId } = request;\n\n const etherscanTransactions = await fetchEtherscanTokenTransactions(\n etherscanRequest,\n );\n\n return this.#getResponseTransactions(etherscanTransactions).map((tx) =>\n this.#normalizeTokenTransaction(tx, currentChainId),\n );\n };\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n #getResponseTransactions<T extends EtherscanTransactionMetaBase>(\n response: EtherscanTransactionResponse<T>,\n ): T[] {\n let result = response.result as T[];\n\n if (response.status === '0') {\n result = [];\n\n if (response.result.length) {\n log('Ignored Etherscan request error', {\n message: response.result,\n type: this.#isTokenRequestPending ? 'token' : 'normal',\n });\n }\n }\n\n return result;\n }\n\n #normalizeTransaction(\n txMeta: EtherscanTransactionMeta,\n currentChainId: Hex,\n ): TransactionMeta {\n const base = this.#normalizeTransactionBase(txMeta, currentChainId);\n\n return {\n ...base,\n txParams: {\n ...base.txParams,\n data: txMeta.input,\n },\n ...(txMeta.isError === '0'\n ? { status: TransactionStatus.confirmed }\n : {\n error: new Error('Transaction failed'),\n status: TransactionStatus.failed,\n }),\n };\n }\n\n #normalizeTokenTransaction(\n txMeta: EtherscanTokenTransactionMeta,\n currentChainId: Hex,\n ): TransactionMeta {\n const base = this.#normalizeTransactionBase(txMeta, currentChainId);\n\n return {\n ...base,\n isTransfer: true,\n transferInformation: {\n contractAddress: txMeta.contractAddress,\n decimals: Number(txMeta.tokenDecimal),\n symbol: txMeta.tokenSymbol,\n },\n };\n }\n\n #normalizeTransactionBase(\n txMeta: EtherscanTransactionMetaBase,\n currentChainId: Hex,\n ): TransactionMeta {\n const time = parseInt(txMeta.timeStamp, 10) * 1000;\n\n return {\n blockNumber: txMeta.blockNumber,\n chainId: currentChainId,\n hash: txMeta.hash,\n id: random({ msecs: time }),\n status: TransactionStatus.confirmed,\n time,\n txParams: {\n chainId: currentChainId,\n from: txMeta.from,\n gas: BNToHex(new BN(txMeta.gas)),\n gasPrice: BNToHex(new BN(txMeta.gasPrice)),\n gasUsed: BNToHex(new BN(txMeta.gasUsed)),\n nonce: BNToHex(new BN(txMeta.nonce)),\n to: txMeta.to,\n value: BNToHex(new BN(txMeta.value)),\n },\n type: TransactionType.incoming,\n verifiedOnBlockchain: false,\n };\n }\n}\n"]}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { Hex } from "@metamask/utils";
|
|
2
|
-
import type { RemoteTransactionSource, RemoteTransactionSourceRequest, TransactionMeta } from "../types.cjs";
|
|
3
|
-
/**
|
|
4
|
-
* A RemoteTransactionSource that fetches transaction data from Etherscan.
|
|
5
|
-
*/
|
|
6
|
-
export declare class EtherscanRemoteTransactionSource implements RemoteTransactionSource {
|
|
7
|
-
#private;
|
|
8
|
-
constructor({ apiKeysByChainId, includeTokenTransfers, }?: {
|
|
9
|
-
apiKeysByChainId?: Record<Hex, string>;
|
|
10
|
-
includeTokenTransfers?: boolean;
|
|
11
|
-
});
|
|
12
|
-
isSupportedNetwork(chainId: Hex): boolean;
|
|
13
|
-
getLastBlockVariations(): string[];
|
|
14
|
-
fetchTransactions(request: RemoteTransactionSourceRequest): Promise<TransactionMeta[]>;
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=EtherscanRemoteTransactionSource.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EtherscanRemoteTransactionSource.d.cts","sourceRoot":"","sources":["../../src/helpers/EtherscanRemoteTransactionSource.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAO3C,OAAO,KAAK,EACV,uBAAuB,EACvB,8BAA8B,EAC9B,eAAe,EAChB,qBAAiB;AAgBlB;;GAEG;AACH,qBAAa,gCACX,YAAW,uBAAuB;;gBAUtB,EACV,gBAAgB,EAChB,qBAAqB,GACtB,GAAE;QACD,gBAAgB,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvC,qBAAqB,CAAC,EAAE,OAAO,CAAC;KAC5B;IAMN,kBAAkB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;IAIzC,sBAAsB,IAAI,MAAM,EAAE;IAI5B,iBAAiB,CACrB,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,eAAe,EAAE,CAAC;CAiK9B"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { Hex } from "@metamask/utils";
|
|
2
|
-
import type { RemoteTransactionSource, RemoteTransactionSourceRequest, TransactionMeta } from "../types.mjs";
|
|
3
|
-
/**
|
|
4
|
-
* A RemoteTransactionSource that fetches transaction data from Etherscan.
|
|
5
|
-
*/
|
|
6
|
-
export declare class EtherscanRemoteTransactionSource implements RemoteTransactionSource {
|
|
7
|
-
#private;
|
|
8
|
-
constructor({ apiKeysByChainId, includeTokenTransfers, }?: {
|
|
9
|
-
apiKeysByChainId?: Record<Hex, string>;
|
|
10
|
-
includeTokenTransfers?: boolean;
|
|
11
|
-
});
|
|
12
|
-
isSupportedNetwork(chainId: Hex): boolean;
|
|
13
|
-
getLastBlockVariations(): string[];
|
|
14
|
-
fetchTransactions(request: RemoteTransactionSourceRequest): Promise<TransactionMeta[]>;
|
|
15
|
-
}
|
|
16
|
-
//# sourceMappingURL=EtherscanRemoteTransactionSource.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EtherscanRemoteTransactionSource.d.mts","sourceRoot":"","sources":["../../src/helpers/EtherscanRemoteTransactionSource.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAO3C,OAAO,KAAK,EACV,uBAAuB,EACvB,8BAA8B,EAC9B,eAAe,EAChB,qBAAiB;AAgBlB;;GAEG;AACH,qBAAa,gCACX,YAAW,uBAAuB;;gBAUtB,EACV,gBAAgB,EAChB,qBAAqB,GACtB,GAAE;QACD,gBAAgB,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvC,qBAAqB,CAAC,EAAE,OAAO,CAAC;KAC5B;IAMN,kBAAkB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;IAIzC,sBAAsB,IAAI,MAAM,EAAE;IAI5B,iBAAiB,CACrB,OAAO,EAAE,8BAA8B,GACtC,OAAO,CAAC,eAAe,EAAE,CAAC;CAiK9B"}
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
-
};
|
|
7
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
-
};
|
|
12
|
-
var _EtherscanRemoteTransactionSource_instances, _EtherscanRemoteTransactionSource_apiKeysByChainId, _EtherscanRemoteTransactionSource_includeTokenTransfers, _EtherscanRemoteTransactionSource_isTokenRequestPending, _EtherscanRemoteTransactionSource_mutex, _EtherscanRemoteTransactionSource_releaseLockAfterInterval, _EtherscanRemoteTransactionSource_fetchNormalTransactions, _EtherscanRemoteTransactionSource_fetchTokenTransactions, _EtherscanRemoteTransactionSource_getResponseTransactions, _EtherscanRemoteTransactionSource_normalizeTransaction, _EtherscanRemoteTransactionSource_normalizeTokenTransaction, _EtherscanRemoteTransactionSource_normalizeTransactionBase;
|
|
13
|
-
function $importDefault(module) {
|
|
14
|
-
if (module?.__esModule) {
|
|
15
|
-
return module.default;
|
|
16
|
-
}
|
|
17
|
-
return module;
|
|
18
|
-
}
|
|
19
|
-
import { BNToHex } from "@metamask/controller-utils";
|
|
20
|
-
import { Mutex } from "async-mutex";
|
|
21
|
-
import $BN from "bn.js";
|
|
22
|
-
const BN = $importDefault($BN);
|
|
23
|
-
import { v1 as random } from "uuid";
|
|
24
|
-
import { ETHERSCAN_SUPPORTED_NETWORKS } from "../constants.mjs";
|
|
25
|
-
import { incomingTransactionsLogger as log } from "../logger.mjs";
|
|
26
|
-
import { TransactionStatus, TransactionType } from "../types.mjs";
|
|
27
|
-
import { fetchEtherscanTokenTransactions, fetchEtherscanTransactions } from "../utils/etherscan.mjs";
|
|
28
|
-
const ETHERSCAN_RATE_LIMIT_INTERVAL = 5000;
|
|
29
|
-
/**
|
|
30
|
-
* A RemoteTransactionSource that fetches transaction data from Etherscan.
|
|
31
|
-
*/
|
|
32
|
-
export class EtherscanRemoteTransactionSource {
|
|
33
|
-
constructor({ apiKeysByChainId, includeTokenTransfers, } = {}) {
|
|
34
|
-
_EtherscanRemoteTransactionSource_instances.add(this);
|
|
35
|
-
_EtherscanRemoteTransactionSource_apiKeysByChainId.set(this, void 0);
|
|
36
|
-
_EtherscanRemoteTransactionSource_includeTokenTransfers.set(this, void 0);
|
|
37
|
-
_EtherscanRemoteTransactionSource_isTokenRequestPending.set(this, void 0);
|
|
38
|
-
_EtherscanRemoteTransactionSource_mutex.set(this, new Mutex());
|
|
39
|
-
_EtherscanRemoteTransactionSource_fetchNormalTransactions.set(this, async (request, etherscanRequest) => {
|
|
40
|
-
const { currentChainId } = request;
|
|
41
|
-
const etherscanTransactions = await fetchEtherscanTransactions(etherscanRequest);
|
|
42
|
-
return __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_instances, "m", _EtherscanRemoteTransactionSource_getResponseTransactions).call(this, etherscanTransactions).map((tx) => __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_instances, "m", _EtherscanRemoteTransactionSource_normalizeTransaction).call(this, tx, currentChainId));
|
|
43
|
-
});
|
|
44
|
-
_EtherscanRemoteTransactionSource_fetchTokenTransactions.set(this, async (request, etherscanRequest) => {
|
|
45
|
-
const { currentChainId } = request;
|
|
46
|
-
const etherscanTransactions = await fetchEtherscanTokenTransactions(etherscanRequest);
|
|
47
|
-
return __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_instances, "m", _EtherscanRemoteTransactionSource_getResponseTransactions).call(this, etherscanTransactions).map((tx) => __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_instances, "m", _EtherscanRemoteTransactionSource_normalizeTokenTransaction).call(this, tx, currentChainId));
|
|
48
|
-
});
|
|
49
|
-
__classPrivateFieldSet(this, _EtherscanRemoteTransactionSource_apiKeysByChainId, apiKeysByChainId, "f");
|
|
50
|
-
__classPrivateFieldSet(this, _EtherscanRemoteTransactionSource_includeTokenTransfers, includeTokenTransfers ?? true, "f");
|
|
51
|
-
__classPrivateFieldSet(this, _EtherscanRemoteTransactionSource_isTokenRequestPending, false, "f");
|
|
52
|
-
}
|
|
53
|
-
isSupportedNetwork(chainId) {
|
|
54
|
-
return Object.keys(ETHERSCAN_SUPPORTED_NETWORKS).includes(chainId);
|
|
55
|
-
}
|
|
56
|
-
getLastBlockVariations() {
|
|
57
|
-
return [__classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_isTokenRequestPending, "f") ? 'token' : 'normal'];
|
|
58
|
-
}
|
|
59
|
-
async fetchTransactions(request) {
|
|
60
|
-
const releaseLock = await __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_mutex, "f").acquire();
|
|
61
|
-
const acquiredTime = Date.now();
|
|
62
|
-
const { currentChainId: chainId } = request;
|
|
63
|
-
const apiKey = __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_apiKeysByChainId, "f")?.[chainId];
|
|
64
|
-
if (apiKey) {
|
|
65
|
-
log('Etherscan API key found for chain', chainId);
|
|
66
|
-
}
|
|
67
|
-
const etherscanRequest = {
|
|
68
|
-
...request,
|
|
69
|
-
apiKey,
|
|
70
|
-
chainId,
|
|
71
|
-
};
|
|
72
|
-
try {
|
|
73
|
-
const transactions = __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_isTokenRequestPending, "f")
|
|
74
|
-
? await __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_fetchTokenTransactions, "f").call(this, request, etherscanRequest)
|
|
75
|
-
: await __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_fetchNormalTransactions, "f").call(this, request, etherscanRequest);
|
|
76
|
-
if (__classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_includeTokenTransfers, "f")) {
|
|
77
|
-
__classPrivateFieldSet(this, _EtherscanRemoteTransactionSource_isTokenRequestPending, !__classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_isTokenRequestPending, "f"), "f");
|
|
78
|
-
}
|
|
79
|
-
return transactions;
|
|
80
|
-
}
|
|
81
|
-
finally {
|
|
82
|
-
__classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_instances, "m", _EtherscanRemoteTransactionSource_releaseLockAfterInterval).call(this, acquiredTime, releaseLock);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
_EtherscanRemoteTransactionSource_apiKeysByChainId = new WeakMap(), _EtherscanRemoteTransactionSource_includeTokenTransfers = new WeakMap(), _EtherscanRemoteTransactionSource_isTokenRequestPending = new WeakMap(), _EtherscanRemoteTransactionSource_mutex = new WeakMap(), _EtherscanRemoteTransactionSource_fetchNormalTransactions = new WeakMap(), _EtherscanRemoteTransactionSource_fetchTokenTransactions = new WeakMap(), _EtherscanRemoteTransactionSource_instances = new WeakSet(), _EtherscanRemoteTransactionSource_releaseLockAfterInterval = function _EtherscanRemoteTransactionSource_releaseLockAfterInterval(acquireTime, releaseLock) {
|
|
87
|
-
const elapsedTime = Date.now() - acquireTime;
|
|
88
|
-
const remainingTime = Math.max(0, ETHERSCAN_RATE_LIMIT_INTERVAL - elapsedTime);
|
|
89
|
-
// Wait for the remaining time if it hasn't been 5 seconds yet
|
|
90
|
-
if (remainingTime > 0) {
|
|
91
|
-
setTimeout(releaseLock, remainingTime);
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
releaseLock();
|
|
95
|
-
}
|
|
96
|
-
}, _EtherscanRemoteTransactionSource_getResponseTransactions = function _EtherscanRemoteTransactionSource_getResponseTransactions(response) {
|
|
97
|
-
let result = response.result;
|
|
98
|
-
if (response.status === '0') {
|
|
99
|
-
result = [];
|
|
100
|
-
if (response.result.length) {
|
|
101
|
-
log('Ignored Etherscan request error', {
|
|
102
|
-
message: response.result,
|
|
103
|
-
type: __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_isTokenRequestPending, "f") ? 'token' : 'normal',
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return result;
|
|
108
|
-
}, _EtherscanRemoteTransactionSource_normalizeTransaction = function _EtherscanRemoteTransactionSource_normalizeTransaction(txMeta, currentChainId) {
|
|
109
|
-
const base = __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_instances, "m", _EtherscanRemoteTransactionSource_normalizeTransactionBase).call(this, txMeta, currentChainId);
|
|
110
|
-
return {
|
|
111
|
-
...base,
|
|
112
|
-
txParams: {
|
|
113
|
-
...base.txParams,
|
|
114
|
-
data: txMeta.input,
|
|
115
|
-
},
|
|
116
|
-
...(txMeta.isError === '0'
|
|
117
|
-
? { status: TransactionStatus.confirmed }
|
|
118
|
-
: {
|
|
119
|
-
error: new Error('Transaction failed'),
|
|
120
|
-
status: TransactionStatus.failed,
|
|
121
|
-
}),
|
|
122
|
-
};
|
|
123
|
-
}, _EtherscanRemoteTransactionSource_normalizeTokenTransaction = function _EtherscanRemoteTransactionSource_normalizeTokenTransaction(txMeta, currentChainId) {
|
|
124
|
-
const base = __classPrivateFieldGet(this, _EtherscanRemoteTransactionSource_instances, "m", _EtherscanRemoteTransactionSource_normalizeTransactionBase).call(this, txMeta, currentChainId);
|
|
125
|
-
return {
|
|
126
|
-
...base,
|
|
127
|
-
isTransfer: true,
|
|
128
|
-
transferInformation: {
|
|
129
|
-
contractAddress: txMeta.contractAddress,
|
|
130
|
-
decimals: Number(txMeta.tokenDecimal),
|
|
131
|
-
symbol: txMeta.tokenSymbol,
|
|
132
|
-
},
|
|
133
|
-
};
|
|
134
|
-
}, _EtherscanRemoteTransactionSource_normalizeTransactionBase = function _EtherscanRemoteTransactionSource_normalizeTransactionBase(txMeta, currentChainId) {
|
|
135
|
-
const time = parseInt(txMeta.timeStamp, 10) * 1000;
|
|
136
|
-
return {
|
|
137
|
-
blockNumber: txMeta.blockNumber,
|
|
138
|
-
chainId: currentChainId,
|
|
139
|
-
hash: txMeta.hash,
|
|
140
|
-
id: random({ msecs: time }),
|
|
141
|
-
status: TransactionStatus.confirmed,
|
|
142
|
-
time,
|
|
143
|
-
txParams: {
|
|
144
|
-
chainId: currentChainId,
|
|
145
|
-
from: txMeta.from,
|
|
146
|
-
gas: BNToHex(new BN(txMeta.gas)),
|
|
147
|
-
gasPrice: BNToHex(new BN(txMeta.gasPrice)),
|
|
148
|
-
gasUsed: BNToHex(new BN(txMeta.gasUsed)),
|
|
149
|
-
nonce: BNToHex(new BN(txMeta.nonce)),
|
|
150
|
-
to: txMeta.to,
|
|
151
|
-
value: BNToHex(new BN(txMeta.value)),
|
|
152
|
-
},
|
|
153
|
-
type: TransactionType.incoming,
|
|
154
|
-
verifiedOnBlockchain: false,
|
|
155
|
-
};
|
|
156
|
-
};
|
|
157
|
-
//# sourceMappingURL=EtherscanRemoteTransactionSource.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EtherscanRemoteTransactionSource.mjs","sourceRoot":"","sources":["../../src/helpers/EtherscanRemoteTransactionSource.ts"],"names":[],"mappings":"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","sourcesContent":["import { BNToHex } from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport BN from 'bn.js';\nimport { v1 as random } from 'uuid';\n\nimport { ETHERSCAN_SUPPORTED_NETWORKS } from '../constants';\nimport { incomingTransactionsLogger as log } from '../logger';\nimport type {\n RemoteTransactionSource,\n RemoteTransactionSourceRequest,\n TransactionMeta,\n} from '../types';\nimport { TransactionStatus, TransactionType } from '../types';\nimport {\n fetchEtherscanTokenTransactions,\n fetchEtherscanTransactions,\n} from '../utils/etherscan';\nimport type {\n EtherscanTokenTransactionMeta,\n EtherscanTransactionMeta,\n EtherscanTransactionMetaBase,\n EtherscanTransactionRequest,\n EtherscanTransactionResponse,\n} from '../utils/etherscan';\n\nconst ETHERSCAN_RATE_LIMIT_INTERVAL = 5000;\n\n/**\n * A RemoteTransactionSource that fetches transaction data from Etherscan.\n */\nexport class EtherscanRemoteTransactionSource\n implements RemoteTransactionSource\n{\n #apiKeysByChainId?: Record<Hex, string>;\n\n #includeTokenTransfers: boolean;\n\n #isTokenRequestPending: boolean;\n\n #mutex = new Mutex();\n\n constructor({\n apiKeysByChainId,\n includeTokenTransfers,\n }: {\n apiKeysByChainId?: Record<Hex, string>;\n includeTokenTransfers?: boolean;\n } = {}) {\n this.#apiKeysByChainId = apiKeysByChainId;\n this.#includeTokenTransfers = includeTokenTransfers ?? true;\n this.#isTokenRequestPending = false;\n }\n\n isSupportedNetwork(chainId: Hex): boolean {\n return Object.keys(ETHERSCAN_SUPPORTED_NETWORKS).includes(chainId);\n }\n\n getLastBlockVariations(): string[] {\n return [this.#isTokenRequestPending ? 'token' : 'normal'];\n }\n\n async fetchTransactions(\n request: RemoteTransactionSourceRequest,\n ): Promise<TransactionMeta[]> {\n const releaseLock = await this.#mutex.acquire();\n const acquiredTime = Date.now();\n const { currentChainId: chainId } = request;\n const apiKey = this.#apiKeysByChainId?.[chainId];\n\n if (apiKey) {\n log('Etherscan API key found for chain', chainId);\n }\n\n const etherscanRequest: EtherscanTransactionRequest = {\n ...request,\n apiKey,\n chainId,\n };\n\n try {\n const transactions = this.#isTokenRequestPending\n ? await this.#fetchTokenTransactions(request, etherscanRequest)\n : await this.#fetchNormalTransactions(request, etherscanRequest);\n\n if (this.#includeTokenTransfers) {\n this.#isTokenRequestPending = !this.#isTokenRequestPending;\n }\n\n return transactions;\n } finally {\n this.#releaseLockAfterInterval(acquiredTime, releaseLock);\n }\n }\n\n #releaseLockAfterInterval(acquireTime: number, releaseLock: () => void) {\n const elapsedTime = Date.now() - acquireTime;\n const remainingTime = Math.max(\n 0,\n ETHERSCAN_RATE_LIMIT_INTERVAL - elapsedTime,\n );\n // Wait for the remaining time if it hasn't been 5 seconds yet\n if (remainingTime > 0) {\n setTimeout(releaseLock, remainingTime);\n } else {\n releaseLock();\n }\n }\n\n #fetchNormalTransactions = async (\n request: RemoteTransactionSourceRequest,\n etherscanRequest: EtherscanTransactionRequest,\n ) => {\n const { currentChainId } = request;\n\n const etherscanTransactions = await fetchEtherscanTransactions(\n etherscanRequest,\n );\n\n return this.#getResponseTransactions(etherscanTransactions).map((tx) =>\n this.#normalizeTransaction(tx, currentChainId),\n );\n };\n\n #fetchTokenTransactions = async (\n request: RemoteTransactionSourceRequest,\n etherscanRequest: EtherscanTransactionRequest,\n ) => {\n const { currentChainId } = request;\n\n const etherscanTransactions = await fetchEtherscanTokenTransactions(\n etherscanRequest,\n );\n\n return this.#getResponseTransactions(etherscanTransactions).map((tx) =>\n this.#normalizeTokenTransaction(tx, currentChainId),\n );\n };\n\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n #getResponseTransactions<T extends EtherscanTransactionMetaBase>(\n response: EtherscanTransactionResponse<T>,\n ): T[] {\n let result = response.result as T[];\n\n if (response.status === '0') {\n result = [];\n\n if (response.result.length) {\n log('Ignored Etherscan request error', {\n message: response.result,\n type: this.#isTokenRequestPending ? 'token' : 'normal',\n });\n }\n }\n\n return result;\n }\n\n #normalizeTransaction(\n txMeta: EtherscanTransactionMeta,\n currentChainId: Hex,\n ): TransactionMeta {\n const base = this.#normalizeTransactionBase(txMeta, currentChainId);\n\n return {\n ...base,\n txParams: {\n ...base.txParams,\n data: txMeta.input,\n },\n ...(txMeta.isError === '0'\n ? { status: TransactionStatus.confirmed }\n : {\n error: new Error('Transaction failed'),\n status: TransactionStatus.failed,\n }),\n };\n }\n\n #normalizeTokenTransaction(\n txMeta: EtherscanTokenTransactionMeta,\n currentChainId: Hex,\n ): TransactionMeta {\n const base = this.#normalizeTransactionBase(txMeta, currentChainId);\n\n return {\n ...base,\n isTransfer: true,\n transferInformation: {\n contractAddress: txMeta.contractAddress,\n decimals: Number(txMeta.tokenDecimal),\n symbol: txMeta.tokenSymbol,\n },\n };\n }\n\n #normalizeTransactionBase(\n txMeta: EtherscanTransactionMetaBase,\n currentChainId: Hex,\n ): TransactionMeta {\n const time = parseInt(txMeta.timeStamp, 10) * 1000;\n\n return {\n blockNumber: txMeta.blockNumber,\n chainId: currentChainId,\n hash: txMeta.hash,\n id: random({ msecs: time }),\n status: TransactionStatus.confirmed,\n time,\n txParams: {\n chainId: currentChainId,\n from: txMeta.from,\n gas: BNToHex(new BN(txMeta.gas)),\n gasPrice: BNToHex(new BN(txMeta.gasPrice)),\n gasUsed: BNToHex(new BN(txMeta.gasUsed)),\n nonce: BNToHex(new BN(txMeta.nonce)),\n to: txMeta.to,\n value: BNToHex(new BN(txMeta.value)),\n },\n type: TransactionType.incoming,\n verifiedOnBlockchain: false,\n };\n }\n}\n"]}
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
-
};
|
|
8
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
-
};
|
|
13
|
-
var _TransactionPoller_instances, _TransactionPoller_acceleratedCount, _TransactionPoller_blockTracker, _TransactionPoller_blockTrackerListener, _TransactionPoller_listener, _TransactionPoller_pendingTransactions, _TransactionPoller_running, _TransactionPoller_timeout, _TransactionPoller_queue, _TransactionPoller_interval, _TransactionPoller_stopTimeout, _TransactionPoller_stopBlockTracker;
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.TransactionPoller = exports.ACCELERATED_INTERVAL = exports.ACCELERATED_COUNT_MAX = void 0;
|
|
16
|
-
const utils_1 = require("@metamask/utils");
|
|
17
|
-
const lodash_1 = require("lodash");
|
|
18
|
-
const logger_1 = require("../logger.cjs");
|
|
19
|
-
exports.ACCELERATED_COUNT_MAX = 5;
|
|
20
|
-
exports.ACCELERATED_INTERVAL = 1000 * 2; // 2 Seconds
|
|
21
|
-
const log = (0, utils_1.createModuleLogger)(logger_1.projectLogger, 'transaction-poller');
|
|
22
|
-
/**
|
|
23
|
-
* Helper class to orchestrate when to poll pending transactions.
|
|
24
|
-
* Initially starts polling via a timeout chain every 2 seconds up to 5 times.
|
|
25
|
-
* Following that, it will poll on every new block via the block tracker.
|
|
26
|
-
*/
|
|
27
|
-
class TransactionPoller {
|
|
28
|
-
constructor(blockTracker) {
|
|
29
|
-
_TransactionPoller_instances.add(this);
|
|
30
|
-
_TransactionPoller_acceleratedCount.set(this, 0);
|
|
31
|
-
_TransactionPoller_blockTracker.set(this, void 0);
|
|
32
|
-
_TransactionPoller_blockTrackerListener.set(this, void 0);
|
|
33
|
-
_TransactionPoller_listener.set(this, void 0);
|
|
34
|
-
_TransactionPoller_pendingTransactions.set(this, void 0);
|
|
35
|
-
_TransactionPoller_running.set(this, false);
|
|
36
|
-
_TransactionPoller_timeout.set(this, void 0);
|
|
37
|
-
__classPrivateFieldSet(this, _TransactionPoller_blockTracker, blockTracker, "f");
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Start the poller with a listener that will be called on every interval.
|
|
41
|
-
* @param listener - The listener to call on every interval.
|
|
42
|
-
*/
|
|
43
|
-
start(listener) {
|
|
44
|
-
if (__classPrivateFieldGet(this, _TransactionPoller_running, "f")) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
__classPrivateFieldSet(this, _TransactionPoller_listener, listener, "f");
|
|
48
|
-
__classPrivateFieldSet(this, _TransactionPoller_running, true, "f");
|
|
49
|
-
__classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_queue).call(this);
|
|
50
|
-
log('Started');
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Stop the poller.
|
|
54
|
-
* Remove all timeouts and block tracker listeners.
|
|
55
|
-
*/
|
|
56
|
-
stop() {
|
|
57
|
-
if (!__classPrivateFieldGet(this, _TransactionPoller_running, "f")) {
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
__classPrivateFieldSet(this, _TransactionPoller_running, false, "f");
|
|
61
|
-
__classPrivateFieldSet(this, _TransactionPoller_listener, undefined, "f");
|
|
62
|
-
__classPrivateFieldSet(this, _TransactionPoller_acceleratedCount, 0, "f");
|
|
63
|
-
__classPrivateFieldSet(this, _TransactionPoller_pendingTransactions, undefined, "f");
|
|
64
|
-
__classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_stopTimeout).call(this);
|
|
65
|
-
__classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_stopBlockTracker).call(this);
|
|
66
|
-
log('Stopped');
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Notify the poller of the pending transactions being monitored.
|
|
70
|
-
* This will reset to the accelerated polling and reset the count
|
|
71
|
-
* when new transactions are added or removed.
|
|
72
|
-
* @param pendingTransactions - The pending transactions to poll.
|
|
73
|
-
*/
|
|
74
|
-
setPendingTransactions(pendingTransactions) {
|
|
75
|
-
const currentPendingTransactionIds = (__classPrivateFieldGet(this, _TransactionPoller_pendingTransactions, "f") ?? []).map((tx) => tx.id);
|
|
76
|
-
__classPrivateFieldSet(this, _TransactionPoller_pendingTransactions, pendingTransactions, "f");
|
|
77
|
-
const newPendingTransactionIds = pendingTransactions.map((tx) => tx.id);
|
|
78
|
-
const hasUpdatedIds = !(0, lodash_1.isEqual)(currentPendingTransactionIds, newPendingTransactionIds);
|
|
79
|
-
if (!__classPrivateFieldGet(this, _TransactionPoller_running, "f") || !hasUpdatedIds) {
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
log('Detected new pending transactions', newPendingTransactionIds);
|
|
83
|
-
__classPrivateFieldSet(this, _TransactionPoller_acceleratedCount, 0, "f");
|
|
84
|
-
if (__classPrivateFieldGet(this, _TransactionPoller_blockTrackerListener, "f")) {
|
|
85
|
-
__classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_stopBlockTracker).call(this);
|
|
86
|
-
__classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_queue).call(this);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
exports.TransactionPoller = TransactionPoller;
|
|
91
|
-
_TransactionPoller_acceleratedCount = new WeakMap(), _TransactionPoller_blockTracker = new WeakMap(), _TransactionPoller_blockTrackerListener = new WeakMap(), _TransactionPoller_listener = new WeakMap(), _TransactionPoller_pendingTransactions = new WeakMap(), _TransactionPoller_running = new WeakMap(), _TransactionPoller_timeout = new WeakMap(), _TransactionPoller_instances = new WeakSet(), _TransactionPoller_queue = function _TransactionPoller_queue() {
|
|
92
|
-
if (!__classPrivateFieldGet(this, _TransactionPoller_running, "f")) {
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
if (__classPrivateFieldGet(this, _TransactionPoller_acceleratedCount, "f") >= exports.ACCELERATED_COUNT_MAX) {
|
|
96
|
-
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
97
|
-
__classPrivateFieldSet(this, _TransactionPoller_blockTrackerListener, (latestBlockNumber) => __classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_interval).call(this, false, latestBlockNumber), "f");
|
|
98
|
-
__classPrivateFieldGet(this, _TransactionPoller_blockTracker, "f").on('latest', __classPrivateFieldGet(this, _TransactionPoller_blockTrackerListener, "f"));
|
|
99
|
-
log('Added block tracker listener');
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
__classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_stopTimeout).call(this);
|
|
103
|
-
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
104
|
-
__classPrivateFieldSet(this, _TransactionPoller_timeout, setTimeout(async () => {
|
|
105
|
-
await __classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_interval).call(this, true);
|
|
106
|
-
__classPrivateFieldGet(this, _TransactionPoller_instances, "m", _TransactionPoller_queue).call(this);
|
|
107
|
-
}, exports.ACCELERATED_INTERVAL), "f");
|
|
108
|
-
}, _TransactionPoller_interval = async function _TransactionPoller_interval(isAccelerated, latestBlockNumber) {
|
|
109
|
-
if (isAccelerated) {
|
|
110
|
-
log('Accelerated interval', __classPrivateFieldGet(this, _TransactionPoller_acceleratedCount, "f") + 1);
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
log('Block tracker interval', latestBlockNumber);
|
|
114
|
-
}
|
|
115
|
-
const latestBlockNumberFinal = latestBlockNumber ?? (await __classPrivateFieldGet(this, _TransactionPoller_blockTracker, "f").getLatestBlock());
|
|
116
|
-
await __classPrivateFieldGet(this, _TransactionPoller_listener, "f")?.call(this, latestBlockNumberFinal);
|
|
117
|
-
if (isAccelerated && __classPrivateFieldGet(this, _TransactionPoller_running, "f")) {
|
|
118
|
-
__classPrivateFieldSet(this, _TransactionPoller_acceleratedCount, __classPrivateFieldGet(this, _TransactionPoller_acceleratedCount, "f") + 1, "f");
|
|
119
|
-
}
|
|
120
|
-
}, _TransactionPoller_stopTimeout = function _TransactionPoller_stopTimeout() {
|
|
121
|
-
if (!__classPrivateFieldGet(this, _TransactionPoller_timeout, "f")) {
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
clearTimeout(__classPrivateFieldGet(this, _TransactionPoller_timeout, "f"));
|
|
125
|
-
__classPrivateFieldSet(this, _TransactionPoller_timeout, undefined, "f");
|
|
126
|
-
}, _TransactionPoller_stopBlockTracker = function _TransactionPoller_stopBlockTracker() {
|
|
127
|
-
if (!__classPrivateFieldGet(this, _TransactionPoller_blockTrackerListener, "f")) {
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
__classPrivateFieldGet(this, _TransactionPoller_blockTracker, "f").removeListener('latest', __classPrivateFieldGet(this, _TransactionPoller_blockTrackerListener, "f"));
|
|
131
|
-
__classPrivateFieldSet(this, _TransactionPoller_blockTrackerListener, undefined, "f");
|
|
132
|
-
};
|
|
133
|
-
//# sourceMappingURL=TransactionPoller.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPoller.cjs","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BlockTracker } from '@metamask/network-controller';\nimport { createModuleLogger } from '@metamask/utils';\nimport { isEqual } from 'lodash';\n\nimport { projectLogger } from '../logger';\nimport type { TransactionMeta } from '../types';\n\nexport const ACCELERATED_COUNT_MAX = 5;\nexport const ACCELERATED_INTERVAL = 1000 * 2; // 2 Seconds\n\nconst log = createModuleLogger(projectLogger, 'transaction-poller');\n\n/**\n * Helper class to orchestrate when to poll pending transactions.\n * Initially starts polling via a timeout chain every 2 seconds up to 5 times.\n * Following that, it will poll on every new block via the block tracker.\n */\nexport class TransactionPoller {\n #acceleratedCount = 0;\n\n #blockTracker: BlockTracker;\n\n #blockTrackerListener?: (latestBlockNumber: string) => void;\n\n #listener?: (latestBlockNumber: string) => Promise<void>;\n\n #pendingTransactions?: TransactionMeta[];\n\n #running = false;\n\n #timeout?: NodeJS.Timeout;\n\n constructor(blockTracker: BlockTracker) {\n this.#blockTracker = blockTracker;\n }\n\n /**\n * Start the poller with a listener that will be called on every interval.\n * @param listener - The listener to call on every interval.\n */\n start(listener: (latestBlockNumber: string) => Promise<void>) {\n if (this.#running) {\n return;\n }\n\n this.#listener = listener;\n this.#running = true;\n\n this.#queue();\n\n log('Started');\n }\n\n /**\n * Stop the poller.\n * Remove all timeouts and block tracker listeners.\n */\n stop() {\n if (!this.#running) {\n return;\n }\n\n this.#running = false;\n this.#listener = undefined;\n this.#acceleratedCount = 0;\n this.#pendingTransactions = undefined;\n\n this.#stopTimeout();\n this.#stopBlockTracker();\n\n log('Stopped');\n }\n\n /**\n * Notify the poller of the pending transactions being monitored.\n * This will reset to the accelerated polling and reset the count\n * when new transactions are added or removed.\n * @param pendingTransactions - The pending transactions to poll.\n */\n setPendingTransactions(pendingTransactions: TransactionMeta[]) {\n const currentPendingTransactionIds = (this.#pendingTransactions ?? []).map(\n (tx) => tx.id,\n );\n\n this.#pendingTransactions = pendingTransactions;\n\n const newPendingTransactionIds = pendingTransactions.map((tx) => tx.id);\n\n const hasUpdatedIds = !isEqual(\n currentPendingTransactionIds,\n newPendingTransactionIds,\n );\n\n if (!this.#running || !hasUpdatedIds) {\n return;\n }\n\n log('Detected new pending transactions', newPendingTransactionIds);\n\n this.#acceleratedCount = 0;\n\n if (this.#blockTrackerListener) {\n this.#stopBlockTracker();\n this.#queue();\n }\n }\n\n #queue() {\n if (!this.#running) {\n return;\n }\n\n if (this.#acceleratedCount >= ACCELERATED_COUNT_MAX) {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#blockTrackerListener = (latestBlockNumber) =>\n this.#interval(false, latestBlockNumber);\n\n this.#blockTracker.on('latest', this.#blockTrackerListener);\n\n log('Added block tracker listener');\n\n return;\n }\n\n this.#stopTimeout();\n\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n this.#timeout = setTimeout(async () => {\n await this.#interval(true);\n this.#queue();\n }, ACCELERATED_INTERVAL);\n }\n\n async #interval(isAccelerated: boolean, latestBlockNumber?: string) {\n if (isAccelerated) {\n log('Accelerated interval', this.#acceleratedCount + 1);\n } else {\n log('Block tracker interval', latestBlockNumber);\n }\n\n const latestBlockNumberFinal =\n latestBlockNumber ?? (await this.#blockTracker.getLatestBlock());\n\n await this.#listener?.(latestBlockNumberFinal);\n\n if (isAccelerated && this.#running) {\n this.#acceleratedCount += 1;\n }\n }\n\n #stopTimeout() {\n if (!this.#timeout) {\n return;\n }\n\n clearTimeout(this.#timeout);\n this.#timeout = undefined;\n }\n\n #stopBlockTracker() {\n if (!this.#blockTrackerListener) {\n return;\n }\n\n this.#blockTracker.removeListener('latest', this.#blockTrackerListener);\n this.#blockTrackerListener = undefined;\n }\n}\n"]}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { BlockTracker } from "@metamask/network-controller";
|
|
2
|
-
import type { TransactionMeta } from "../types.cjs";
|
|
3
|
-
export declare const ACCELERATED_COUNT_MAX = 5;
|
|
4
|
-
export declare const ACCELERATED_INTERVAL: number;
|
|
5
|
-
/**
|
|
6
|
-
* Helper class to orchestrate when to poll pending transactions.
|
|
7
|
-
* Initially starts polling via a timeout chain every 2 seconds up to 5 times.
|
|
8
|
-
* Following that, it will poll on every new block via the block tracker.
|
|
9
|
-
*/
|
|
10
|
-
export declare class TransactionPoller {
|
|
11
|
-
#private;
|
|
12
|
-
constructor(blockTracker: BlockTracker);
|
|
13
|
-
/**
|
|
14
|
-
* Start the poller with a listener that will be called on every interval.
|
|
15
|
-
* @param listener - The listener to call on every interval.
|
|
16
|
-
*/
|
|
17
|
-
start(listener: (latestBlockNumber: string) => Promise<void>): void;
|
|
18
|
-
/**
|
|
19
|
-
* Stop the poller.
|
|
20
|
-
* Remove all timeouts and block tracker listeners.
|
|
21
|
-
*/
|
|
22
|
-
stop(): void;
|
|
23
|
-
/**
|
|
24
|
-
* Notify the poller of the pending transactions being monitored.
|
|
25
|
-
* This will reset to the accelerated polling and reset the count
|
|
26
|
-
* when new transactions are added or removed.
|
|
27
|
-
* @param pendingTransactions - The pending transactions to poll.
|
|
28
|
-
*/
|
|
29
|
-
setPendingTransactions(pendingTransactions: TransactionMeta[]): void;
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=TransactionPoller.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionPoller.d.cts","sourceRoot":"","sources":["../../src/helpers/TransactionPoller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,qCAAqC;AAKjE,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAiB;AAEhD,eAAO,MAAM,qBAAqB,IAAI,CAAC;AACvC,eAAO,MAAM,oBAAoB,QAAW,CAAC;AAI7C;;;;GAIG;AACH,qBAAa,iBAAiB;;gBAehB,YAAY,EAAE,YAAY;IAItC;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;IAa5D;;;OAGG;IACH,IAAI;IAgBJ;;;;;OAKG;IACH,sBAAsB,CAAC,mBAAmB,EAAE,eAAe,EAAE;CAwF9D"}
|