@metamask-previews/assets-controllers 93.1.0-preview-1dd40c75 → 93.1.0-preview-c92c27f1
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 +9 -0
- package/dist/TokenBalancesController.cjs +337 -377
- package/dist/TokenBalancesController.cjs.map +1 -1
- package/dist/TokenBalancesController.d.cts +17 -38
- package/dist/TokenBalancesController.d.cts.map +1 -1
- package/dist/TokenBalancesController.d.mts +17 -38
- package/dist/TokenBalancesController.d.mts.map +1 -1
- package/dist/TokenBalancesController.mjs +337 -377
- package/dist/TokenBalancesController.mjs.map +1 -1
- package/dist/TokenDetectionController.cjs +44 -205
- package/dist/TokenDetectionController.cjs.map +1 -1
- package/dist/TokenDetectionController.d.cts +12 -10
- package/dist/TokenDetectionController.d.cts.map +1 -1
- package/dist/TokenDetectionController.d.mts +12 -10
- package/dist/TokenDetectionController.d.mts.map +1 -1
- package/dist/TokenDetectionController.mjs +45 -206
- package/dist/TokenDetectionController.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -20,9 +20,7 @@ export declare const STATIC_MAINNET_TOKEN_LIST: TokenDetectionMap;
|
|
|
20
20
|
* @param tokensChainsCache - TokensChainsCache input object
|
|
21
21
|
* @returns returns the map of chainId with TokenListMap
|
|
22
22
|
*/
|
|
23
|
-
export declare function mapChainIdWithTokenListMap(tokensChainsCache: TokensChainsCache):
|
|
24
|
-
[x: `0x${string}`]: TokenListMap;
|
|
25
|
-
};
|
|
23
|
+
export declare function mapChainIdWithTokenListMap(tokensChainsCache: TokensChainsCache): Record<string, unknown>;
|
|
26
24
|
export declare const controllerName = "TokenDetectionController";
|
|
27
25
|
export type TokenDetectionState = Record<never, never>;
|
|
28
26
|
export type TokenDetectionControllerGetStateAction = ControllerGetStateAction<typeof controllerName, TokenDetectionState>;
|
|
@@ -30,7 +28,11 @@ export type TokenDetectionControllerAddDetectedTokensViaWsAction = {
|
|
|
30
28
|
type: `TokenDetectionController:addDetectedTokensViaWs`;
|
|
31
29
|
handler: TokenDetectionController['addDetectedTokensViaWs'];
|
|
32
30
|
};
|
|
33
|
-
export type
|
|
31
|
+
export type TokenDetectionControllerDetectTokensAction = {
|
|
32
|
+
type: `TokenDetectionController:detectTokens`;
|
|
33
|
+
handler: TokenDetectionController['detectTokens'];
|
|
34
|
+
};
|
|
35
|
+
export type TokenDetectionControllerActions = TokenDetectionControllerGetStateAction | TokenDetectionControllerAddDetectedTokensViaWsAction | TokenDetectionControllerDetectTokensAction;
|
|
34
36
|
export type AllowedActions = AccountsControllerGetSelectedAccountAction | AccountsControllerGetAccountAction | NetworkControllerGetNetworkClientByIdAction | NetworkControllerGetNetworkConfigurationByNetworkClientId | NetworkControllerGetStateAction | GetTokenListState | KeyringControllerGetStateAction | PreferencesControllerGetStateAction | TokensControllerGetStateAction | TokensControllerAddDetectedTokensAction | TokensControllerAddTokensAction | NetworkControllerFindNetworkClientIdByChainIdAction | AuthenticationController.AuthenticationControllerGetBearerToken;
|
|
35
37
|
export type TokenDetectionControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, TokenDetectionState>;
|
|
36
38
|
export type TokenDetectionControllerEvents = TokenDetectionControllerStateChangeEvent;
|
|
@@ -83,12 +85,10 @@ export declare class TokenDetectionController extends TokenDetectionController_b
|
|
|
83
85
|
* @param options.interval - Polling interval used to fetch new token rates
|
|
84
86
|
* @param options.getBalancesInSingleCall - Gets the balances of a list of tokens for the given address.
|
|
85
87
|
* @param options.trackMetaMetricsEvent - Sets options for MetaMetrics event tracking.
|
|
86
|
-
* @param options.useAccountsAPI - Feature Switch for using the accounts API when detecting tokens (default: true)
|
|
87
88
|
* @param options.useTokenDetection - Feature Switch for using token detection (default: true)
|
|
88
89
|
* @param options.useExternalServices - Feature Switch for using external services (default: false)
|
|
89
|
-
* @param options.platform - Indicates whether the platform is extension or mobile
|
|
90
90
|
*/
|
|
91
|
-
constructor({ interval, disabled, getBalancesInSingleCall, trackMetaMetricsEvent, messenger,
|
|
91
|
+
constructor({ interval, disabled, getBalancesInSingleCall, trackMetaMetricsEvent, messenger, useTokenDetection, useExternalServices, }: {
|
|
92
92
|
interval?: number;
|
|
93
93
|
disabled?: boolean;
|
|
94
94
|
getBalancesInSingleCall: AssetsContractController['getBalancesInSingleCall'];
|
|
@@ -102,10 +102,8 @@ export declare class TokenDetectionController extends TokenDetectionController_b
|
|
|
102
102
|
};
|
|
103
103
|
}) => void;
|
|
104
104
|
messenger: TokenDetectionControllerMessenger;
|
|
105
|
-
useAccountsAPI?: boolean;
|
|
106
105
|
useTokenDetection?: () => boolean;
|
|
107
106
|
useExternalServices?: () => boolean;
|
|
108
|
-
platform: 'extension' | 'mobile';
|
|
109
107
|
});
|
|
110
108
|
/**
|
|
111
109
|
* Allows controller to make active and passive polling requests
|
|
@@ -137,10 +135,14 @@ export declare class TokenDetectionController extends TokenDetectionController_b
|
|
|
137
135
|
* @param options - Options for token detection.
|
|
138
136
|
* @param options.chainIds - The chain IDs of the network client to use.
|
|
139
137
|
* @param options.selectedAddress - the selectedAddress against which to detect for token balances.
|
|
138
|
+
* @param options.forceRpc - Force RPC-based token detection for all specified chains,
|
|
139
|
+
* bypassing external services check and ensuring RPC is used even for chains
|
|
140
|
+
* that might otherwise be handled by the Accounts API.
|
|
140
141
|
*/
|
|
141
|
-
detectTokens({ chainIds, selectedAddress, }?: {
|
|
142
|
+
detectTokens({ chainIds, selectedAddress, forceRpc, }?: {
|
|
142
143
|
chainIds?: Hex[];
|
|
143
144
|
selectedAddress?: string;
|
|
145
|
+
forceRpc?: boolean;
|
|
144
146
|
}): Promise<void>;
|
|
145
147
|
/**
|
|
146
148
|
* Add tokens detected from websocket balance updates
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenDetectionController.d.cts","sourceRoot":"","sources":["../src/TokenDetectionController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0CAA0C,EAC1C,kCAAkC,EAClC,+CAA+C,EAChD,sCAAsC;AACvC,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC3B,kCAAkC;
|
|
1
|
+
{"version":3,"file":"TokenDetectionController.d.cts","sourceRoot":"","sources":["../src/TokenDetectionController.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,9 +20,7 @@ export declare const STATIC_MAINNET_TOKEN_LIST: TokenDetectionMap;
|
|
|
20
20
|
* @param tokensChainsCache - TokensChainsCache input object
|
|
21
21
|
* @returns returns the map of chainId with TokenListMap
|
|
22
22
|
*/
|
|
23
|
-
export declare function mapChainIdWithTokenListMap(tokensChainsCache: TokensChainsCache):
|
|
24
|
-
[x: `0x${string}`]: TokenListMap;
|
|
25
|
-
};
|
|
23
|
+
export declare function mapChainIdWithTokenListMap(tokensChainsCache: TokensChainsCache): Record<string, unknown>;
|
|
26
24
|
export declare const controllerName = "TokenDetectionController";
|
|
27
25
|
export type TokenDetectionState = Record<never, never>;
|
|
28
26
|
export type TokenDetectionControllerGetStateAction = ControllerGetStateAction<typeof controllerName, TokenDetectionState>;
|
|
@@ -30,7 +28,11 @@ export type TokenDetectionControllerAddDetectedTokensViaWsAction = {
|
|
|
30
28
|
type: `TokenDetectionController:addDetectedTokensViaWs`;
|
|
31
29
|
handler: TokenDetectionController['addDetectedTokensViaWs'];
|
|
32
30
|
};
|
|
33
|
-
export type
|
|
31
|
+
export type TokenDetectionControllerDetectTokensAction = {
|
|
32
|
+
type: `TokenDetectionController:detectTokens`;
|
|
33
|
+
handler: TokenDetectionController['detectTokens'];
|
|
34
|
+
};
|
|
35
|
+
export type TokenDetectionControllerActions = TokenDetectionControllerGetStateAction | TokenDetectionControllerAddDetectedTokensViaWsAction | TokenDetectionControllerDetectTokensAction;
|
|
34
36
|
export type AllowedActions = AccountsControllerGetSelectedAccountAction | AccountsControllerGetAccountAction | NetworkControllerGetNetworkClientByIdAction | NetworkControllerGetNetworkConfigurationByNetworkClientId | NetworkControllerGetStateAction | GetTokenListState | KeyringControllerGetStateAction | PreferencesControllerGetStateAction | TokensControllerGetStateAction | TokensControllerAddDetectedTokensAction | TokensControllerAddTokensAction | NetworkControllerFindNetworkClientIdByChainIdAction | AuthenticationController.AuthenticationControllerGetBearerToken;
|
|
35
37
|
export type TokenDetectionControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, TokenDetectionState>;
|
|
36
38
|
export type TokenDetectionControllerEvents = TokenDetectionControllerStateChangeEvent;
|
|
@@ -83,12 +85,10 @@ export declare class TokenDetectionController extends TokenDetectionController_b
|
|
|
83
85
|
* @param options.interval - Polling interval used to fetch new token rates
|
|
84
86
|
* @param options.getBalancesInSingleCall - Gets the balances of a list of tokens for the given address.
|
|
85
87
|
* @param options.trackMetaMetricsEvent - Sets options for MetaMetrics event tracking.
|
|
86
|
-
* @param options.useAccountsAPI - Feature Switch for using the accounts API when detecting tokens (default: true)
|
|
87
88
|
* @param options.useTokenDetection - Feature Switch for using token detection (default: true)
|
|
88
89
|
* @param options.useExternalServices - Feature Switch for using external services (default: false)
|
|
89
|
-
* @param options.platform - Indicates whether the platform is extension or mobile
|
|
90
90
|
*/
|
|
91
|
-
constructor({ interval, disabled, getBalancesInSingleCall, trackMetaMetricsEvent, messenger,
|
|
91
|
+
constructor({ interval, disabled, getBalancesInSingleCall, trackMetaMetricsEvent, messenger, useTokenDetection, useExternalServices, }: {
|
|
92
92
|
interval?: number;
|
|
93
93
|
disabled?: boolean;
|
|
94
94
|
getBalancesInSingleCall: AssetsContractController['getBalancesInSingleCall'];
|
|
@@ -102,10 +102,8 @@ export declare class TokenDetectionController extends TokenDetectionController_b
|
|
|
102
102
|
};
|
|
103
103
|
}) => void;
|
|
104
104
|
messenger: TokenDetectionControllerMessenger;
|
|
105
|
-
useAccountsAPI?: boolean;
|
|
106
105
|
useTokenDetection?: () => boolean;
|
|
107
106
|
useExternalServices?: () => boolean;
|
|
108
|
-
platform: 'extension' | 'mobile';
|
|
109
107
|
});
|
|
110
108
|
/**
|
|
111
109
|
* Allows controller to make active and passive polling requests
|
|
@@ -137,10 +135,14 @@ export declare class TokenDetectionController extends TokenDetectionController_b
|
|
|
137
135
|
* @param options - Options for token detection.
|
|
138
136
|
* @param options.chainIds - The chain IDs of the network client to use.
|
|
139
137
|
* @param options.selectedAddress - the selectedAddress against which to detect for token balances.
|
|
138
|
+
* @param options.forceRpc - Force RPC-based token detection for all specified chains,
|
|
139
|
+
* bypassing external services check and ensuring RPC is used even for chains
|
|
140
|
+
* that might otherwise be handled by the Accounts API.
|
|
140
141
|
*/
|
|
141
|
-
detectTokens({ chainIds, selectedAddress, }?: {
|
|
142
|
+
detectTokens({ chainIds, selectedAddress, forceRpc, }?: {
|
|
142
143
|
chainIds?: Hex[];
|
|
143
144
|
selectedAddress?: string;
|
|
145
|
+
forceRpc?: boolean;
|
|
144
146
|
}): Promise<void>;
|
|
145
147
|
/**
|
|
146
148
|
* Add tokens detected from websocket balance updates
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenDetectionController.d.mts","sourceRoot":"","sources":["../src/TokenDetectionController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0CAA0C,EAC1C,kCAAkC,EAClC,+CAA+C,EAChD,sCAAsC;AACvC,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC3B,kCAAkC;
|
|
1
|
+
{"version":3,"file":"TokenDetectionController.d.mts","sourceRoot":"","sources":["../src/TokenDetectionController.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 _TokenDetectionController_instances, _TokenDetectionController_intervalId, _TokenDetectionController_selectedAccountId, _TokenDetectionController_tokensChainsCache, _TokenDetectionController_disabled, _TokenDetectionController_isUnlocked, _TokenDetectionController_isDetectionEnabledFromPreferences, _TokenDetectionController_useTokenDetection, _TokenDetectionController_useExternalServices, _TokenDetectionController_getBalancesInSingleCall, _TokenDetectionController_trackMetaMetricsEvent,
|
|
12
|
+
var _TokenDetectionController_instances, _TokenDetectionController_intervalId, _TokenDetectionController_selectedAccountId, _TokenDetectionController_tokensChainsCache, _TokenDetectionController_disabled, _TokenDetectionController_isUnlocked, _TokenDetectionController_isDetectionEnabledFromPreferences, _TokenDetectionController_useTokenDetection, _TokenDetectionController_useExternalServices, _TokenDetectionController_getBalancesInSingleCall, _TokenDetectionController_trackMetaMetricsEvent, _TokenDetectionController_registerEventListeners, _TokenDetectionController_stopPolling, _TokenDetectionController_startPolling, _TokenDetectionController_compareTokensChainsCache, _TokenDetectionController_getCorrectNetworkClientIdByChainId, _TokenDetectionController_restartTokenDetection, _TokenDetectionController_shouldDetectTokens, _TokenDetectionController_detectTokensUsingRpc, _TokenDetectionController_getSlicesOfTokensToDetect, _TokenDetectionController_getConvertedStaticMainnetTokenList, _TokenDetectionController_addDetectedTokens, _TokenDetectionController_getSelectedAccount, _TokenDetectionController_getSelectedAddress;
|
|
13
13
|
function $importDefault(module) {
|
|
14
14
|
if (module?.__esModule) {
|
|
15
15
|
return module.default;
|
|
@@ -18,15 +18,13 @@ function $importDefault(module) {
|
|
|
18
18
|
}
|
|
19
19
|
import $contractMap from "@metamask/contract-metadata";
|
|
20
20
|
const contractMap = $importDefault($contractMap);
|
|
21
|
-
import { ASSET_TYPES, ChainId, ERC20, safelyExecute,
|
|
21
|
+
import { ASSET_TYPES, ChainId, ERC20, safelyExecute, isEqualCaseInsensitive, toChecksumHexAddress } from "@metamask/controller-utils";
|
|
22
22
|
import { StaticIntervalPollingController } from "@metamask/polling-controller";
|
|
23
|
-
import { hexToNumber } from "@metamask/utils";
|
|
24
23
|
import $lodash from "lodash";
|
|
25
24
|
const { isEqual, mapValues, isObject, get } = $lodash;
|
|
26
25
|
import { isTokenDetectionSupportedForNetwork } from "./assetsUtil.mjs";
|
|
27
|
-
import {
|
|
26
|
+
import { SUPPORTED_NETWORKS_ACCOUNTS_API_V4 } from "./constants.mjs";
|
|
28
27
|
const DEFAULT_INTERVAL = 180000;
|
|
29
|
-
const ACCOUNTS_API_TIMEOUT_MS = 10000;
|
|
30
28
|
export const STATIC_MAINNET_TOKEN_LIST = Object.entries(contractMap).reduce((acc, [base, contract]) => {
|
|
31
29
|
const { logo, erc20, erc721, ...tokenMetadata } = contract;
|
|
32
30
|
return {
|
|
@@ -80,12 +78,10 @@ export class TokenDetectionController extends StaticIntervalPollingController()
|
|
|
80
78
|
* @param options.interval - Polling interval used to fetch new token rates
|
|
81
79
|
* @param options.getBalancesInSingleCall - Gets the balances of a list of tokens for the given address.
|
|
82
80
|
* @param options.trackMetaMetricsEvent - Sets options for MetaMetrics event tracking.
|
|
83
|
-
* @param options.useAccountsAPI - Feature Switch for using the accounts API when detecting tokens (default: true)
|
|
84
81
|
* @param options.useTokenDetection - Feature Switch for using token detection (default: true)
|
|
85
82
|
* @param options.useExternalServices - Feature Switch for using external services (default: false)
|
|
86
|
-
* @param options.platform - Indicates whether the platform is extension or mobile
|
|
87
83
|
*/
|
|
88
|
-
constructor({ interval = DEFAULT_INTERVAL, disabled = true, getBalancesInSingleCall, trackMetaMetricsEvent, messenger,
|
|
84
|
+
constructor({ interval = DEFAULT_INTERVAL, disabled = true, getBalancesInSingleCall, trackMetaMetricsEvent, messenger, useTokenDetection = () => true, useExternalServices = () => true, }) {
|
|
89
85
|
super({
|
|
90
86
|
name: controllerName,
|
|
91
87
|
messenger,
|
|
@@ -103,38 +99,8 @@ export class TokenDetectionController extends StaticIntervalPollingController()
|
|
|
103
99
|
_TokenDetectionController_useExternalServices.set(this, void 0);
|
|
104
100
|
_TokenDetectionController_getBalancesInSingleCall.set(this, void 0);
|
|
105
101
|
_TokenDetectionController_trackMetaMetricsEvent.set(this, void 0);
|
|
106
|
-
_TokenDetectionController_accountsAPI.set(this, {
|
|
107
|
-
isAccountsAPIEnabled: true,
|
|
108
|
-
supportedNetworksCache: null,
|
|
109
|
-
platform: '',
|
|
110
|
-
async getSupportedNetworks() {
|
|
111
|
-
/* istanbul ignore next */
|
|
112
|
-
if (!this.isAccountsAPIEnabled) {
|
|
113
|
-
throw new Error('Accounts API Feature Switch is disabled');
|
|
114
|
-
}
|
|
115
|
-
/* istanbul ignore next */
|
|
116
|
-
if (this.supportedNetworksCache) {
|
|
117
|
-
return this.supportedNetworksCache;
|
|
118
|
-
}
|
|
119
|
-
const result = await fetchSupportedNetworks().catch(() => null);
|
|
120
|
-
this.supportedNetworksCache = result;
|
|
121
|
-
return result;
|
|
122
|
-
},
|
|
123
|
-
async getMultiNetworksBalances(address, chainIds, supportedNetworks, jwtToken) {
|
|
124
|
-
const chainIdNumbers = chainIds.map((chainId) => hexToNumber(chainId));
|
|
125
|
-
if (!supportedNetworks ||
|
|
126
|
-
!chainIdNumbers.every((id) => supportedNetworks.includes(id))) {
|
|
127
|
-
const supportedNetworksErrStr = (supportedNetworks ?? []).toString();
|
|
128
|
-
throw new Error(`Unsupported Network: supported networks ${supportedNetworksErrStr}, requested networks: ${chainIdNumbers.toString()}`);
|
|
129
|
-
}
|
|
130
|
-
const result = await fetchMultiChainBalances(address, {
|
|
131
|
-
networks: chainIdNumbers,
|
|
132
|
-
}, this.platform, jwtToken);
|
|
133
|
-
// Return the full response including unprocessedNetworks
|
|
134
|
-
return result;
|
|
135
|
-
},
|
|
136
|
-
});
|
|
137
102
|
this.messenger.registerActionHandler(`${controllerName}:addDetectedTokensViaWs`, this.addDetectedTokensViaWs.bind(this));
|
|
103
|
+
this.messenger.registerActionHandler(`${controllerName}:detectTokens`, this.detectTokens.bind(this));
|
|
138
104
|
__classPrivateFieldSet(this, _TokenDetectionController_disabled, disabled, "f");
|
|
139
105
|
this.setIntervalLength(interval);
|
|
140
106
|
__classPrivateFieldSet(this, _TokenDetectionController_selectedAccountId, __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_getSelectedAccount).call(this).id, "f");
|
|
@@ -146,10 +112,8 @@ export class TokenDetectionController extends StaticIntervalPollingController()
|
|
|
146
112
|
__classPrivateFieldSet(this, _TokenDetectionController_trackMetaMetricsEvent, trackMetaMetricsEvent, "f");
|
|
147
113
|
const { isUnlocked } = this.messenger.call('KeyringController:getState');
|
|
148
114
|
__classPrivateFieldSet(this, _TokenDetectionController_isUnlocked, isUnlocked, "f");
|
|
149
|
-
__classPrivateFieldGet(this, _TokenDetectionController_accountsAPI, "f").isAccountsAPIEnabled = useAccountsAPI;
|
|
150
115
|
__classPrivateFieldSet(this, _TokenDetectionController_useTokenDetection, useTokenDetection, "f");
|
|
151
116
|
__classPrivateFieldSet(this, _TokenDetectionController_useExternalServices, useExternalServices, "f");
|
|
152
|
-
__classPrivateFieldGet(this, _TokenDetectionController_accountsAPI, "f").platform = platform;
|
|
153
117
|
__classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_registerEventListeners).call(this);
|
|
154
118
|
}
|
|
155
119
|
/**
|
|
@@ -202,43 +166,33 @@ export class TokenDetectionController extends StaticIntervalPollingController()
|
|
|
202
166
|
* @param options - Options for token detection.
|
|
203
167
|
* @param options.chainIds - The chain IDs of the network client to use.
|
|
204
168
|
* @param options.selectedAddress - the selectedAddress against which to detect for token balances.
|
|
169
|
+
* @param options.forceRpc - Force RPC-based token detection for all specified chains,
|
|
170
|
+
* bypassing external services check and ensuring RPC is used even for chains
|
|
171
|
+
* that might otherwise be handled by the Accounts API.
|
|
205
172
|
*/
|
|
206
|
-
async detectTokens({ chainIds, selectedAddress, } = {}) {
|
|
173
|
+
async detectTokens({ chainIds, selectedAddress, forceRpc = false, } = {}) {
|
|
207
174
|
if (!this.isActive) {
|
|
208
175
|
return;
|
|
209
176
|
}
|
|
210
|
-
|
|
177
|
+
// When forceRpc is true, bypass the useTokenDetection check to ensure RPC detection runs
|
|
178
|
+
if (!forceRpc && !__classPrivateFieldGet(this, _TokenDetectionController_useTokenDetection, "f").call(this)) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
// If external services are disabled and not forcing RPC, skip all detection
|
|
182
|
+
if (!forceRpc && !__classPrivateFieldGet(this, _TokenDetectionController_useExternalServices, "f").call(this)) {
|
|
211
183
|
return;
|
|
212
184
|
}
|
|
213
185
|
const addressToDetect = selectedAddress ?? __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_getSelectedAddress).call(this);
|
|
214
186
|
const clientNetworks = __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_getCorrectNetworkClientIdByChainId).call(this, chainIds);
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
const { chainsToDetectUsingRpc, chainsToDetectUsingAccountAPI } = __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_getChainsToDetect).call(this, clientNetworks, supportedNetworks);
|
|
223
|
-
// Try detecting tokens via Account API first if conditions allow
|
|
224
|
-
if (supportedNetworks && chainsToDetectUsingAccountAPI.length > 0) {
|
|
225
|
-
const apiResult = await __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_attemptAccountAPIDetection).call(this, chainsToDetectUsingAccountAPI, addressToDetect, supportedNetworks, jwtToken);
|
|
226
|
-
// If the account API call failed or returned undefined, have those chains fall back to RPC detection
|
|
227
|
-
if (!apiResult || apiResult.result === 'failed') {
|
|
228
|
-
__classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_addChainsToRpcDetection).call(this, chainsToDetectUsingRpc, chainsToDetectUsingAccountAPI, clientNetworks);
|
|
229
|
-
}
|
|
230
|
-
else if (apiResult?.result === 'success' &&
|
|
231
|
-
apiResult.unprocessedNetworks &&
|
|
232
|
-
apiResult.unprocessedNetworks.length > 0) {
|
|
233
|
-
// Handle unprocessed networks by adding them to RPC detection
|
|
234
|
-
const unprocessedChainIds = apiResult.unprocessedNetworks.map((chainId) => toHex(chainId));
|
|
235
|
-
__classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_addChainsToRpcDetection).call(this, chainsToDetectUsingRpc, unprocessedChainIds, clientNetworks);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
// Proceed with RPC detection if there are chains remaining in chainsToDetectUsingRpc
|
|
239
|
-
if (chainsToDetectUsingRpc.length > 0) {
|
|
240
|
-
await __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_detectTokensUsingRpc).call(this, chainsToDetectUsingRpc, addressToDetect);
|
|
187
|
+
// If forceRpc is true, use RPC for all chains
|
|
188
|
+
// Otherwise, skip chains supported by Accounts API (they are handled by TokenBalancesController)
|
|
189
|
+
const chainsToDetectUsingRpc = forceRpc
|
|
190
|
+
? clientNetworks
|
|
191
|
+
: clientNetworks.filter(({ chainId }) => !SUPPORTED_NETWORKS_ACCOUNTS_API_V4.includes(chainId));
|
|
192
|
+
if (chainsToDetectUsingRpc.length === 0) {
|
|
193
|
+
return;
|
|
241
194
|
}
|
|
195
|
+
await __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_detectTokensUsingRpc).call(this, chainsToDetectUsingRpc, addressToDetect);
|
|
242
196
|
}
|
|
243
197
|
/**
|
|
244
198
|
* Add tokens detected from websocket balance updates
|
|
@@ -294,46 +248,56 @@ export class TokenDetectionController extends StaticIntervalPollingController()
|
|
|
294
248
|
}
|
|
295
249
|
}
|
|
296
250
|
}
|
|
297
|
-
_TokenDetectionController_intervalId = new WeakMap(), _TokenDetectionController_selectedAccountId = new WeakMap(), _TokenDetectionController_tokensChainsCache = new WeakMap(), _TokenDetectionController_disabled = new WeakMap(), _TokenDetectionController_isUnlocked = new WeakMap(), _TokenDetectionController_isDetectionEnabledFromPreferences = new WeakMap(), _TokenDetectionController_useTokenDetection = new WeakMap(), _TokenDetectionController_useExternalServices = new WeakMap(), _TokenDetectionController_getBalancesInSingleCall = new WeakMap(), _TokenDetectionController_trackMetaMetricsEvent = new WeakMap(),
|
|
298
|
-
this.messenger.subscribe('KeyringController:unlock',
|
|
251
|
+
_TokenDetectionController_intervalId = new WeakMap(), _TokenDetectionController_selectedAccountId = new WeakMap(), _TokenDetectionController_tokensChainsCache = new WeakMap(), _TokenDetectionController_disabled = new WeakMap(), _TokenDetectionController_isUnlocked = new WeakMap(), _TokenDetectionController_isDetectionEnabledFromPreferences = new WeakMap(), _TokenDetectionController_useTokenDetection = new WeakMap(), _TokenDetectionController_useExternalServices = new WeakMap(), _TokenDetectionController_getBalancesInSingleCall = new WeakMap(), _TokenDetectionController_trackMetaMetricsEvent = new WeakMap(), _TokenDetectionController_instances = new WeakSet(), _TokenDetectionController_registerEventListeners = function _TokenDetectionController_registerEventListeners() {
|
|
252
|
+
this.messenger.subscribe('KeyringController:unlock', () => {
|
|
299
253
|
__classPrivateFieldSet(this, _TokenDetectionController_isUnlocked, true, "f");
|
|
300
|
-
|
|
254
|
+
__classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_restartTokenDetection).call(this).catch(() => {
|
|
255
|
+
// Silently handle token detection errors
|
|
256
|
+
});
|
|
301
257
|
});
|
|
302
258
|
this.messenger.subscribe('KeyringController:lock', () => {
|
|
303
259
|
__classPrivateFieldSet(this, _TokenDetectionController_isUnlocked, false, "f");
|
|
304
260
|
__classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_stopPolling).call(this);
|
|
305
261
|
});
|
|
306
|
-
this.messenger.subscribe('TokenListController:stateChange',
|
|
262
|
+
this.messenger.subscribe('TokenListController:stateChange', ({ tokensChainsCache }) => {
|
|
307
263
|
const isEqualValues = __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_compareTokensChainsCache).call(this, tokensChainsCache, __classPrivateFieldGet(this, _TokenDetectionController_tokensChainsCache, "f"));
|
|
308
264
|
if (!isEqualValues) {
|
|
309
|
-
|
|
265
|
+
__classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_restartTokenDetection).call(this).catch(() => {
|
|
266
|
+
// Silently handle token detection errors
|
|
267
|
+
});
|
|
310
268
|
}
|
|
311
269
|
});
|
|
312
|
-
this.messenger.subscribe('PreferencesController:stateChange',
|
|
270
|
+
this.messenger.subscribe('PreferencesController:stateChange', ({ useTokenDetection }) => {
|
|
313
271
|
const selectedAccount = __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_getSelectedAccount).call(this);
|
|
314
272
|
const isDetectionChangedFromPreferences = __classPrivateFieldGet(this, _TokenDetectionController_isDetectionEnabledFromPreferences, "f") !== useTokenDetection;
|
|
315
273
|
__classPrivateFieldSet(this, _TokenDetectionController_isDetectionEnabledFromPreferences, useTokenDetection, "f");
|
|
316
274
|
if (isDetectionChangedFromPreferences) {
|
|
317
|
-
|
|
275
|
+
__classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_restartTokenDetection).call(this, {
|
|
318
276
|
selectedAddress: selectedAccount.address,
|
|
277
|
+
}).catch(() => {
|
|
278
|
+
// Silently handle token detection errors
|
|
319
279
|
});
|
|
320
280
|
}
|
|
321
281
|
});
|
|
322
|
-
this.messenger.subscribe('AccountsController:selectedEvmAccountChange',
|
|
282
|
+
this.messenger.subscribe('AccountsController:selectedEvmAccountChange', (selectedAccount) => {
|
|
323
283
|
const { networkConfigurationsByChainId } = this.messenger.call('NetworkController:getState');
|
|
324
284
|
const chainIds = Object.keys(networkConfigurationsByChainId);
|
|
325
285
|
const isSelectedAccountIdChanged = __classPrivateFieldGet(this, _TokenDetectionController_selectedAccountId, "f") !== selectedAccount.id;
|
|
326
286
|
if (isSelectedAccountIdChanged) {
|
|
327
287
|
__classPrivateFieldSet(this, _TokenDetectionController_selectedAccountId, selectedAccount.id, "f");
|
|
328
|
-
|
|
288
|
+
__classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_restartTokenDetection).call(this, {
|
|
329
289
|
selectedAddress: selectedAccount.address,
|
|
330
290
|
chainIds,
|
|
291
|
+
}).catch(() => {
|
|
292
|
+
// Silently handle token detection errors
|
|
331
293
|
});
|
|
332
294
|
}
|
|
333
295
|
});
|
|
334
|
-
this.messenger.subscribe('TransactionController:transactionConfirmed',
|
|
335
|
-
|
|
296
|
+
this.messenger.subscribe('TransactionController:transactionConfirmed', (transactionMeta) => {
|
|
297
|
+
this.detectTokens({
|
|
336
298
|
chainIds: [transactionMeta.chainId],
|
|
299
|
+
}).catch(() => {
|
|
300
|
+
// Silently handle token detection errors
|
|
337
301
|
});
|
|
338
302
|
});
|
|
339
303
|
}, _TokenDetectionController_stopPolling = function _TokenDetectionController_stopPolling() {
|
|
@@ -394,41 +358,6 @@ async function _TokenDetectionController_restartTokenDetection({ selectedAddress
|
|
|
394
358
|
selectedAddress,
|
|
395
359
|
});
|
|
396
360
|
this.setIntervalLength(DEFAULT_INTERVAL);
|
|
397
|
-
}, _TokenDetectionController_getChainsToDetect = function _TokenDetectionController_getChainsToDetect(clientNetworks, supportedNetworks) {
|
|
398
|
-
const chainsToDetectUsingAccountAPI = [];
|
|
399
|
-
const chainsToDetectUsingRpc = [];
|
|
400
|
-
clientNetworks.forEach(({ chainId, networkClientId }) => {
|
|
401
|
-
if (supportedNetworks?.includes(hexToNumber(chainId))) {
|
|
402
|
-
chainsToDetectUsingAccountAPI.push(chainId);
|
|
403
|
-
}
|
|
404
|
-
else {
|
|
405
|
-
chainsToDetectUsingRpc.push({ chainId, networkClientId });
|
|
406
|
-
}
|
|
407
|
-
});
|
|
408
|
-
return { chainsToDetectUsingRpc, chainsToDetectUsingAccountAPI };
|
|
409
|
-
}, _TokenDetectionController_attemptAccountAPIDetection = async function _TokenDetectionController_attemptAccountAPIDetection(chainsToDetectUsingAccountAPI, addressToDetect, supportedNetworks, jwtToken) {
|
|
410
|
-
const result = await safelyExecuteWithTimeout(async () => {
|
|
411
|
-
return __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_addDetectedTokensViaAPI).call(this, {
|
|
412
|
-
chainIds: chainsToDetectUsingAccountAPI,
|
|
413
|
-
selectedAddress: addressToDetect,
|
|
414
|
-
supportedNetworks,
|
|
415
|
-
jwtToken,
|
|
416
|
-
});
|
|
417
|
-
}, false, ACCOUNTS_API_TIMEOUT_MS);
|
|
418
|
-
if (!result) {
|
|
419
|
-
return { result: 'failed' };
|
|
420
|
-
}
|
|
421
|
-
return result;
|
|
422
|
-
}, _TokenDetectionController_addChainsToRpcDetection = function _TokenDetectionController_addChainsToRpcDetection(chainsToDetectUsingRpc, chainsToDetectUsingAccountAPI, clientNetworks) {
|
|
423
|
-
chainsToDetectUsingAccountAPI.forEach((chainId) => {
|
|
424
|
-
const networkEntry = clientNetworks.find((network) => network.chainId === chainId);
|
|
425
|
-
if (networkEntry) {
|
|
426
|
-
chainsToDetectUsingRpc.push({
|
|
427
|
-
chainId: networkEntry.chainId,
|
|
428
|
-
networkClientId: networkEntry.networkClientId,
|
|
429
|
-
});
|
|
430
|
-
}
|
|
431
|
-
});
|
|
432
361
|
}, _TokenDetectionController_shouldDetectTokens = function _TokenDetectionController_shouldDetectTokens(chainId) {
|
|
433
362
|
if (!isTokenDetectionSupportedForNetwork(chainId)) {
|
|
434
363
|
return false;
|
|
@@ -503,96 +432,6 @@ async function _TokenDetectionController_restartTokenDetection({ selectedAddress
|
|
|
503
432
|
timestamp: 0,
|
|
504
433
|
},
|
|
505
434
|
};
|
|
506
|
-
}, _TokenDetectionController_addDetectedTokensViaAPI =
|
|
507
|
-
/**
|
|
508
|
-
* This adds detected tokens from the Accounts API, avoiding the multi-call RPC calls for balances
|
|
509
|
-
*
|
|
510
|
-
* @param options - method arguments
|
|
511
|
-
* @param options.selectedAddress - address to check against
|
|
512
|
-
* @param options.chainIds - array of chainIds to check tokens for
|
|
513
|
-
* @param options.supportedNetworks - array of chainIds to check tokens for
|
|
514
|
-
* @param options.jwtToken - JWT token for authentication
|
|
515
|
-
* @returns a success or failed object
|
|
516
|
-
*/
|
|
517
|
-
async function _TokenDetectionController_addDetectedTokensViaAPI({ selectedAddress, chainIds, supportedNetworks, jwtToken, }) {
|
|
518
|
-
return await safelyExecute(async () => {
|
|
519
|
-
// Fetch balances for multiple chain IDs at once
|
|
520
|
-
const apiResponse = await __classPrivateFieldGet(this, _TokenDetectionController_accountsAPI, "f")
|
|
521
|
-
.getMultiNetworksBalances(selectedAddress, chainIds, supportedNetworks, jwtToken)
|
|
522
|
-
.catch(() => null);
|
|
523
|
-
if (apiResponse === null) {
|
|
524
|
-
return { result: 'failed' };
|
|
525
|
-
}
|
|
526
|
-
const tokenBalancesByChain = apiResponse.balances;
|
|
527
|
-
// Process each chain ID individually
|
|
528
|
-
for (const chainId of chainIds) {
|
|
529
|
-
const isTokenDetectionInactiveInMainnet = !__classPrivateFieldGet(this, _TokenDetectionController_isDetectionEnabledFromPreferences, "f") &&
|
|
530
|
-
chainId === ChainId.mainnet;
|
|
531
|
-
const { tokensChainsCache } = this.messenger.call('TokenListController:getState');
|
|
532
|
-
__classPrivateFieldSet(this, _TokenDetectionController_tokensChainsCache, isTokenDetectionInactiveInMainnet
|
|
533
|
-
? __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_getConvertedStaticMainnetTokenList).call(this)
|
|
534
|
-
: (tokensChainsCache ?? {}), "f");
|
|
535
|
-
// Generate token candidates based on chainId and selectedAddress
|
|
536
|
-
const tokenCandidateSlices = __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_getSlicesOfTokensToDetect).call(this, {
|
|
537
|
-
chainId,
|
|
538
|
-
selectedAddress,
|
|
539
|
-
});
|
|
540
|
-
// Filter balances for the current chainId
|
|
541
|
-
const tokenBalances = tokenBalancesByChain.filter((balance) => balance.chainId === hexToNumber(chainId));
|
|
542
|
-
if (!tokenBalances || tokenBalances.length === 0) {
|
|
543
|
-
continue;
|
|
544
|
-
}
|
|
545
|
-
// Use helper function to filter tokens with balance for this chainId
|
|
546
|
-
const { tokensWithBalance, eventTokensDetails } = __classPrivateFieldGet(this, _TokenDetectionController_instances, "m", _TokenDetectionController_filterAndBuildTokensWithBalance).call(this, tokenCandidateSlices, tokenBalances, chainId);
|
|
547
|
-
if (tokensWithBalance.length) {
|
|
548
|
-
__classPrivateFieldGet(this, _TokenDetectionController_trackMetaMetricsEvent, "f").call(this, {
|
|
549
|
-
event: 'Token Detected',
|
|
550
|
-
category: 'Wallet',
|
|
551
|
-
properties: {
|
|
552
|
-
tokens: eventTokensDetails,
|
|
553
|
-
token_standard: ERC20,
|
|
554
|
-
asset_type: ASSET_TYPES.TOKEN,
|
|
555
|
-
},
|
|
556
|
-
});
|
|
557
|
-
const networkClientId = this.messenger.call('NetworkController:findNetworkClientIdByChainId', chainId);
|
|
558
|
-
await this.messenger.call('TokensController:addTokens', tokensWithBalance, networkClientId);
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
return {
|
|
562
|
-
result: 'success',
|
|
563
|
-
unprocessedNetworks: apiResponse.unprocessedNetworks,
|
|
564
|
-
};
|
|
565
|
-
});
|
|
566
|
-
}, _TokenDetectionController_filterAndBuildTokensWithBalance = function _TokenDetectionController_filterAndBuildTokensWithBalance(tokenCandidateSlices, tokenBalances, chainId) {
|
|
567
|
-
const tokensWithBalance = [];
|
|
568
|
-
const eventTokensDetails = [];
|
|
569
|
-
const tokenCandidateSet = new Set(tokenCandidateSlices.flat());
|
|
570
|
-
tokenBalances?.forEach((token) => {
|
|
571
|
-
const tokenAddress = token.address;
|
|
572
|
-
// Make sure the token to add is in our candidate list
|
|
573
|
-
if (!tokenCandidateSet.has(tokenAddress)) {
|
|
574
|
-
return;
|
|
575
|
-
}
|
|
576
|
-
// Retrieve token data from cache to safely add it
|
|
577
|
-
const tokenData = __classPrivateFieldGet(this, _TokenDetectionController_tokensChainsCache, "f")[chainId]?.data[tokenAddress];
|
|
578
|
-
// We need specific data from tokensChainsCache to correctly create a token
|
|
579
|
-
// So even if we have a token that was detected correctly by the API, if its missing data we cannot safely add it.
|
|
580
|
-
if (!tokenData) {
|
|
581
|
-
return;
|
|
582
|
-
}
|
|
583
|
-
const { decimals, symbol, aggregators, iconUrl, name } = tokenData;
|
|
584
|
-
eventTokensDetails.push(`${symbol} - ${tokenAddress}`);
|
|
585
|
-
tokensWithBalance.push({
|
|
586
|
-
address: tokenAddress,
|
|
587
|
-
decimals,
|
|
588
|
-
symbol,
|
|
589
|
-
aggregators,
|
|
590
|
-
image: iconUrl,
|
|
591
|
-
isERC721: false,
|
|
592
|
-
name,
|
|
593
|
-
});
|
|
594
|
-
});
|
|
595
|
-
return { tokensWithBalance, eventTokensDetails };
|
|
596
435
|
}, _TokenDetectionController_addDetectedTokens = async function _TokenDetectionController_addDetectedTokens({ tokensSlice, selectedAddress, networkClientId, chainId, }) {
|
|
597
436
|
await safelyExecute(async () => {
|
|
598
437
|
const balances = await __classPrivateFieldGet(this, _TokenDetectionController_getBalancesInSingleCall, "f").call(this, selectedAddress, tokensSlice, networkClientId);
|
|
@@ -629,7 +468,7 @@ async function _TokenDetectionController_addDetectedTokensViaAPI({ selectedAddre
|
|
|
629
468
|
}, _TokenDetectionController_getSelectedAddress = function _TokenDetectionController_getSelectedAddress() {
|
|
630
469
|
// If the address is not defined (or empty), we fallback to the currently selected account's address
|
|
631
470
|
const account = this.messenger.call('AccountsController:getAccount', __classPrivateFieldGet(this, _TokenDetectionController_selectedAccountId, "f"));
|
|
632
|
-
return account?.address
|
|
471
|
+
return account?.address ?? '';
|
|
633
472
|
};
|
|
634
473
|
export default TokenDetectionController;
|
|
635
474
|
//# sourceMappingURL=TokenDetectionController.mjs.map
|