@metamask-previews/transaction-controller 66.0.1-preview-e37aff3 → 66.0.1-preview-c5f8cd0af
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/dist/TransactionController-method-action-types.cjs.map +1 -1
- package/dist/TransactionController-method-action-types.d.cts +1 -25
- package/dist/TransactionController-method-action-types.d.cts.map +1 -1
- package/dist/TransactionController-method-action-types.d.mts +1 -25
- package/dist/TransactionController-method-action-types.d.mts.map +1 -1
- package/dist/TransactionController-method-action-types.mjs.map +1 -1
- package/dist/TransactionController.cjs +32 -191
- package/dist/TransactionController.cjs.map +1 -1
- package/dist/TransactionController.d.cts +12 -89
- package/dist/TransactionController.d.cts.map +1 -1
- package/dist/TransactionController.d.mts +12 -89
- package/dist/TransactionController.d.mts.map +1 -1
- package/dist/TransactionController.mjs +32 -191
- package/dist/TransactionController.mjs.map +1 -1
- package/dist/api/accounts-api.cjs +1 -42
- package/dist/api/accounts-api.cjs.map +1 -1
- package/dist/api/accounts-api.d.cts +0 -51
- package/dist/api/accounts-api.d.cts.map +1 -1
- package/dist/api/accounts-api.d.mts +0 -51
- package/dist/api/accounts-api.d.mts.map +1 -1
- package/dist/api/accounts-api.mjs +0 -40
- package/dist/api/accounts-api.mjs.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.cjs +27 -7
- package/dist/helpers/MultichainTrackingHelper.cjs.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.d.cts +0 -1
- package/dist/helpers/MultichainTrackingHelper.d.cts.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.d.mts +0 -1
- package/dist/helpers/MultichainTrackingHelper.d.mts.map +1 -1
- package/dist/helpers/MultichainTrackingHelper.mjs +27 -7
- package/dist/helpers/MultichainTrackingHelper.mjs.map +1 -1
- package/dist/helpers/PendingTransactionTracker.cjs +4 -82
- package/dist/helpers/PendingTransactionTracker.cjs.map +1 -1
- package/dist/helpers/PendingTransactionTracker.d.cts +1 -3
- package/dist/helpers/PendingTransactionTracker.d.cts.map +1 -1
- package/dist/helpers/PendingTransactionTracker.d.mts +1 -3
- package/dist/helpers/PendingTransactionTracker.d.mts.map +1 -1
- package/dist/helpers/PendingTransactionTracker.mjs +5 -83
- package/dist/helpers/PendingTransactionTracker.mjs.map +1 -1
- package/dist/index.cjs +1 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -4
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +0 -1
- package/dist/index.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +0 -15
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +0 -15
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/feature-flags.cjs +14 -33
- package/dist/utils/feature-flags.cjs.map +1 -1
- package/dist/utils/feature-flags.d.cts +1 -25
- package/dist/utils/feature-flags.d.cts.map +1 -1
- package/dist/utils/feature-flags.d.mts +1 -25
- package/dist/utils/feature-flags.d.mts.map +1 -1
- package/dist/utils/feature-flags.mjs +13 -30
- package/dist/utils/feature-flags.mjs.map +1 -1
- package/dist/utils/prepare.cjs +8 -4
- package/dist/utils/prepare.cjs.map +1 -1
- package/dist/utils/prepare.d.cts +5 -4
- package/dist/utils/prepare.d.cts.map +1 -1
- package/dist/utils/prepare.d.mts +5 -4
- package/dist/utils/prepare.d.mts.map +1 -1
- package/dist/utils/prepare.mjs +8 -4
- package/dist/utils/prepare.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.cjs +0 -159
- package/dist/helpers/AccountsApiRemoteTransactionSource.cjs.map +0 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts +0 -12
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.cts.map +0 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts +0 -12
- package/dist/helpers/AccountsApiRemoteTransactionSource.d.mts.map +0 -1
- package/dist/helpers/AccountsApiRemoteTransactionSource.mjs +0 -159
- package/dist/helpers/AccountsApiRemoteTransactionSource.mjs.map +0 -1
- package/dist/helpers/IncomingTransactionHelper.cjs +0 -306
- package/dist/helpers/IncomingTransactionHelper.cjs.map +0 -1
- package/dist/helpers/IncomingTransactionHelper.d.cts +0 -45
- package/dist/helpers/IncomingTransactionHelper.d.cts.map +0 -1
- package/dist/helpers/IncomingTransactionHelper.d.mts +0 -45
- package/dist/helpers/IncomingTransactionHelper.d.mts.map +0 -1
- package/dist/helpers/IncomingTransactionHelper.mjs +0 -299
- package/dist/helpers/IncomingTransactionHelper.mjs.map +0 -1
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.getAccountAddressRelationship = void 0;
|
|
4
4
|
const controller_utils_1 = require("@metamask/controller-utils");
|
|
5
5
|
const utils_1 = require("@metamask/utils");
|
|
6
6
|
const errors_1 = require("../errors.cjs");
|
|
7
7
|
const logger_1 = require("../logger.cjs");
|
|
8
8
|
const BASE_URL = `https://accounts.api.cx.metamask.io`;
|
|
9
|
-
const BASE_URL_ACCOUNTS = `${BASE_URL}/v1/accounts/`;
|
|
10
9
|
const CLIENT_HEADER = 'x-metamask-clientproduct';
|
|
11
10
|
const CLIENT_ID = 'metamask-transaction-controller';
|
|
12
11
|
const SUPPORTED_CHAIN_IDS_FOR_RELATIONSHIP_API = [
|
|
@@ -55,44 +54,4 @@ async function getAccountAddressRelationship(request) {
|
|
|
55
54
|
return responseJson;
|
|
56
55
|
}
|
|
57
56
|
exports.getAccountAddressRelationship = getAccountAddressRelationship;
|
|
58
|
-
/**
|
|
59
|
-
* Fetch account transactions from the accounts API.
|
|
60
|
-
*
|
|
61
|
-
* @param request - The request object.
|
|
62
|
-
* @returns The response object.
|
|
63
|
-
*/
|
|
64
|
-
async function getAccountTransactions(request) {
|
|
65
|
-
const { address, chainIds, cursor, endTimestamp, sortDirection, startTimestamp, tags, } = request;
|
|
66
|
-
let url = `${BASE_URL_ACCOUNTS}${address}/transactions`;
|
|
67
|
-
const params = [];
|
|
68
|
-
if (chainIds) {
|
|
69
|
-
const network = chainIds.join(',');
|
|
70
|
-
params.push(`networks=${network}`);
|
|
71
|
-
}
|
|
72
|
-
if (startTimestamp) {
|
|
73
|
-
params.push(`startTimestamp=${startTimestamp}`);
|
|
74
|
-
}
|
|
75
|
-
if (endTimestamp) {
|
|
76
|
-
params.push(`endTimestamp=${endTimestamp}`);
|
|
77
|
-
}
|
|
78
|
-
if (cursor) {
|
|
79
|
-
params.push(`cursor=${cursor}`);
|
|
80
|
-
}
|
|
81
|
-
if (sortDirection) {
|
|
82
|
-
params.push(`sortDirection=${sortDirection}`);
|
|
83
|
-
}
|
|
84
|
-
if (params.length) {
|
|
85
|
-
url += `?${params.join('&')}`;
|
|
86
|
-
}
|
|
87
|
-
log('Getting account transactions', { request, url });
|
|
88
|
-
const clientId = [CLIENT_ID, ...(tags ?? [])].join('__');
|
|
89
|
-
const headers = {
|
|
90
|
-
[CLIENT_HEADER]: clientId,
|
|
91
|
-
};
|
|
92
|
-
const response = await (0, controller_utils_1.successfulFetch)(url, { headers });
|
|
93
|
-
const responseJson = await response.json();
|
|
94
|
-
log('Retrieved account transactions', responseJson);
|
|
95
|
-
return responseJson;
|
|
96
|
-
}
|
|
97
|
-
exports.getAccountTransactions = getAccountTransactions;
|
|
98
57
|
//# sourceMappingURL=accounts-api.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounts-api.cjs","sourceRoot":"","sources":["../../src/api/accounts-api.ts"],"names":[],"mappings":";;;AAAA,iEAA6D;
|
|
1
|
+
{"version":3,"file":"accounts-api.cjs","sourceRoot":"","sources":["../../src/api/accounts-api.ts"],"names":[],"mappings":";;;AAAA,iEAA6D;AAC7D,2CAAqD;AAErD,0CAAsD;AACtD,0CAA0C;AA4C1C,MAAM,QAAQ,GAAG,qCAAqC,CAAC;AACvD,MAAM,aAAa,GAAG,0BAA0B,CAAC;AACjD,MAAM,SAAS,GAAG,iCAAiC,CAAC;AAEpD,MAAM,wCAAwC,GAAG;IAC/C,CAAC,EAAE,mBAAmB;IACtB,EAAE,EAAE,WAAW;IACf,EAAE,EAAE,MAAM;IACV,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,WAAW;CACjB,CAAC;AAEF,MAAM,GAAG,GAAG,IAAA,0BAAkB,EAAC,sBAAa,EAAE,cAAc,CAAC,CAAC;AAE9D;;;;;GAKG;AACI,KAAK,UAAU,6BAA6B,CACjD,OAA6C;IAE7C,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAEtC,IAAI,CAAC,wCAAwC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,mDAAmD,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,IAAI,kCAAyB,CAAC,sBAAsB,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,QAAQ,gBAAgB,OAAO,aAAa,IAAI,kBAAkB,EAAE,EAAE,CAAC;IAEtF,GAAG,CAAC,sCAAsC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAE9D,MAAM,OAAO,GAAG;QACd,CAAC,aAAa,CAAC,EAAE,SAAS;KAC3B,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,IAAA,kCAAe,EAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAEzD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,4FAA4F;QAC5F,yBAAyB;QACzB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,YAAY,GAAqC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE7E,GAAG,CAAC,wCAAwC,EAAE,YAAY,CAAC,CAAC;IAE5D,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC;QAC7C,MAAM,IAAI,kCAAyB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AApCD,sEAoCC","sourcesContent":["import { successfulFetch } from '@metamask/controller-utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { FirstTimeInteractionError } from '../errors';\nimport { projectLogger } from '../logger';\n\nexport type AccountAddressRelationshipResponse = {\n chainId?: number;\n count?: number;\n data?: {\n hash: string;\n timestamp: string;\n chainId: number;\n blockNumber: string;\n blockHash: string;\n gas: number;\n gasUsed: number;\n gasPrice: string;\n effectiveGasPrice: number;\n nonce: number;\n cumulativeGasUsed: number;\n methodId: string;\n value: string;\n to: string;\n from: string;\n };\n txHash?: string;\n};\n\nexport type AccountAddressRelationshipResult =\n AccountAddressRelationshipResponse & {\n error?: {\n code: string;\n message: string;\n };\n };\n\nexport type GetAccountAddressRelationshipRequest = {\n /** Chain ID of account relationship to check. */\n chainId: number;\n\n /** Recipient of the transaction. */\n to: string;\n\n /** Sender of the transaction. */\n from: string;\n};\n\nconst BASE_URL = `https://accounts.api.cx.metamask.io`;\nconst CLIENT_HEADER = 'x-metamask-clientproduct';\nconst CLIENT_ID = 'metamask-transaction-controller';\n\nconst SUPPORTED_CHAIN_IDS_FOR_RELATIONSHIP_API = [\n 1, // Ethereum Mainnet\n 10, // Optimism\n 56, // BSC\n 137, // Polygon\n 8453, // Base\n 42161, // Arbitrum\n 59144, // Linea\n 534352, // Scroll\n 1329, // Sei\n 143, // Monad\n 999, // HyperEVM\n];\n\nconst log = createModuleLogger(projectLogger, 'accounts-api');\n\n/**\n * Fetch account address relationship from the accounts API.\n *\n * @param request - The request object.\n * @returns The raw response object from the API.\n */\nexport async function getAccountAddressRelationship(\n request: GetAccountAddressRelationshipRequest,\n): Promise<AccountAddressRelationshipResult> {\n const { chainId, from, to } = request;\n\n if (!SUPPORTED_CHAIN_IDS_FOR_RELATIONSHIP_API.includes(chainId)) {\n log('Unsupported chain ID for account relationship API', chainId);\n throw new FirstTimeInteractionError('Unsupported chain ID');\n }\n\n const url = `${BASE_URL}/v1/networks/${chainId}/accounts/${from}/relationships/${to}`;\n\n log('Getting account address relationship', { request, url });\n\n const headers = {\n [CLIENT_HEADER]: CLIENT_ID,\n };\n\n const response = await successfulFetch(url, { headers });\n\n if (response.status === 204) {\n // The accounts API returns a 204 status code when there are no transactions with empty body\n // imitating a count of 0\n return { count: 0 };\n }\n\n const responseJson: AccountAddressRelationshipResult = await response.json();\n\n log('Retrieved account address relationship', responseJson);\n\n if (responseJson.error) {\n const { code, message } = responseJson.error;\n throw new FirstTimeInteractionError(message, code);\n }\n\n return responseJson;\n}\n"]}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { Hex } from "@metamask/utils";
|
|
2
1
|
export type AccountAddressRelationshipResponse = {
|
|
3
2
|
chainId?: number;
|
|
4
3
|
count?: number;
|
|
@@ -35,49 +34,6 @@ export type GetAccountAddressRelationshipRequest = {
|
|
|
35
34
|
/** Sender of the transaction. */
|
|
36
35
|
from: string;
|
|
37
36
|
};
|
|
38
|
-
export type TransactionResponse = {
|
|
39
|
-
hash: Hex;
|
|
40
|
-
timestamp: string;
|
|
41
|
-
chainId: number;
|
|
42
|
-
blockNumber: number;
|
|
43
|
-
blockHash: Hex;
|
|
44
|
-
gas: number;
|
|
45
|
-
gasUsed: number;
|
|
46
|
-
gasPrice: string;
|
|
47
|
-
effectiveGasPrice: string;
|
|
48
|
-
nonce: number;
|
|
49
|
-
cumulativeGasUsed: number;
|
|
50
|
-
methodId?: Hex;
|
|
51
|
-
value: string;
|
|
52
|
-
to: string;
|
|
53
|
-
from: string;
|
|
54
|
-
isError: boolean;
|
|
55
|
-
valueTransfers: {
|
|
56
|
-
contractAddress: string;
|
|
57
|
-
decimal: number;
|
|
58
|
-
symbol: string;
|
|
59
|
-
from: string;
|
|
60
|
-
to: string;
|
|
61
|
-
amount: string;
|
|
62
|
-
}[];
|
|
63
|
-
};
|
|
64
|
-
export type GetAccountTransactionsRequest = {
|
|
65
|
-
address: Hex;
|
|
66
|
-
chainIds?: Hex[];
|
|
67
|
-
cursor?: string;
|
|
68
|
-
endTimestamp?: number;
|
|
69
|
-
sortDirection?: 'ASC' | 'DESC';
|
|
70
|
-
startTimestamp?: number;
|
|
71
|
-
tags?: string[];
|
|
72
|
-
};
|
|
73
|
-
export type GetAccountTransactionsResponse = {
|
|
74
|
-
data: TransactionResponse[];
|
|
75
|
-
pageInfo: {
|
|
76
|
-
count: number;
|
|
77
|
-
hasNextPage: boolean;
|
|
78
|
-
cursor?: string;
|
|
79
|
-
};
|
|
80
|
-
};
|
|
81
37
|
/**
|
|
82
38
|
* Fetch account address relationship from the accounts API.
|
|
83
39
|
*
|
|
@@ -85,11 +41,4 @@ export type GetAccountTransactionsResponse = {
|
|
|
85
41
|
* @returns The raw response object from the API.
|
|
86
42
|
*/
|
|
87
43
|
export declare function getAccountAddressRelationship(request: GetAccountAddressRelationshipRequest): Promise<AccountAddressRelationshipResult>;
|
|
88
|
-
/**
|
|
89
|
-
* Fetch account transactions from the accounts API.
|
|
90
|
-
*
|
|
91
|
-
* @param request - The request object.
|
|
92
|
-
* @returns The response object.
|
|
93
|
-
*/
|
|
94
|
-
export declare function getAccountTransactions(request: GetAccountTransactionsRequest): Promise<GetAccountTransactionsResponse>;
|
|
95
44
|
//# sourceMappingURL=accounts-api.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounts-api.d.cts","sourceRoot":"","sources":["../../src/api/accounts-api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"accounts-api.d.cts","sourceRoot":"","sources":["../../src/api/accounts-api.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,kCAAkC,GAAG;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC;QACd,iBAAiB,EAAE,MAAM,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAC1C,kCAAkC,GAAG;IACnC,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAEJ,MAAM,MAAM,oCAAoC,GAAG;IACjD,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAEhB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IAEX,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAsBF;;;;;GAKG;AACH,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,oCAAoC,GAC5C,OAAO,CAAC,gCAAgC,CAAC,CAkC3C"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { Hex } from "@metamask/utils";
|
|
2
1
|
export type AccountAddressRelationshipResponse = {
|
|
3
2
|
chainId?: number;
|
|
4
3
|
count?: number;
|
|
@@ -35,49 +34,6 @@ export type GetAccountAddressRelationshipRequest = {
|
|
|
35
34
|
/** Sender of the transaction. */
|
|
36
35
|
from: string;
|
|
37
36
|
};
|
|
38
|
-
export type TransactionResponse = {
|
|
39
|
-
hash: Hex;
|
|
40
|
-
timestamp: string;
|
|
41
|
-
chainId: number;
|
|
42
|
-
blockNumber: number;
|
|
43
|
-
blockHash: Hex;
|
|
44
|
-
gas: number;
|
|
45
|
-
gasUsed: number;
|
|
46
|
-
gasPrice: string;
|
|
47
|
-
effectiveGasPrice: string;
|
|
48
|
-
nonce: number;
|
|
49
|
-
cumulativeGasUsed: number;
|
|
50
|
-
methodId?: Hex;
|
|
51
|
-
value: string;
|
|
52
|
-
to: string;
|
|
53
|
-
from: string;
|
|
54
|
-
isError: boolean;
|
|
55
|
-
valueTransfers: {
|
|
56
|
-
contractAddress: string;
|
|
57
|
-
decimal: number;
|
|
58
|
-
symbol: string;
|
|
59
|
-
from: string;
|
|
60
|
-
to: string;
|
|
61
|
-
amount: string;
|
|
62
|
-
}[];
|
|
63
|
-
};
|
|
64
|
-
export type GetAccountTransactionsRequest = {
|
|
65
|
-
address: Hex;
|
|
66
|
-
chainIds?: Hex[];
|
|
67
|
-
cursor?: string;
|
|
68
|
-
endTimestamp?: number;
|
|
69
|
-
sortDirection?: 'ASC' | 'DESC';
|
|
70
|
-
startTimestamp?: number;
|
|
71
|
-
tags?: string[];
|
|
72
|
-
};
|
|
73
|
-
export type GetAccountTransactionsResponse = {
|
|
74
|
-
data: TransactionResponse[];
|
|
75
|
-
pageInfo: {
|
|
76
|
-
count: number;
|
|
77
|
-
hasNextPage: boolean;
|
|
78
|
-
cursor?: string;
|
|
79
|
-
};
|
|
80
|
-
};
|
|
81
37
|
/**
|
|
82
38
|
* Fetch account address relationship from the accounts API.
|
|
83
39
|
*
|
|
@@ -85,11 +41,4 @@ export type GetAccountTransactionsResponse = {
|
|
|
85
41
|
* @returns The raw response object from the API.
|
|
86
42
|
*/
|
|
87
43
|
export declare function getAccountAddressRelationship(request: GetAccountAddressRelationshipRequest): Promise<AccountAddressRelationshipResult>;
|
|
88
|
-
/**
|
|
89
|
-
* Fetch account transactions from the accounts API.
|
|
90
|
-
*
|
|
91
|
-
* @param request - The request object.
|
|
92
|
-
* @returns The response object.
|
|
93
|
-
*/
|
|
94
|
-
export declare function getAccountTransactions(request: GetAccountTransactionsRequest): Promise<GetAccountTransactionsResponse>;
|
|
95
44
|
//# sourceMappingURL=accounts-api.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounts-api.d.mts","sourceRoot":"","sources":["../../src/api/accounts-api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"accounts-api.d.mts","sourceRoot":"","sources":["../../src/api/accounts-api.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,kCAAkC,GAAG;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC;QACd,iBAAiB,EAAE,MAAM,CAAC;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAC1C,kCAAkC,GAAG;IACnC,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAEJ,MAAM,MAAM,oCAAoC,GAAG;IACjD,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAEhB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IAEX,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAsBF;;;;;GAKG;AACH,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,oCAAoC,GAC5C,OAAO,CAAC,gCAAgC,CAAC,CAkC3C"}
|
|
@@ -3,7 +3,6 @@ import { createModuleLogger } from "@metamask/utils";
|
|
|
3
3
|
import { FirstTimeInteractionError } from "../errors.mjs";
|
|
4
4
|
import { projectLogger } from "../logger.mjs";
|
|
5
5
|
const BASE_URL = `https://accounts.api.cx.metamask.io`;
|
|
6
|
-
const BASE_URL_ACCOUNTS = `${BASE_URL}/v1/accounts/`;
|
|
7
6
|
const CLIENT_HEADER = 'x-metamask-clientproduct';
|
|
8
7
|
const CLIENT_ID = 'metamask-transaction-controller';
|
|
9
8
|
const SUPPORTED_CHAIN_IDS_FOR_RELATIONSHIP_API = [
|
|
@@ -51,43 +50,4 @@ export async function getAccountAddressRelationship(request) {
|
|
|
51
50
|
}
|
|
52
51
|
return responseJson;
|
|
53
52
|
}
|
|
54
|
-
/**
|
|
55
|
-
* Fetch account transactions from the accounts API.
|
|
56
|
-
*
|
|
57
|
-
* @param request - The request object.
|
|
58
|
-
* @returns The response object.
|
|
59
|
-
*/
|
|
60
|
-
export async function getAccountTransactions(request) {
|
|
61
|
-
const { address, chainIds, cursor, endTimestamp, sortDirection, startTimestamp, tags, } = request;
|
|
62
|
-
let url = `${BASE_URL_ACCOUNTS}${address}/transactions`;
|
|
63
|
-
const params = [];
|
|
64
|
-
if (chainIds) {
|
|
65
|
-
const network = chainIds.join(',');
|
|
66
|
-
params.push(`networks=${network}`);
|
|
67
|
-
}
|
|
68
|
-
if (startTimestamp) {
|
|
69
|
-
params.push(`startTimestamp=${startTimestamp}`);
|
|
70
|
-
}
|
|
71
|
-
if (endTimestamp) {
|
|
72
|
-
params.push(`endTimestamp=${endTimestamp}`);
|
|
73
|
-
}
|
|
74
|
-
if (cursor) {
|
|
75
|
-
params.push(`cursor=${cursor}`);
|
|
76
|
-
}
|
|
77
|
-
if (sortDirection) {
|
|
78
|
-
params.push(`sortDirection=${sortDirection}`);
|
|
79
|
-
}
|
|
80
|
-
if (params.length) {
|
|
81
|
-
url += `?${params.join('&')}`;
|
|
82
|
-
}
|
|
83
|
-
log('Getting account transactions', { request, url });
|
|
84
|
-
const clientId = [CLIENT_ID, ...(tags ?? [])].join('__');
|
|
85
|
-
const headers = {
|
|
86
|
-
[CLIENT_HEADER]: clientId,
|
|
87
|
-
};
|
|
88
|
-
const response = await successfulFetch(url, { headers });
|
|
89
|
-
const responseJson = await response.json();
|
|
90
|
-
log('Retrieved account transactions', responseJson);
|
|
91
|
-
return responseJson;
|
|
92
|
-
}
|
|
93
53
|
//# sourceMappingURL=accounts-api.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accounts-api.mjs","sourceRoot":"","sources":["../../src/api/accounts-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mCAAmC;
|
|
1
|
+
{"version":3,"file":"accounts-api.mjs","sourceRoot":"","sources":["../../src/api/accounts-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,mCAAmC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,wBAAwB;AAErD,OAAO,EAAE,yBAAyB,EAAE,sBAAkB;AACtD,OAAO,EAAE,aAAa,EAAE,sBAAkB;AA4C1C,MAAM,QAAQ,GAAG,qCAAqC,CAAC;AACvD,MAAM,aAAa,GAAG,0BAA0B,CAAC;AACjD,MAAM,SAAS,GAAG,iCAAiC,CAAC;AAEpD,MAAM,wCAAwC,GAAG;IAC/C,CAAC,EAAE,mBAAmB;IACtB,EAAE,EAAE,WAAW;IACf,EAAE,EAAE,MAAM;IACV,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,WAAW;IAClB,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,WAAW;CACjB,CAAC;AAEF,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,OAA6C;IAE7C,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAEtC,IAAI,CAAC,wCAAwC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,mDAAmD,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,IAAI,yBAAyB,CAAC,sBAAsB,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,QAAQ,gBAAgB,OAAO,aAAa,IAAI,kBAAkB,EAAE,EAAE,CAAC;IAEtF,GAAG,CAAC,sCAAsC,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IAE9D,MAAM,OAAO,GAAG;QACd,CAAC,aAAa,CAAC,EAAE,SAAS;KAC3B,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAEzD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,4FAA4F;QAC5F,yBAAyB;QACzB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,YAAY,GAAqC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAE7E,GAAG,CAAC,wCAAwC,EAAE,YAAY,CAAC,CAAC;IAE5D,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC;QAC7C,MAAM,IAAI,yBAAyB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC","sourcesContent":["import { successfulFetch } from '@metamask/controller-utils';\nimport { createModuleLogger } from '@metamask/utils';\n\nimport { FirstTimeInteractionError } from '../errors';\nimport { projectLogger } from '../logger';\n\nexport type AccountAddressRelationshipResponse = {\n chainId?: number;\n count?: number;\n data?: {\n hash: string;\n timestamp: string;\n chainId: number;\n blockNumber: string;\n blockHash: string;\n gas: number;\n gasUsed: number;\n gasPrice: string;\n effectiveGasPrice: number;\n nonce: number;\n cumulativeGasUsed: number;\n methodId: string;\n value: string;\n to: string;\n from: string;\n };\n txHash?: string;\n};\n\nexport type AccountAddressRelationshipResult =\n AccountAddressRelationshipResponse & {\n error?: {\n code: string;\n message: string;\n };\n };\n\nexport type GetAccountAddressRelationshipRequest = {\n /** Chain ID of account relationship to check. */\n chainId: number;\n\n /** Recipient of the transaction. */\n to: string;\n\n /** Sender of the transaction. */\n from: string;\n};\n\nconst BASE_URL = `https://accounts.api.cx.metamask.io`;\nconst CLIENT_HEADER = 'x-metamask-clientproduct';\nconst CLIENT_ID = 'metamask-transaction-controller';\n\nconst SUPPORTED_CHAIN_IDS_FOR_RELATIONSHIP_API = [\n 1, // Ethereum Mainnet\n 10, // Optimism\n 56, // BSC\n 137, // Polygon\n 8453, // Base\n 42161, // Arbitrum\n 59144, // Linea\n 534352, // Scroll\n 1329, // Sei\n 143, // Monad\n 999, // HyperEVM\n];\n\nconst log = createModuleLogger(projectLogger, 'accounts-api');\n\n/**\n * Fetch account address relationship from the accounts API.\n *\n * @param request - The request object.\n * @returns The raw response object from the API.\n */\nexport async function getAccountAddressRelationship(\n request: GetAccountAddressRelationshipRequest,\n): Promise<AccountAddressRelationshipResult> {\n const { chainId, from, to } = request;\n\n if (!SUPPORTED_CHAIN_IDS_FOR_RELATIONSHIP_API.includes(chainId)) {\n log('Unsupported chain ID for account relationship API', chainId);\n throw new FirstTimeInteractionError('Unsupported chain ID');\n }\n\n const url = `${BASE_URL}/v1/networks/${chainId}/accounts/${from}/relationships/${to}`;\n\n log('Getting account address relationship', { request, url });\n\n const headers = {\n [CLIENT_HEADER]: CLIENT_ID,\n };\n\n const response = await successfulFetch(url, { headers });\n\n if (response.status === 204) {\n // The accounts API returns a 204 status code when there are no transactions with empty body\n // imitating a count of 0\n return { count: 0 };\n }\n\n const responseJson: AccountAddressRelationshipResult = await response.json();\n\n log('Retrieved account address relationship', responseJson);\n\n if (responseJson.error) {\n const { code, message } = responseJson.error;\n throw new FirstTimeInteractionError(message, code);\n }\n\n return responseJson;\n}\n"]}
|
|
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
10
10
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
11
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
12
|
};
|
|
13
|
-
var _MultichainTrackingHelper_instances, _MultichainTrackingHelper_findNetworkClientIdByChainId, _MultichainTrackingHelper_getNetworkClientById, _MultichainTrackingHelper_getNetworkClientRegistry, _MultichainTrackingHelper_removePendingTransactionTrackerListeners, _MultichainTrackingHelper_createNonceTracker, _MultichainTrackingHelper_createPendingTransactionTracker, _MultichainTrackingHelper_nonceMutexesByChainId, _MultichainTrackingHelper_trackingMap, _MultichainTrackingHelper_refreshTrackingMap, _MultichainTrackingHelper_stopTrackingByNetworkClientId, _MultichainTrackingHelper_startTrackingByNetworkClientId;
|
|
13
|
+
var _MultichainTrackingHelper_instances, _MultichainTrackingHelper_findNetworkClientIdByChainId, _MultichainTrackingHelper_getNetworkClientById, _MultichainTrackingHelper_getNetworkClientRegistry, _MultichainTrackingHelper_removePendingTransactionTrackerListeners, _MultichainTrackingHelper_createNonceTracker, _MultichainTrackingHelper_createPendingTransactionTracker, _MultichainTrackingHelper_initialized, _MultichainTrackingHelper_initInterval, _MultichainTrackingHelper_nonceMutexesByChainId, _MultichainTrackingHelper_trackingMap, _MultichainTrackingHelper_waitForNetworkController, _MultichainTrackingHelper_refreshTrackingMap, _MultichainTrackingHelper_stopTrackingByNetworkClientId, _MultichainTrackingHelper_startTrackingByNetworkClientId;
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.MultichainTrackingHelper = void 0;
|
|
16
16
|
const async_mutex_1 = require("async-mutex");
|
|
@@ -25,6 +25,8 @@ class MultichainTrackingHelper {
|
|
|
25
25
|
_MultichainTrackingHelper_removePendingTransactionTrackerListeners.set(this, void 0);
|
|
26
26
|
_MultichainTrackingHelper_createNonceTracker.set(this, void 0);
|
|
27
27
|
_MultichainTrackingHelper_createPendingTransactionTracker.set(this, void 0);
|
|
28
|
+
_MultichainTrackingHelper_initialized.set(this, false);
|
|
29
|
+
_MultichainTrackingHelper_initInterval.set(this, void 0);
|
|
28
30
|
_MultichainTrackingHelper_nonceMutexesByChainId.set(this, new Map());
|
|
29
31
|
_MultichainTrackingHelper_trackingMap.set(this, new Map());
|
|
30
32
|
this.checkForPendingTransactionAndStartPolling = () => {
|
|
@@ -59,6 +61,9 @@ class MultichainTrackingHelper {
|
|
|
59
61
|
__classPrivateFieldSet(this, _MultichainTrackingHelper_createNonceTracker, createNonceTracker, "f");
|
|
60
62
|
__classPrivateFieldSet(this, _MultichainTrackingHelper_createPendingTransactionTracker, createPendingTransactionTracker, "f");
|
|
61
63
|
onNetworkStateChange((_, patches) => {
|
|
64
|
+
if (!__classPrivateFieldGet(this, _MultichainTrackingHelper_initialized, "f")) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
62
67
|
const networkClients = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientRegistry, "f").call(this);
|
|
63
68
|
patches.forEach(({ op, path }) => {
|
|
64
69
|
if (op === 'remove' && path[0] === 'networkConfigurations') {
|
|
@@ -68,11 +73,7 @@ class MultichainTrackingHelper {
|
|
|
68
73
|
});
|
|
69
74
|
__classPrivateFieldGet(this, _MultichainTrackingHelper_refreshTrackingMap, "f").call(this, networkClients);
|
|
70
75
|
});
|
|
71
|
-
|
|
72
|
-
initialize() {
|
|
73
|
-
const networkClients = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientRegistry, "f").call(this);
|
|
74
|
-
__classPrivateFieldGet(this, _MultichainTrackingHelper_refreshTrackingMap, "f").call(this, networkClients);
|
|
75
|
-
log('Initialized');
|
|
76
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_instances, "m", _MultichainTrackingHelper_waitForNetworkController).call(this);
|
|
76
77
|
}
|
|
77
78
|
has(networkClientId) {
|
|
78
79
|
return __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").has(networkClientId);
|
|
@@ -137,6 +138,10 @@ class MultichainTrackingHelper {
|
|
|
137
138
|
}
|
|
138
139
|
}
|
|
139
140
|
stopAllTracking() {
|
|
141
|
+
if (__classPrivateFieldGet(this, _MultichainTrackingHelper_initInterval, "f")) {
|
|
142
|
+
clearInterval(__classPrivateFieldGet(this, _MultichainTrackingHelper_initInterval, "f"));
|
|
143
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, undefined, "f");
|
|
144
|
+
}
|
|
140
145
|
for (const [networkClientId] of __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f")) {
|
|
141
146
|
__classPrivateFieldGet(this, _MultichainTrackingHelper_instances, "m", _MultichainTrackingHelper_stopTrackingByNetworkClientId).call(this, networkClientId);
|
|
142
147
|
}
|
|
@@ -169,7 +174,22 @@ class MultichainTrackingHelper {
|
|
|
169
174
|
}
|
|
170
175
|
}
|
|
171
176
|
exports.MultichainTrackingHelper = MultichainTrackingHelper;
|
|
172
|
-
_MultichainTrackingHelper_findNetworkClientIdByChainId = new WeakMap(), _MultichainTrackingHelper_getNetworkClientById = new WeakMap(), _MultichainTrackingHelper_getNetworkClientRegistry = new WeakMap(), _MultichainTrackingHelper_removePendingTransactionTrackerListeners = new WeakMap(), _MultichainTrackingHelper_createNonceTracker = new WeakMap(), _MultichainTrackingHelper_createPendingTransactionTracker = new WeakMap(), _MultichainTrackingHelper_nonceMutexesByChainId = new WeakMap(), _MultichainTrackingHelper_trackingMap = new WeakMap(), _MultichainTrackingHelper_refreshTrackingMap = new WeakMap(), _MultichainTrackingHelper_instances = new WeakSet(),
|
|
177
|
+
_MultichainTrackingHelper_findNetworkClientIdByChainId = new WeakMap(), _MultichainTrackingHelper_getNetworkClientById = new WeakMap(), _MultichainTrackingHelper_getNetworkClientRegistry = new WeakMap(), _MultichainTrackingHelper_removePendingTransactionTrackerListeners = new WeakMap(), _MultichainTrackingHelper_createNonceTracker = new WeakMap(), _MultichainTrackingHelper_createPendingTransactionTracker = new WeakMap(), _MultichainTrackingHelper_initialized = new WeakMap(), _MultichainTrackingHelper_initInterval = new WeakMap(), _MultichainTrackingHelper_nonceMutexesByChainId = new WeakMap(), _MultichainTrackingHelper_trackingMap = new WeakMap(), _MultichainTrackingHelper_refreshTrackingMap = new WeakMap(), _MultichainTrackingHelper_instances = new WeakSet(), _MultichainTrackingHelper_waitForNetworkController = function _MultichainTrackingHelper_waitForNetworkController() {
|
|
178
|
+
log('Waiting for NetworkController to be available');
|
|
179
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, setInterval(() => {
|
|
180
|
+
try {
|
|
181
|
+
const networkClients = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientRegistry, "f").call(this);
|
|
182
|
+
clearInterval(__classPrivateFieldGet(this, _MultichainTrackingHelper_initInterval, "f"));
|
|
183
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, undefined, "f");
|
|
184
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_refreshTrackingMap, "f").call(this, networkClients);
|
|
185
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_initialized, true, "f");
|
|
186
|
+
log('Initialized');
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
log('NetworkController not yet available, retrying');
|
|
190
|
+
}
|
|
191
|
+
}, 10), "f");
|
|
192
|
+
}, _MultichainTrackingHelper_stopTrackingByNetworkClientId = function _MultichainTrackingHelper_stopTrackingByNetworkClientId(networkClientId) {
|
|
173
193
|
const trackers = __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").get(networkClientId);
|
|
174
194
|
if (trackers) {
|
|
175
195
|
trackers.pendingTransactionTracker.stop();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultichainTrackingHelper.cjs","sourceRoot":"","sources":["../../src/helpers/MultichainTrackingHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n NetworkClientId,\n NetworkController,\n NetworkClient,\n BlockTracker,\n Provider,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport type { NonceLock, NonceTracker } from '@metamask/nonce-tracker';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\n\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { PendingTransactionTracker } from './PendingTransactionTracker';\n\n/**\n * Registry of network clients provided by the NetworkController\n */\ntype NetworkClientRegistry = ReturnType<\n NetworkController['getNetworkClientRegistry']\n>;\n\nconst log = createModuleLogger(projectLogger, 'multichain-tracking');\n\nexport type MultichainTrackingHelperOptions = {\n findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n getNetworkClientById: NetworkController['getNetworkClientById'];\n getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }) => NonceTracker;\n createPendingTransactionTracker: (opts: {\n blockTracker: BlockTracker;\n networkClientId: NetworkClientId;\n }) => PendingTransactionTracker;\n onNetworkStateChange: (\n listener: (\n ...payload: NetworkControllerStateChangeEvent['payload']\n ) => void,\n ) => void;\n};\n\nexport class MultichainTrackingHelper {\n readonly #findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n\n readonly #getNetworkClientById: NetworkController['getNetworkClientById'];\n\n readonly #getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n readonly #removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n\n readonly #createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }) => NonceTracker;\n\n readonly #createPendingTransactionTracker: (opts: {\n blockTracker: BlockTracker;\n networkClientId: NetworkClientId;\n }) => PendingTransactionTracker;\n\n readonly #nonceMutexesByChainId = new Map<Hex, Map<string, Mutex>>();\n\n readonly #trackingMap: Map<\n NetworkClientId,\n {\n nonceTracker: NonceTracker;\n pendingTransactionTracker: PendingTransactionTracker;\n }\n > = new Map();\n\n constructor({\n findNetworkClientIdByChainId,\n getNetworkClientById,\n getNetworkClientRegistry,\n removePendingTransactionTrackerListeners,\n createNonceTracker,\n createPendingTransactionTracker,\n onNetworkStateChange,\n }: MultichainTrackingHelperOptions) {\n this.#findNetworkClientIdByChainId = findNetworkClientIdByChainId;\n this.#getNetworkClientById = getNetworkClientById;\n this.#getNetworkClientRegistry = getNetworkClientRegistry;\n\n this.#removePendingTransactionTrackerListeners =\n removePendingTransactionTrackerListeners;\n this.#createNonceTracker = createNonceTracker;\n this.#createPendingTransactionTracker = createPendingTransactionTracker;\n\n onNetworkStateChange((_, patches) => {\n const networkClients = this.#getNetworkClientRegistry();\n\n patches.forEach(({ op, path }) => {\n if (op === 'remove' && path[0] === 'networkConfigurations') {\n const networkClientId = path[1] as NetworkClientId;\n delete networkClients[networkClientId];\n }\n });\n\n this.#refreshTrackingMap(networkClients);\n });\n }\n\n initialize(): void {\n const networkClients = this.#getNetworkClientRegistry();\n\n this.#refreshTrackingMap(networkClients);\n\n log('Initialized');\n }\n\n has(networkClientId: NetworkClientId): boolean {\n return this.#trackingMap.has(networkClientId);\n }\n\n /**\n * Gets the mutex intended to guard the nonceTracker for a particular chainId and key .\n *\n * @param opts - The options object.\n * @param opts.chainId - The hex chainId.\n * @param opts.key - The hex address (or constant) pertaining to the chainId\n * @returns Mutex instance for the given chainId and key pair\n */\n async acquireNonceLockForChainIdKey({\n chainId,\n key = 'global',\n }: {\n chainId: Hex;\n key?: string;\n }): Promise<() => void> {\n let nonceMutexesForChainId = this.#nonceMutexesByChainId.get(chainId);\n if (!nonceMutexesForChainId) {\n nonceMutexesForChainId = new Map<string, Mutex>();\n this.#nonceMutexesByChainId.set(chainId, nonceMutexesForChainId);\n }\n let nonceMutexForKey = nonceMutexesForChainId.get(key);\n if (!nonceMutexForKey) {\n nonceMutexForKey = new Mutex();\n nonceMutexesForChainId.set(key, nonceMutexForKey);\n }\n\n return await nonceMutexForKey.acquire();\n }\n\n /**\n * Gets the next nonce according to the nonce-tracker.\n * Ensure `releaseLock` is called once processing of the `nonce` value is complete.\n *\n * @param address - The hex string address for the transaction.\n * @param networkClientId - The network client ID for the transaction, used to fetch the correct nonce tracker.\n * @returns object with the `nextNonce` `nonceDetails`, and the releaseLock.\n */\n async getNonceLock(\n address: string,\n networkClientId: NetworkClientId,\n ): Promise<NonceLock> {\n const networkClient = this.#getNetworkClientById(networkClientId);\n\n const releaseLockForChainIdKey = await this.acquireNonceLockForChainIdKey({\n chainId: networkClient.configuration.chainId,\n key: address,\n });\n\n const nonceTracker = this.#trackingMap.get(networkClientId)?.nonceTracker;\n\n if (!nonceTracker) {\n throw new Error(\n `Missing nonce tracker for network client ID - ${networkClientId}`,\n );\n }\n\n // Acquires the lock for the chainId + address and the nonceLock from the nonceTracker, then\n // couples them together by replacing the nonceLock's releaseLock method with\n // an anonymous function that calls releases both the original nonceLock and the\n // lock for the chainId.\n try {\n const nonceLock = await nonceTracker.getNonceLock(address);\n\n const releaseLock = (): void => {\n nonceLock.releaseLock();\n releaseLockForChainIdKey?.();\n };\n\n return {\n ...nonceLock,\n releaseLock,\n };\n } catch (error) {\n releaseLockForChainIdKey?.();\n throw error;\n }\n }\n\n checkForPendingTransactionAndStartPolling = (): void => {\n for (const [, trackers] of this.#trackingMap) {\n trackers.pendingTransactionTracker.startIfPendingTransactions();\n }\n };\n\n stopAllTracking(): void {\n for (const [networkClientId] of this.#trackingMap) {\n this.#stopTrackingByNetworkClientId(networkClientId);\n }\n }\n\n getNetworkClient({\n chainId,\n networkClientId: requestNetworkClientId,\n }: {\n chainId?: Hex;\n networkClientId?: NetworkClientId;\n }): NetworkClient & { id: NetworkClientId } {\n if (!requestNetworkClientId && !chainId) {\n throw new Error(\n 'Cannot locate network client without networkClientId or chainId',\n );\n }\n\n let networkClient: NetworkClient | undefined;\n let networkClientId = requestNetworkClientId;\n\n try {\n if (requestNetworkClientId) {\n networkClient = this.#getNetworkClientById(requestNetworkClientId);\n }\n } catch (error) {\n log('No network client found with ID', requestNetworkClientId);\n\n if (!chainId) {\n throw error;\n }\n }\n\n if (!networkClient && chainId) {\n networkClientId = this.#findNetworkClientIdByChainId(chainId);\n networkClient = this.#getNetworkClientById(networkClientId);\n }\n\n return {\n ...(networkClient as NetworkClient),\n id: networkClientId as NetworkClientId,\n };\n }\n\n readonly #refreshTrackingMap = (\n networkClients: NetworkClientRegistry,\n ): void => {\n const networkClientIds = Object.keys(networkClients);\n const existingNetworkClientIds = Array.from(this.#trackingMap.keys());\n\n // Remove tracking for NetworkClientIds that no longer exist\n const networkClientIdsToRemove = existingNetworkClientIds.filter(\n (id) => !networkClientIds.includes(id),\n );\n\n networkClientIdsToRemove.forEach((id) => {\n this.#stopTrackingByNetworkClientId(id);\n });\n\n // Start tracking new NetworkClientIds from the registry\n const networkClientIdsToAdd = networkClientIds.filter(\n (id) => !existingNetworkClientIds.includes(id),\n );\n\n networkClientIdsToAdd.forEach((id) => {\n this.#startTrackingByNetworkClientId(id);\n });\n\n if (networkClientIdsToAdd.length) {\n log('Added trackers', networkClientIdsToAdd);\n }\n\n if (networkClientIdsToRemove.length) {\n log('Removed trackers', networkClientIdsToRemove);\n }\n };\n\n #stopTrackingByNetworkClientId(networkClientId: NetworkClientId): void {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n trackers.pendingTransactionTracker.stop();\n this.#removePendingTransactionTrackerListeners(\n trackers.pendingTransactionTracker,\n );\n this.#trackingMap.delete(networkClientId);\n }\n }\n\n #startTrackingByNetworkClientId(networkClientId: NetworkClientId): void {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n return;\n }\n\n const {\n provider,\n blockTracker,\n configuration: { chainId },\n } = this.#getNetworkClientById(networkClientId);\n\n const nonceTracker = this.#createNonceTracker({\n provider,\n blockTracker,\n chainId,\n });\n\n const pendingTransactionTracker = this.#createPendingTransactionTracker({\n blockTracker,\n networkClientId,\n });\n\n this.#trackingMap.set(networkClientId, {\n nonceTracker,\n pendingTransactionTracker,\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MultichainTrackingHelper.cjs","sourceRoot":"","sources":["../../src/helpers/MultichainTrackingHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n NetworkClientId,\n NetworkController,\n NetworkClient,\n BlockTracker,\n Provider,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport type { NonceLock, NonceTracker } from '@metamask/nonce-tracker';\nimport type { Hex } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\n\nimport { createModuleLogger, projectLogger } from '../logger';\nimport type { PendingTransactionTracker } from './PendingTransactionTracker';\n\n/**\n * Registry of network clients provided by the NetworkController\n */\ntype NetworkClientRegistry = ReturnType<\n NetworkController['getNetworkClientRegistry']\n>;\n\nconst log = createModuleLogger(projectLogger, 'multichain-tracking');\n\nexport type MultichainTrackingHelperOptions = {\n findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n getNetworkClientById: NetworkController['getNetworkClientById'];\n getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }) => NonceTracker;\n createPendingTransactionTracker: (opts: {\n blockTracker: BlockTracker;\n networkClientId: NetworkClientId;\n }) => PendingTransactionTracker;\n onNetworkStateChange: (\n listener: (\n ...payload: NetworkControllerStateChangeEvent['payload']\n ) => void,\n ) => void;\n};\n\nexport class MultichainTrackingHelper {\n readonly #findNetworkClientIdByChainId: NetworkController['findNetworkClientIdByChainId'];\n\n readonly #getNetworkClientById: NetworkController['getNetworkClientById'];\n\n readonly #getNetworkClientRegistry: NetworkController['getNetworkClientRegistry'];\n\n readonly #removePendingTransactionTrackerListeners: (\n pendingTransactionTracker: PendingTransactionTracker,\n ) => void;\n\n readonly #createNonceTracker: (opts: {\n provider: Provider;\n blockTracker: BlockTracker;\n chainId: Hex;\n }) => NonceTracker;\n\n readonly #createPendingTransactionTracker: (opts: {\n blockTracker: BlockTracker;\n networkClientId: NetworkClientId;\n }) => PendingTransactionTracker;\n\n #initialized = false;\n\n #initInterval?: ReturnType<typeof setInterval>;\n\n readonly #nonceMutexesByChainId = new Map<Hex, Map<string, Mutex>>();\n\n readonly #trackingMap: Map<\n NetworkClientId,\n {\n nonceTracker: NonceTracker;\n pendingTransactionTracker: PendingTransactionTracker;\n }\n > = new Map();\n\n constructor({\n findNetworkClientIdByChainId,\n getNetworkClientById,\n getNetworkClientRegistry,\n removePendingTransactionTrackerListeners,\n createNonceTracker,\n createPendingTransactionTracker,\n onNetworkStateChange,\n }: MultichainTrackingHelperOptions) {\n this.#findNetworkClientIdByChainId = findNetworkClientIdByChainId;\n this.#getNetworkClientById = getNetworkClientById;\n this.#getNetworkClientRegistry = getNetworkClientRegistry;\n\n this.#removePendingTransactionTrackerListeners =\n removePendingTransactionTrackerListeners;\n this.#createNonceTracker = createNonceTracker;\n this.#createPendingTransactionTracker = createPendingTransactionTracker;\n\n onNetworkStateChange((_, patches) => {\n if (!this.#initialized) {\n return;\n }\n\n const networkClients = this.#getNetworkClientRegistry();\n\n patches.forEach(({ op, path }) => {\n if (op === 'remove' && path[0] === 'networkConfigurations') {\n const networkClientId = path[1] as NetworkClientId;\n delete networkClients[networkClientId];\n }\n });\n\n this.#refreshTrackingMap(networkClients);\n });\n\n this.#waitForNetworkController();\n }\n\n #waitForNetworkController(): void {\n log('Waiting for NetworkController to be available');\n\n this.#initInterval = setInterval(() => {\n try {\n const networkClients = this.#getNetworkClientRegistry();\n clearInterval(this.#initInterval);\n this.#initInterval = undefined;\n this.#refreshTrackingMap(networkClients);\n this.#initialized = true;\n log('Initialized');\n } catch {\n log('NetworkController not yet available, retrying');\n }\n }, 10);\n }\n\n has(networkClientId: NetworkClientId): boolean {\n return this.#trackingMap.has(networkClientId);\n }\n\n /**\n * Gets the mutex intended to guard the nonceTracker for a particular chainId and key .\n *\n * @param opts - The options object.\n * @param opts.chainId - The hex chainId.\n * @param opts.key - The hex address (or constant) pertaining to the chainId\n * @returns Mutex instance for the given chainId and key pair\n */\n async acquireNonceLockForChainIdKey({\n chainId,\n key = 'global',\n }: {\n chainId: Hex;\n key?: string;\n }): Promise<() => void> {\n let nonceMutexesForChainId = this.#nonceMutexesByChainId.get(chainId);\n if (!nonceMutexesForChainId) {\n nonceMutexesForChainId = new Map<string, Mutex>();\n this.#nonceMutexesByChainId.set(chainId, nonceMutexesForChainId);\n }\n let nonceMutexForKey = nonceMutexesForChainId.get(key);\n if (!nonceMutexForKey) {\n nonceMutexForKey = new Mutex();\n nonceMutexesForChainId.set(key, nonceMutexForKey);\n }\n\n return await nonceMutexForKey.acquire();\n }\n\n /**\n * Gets the next nonce according to the nonce-tracker.\n * Ensure `releaseLock` is called once processing of the `nonce` value is complete.\n *\n * @param address - The hex string address for the transaction.\n * @param networkClientId - The network client ID for the transaction, used to fetch the correct nonce tracker.\n * @returns object with the `nextNonce` `nonceDetails`, and the releaseLock.\n */\n async getNonceLock(\n address: string,\n networkClientId: NetworkClientId,\n ): Promise<NonceLock> {\n const networkClient = this.#getNetworkClientById(networkClientId);\n\n const releaseLockForChainIdKey = await this.acquireNonceLockForChainIdKey({\n chainId: networkClient.configuration.chainId,\n key: address,\n });\n\n const nonceTracker = this.#trackingMap.get(networkClientId)?.nonceTracker;\n\n if (!nonceTracker) {\n throw new Error(\n `Missing nonce tracker for network client ID - ${networkClientId}`,\n );\n }\n\n // Acquires the lock for the chainId + address and the nonceLock from the nonceTracker, then\n // couples them together by replacing the nonceLock's releaseLock method with\n // an anonymous function that calls releases both the original nonceLock and the\n // lock for the chainId.\n try {\n const nonceLock = await nonceTracker.getNonceLock(address);\n\n const releaseLock = (): void => {\n nonceLock.releaseLock();\n releaseLockForChainIdKey?.();\n };\n\n return {\n ...nonceLock,\n releaseLock,\n };\n } catch (error) {\n releaseLockForChainIdKey?.();\n throw error;\n }\n }\n\n checkForPendingTransactionAndStartPolling = (): void => {\n for (const [, trackers] of this.#trackingMap) {\n trackers.pendingTransactionTracker.startIfPendingTransactions();\n }\n };\n\n stopAllTracking(): void {\n if (this.#initInterval) {\n clearInterval(this.#initInterval);\n this.#initInterval = undefined;\n }\n\n for (const [networkClientId] of this.#trackingMap) {\n this.#stopTrackingByNetworkClientId(networkClientId);\n }\n }\n\n getNetworkClient({\n chainId,\n networkClientId: requestNetworkClientId,\n }: {\n chainId?: Hex;\n networkClientId?: NetworkClientId;\n }): NetworkClient & { id: NetworkClientId } {\n if (!requestNetworkClientId && !chainId) {\n throw new Error(\n 'Cannot locate network client without networkClientId or chainId',\n );\n }\n\n let networkClient: NetworkClient | undefined;\n let networkClientId = requestNetworkClientId;\n\n try {\n if (requestNetworkClientId) {\n networkClient = this.#getNetworkClientById(requestNetworkClientId);\n }\n } catch (error) {\n log('No network client found with ID', requestNetworkClientId);\n\n if (!chainId) {\n throw error;\n }\n }\n\n if (!networkClient && chainId) {\n networkClientId = this.#findNetworkClientIdByChainId(chainId);\n networkClient = this.#getNetworkClientById(networkClientId);\n }\n\n return {\n ...(networkClient as NetworkClient),\n id: networkClientId as NetworkClientId,\n };\n }\n\n readonly #refreshTrackingMap = (\n networkClients: NetworkClientRegistry,\n ): void => {\n const networkClientIds = Object.keys(networkClients);\n const existingNetworkClientIds = Array.from(this.#trackingMap.keys());\n\n // Remove tracking for NetworkClientIds that no longer exist\n const networkClientIdsToRemove = existingNetworkClientIds.filter(\n (id) => !networkClientIds.includes(id),\n );\n\n networkClientIdsToRemove.forEach((id) => {\n this.#stopTrackingByNetworkClientId(id);\n });\n\n // Start tracking new NetworkClientIds from the registry\n const networkClientIdsToAdd = networkClientIds.filter(\n (id) => !existingNetworkClientIds.includes(id),\n );\n\n networkClientIdsToAdd.forEach((id) => {\n this.#startTrackingByNetworkClientId(id);\n });\n\n if (networkClientIdsToAdd.length) {\n log('Added trackers', networkClientIdsToAdd);\n }\n\n if (networkClientIdsToRemove.length) {\n log('Removed trackers', networkClientIdsToRemove);\n }\n };\n\n #stopTrackingByNetworkClientId(networkClientId: NetworkClientId): void {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n trackers.pendingTransactionTracker.stop();\n this.#removePendingTransactionTrackerListeners(\n trackers.pendingTransactionTracker,\n );\n this.#trackingMap.delete(networkClientId);\n }\n }\n\n #startTrackingByNetworkClientId(networkClientId: NetworkClientId): void {\n const trackers = this.#trackingMap.get(networkClientId);\n if (trackers) {\n return;\n }\n\n const {\n provider,\n blockTracker,\n configuration: { chainId },\n } = this.#getNetworkClientById(networkClientId);\n\n const nonceTracker = this.#createNonceTracker({\n provider,\n blockTracker,\n chainId,\n });\n\n const pendingTransactionTracker = this.#createPendingTransactionTracker({\n blockTracker,\n networkClientId,\n });\n\n this.#trackingMap.set(networkClientId, {\n nonceTracker,\n pendingTransactionTracker,\n });\n }\n}\n"]}
|
|
@@ -21,7 +21,6 @@ export type MultichainTrackingHelperOptions = {
|
|
|
21
21
|
export declare class MultichainTrackingHelper {
|
|
22
22
|
#private;
|
|
23
23
|
constructor({ findNetworkClientIdByChainId, getNetworkClientById, getNetworkClientRegistry, removePendingTransactionTrackerListeners, createNonceTracker, createPendingTransactionTracker, onNetworkStateChange, }: MultichainTrackingHelperOptions);
|
|
24
|
-
initialize(): void;
|
|
25
24
|
has(networkClientId: NetworkClientId): boolean;
|
|
26
25
|
/**
|
|
27
26
|
* Gets the mutex intended to guard the nonceTracker for a particular chainId and key .
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultichainTrackingHelper.d.cts","sourceRoot":"","sources":["../../src/helpers/MultichainTrackingHelper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,iCAAiC,EAClC,qCAAqC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,gCAAgC;AACvE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,wCAAoC;AAW7E,MAAM,MAAM,+BAA+B,GAAG;IAC5C,4BAA4B,EAAE,iBAAiB,CAAC,8BAA8B,CAAC,CAAC;IAChF,oBAAoB,EAAE,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;IAChE,wBAAwB,EAAE,iBAAiB,CAAC,0BAA0B,CAAC,CAAC;IAExE,wCAAwC,EAAE,CACxC,yBAAyB,EAAE,yBAAyB,KACjD,IAAI,CAAC;IACV,kBAAkB,EAAE,CAAC,IAAI,EAAE;QACzB,QAAQ,EAAE,QAAQ,CAAC;QACnB,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC;KACd,KAAK,YAAY,CAAC;IACnB,+BAA+B,EAAE,CAAC,IAAI,EAAE;QACtC,YAAY,EAAE,YAAY,CAAC;QAC3B,eAAe,EAAE,eAAe,CAAC;KAClC,KAAK,yBAAyB,CAAC;IAChC,oBAAoB,EAAE,CACpB,QAAQ,EAAE,CACR,GAAG,OAAO,EAAE,iCAAiC,CAAC,SAAS,CAAC,KACrD,IAAI,KACN,IAAI,CAAC;CACX,CAAC;AAEF,qBAAa,wBAAwB;;
|
|
1
|
+
{"version":3,"file":"MultichainTrackingHelper.d.cts","sourceRoot":"","sources":["../../src/helpers/MultichainTrackingHelper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,iCAAiC,EAClC,qCAAqC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,gCAAgC;AACvE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,wCAAoC;AAW7E,MAAM,MAAM,+BAA+B,GAAG;IAC5C,4BAA4B,EAAE,iBAAiB,CAAC,8BAA8B,CAAC,CAAC;IAChF,oBAAoB,EAAE,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;IAChE,wBAAwB,EAAE,iBAAiB,CAAC,0BAA0B,CAAC,CAAC;IAExE,wCAAwC,EAAE,CACxC,yBAAyB,EAAE,yBAAyB,KACjD,IAAI,CAAC;IACV,kBAAkB,EAAE,CAAC,IAAI,EAAE;QACzB,QAAQ,EAAE,QAAQ,CAAC;QACnB,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC;KACd,KAAK,YAAY,CAAC;IACnB,+BAA+B,EAAE,CAAC,IAAI,EAAE;QACtC,YAAY,EAAE,YAAY,CAAC;QAC3B,eAAe,EAAE,eAAe,CAAC;KAClC,KAAK,yBAAyB,CAAC;IAChC,oBAAoB,EAAE,CACpB,QAAQ,EAAE,CACR,GAAG,OAAO,EAAE,iCAAiC,CAAC,SAAS,CAAC,KACrD,IAAI,KACN,IAAI,CAAC;CACX,CAAC;AAEF,qBAAa,wBAAwB;;gBAoCvB,EACV,4BAA4B,EAC5B,oBAAoB,EACpB,wBAAwB,EACxB,wCAAwC,EACxC,kBAAkB,EAClB,+BAA+B,EAC/B,oBAAoB,GACrB,EAAE,+BAA+B;IA+ClC,GAAG,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO;IAI9C;;;;;;;OAOG;IACG,6BAA6B,CAAC,EAClC,OAAO,EACP,GAAc,GACf,EAAE;QACD,OAAO,EAAE,GAAG,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAevB;;;;;;;OAOG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,SAAS,CAAC;IAsCrB,yCAAyC,QAAO,IAAI,CAIlD;IAEF,eAAe,IAAI,IAAI;IAWvB,gBAAgB,CAAC,EACf,OAAO,EACP,eAAe,EAAE,sBAAsB,GACxC,EAAE;QACD,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,eAAe,CAAC,EAAE,eAAe,CAAC;KACnC,GAAG,aAAa,GAAG;QAAE,EAAE,EAAE,eAAe,CAAA;KAAE;CAyG5C"}
|
|
@@ -21,7 +21,6 @@ export type MultichainTrackingHelperOptions = {
|
|
|
21
21
|
export declare class MultichainTrackingHelper {
|
|
22
22
|
#private;
|
|
23
23
|
constructor({ findNetworkClientIdByChainId, getNetworkClientById, getNetworkClientRegistry, removePendingTransactionTrackerListeners, createNonceTracker, createPendingTransactionTracker, onNetworkStateChange, }: MultichainTrackingHelperOptions);
|
|
24
|
-
initialize(): void;
|
|
25
24
|
has(networkClientId: NetworkClientId): boolean;
|
|
26
25
|
/**
|
|
27
26
|
* Gets the mutex intended to guard the nonceTracker for a particular chainId and key .
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultichainTrackingHelper.d.mts","sourceRoot":"","sources":["../../src/helpers/MultichainTrackingHelper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,iCAAiC,EAClC,qCAAqC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,gCAAgC;AACvE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,wCAAoC;AAW7E,MAAM,MAAM,+BAA+B,GAAG;IAC5C,4BAA4B,EAAE,iBAAiB,CAAC,8BAA8B,CAAC,CAAC;IAChF,oBAAoB,EAAE,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;IAChE,wBAAwB,EAAE,iBAAiB,CAAC,0BAA0B,CAAC,CAAC;IAExE,wCAAwC,EAAE,CACxC,yBAAyB,EAAE,yBAAyB,KACjD,IAAI,CAAC;IACV,kBAAkB,EAAE,CAAC,IAAI,EAAE;QACzB,QAAQ,EAAE,QAAQ,CAAC;QACnB,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC;KACd,KAAK,YAAY,CAAC;IACnB,+BAA+B,EAAE,CAAC,IAAI,EAAE;QACtC,YAAY,EAAE,YAAY,CAAC;QAC3B,eAAe,EAAE,eAAe,CAAC;KAClC,KAAK,yBAAyB,CAAC;IAChC,oBAAoB,EAAE,CACpB,QAAQ,EAAE,CACR,GAAG,OAAO,EAAE,iCAAiC,CAAC,SAAS,CAAC,KACrD,IAAI,KACN,IAAI,CAAC;CACX,CAAC;AAEF,qBAAa,wBAAwB;;
|
|
1
|
+
{"version":3,"file":"MultichainTrackingHelper.d.mts","sourceRoot":"","sources":["../../src/helpers/MultichainTrackingHelper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,iCAAiC,EAClC,qCAAqC;AACtC,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,gCAAgC;AACvE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAI3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,wCAAoC;AAW7E,MAAM,MAAM,+BAA+B,GAAG;IAC5C,4BAA4B,EAAE,iBAAiB,CAAC,8BAA8B,CAAC,CAAC;IAChF,oBAAoB,EAAE,iBAAiB,CAAC,sBAAsB,CAAC,CAAC;IAChE,wBAAwB,EAAE,iBAAiB,CAAC,0BAA0B,CAAC,CAAC;IAExE,wCAAwC,EAAE,CACxC,yBAAyB,EAAE,yBAAyB,KACjD,IAAI,CAAC;IACV,kBAAkB,EAAE,CAAC,IAAI,EAAE;QACzB,QAAQ,EAAE,QAAQ,CAAC;QACnB,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,EAAE,GAAG,CAAC;KACd,KAAK,YAAY,CAAC;IACnB,+BAA+B,EAAE,CAAC,IAAI,EAAE;QACtC,YAAY,EAAE,YAAY,CAAC;QAC3B,eAAe,EAAE,eAAe,CAAC;KAClC,KAAK,yBAAyB,CAAC;IAChC,oBAAoB,EAAE,CACpB,QAAQ,EAAE,CACR,GAAG,OAAO,EAAE,iCAAiC,CAAC,SAAS,CAAC,KACrD,IAAI,KACN,IAAI,CAAC;CACX,CAAC;AAEF,qBAAa,wBAAwB;;gBAoCvB,EACV,4BAA4B,EAC5B,oBAAoB,EACpB,wBAAwB,EACxB,wCAAwC,EACxC,kBAAkB,EAClB,+BAA+B,EAC/B,oBAAoB,GACrB,EAAE,+BAA+B;IA+ClC,GAAG,CAAC,eAAe,EAAE,eAAe,GAAG,OAAO;IAI9C;;;;;;;OAOG;IACG,6BAA6B,CAAC,EAClC,OAAO,EACP,GAAc,GACf,EAAE;QACD,OAAO,EAAE,GAAG,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAevB;;;;;;;OAOG;IACG,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,SAAS,CAAC;IAsCrB,yCAAyC,QAAO,IAAI,CAIlD;IAEF,eAAe,IAAI,IAAI;IAWvB,gBAAgB,CAAC,EACf,OAAO,EACP,eAAe,EAAE,sBAAsB,GACxC,EAAE;QACD,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,eAAe,CAAC,EAAE,eAAe,CAAC;KACnC,GAAG,aAAa,GAAG;QAAE,EAAE,EAAE,eAAe,CAAA;KAAE;CAyG5C"}
|
|
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _MultichainTrackingHelper_instances, _MultichainTrackingHelper_findNetworkClientIdByChainId, _MultichainTrackingHelper_getNetworkClientById, _MultichainTrackingHelper_getNetworkClientRegistry, _MultichainTrackingHelper_removePendingTransactionTrackerListeners, _MultichainTrackingHelper_createNonceTracker, _MultichainTrackingHelper_createPendingTransactionTracker, _MultichainTrackingHelper_nonceMutexesByChainId, _MultichainTrackingHelper_trackingMap, _MultichainTrackingHelper_refreshTrackingMap, _MultichainTrackingHelper_stopTrackingByNetworkClientId, _MultichainTrackingHelper_startTrackingByNetworkClientId;
|
|
12
|
+
var _MultichainTrackingHelper_instances, _MultichainTrackingHelper_findNetworkClientIdByChainId, _MultichainTrackingHelper_getNetworkClientById, _MultichainTrackingHelper_getNetworkClientRegistry, _MultichainTrackingHelper_removePendingTransactionTrackerListeners, _MultichainTrackingHelper_createNonceTracker, _MultichainTrackingHelper_createPendingTransactionTracker, _MultichainTrackingHelper_initialized, _MultichainTrackingHelper_initInterval, _MultichainTrackingHelper_nonceMutexesByChainId, _MultichainTrackingHelper_trackingMap, _MultichainTrackingHelper_waitForNetworkController, _MultichainTrackingHelper_refreshTrackingMap, _MultichainTrackingHelper_stopTrackingByNetworkClientId, _MultichainTrackingHelper_startTrackingByNetworkClientId;
|
|
13
13
|
import { Mutex } from "async-mutex";
|
|
14
14
|
import { createModuleLogger, projectLogger } from "../logger.mjs";
|
|
15
15
|
const log = createModuleLogger(projectLogger, 'multichain-tracking');
|
|
@@ -22,6 +22,8 @@ export class MultichainTrackingHelper {
|
|
|
22
22
|
_MultichainTrackingHelper_removePendingTransactionTrackerListeners.set(this, void 0);
|
|
23
23
|
_MultichainTrackingHelper_createNonceTracker.set(this, void 0);
|
|
24
24
|
_MultichainTrackingHelper_createPendingTransactionTracker.set(this, void 0);
|
|
25
|
+
_MultichainTrackingHelper_initialized.set(this, false);
|
|
26
|
+
_MultichainTrackingHelper_initInterval.set(this, void 0);
|
|
25
27
|
_MultichainTrackingHelper_nonceMutexesByChainId.set(this, new Map());
|
|
26
28
|
_MultichainTrackingHelper_trackingMap.set(this, new Map());
|
|
27
29
|
this.checkForPendingTransactionAndStartPolling = () => {
|
|
@@ -56,6 +58,9 @@ export class MultichainTrackingHelper {
|
|
|
56
58
|
__classPrivateFieldSet(this, _MultichainTrackingHelper_createNonceTracker, createNonceTracker, "f");
|
|
57
59
|
__classPrivateFieldSet(this, _MultichainTrackingHelper_createPendingTransactionTracker, createPendingTransactionTracker, "f");
|
|
58
60
|
onNetworkStateChange((_, patches) => {
|
|
61
|
+
if (!__classPrivateFieldGet(this, _MultichainTrackingHelper_initialized, "f")) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
59
64
|
const networkClients = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientRegistry, "f").call(this);
|
|
60
65
|
patches.forEach(({ op, path }) => {
|
|
61
66
|
if (op === 'remove' && path[0] === 'networkConfigurations') {
|
|
@@ -65,11 +70,7 @@ export class MultichainTrackingHelper {
|
|
|
65
70
|
});
|
|
66
71
|
__classPrivateFieldGet(this, _MultichainTrackingHelper_refreshTrackingMap, "f").call(this, networkClients);
|
|
67
72
|
});
|
|
68
|
-
|
|
69
|
-
initialize() {
|
|
70
|
-
const networkClients = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientRegistry, "f").call(this);
|
|
71
|
-
__classPrivateFieldGet(this, _MultichainTrackingHelper_refreshTrackingMap, "f").call(this, networkClients);
|
|
72
|
-
log('Initialized');
|
|
73
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_instances, "m", _MultichainTrackingHelper_waitForNetworkController).call(this);
|
|
73
74
|
}
|
|
74
75
|
has(networkClientId) {
|
|
75
76
|
return __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").has(networkClientId);
|
|
@@ -134,6 +135,10 @@ export class MultichainTrackingHelper {
|
|
|
134
135
|
}
|
|
135
136
|
}
|
|
136
137
|
stopAllTracking() {
|
|
138
|
+
if (__classPrivateFieldGet(this, _MultichainTrackingHelper_initInterval, "f")) {
|
|
139
|
+
clearInterval(__classPrivateFieldGet(this, _MultichainTrackingHelper_initInterval, "f"));
|
|
140
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, undefined, "f");
|
|
141
|
+
}
|
|
137
142
|
for (const [networkClientId] of __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f")) {
|
|
138
143
|
__classPrivateFieldGet(this, _MultichainTrackingHelper_instances, "m", _MultichainTrackingHelper_stopTrackingByNetworkClientId).call(this, networkClientId);
|
|
139
144
|
}
|
|
@@ -165,7 +170,22 @@ export class MultichainTrackingHelper {
|
|
|
165
170
|
};
|
|
166
171
|
}
|
|
167
172
|
}
|
|
168
|
-
_MultichainTrackingHelper_findNetworkClientIdByChainId = new WeakMap(), _MultichainTrackingHelper_getNetworkClientById = new WeakMap(), _MultichainTrackingHelper_getNetworkClientRegistry = new WeakMap(), _MultichainTrackingHelper_removePendingTransactionTrackerListeners = new WeakMap(), _MultichainTrackingHelper_createNonceTracker = new WeakMap(), _MultichainTrackingHelper_createPendingTransactionTracker = new WeakMap(), _MultichainTrackingHelper_nonceMutexesByChainId = new WeakMap(), _MultichainTrackingHelper_trackingMap = new WeakMap(), _MultichainTrackingHelper_refreshTrackingMap = new WeakMap(), _MultichainTrackingHelper_instances = new WeakSet(),
|
|
173
|
+
_MultichainTrackingHelper_findNetworkClientIdByChainId = new WeakMap(), _MultichainTrackingHelper_getNetworkClientById = new WeakMap(), _MultichainTrackingHelper_getNetworkClientRegistry = new WeakMap(), _MultichainTrackingHelper_removePendingTransactionTrackerListeners = new WeakMap(), _MultichainTrackingHelper_createNonceTracker = new WeakMap(), _MultichainTrackingHelper_createPendingTransactionTracker = new WeakMap(), _MultichainTrackingHelper_initialized = new WeakMap(), _MultichainTrackingHelper_initInterval = new WeakMap(), _MultichainTrackingHelper_nonceMutexesByChainId = new WeakMap(), _MultichainTrackingHelper_trackingMap = new WeakMap(), _MultichainTrackingHelper_refreshTrackingMap = new WeakMap(), _MultichainTrackingHelper_instances = new WeakSet(), _MultichainTrackingHelper_waitForNetworkController = function _MultichainTrackingHelper_waitForNetworkController() {
|
|
174
|
+
log('Waiting for NetworkController to be available');
|
|
175
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, setInterval(() => {
|
|
176
|
+
try {
|
|
177
|
+
const networkClients = __classPrivateFieldGet(this, _MultichainTrackingHelper_getNetworkClientRegistry, "f").call(this);
|
|
178
|
+
clearInterval(__classPrivateFieldGet(this, _MultichainTrackingHelper_initInterval, "f"));
|
|
179
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_initInterval, undefined, "f");
|
|
180
|
+
__classPrivateFieldGet(this, _MultichainTrackingHelper_refreshTrackingMap, "f").call(this, networkClients);
|
|
181
|
+
__classPrivateFieldSet(this, _MultichainTrackingHelper_initialized, true, "f");
|
|
182
|
+
log('Initialized');
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
log('NetworkController not yet available, retrying');
|
|
186
|
+
}
|
|
187
|
+
}, 10), "f");
|
|
188
|
+
}, _MultichainTrackingHelper_stopTrackingByNetworkClientId = function _MultichainTrackingHelper_stopTrackingByNetworkClientId(networkClientId) {
|
|
169
189
|
const trackers = __classPrivateFieldGet(this, _MultichainTrackingHelper_trackingMap, "f").get(networkClientId);
|
|
170
190
|
if (trackers) {
|
|
171
191
|
trackers.pendingTransactionTracker.stop();
|