@metamask-previews/assets-controller 9.1.0-preview-14cbc2873 → 9.1.0-preview-9298fa429
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 +10 -0
- package/dist/AssetsController.cjs +183 -75
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +10 -7
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +10 -7
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +183 -75
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.cjs +5 -2
- package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.mjs +5 -2
- package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.cjs +226 -149
- package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.d.cts +7 -0
- package/dist/data-sources/BackendWebsocketDataSource.d.cts.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.d.mts +7 -0
- package/dist/data-sources/BackendWebsocketDataSource.d.mts.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.mjs +226 -146
- package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -1
- package/dist/data-sources/PriceDataSource.cjs +2 -0
- package/dist/data-sources/PriceDataSource.cjs.map +1 -1
- package/dist/data-sources/PriceDataSource.d.cts.map +1 -1
- package/dist/data-sources/PriceDataSource.d.mts.map +1 -1
- package/dist/data-sources/PriceDataSource.mjs +2 -0
- package/dist/data-sources/PriceDataSource.mjs.map +1 -1
- package/dist/data-sources/RpcDataSource.cjs +3 -2
- package/dist/data-sources/RpcDataSource.cjs.map +1 -1
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
- package/dist/data-sources/RpcDataSource.mjs +3 -2
- package/dist/data-sources/RpcDataSource.mjs.map +1 -1
- package/dist/data-sources/SnapDataSource.cjs +3 -3
- package/dist/data-sources/SnapDataSource.cjs.map +1 -1
- package/dist/data-sources/SnapDataSource.mjs +3 -3
- package/dist/data-sources/SnapDataSource.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts +2 -2
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts +2 -2
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts +2 -2
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts +2 -2
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts +2 -2
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts +2 -2
- package/dist/middlewares/ParallelMiddleware.cjs +9 -0
- package/dist/middlewares/ParallelMiddleware.cjs.map +1 -1
- package/dist/middlewares/ParallelMiddleware.d.cts.map +1 -1
- package/dist/middlewares/ParallelMiddleware.d.mts.map +1 -1
- package/dist/middlewares/ParallelMiddleware.mjs +9 -0
- package/dist/middlewares/ParallelMiddleware.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +8 -3
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +8 -3
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/processAccountActivityBalanceUpdates.cjs +54 -0
- package/dist/utils/processAccountActivityBalanceUpdates.cjs.map +1 -0
- package/dist/utils/processAccountActivityBalanceUpdates.d.cts +13 -0
- package/dist/utils/processAccountActivityBalanceUpdates.d.cts.map +1 -0
- package/dist/utils/processAccountActivityBalanceUpdates.d.mts +13 -0
- package/dist/utils/processAccountActivityBalanceUpdates.d.mts.map +1 -0
- package/dist/utils/processAccountActivityBalanceUpdates.mjs +47 -0
- package/dist/utils/processAccountActivityBalanceUpdates.mjs.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -9,8 +9,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
### Changed
|
|
11
11
|
|
|
12
|
+
- **BREAKING:** `AssetsController` messenger must now allow `AccountActivityService:balanceUpdated` so unified `assetsBalance` state receives real-time websocket balance updates when `AccountActivityService` owns the server subscription ([#9273](https://github.com/MetaMask/core/pull/9273))
|
|
12
13
|
- Bump `@metamask/transaction-controller` from `^68.1.1` to `^68.2.0` ([#9253](https://github.com/MetaMask/core/pull/9253))
|
|
13
14
|
|
|
15
|
+
### Fixed
|
|
16
|
+
|
|
17
|
+
- Fix stale token balances after transactions when switching accounts or when websocket subscriptions reconnect; `AssetsController` now fetches before re-subscribing on account switch and serializes overlapping refresh work ([#9265](https://github.com/MetaMask/core/pull/9265))
|
|
18
|
+
- `AccountsApiDataSource` bypasses the TanStack Query balance cache when `forceUpdate` is true so forced refreshes return up-to-date balances instead of 60-second cached values ([#9265](https://github.com/MetaMask/core/pull/9265))
|
|
19
|
+
- `BackendWebsocketDataSource` re-subscribes when subscribed accounts change (case-insensitive EVM address matching), serializes subscribe/unsubscribe to prevent races on account switch, and registers channel callbacks as a fallback when server `subscriptionId` values do not match ([#9265](https://github.com/MetaMask/core/pull/9265))
|
|
20
|
+
- Remove the 120-second websocket balance freshness guard that blocked force-refresh and polling updates from correcting stale websocket balances ([#9273](https://github.com/MetaMask/core/pull/9273))
|
|
21
|
+
- Add `update` balance update mode so fetch and force-refresh pipelines patch balances without removing tokens omitted from partial API snapshots; `getAssets({ forceUpdate: true })`, `AccountsApiDataSource`, and `SnapDataSource` use this mode ([#9273](https://github.com/MetaMask/core/pull/9273))
|
|
22
|
+
- `BackendWebsocketDataSource` registers subscription handlers before the subscribe handshake so in-flight account-activity notifications are not dropped, cleans up subscription state on subscribe failure, and resolves balance updates from stored subscription state when notifications arrive with stale subscription IDs ([#9273](https://github.com/MetaMask/core/pull/9273))
|
|
23
|
+
|
|
14
24
|
## [9.1.0]
|
|
15
25
|
|
|
16
26
|
### Added
|
|
@@ -13,7 +13,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
13
13
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
14
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
15
|
};
|
|
16
|
-
var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_trace, _AssetsController_captureException, _AssetsController_firstInitFetchReported, _AssetsController_stateSizeReported, _AssetsController_emitTrace, _AssetsController_emitStateSizeTrace, _AssetsController_uiOpen, _AssetsController_keyringUnlocked, _AssetsController_controllerMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_lastKnownAccountIds, _AssetsController_getSelectedAccounts, _AssetsController_backendWebsocketDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_stakedBalanceDataSource, _AssetsController_allBalanceDataSources_get, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_customAssetGraduationMiddleware, _AssetsController_rpcFallbackMiddleware, _AssetsController_tokenDataSource, _AssetsController_unsubscribeBasicFunctionality, _AssetsController_queryApiClient, _AssetsController_onActiveChainsUpdated, _AssetsController_initializeNativeAssetsMap, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_onUnapprovedTransactionAdded, _AssetsController_updateActive, _AssetsController_handleAccountTreeStateChange, _AssetsController_registerActionHandlers, _AssetsController_handleActiveChainsUpdate, _AssetsController_executeMiddlewares, _AssetsController_getNativeAssetMap, _AssetsController_isNativeAsset, _AssetsController_getAssetType, _AssetsController_resolveNativeAssetIds, _AssetsController_getNativeAssetIdsForEnabledChains, _AssetsController_getNativeAssetIdsForAccount, _AssetsController_ensureNativeBalancesDefaultZero, _AssetsController_ensureDefaultTrackedAssetsSeeded, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_shouldHideNativeToken, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeAssets, _AssetsController_subscribeAssetsBalance, _AssetsController_subscribeRpcCustomAssetsSupplement, _AssetsController_unsubscribeBySubscriptionKey, _AssetsController_subscribeStakedBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_subscribeDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged, _AssetsController_handleNetworkAdded, _AssetsController_refreshAssetsAfterNetworkChange;
|
|
16
|
+
var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_trace, _AssetsController_captureException, _AssetsController_firstInitFetchReported, _AssetsController_stateSizeReported, _AssetsController_emitTrace, _AssetsController_emitStateSizeTrace, _AssetsController_uiOpen, _AssetsController_keyringUnlocked, _AssetsController_controllerMutex, _AssetsController_accountRefreshMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_lastKnownAccountIds, _AssetsController_getSelectedAccounts, _AssetsController_backendWebsocketDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_stakedBalanceDataSource, _AssetsController_allBalanceDataSources_get, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_customAssetGraduationMiddleware, _AssetsController_rpcFallbackMiddleware, _AssetsController_tokenDataSource, _AssetsController_unsubscribeBasicFunctionality, _AssetsController_queryApiClient, _AssetsController_onActiveChainsUpdated, _AssetsController_initializeNativeAssetsMap, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_onUnapprovedTransactionAdded, _AssetsController_onAccountActivityBalanceUpdated, _AssetsController_updateActive, _AssetsController_handleAccountTreeStateChange, _AssetsController_runAccountTreeRefresh, _AssetsController_registerActionHandlers, _AssetsController_handleActiveChainsUpdate, _AssetsController_executeMiddlewares, _AssetsController_getNativeAssetMap, _AssetsController_isNativeAsset, _AssetsController_getAssetType, _AssetsController_resolveNativeAssetIds, _AssetsController_getNativeAssetIdsForEnabledChains, _AssetsController_getNativeAssetIdsForAccount, _AssetsController_getSlowPipelineChainIds, _AssetsController_ensureNativeBalancesDefaultZero, _AssetsController_ensureDefaultTrackedAssetsSeeded, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_shouldHideNativeToken, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeAssets, _AssetsController_subscribeAssetsBalance, _AssetsController_subscribeRpcCustomAssetsSupplement, _AssetsController_unsubscribeBySubscriptionKey, _AssetsController_subscribeStakedBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_subscribeDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged, _AssetsController_handleNetworkAdded, _AssetsController_refreshAssetsAfterNetworkChange;
|
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
18
|
exports.AssetsController = exports.getDefaultAssetsControllerState = void 0;
|
|
19
19
|
const base_controller_1 = require("@metamask/base-controller");
|
|
@@ -40,6 +40,7 @@ const RpcFallbackMiddleware_1 = require("./middlewares/RpcFallbackMiddleware.cjs
|
|
|
40
40
|
const utils_2 = require("./utils/index.cjs");
|
|
41
41
|
const constants_1 = require("./utils/constants.cjs");
|
|
42
42
|
const customAssetsRpcSupplement_1 = require("./utils/customAssetsRpcSupplement.cjs");
|
|
43
|
+
const processAccountActivityBalanceUpdates_1 = require("./utils/processAccountActivityBalanceUpdates.cjs");
|
|
43
44
|
const NATIVE_ASSETS_QUERY_KEY = ['nativeAssets'];
|
|
44
45
|
// ============================================================================
|
|
45
46
|
// CONTROLLER CONSTANTS
|
|
@@ -255,6 +256,8 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
255
256
|
/** Whether the keyring is unlocked. Combined with #uiOpen for #updateActive. */
|
|
256
257
|
_AssetsController_keyringUnlocked.set(this, false);
|
|
257
258
|
_AssetsController_controllerMutex.set(this, new async_mutex_1.Mutex());
|
|
259
|
+
/** Serializes account-switch fetch + subscribe to prevent overlapping races. */
|
|
260
|
+
_AssetsController_accountRefreshMutex.set(this, new async_mutex_1.Mutex());
|
|
258
261
|
/**
|
|
259
262
|
* Active balance subscriptions keyed by account ID.
|
|
260
263
|
* Each account has one logical subscription that may span multiple data sources.
|
|
@@ -418,9 +421,9 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
418
421
|
// creation, RPC is slow on many chains). Results are committed to state
|
|
419
422
|
// immediately so the UI can display balances without waiting for them.
|
|
420
423
|
//
|
|
421
|
-
//
|
|
422
|
-
//
|
|
423
|
-
//
|
|
424
|
+
// Fast/slow pipelines use 'update' so partial API snapshots cannot wipe
|
|
425
|
+
// tokens missing from the response (e.g. USDC when only native balance
|
|
426
|
+
// is returned). Balances present in the response are still refreshed.
|
|
424
427
|
const fastSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
425
428
|
? [
|
|
426
429
|
(0, ParallelMiddleware_1.createParallelBalanceMiddleware)([
|
|
@@ -440,31 +443,32 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
440
443
|
]
|
|
441
444
|
: [__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f")];
|
|
442
445
|
const { response, durationByDataSource } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, fastSources, request);
|
|
443
|
-
|
|
444
|
-
// StakedBalance), so it must always merge to avoid wiping Snap/RPC
|
|
445
|
-
// balances that the background pipeline hasn't yet replaced.
|
|
446
|
-
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...response, updateMode: 'merge' });
|
|
446
|
+
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...response, updateMode: 'update' });
|
|
447
447
|
// Background pipeline: snap and RPC run in parallel after the fast path
|
|
448
448
|
// commits to state. Their balances are merged together before detection.
|
|
449
449
|
// Token + price enrichment matches the pre-split behavior: only when basic
|
|
450
450
|
// functionality is on (RPC-only mode must not call token/price APIs).
|
|
451
|
-
const
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
451
|
+
const slowPipelineChainIds = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSlowPipelineChainIds).call(this, chainIds, response);
|
|
452
|
+
if (slowPipelineChainIds.length > 0) {
|
|
453
|
+
const slowSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
454
|
+
? [__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")]
|
|
455
|
+
: [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
|
|
456
|
+
const slowRequest = { ...request, chainIds: slowPipelineChainIds };
|
|
457
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [
|
|
458
|
+
(0, ParallelMiddleware_1.createParallelBalanceMiddleware)(slowSources),
|
|
459
|
+
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
460
|
+
...(__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
461
|
+
? [
|
|
462
|
+
(0, ParallelMiddleware_1.createParallelMiddleware)([
|
|
463
|
+
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
464
|
+
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
465
|
+
]),
|
|
466
|
+
]
|
|
467
|
+
: []),
|
|
468
|
+
], slowRequest)
|
|
469
|
+
.then(({ response: slowResponse }) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...slowResponse, updateMode: 'update' }))
|
|
470
|
+
.catch((error) => log('Background pipeline failed', { error }));
|
|
471
|
+
}
|
|
468
472
|
const durationMs = performance.now() - startTime;
|
|
469
473
|
// Emit trace for every full fetch (Assets Health dashboard)
|
|
470
474
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_emitTrace).call(this, TRACE_FULL_FETCH, {
|
|
@@ -856,7 +860,8 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
856
860
|
// RPC already fetches custom assets on purpose, and Snap handles non-EVM
|
|
857
861
|
// chains the rule does not apply to, so skip the middleware for those.
|
|
858
862
|
const shouldGraduateCustomAssets = sourceId === 'AccountsApiDataSource' ||
|
|
859
|
-
sourceId === 'BackendWebsocketDataSource'
|
|
863
|
+
sourceId === 'BackendWebsocketDataSource' ||
|
|
864
|
+
sourceId === 'AccountActivityService';
|
|
860
865
|
const enrichmentSources = [
|
|
861
866
|
...(shouldGraduateCustomAssets
|
|
862
867
|
? [__classPrivateFieldGet(this, _AssetsController_customAssetGraduationMiddleware, "f")]
|
|
@@ -918,7 +923,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
918
923
|
}
|
|
919
924
|
}
|
|
920
925
|
exports.AssetsController = AssetsController;
|
|
921
|
-
_AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctionality = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_trace = new WeakMap(), _AssetsController_captureException = new WeakMap(), _AssetsController_firstInitFetchReported = new WeakMap(), _AssetsController_stateSizeReported = new WeakMap(), _AssetsController_uiOpen = new WeakMap(), _AssetsController_keyringUnlocked = new WeakMap(), _AssetsController_controllerMutex = new WeakMap(), _AssetsController_activeSubscriptions = new WeakMap(), _AssetsController_enabledChains = new WeakMap(), _AssetsController_lastKnownAccountIds = new WeakMap(), _AssetsController_backendWebsocketDataSource = new WeakMap(), _AssetsController_accountsApiDataSource = new WeakMap(), _AssetsController_snapDataSource = new WeakMap(), _AssetsController_rpcDataSource = new WeakMap(), _AssetsController_stakedBalanceDataSource = new WeakMap(), _AssetsController_priceDataSource = new WeakMap(), _AssetsController_detectionMiddleware = new WeakMap(), _AssetsController_customAssetGraduationMiddleware = new WeakMap(), _AssetsController_rpcFallbackMiddleware = new WeakMap(), _AssetsController_tokenDataSource = new WeakMap(), _AssetsController_unsubscribeBasicFunctionality = new WeakMap(), _AssetsController_queryApiClient = new WeakMap(), _AssetsController_onActiveChainsUpdated = new WeakMap(), _AssetsController_instances = new WeakSet(), _AssetsController_emitTrace = function _AssetsController_emitTrace(name, data, tags = {
|
|
926
|
+
_AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctionality = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_trace = new WeakMap(), _AssetsController_captureException = new WeakMap(), _AssetsController_firstInitFetchReported = new WeakMap(), _AssetsController_stateSizeReported = new WeakMap(), _AssetsController_uiOpen = new WeakMap(), _AssetsController_keyringUnlocked = new WeakMap(), _AssetsController_controllerMutex = new WeakMap(), _AssetsController_accountRefreshMutex = new WeakMap(), _AssetsController_activeSubscriptions = new WeakMap(), _AssetsController_enabledChains = new WeakMap(), _AssetsController_lastKnownAccountIds = new WeakMap(), _AssetsController_backendWebsocketDataSource = new WeakMap(), _AssetsController_accountsApiDataSource = new WeakMap(), _AssetsController_snapDataSource = new WeakMap(), _AssetsController_rpcDataSource = new WeakMap(), _AssetsController_stakedBalanceDataSource = new WeakMap(), _AssetsController_priceDataSource = new WeakMap(), _AssetsController_detectionMiddleware = new WeakMap(), _AssetsController_customAssetGraduationMiddleware = new WeakMap(), _AssetsController_rpcFallbackMiddleware = new WeakMap(), _AssetsController_tokenDataSource = new WeakMap(), _AssetsController_unsubscribeBasicFunctionality = new WeakMap(), _AssetsController_queryApiClient = new WeakMap(), _AssetsController_onActiveChainsUpdated = new WeakMap(), _AssetsController_instances = new WeakSet(), _AssetsController_emitTrace = function _AssetsController_emitTrace(name, data, tags = {
|
|
922
927
|
controller: 'AssetsController',
|
|
923
928
|
}) {
|
|
924
929
|
if (!__classPrivateFieldGet(this, _AssetsController_trace, "f")) {
|
|
@@ -1044,11 +1049,11 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
|
|
|
1044
1049
|
// The base-controller `:stateChange` event is guaranteed to fire
|
|
1045
1050
|
// when init() calls this.update(). #start() is idempotent so
|
|
1046
1051
|
// repeated fires are safe.
|
|
1047
|
-
this.messenger.subscribe('AccountTreeController:
|
|
1052
|
+
this.messenger.subscribe('AccountTreeController:stateChanged', () => {
|
|
1048
1053
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleAccountTreeStateChange).call(this);
|
|
1049
1054
|
});
|
|
1050
1055
|
// Subscribe to network enablement changes (only enabledNetworkMap)
|
|
1051
|
-
this.messenger.subscribe('NetworkEnablementController:
|
|
1056
|
+
this.messenger.subscribe('NetworkEnablementController:stateChanged', ({ enabledNetworkMap }) => {
|
|
1052
1057
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleEnabledNetworksChanged).call(this, enabledNetworkMap).catch(console.error);
|
|
1053
1058
|
});
|
|
1054
1059
|
// When a network is added or removed from NetworkController, refresh
|
|
@@ -1065,7 +1070,7 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
|
|
|
1065
1070
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_refreshAssetsAfterNetworkChange).call(this);
|
|
1066
1071
|
});
|
|
1067
1072
|
// Client + Keyring lifecycle: only run when UI is open AND keyring is unlocked
|
|
1068
|
-
this.messenger.subscribe('ClientController:
|
|
1073
|
+
this.messenger.subscribe('ClientController:stateChanged', (isUiOpen) => {
|
|
1069
1074
|
__classPrivateFieldSet(this, _AssetsController_uiOpen, isUiOpen, "f");
|
|
1070
1075
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
|
|
1071
1076
|
}, client_controller_1.clientControllerSelectors.selectIsUiOpen);
|
|
@@ -1082,6 +1087,12 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
|
|
|
1082
1087
|
this.messenger.subscribe('TransactionController:unapprovedTransactionAdded', (transactionMeta) => {
|
|
1083
1088
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_onUnapprovedTransactionAdded).call(this, transactionMeta);
|
|
1084
1089
|
});
|
|
1090
|
+
// Real-time post-tx balances from AccountActivityService (same WS payload as
|
|
1091
|
+
// TokenBalancesController; BackendWebsocketDataSource may not receive the
|
|
1092
|
+
// callback when AccountActivityService owns the server subscription).
|
|
1093
|
+
this.messenger.subscribe('AccountActivityService:balanceUpdated', (event) => {
|
|
1094
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_onAccountActivityBalanceUpdated).call(this, event);
|
|
1095
|
+
});
|
|
1085
1096
|
}, _AssetsController_onUnapprovedTransactionAdded = function _AssetsController_onUnapprovedTransactionAdded(transactionMeta) {
|
|
1086
1097
|
const hexChainId = transactionMeta.chainId;
|
|
1087
1098
|
if (!hexChainId) {
|
|
@@ -1104,6 +1115,26 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
|
|
|
1104
1115
|
error,
|
|
1105
1116
|
});
|
|
1106
1117
|
});
|
|
1118
|
+
}, _AssetsController_onAccountActivityBalanceUpdated = function _AssetsController_onAccountActivityBalanceUpdated({ address, chain, updates, }) {
|
|
1119
|
+
const account = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).find((a) => a.address.startsWith('0x')
|
|
1120
|
+
? a.address.toLowerCase() === address.toLowerCase()
|
|
1121
|
+
: a.address === address);
|
|
1122
|
+
if (!account) {
|
|
1123
|
+
return;
|
|
1124
|
+
}
|
|
1125
|
+
const chainId = chain;
|
|
1126
|
+
const response = (0, processAccountActivityBalanceUpdates_1.processAccountActivityBalanceUpdates)(updates, account.id, (assetId) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetType).call(this, assetId));
|
|
1127
|
+
if (!response.assetsBalance) {
|
|
1128
|
+
return;
|
|
1129
|
+
}
|
|
1130
|
+
const request = {
|
|
1131
|
+
accountsWithSupportedChains: [{ account, supportedChains: [chainId] }],
|
|
1132
|
+
chainIds: [chainId],
|
|
1133
|
+
dataTypes: ['balance', 'metadata'],
|
|
1134
|
+
};
|
|
1135
|
+
this.handleAssetsUpdate(response, 'AccountActivityService', request).catch((error) => {
|
|
1136
|
+
log('Failed to apply AccountActivityService balance update', { error });
|
|
1137
|
+
});
|
|
1107
1138
|
}, _AssetsController_updateActive = function _AssetsController_updateActive() {
|
|
1108
1139
|
const shouldRun = __classPrivateFieldGet(this, _AssetsController_uiOpen, "f") && __classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f");
|
|
1109
1140
|
if (shouldRun) {
|
|
@@ -1125,24 +1156,40 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
|
|
|
1125
1156
|
if (!accountsChanged) {
|
|
1126
1157
|
return;
|
|
1127
1158
|
}
|
|
1159
|
+
const hasOverlap = [...currentIds].some((id) => __classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").has(id));
|
|
1160
|
+
if (!hasOverlap && __classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").size > 0) {
|
|
1161
|
+
return;
|
|
1162
|
+
}
|
|
1128
1163
|
log('Account tree changed with new accounts, re-subscribing', {
|
|
1129
1164
|
previousCount: __classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").size,
|
|
1130
1165
|
currentCount: currentIds.size,
|
|
1131
1166
|
});
|
|
1132
1167
|
__classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, currentIds, "f");
|
|
1133
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
1134
1168
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
|
|
1135
1169
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureDefaultTrackedAssetsSeeded).call(this);
|
|
1136
|
-
this.
|
|
1137
|
-
|
|
1138
|
-
forceUpdate: true,
|
|
1139
|
-
}).catch((error) => {
|
|
1140
|
-
log('Failed to fetch assets after tree change', error);
|
|
1170
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runAccountTreeRefresh).call(this, accounts).catch((error) => {
|
|
1171
|
+
log('Failed to refresh assets after tree change', error);
|
|
1141
1172
|
});
|
|
1142
1173
|
}
|
|
1143
1174
|
else {
|
|
1144
1175
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_start).call(this);
|
|
1145
1176
|
}
|
|
1177
|
+
}, _AssetsController_runAccountTreeRefresh = async function _AssetsController_runAccountTreeRefresh(accounts) {
|
|
1178
|
+
const releaseLock = await __classPrivateFieldGet(this, _AssetsController_accountRefreshMutex, "f").acquire();
|
|
1179
|
+
try {
|
|
1180
|
+
await this.getAssets(accounts, {
|
|
1181
|
+
chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
|
|
1182
|
+
forceUpdate: true,
|
|
1183
|
+
});
|
|
1184
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
1185
|
+
}
|
|
1186
|
+
catch (error) {
|
|
1187
|
+
log('Failed to fetch assets after tree change', error);
|
|
1188
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
1189
|
+
}
|
|
1190
|
+
finally {
|
|
1191
|
+
releaseLock();
|
|
1192
|
+
}
|
|
1146
1193
|
}, _AssetsController_registerActionHandlers = function _AssetsController_registerActionHandlers() {
|
|
1147
1194
|
this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
|
|
1148
1195
|
}, _AssetsController_handleActiveChainsUpdate = function _AssetsController_handleActiveChainsUpdate(dataSourceId, activeChains, previousChains) {
|
|
@@ -1297,6 +1344,17 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1297
1344
|
return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_resolveNativeAssetIds).call(this, __classPrivateFieldGet(this, _AssetsController_enabledChains, "f"));
|
|
1298
1345
|
}, _AssetsController_getNativeAssetIdsForAccount = function _AssetsController_getNativeAssetIdsForAccount(account) {
|
|
1299
1346
|
return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_resolveNativeAssetIds).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getEnabledChainsForAccount).call(this, account));
|
|
1347
|
+
}, _AssetsController_getSlowPipelineChainIds = function _AssetsController_getSlowPipelineChainIds(chainIds, fastResponse) {
|
|
1348
|
+
const accountsApiChains = new Set(__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f").getActiveChainsSync());
|
|
1349
|
+
return chainIds.filter((chainId) => {
|
|
1350
|
+
if (fastResponse.errors?.[chainId]) {
|
|
1351
|
+
return true;
|
|
1352
|
+
}
|
|
1353
|
+
if (!accountsApiChains.has(chainId)) {
|
|
1354
|
+
return true;
|
|
1355
|
+
}
|
|
1356
|
+
return false;
|
|
1357
|
+
});
|
|
1300
1358
|
}, _AssetsController_ensureNativeBalancesDefaultZero = function _AssetsController_ensureNativeBalancesDefaultZero() {
|
|
1301
1359
|
const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
|
|
1302
1360
|
if (accounts.length === 0) {
|
|
@@ -1314,7 +1372,7 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1314
1372
|
balances[accountId] = {};
|
|
1315
1373
|
}
|
|
1316
1374
|
for (const nativeAssetId of nativeAssetIds) {
|
|
1317
|
-
if (!(
|
|
1375
|
+
if (!Object.prototype.hasOwnProperty.call(balances[accountId], nativeAssetId)) {
|
|
1318
1376
|
balances[accountId][nativeAssetId] = { amount: '0' };
|
|
1319
1377
|
}
|
|
1320
1378
|
}
|
|
@@ -1382,29 +1440,43 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1382
1440
|
const balances = state.assetsBalance;
|
|
1383
1441
|
const prices = state.assetsPrice;
|
|
1384
1442
|
if (normalizedResponse.assetsInfo) {
|
|
1385
|
-
|
|
1386
|
-
|
|
1443
|
+
if (mode === 'update') {
|
|
1444
|
+
// Balance-only refresh: patch amounts without overwriting metadata,
|
|
1445
|
+
// but seed entries that are missing so RPC-only chains (e.g.
|
|
1446
|
+
// Avalanche) can render native balances on first fetch.
|
|
1447
|
+
for (const [key, value] of Object.entries(normalizedResponse.assetsInfo)) {
|
|
1448
|
+
if (metadata[key]) {
|
|
1449
|
+
continue;
|
|
1450
|
+
}
|
|
1451
|
+
metadata[key] = value;
|
|
1387
1452
|
changedMetadata.push(key);
|
|
1388
1453
|
}
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1454
|
+
}
|
|
1455
|
+
else {
|
|
1456
|
+
for (const [key, value] of Object.entries(normalizedResponse.assetsInfo)) {
|
|
1457
|
+
if (!(0, lodash_1.isEqual)(previousState.assetsInfo[key], value)) {
|
|
1458
|
+
changedMetadata.push(key);
|
|
1459
|
+
}
|
|
1460
|
+
const existing = metadata[key];
|
|
1461
|
+
const incoming = value;
|
|
1462
|
+
// When the API returns no symbol or name for this token, it has no
|
|
1463
|
+
// real knowledge of it (e.g. a user-deployed token not indexed by
|
|
1464
|
+
// the API). Preserve richer metadata already in state (e.g. from
|
|
1465
|
+
// pendingMetadata set by addCustomAsset) so that the correct
|
|
1466
|
+
// decimals/symbol/name/image are not overwritten with empty values.
|
|
1467
|
+
if (existing && !incoming.symbol && !incoming.name) {
|
|
1468
|
+
metadata[key] = {
|
|
1469
|
+
...existing,
|
|
1470
|
+
...incoming,
|
|
1471
|
+
symbol: existing.symbol,
|
|
1472
|
+
name: existing.name,
|
|
1473
|
+
decimals: existing.decimals ?? incoming.decimals,
|
|
1474
|
+
image: existing.image ?? incoming.image,
|
|
1475
|
+
};
|
|
1476
|
+
}
|
|
1477
|
+
else {
|
|
1478
|
+
metadata[key] = value;
|
|
1479
|
+
}
|
|
1408
1480
|
}
|
|
1409
1481
|
}
|
|
1410
1482
|
}
|
|
@@ -1435,8 +1507,9 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1435
1507
|
// balances for chains not in the response are preserved from
|
|
1436
1508
|
// previous state so unsupported chains (e.g. Ink on AccountsAPI)
|
|
1437
1509
|
// are never inadvertently reset to zero.
|
|
1438
|
-
// Merge: response overlays previous balances
|
|
1439
|
-
|
|
1510
|
+
// Merge / update: response overlays previous balances (update never
|
|
1511
|
+
// removes tokens missing from a partial snapshot).
|
|
1512
|
+
const effective = mode === 'merge' || mode === 'update'
|
|
1440
1513
|
? { ...previousBalances, ...accountBalances }
|
|
1441
1514
|
: (() => {
|
|
1442
1515
|
// Determine which chain namespaces this response covers.
|
|
@@ -1453,7 +1526,7 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1453
1526
|
Object.assign(next, accountBalances);
|
|
1454
1527
|
// Preserve custom assets that the response omitted.
|
|
1455
1528
|
for (const customId of customAssetIds) {
|
|
1456
|
-
if (!(customId
|
|
1529
|
+
if (!Object.prototype.hasOwnProperty.call(next, customId)) {
|
|
1457
1530
|
const prev = previousBalances[customId];
|
|
1458
1531
|
next[customId] =
|
|
1459
1532
|
prev ?? { amount: '0' };
|
|
@@ -1461,13 +1534,25 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1461
1534
|
}
|
|
1462
1535
|
return next;
|
|
1463
1536
|
})();
|
|
1537
|
+
// Chains present in this partial response (e.g. Accounts API returned
|
|
1538
|
+
// ERC-20 zeros but omitted native after a max send).
|
|
1539
|
+
const coveredChainsInResponse = new Set(Object.keys(accountBalances).map((assetId) => assetId.split('/')[0]));
|
|
1464
1540
|
// Ensure native tokens have an entry (0 if missing) for chains this account supports
|
|
1465
1541
|
const account = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).find((a) => a.id === accountId);
|
|
1466
1542
|
const nativeAssetIdsForAccount = account
|
|
1467
1543
|
? __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getNativeAssetIdsForAccount).call(this, account)
|
|
1468
1544
|
: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getNativeAssetIdsForEnabledChains).call(this);
|
|
1469
1545
|
for (const nativeAssetId of nativeAssetIdsForAccount) {
|
|
1470
|
-
|
|
1546
|
+
const nativeChain = nativeAssetId.split('/')[0];
|
|
1547
|
+
if (!Object.prototype.hasOwnProperty.call(effective, nativeAssetId)) {
|
|
1548
|
+
effective[nativeAssetId] = { amount: '0' };
|
|
1549
|
+
}
|
|
1550
|
+
else if (mode === 'update' &&
|
|
1551
|
+
coveredChainsInResponse.has(nativeChain) &&
|
|
1552
|
+
!Object.prototype.hasOwnProperty.call(accountBalances, nativeAssetId)) {
|
|
1553
|
+
// Update-mode overlay keeps previous native when the response
|
|
1554
|
+
// omits it. If the API returned any balance on this chain,
|
|
1555
|
+
// treat omitted native as zero instead of a stale pre-tx amount.
|
|
1471
1556
|
effective[nativeAssetId] = { amount: '0' };
|
|
1472
1557
|
}
|
|
1473
1558
|
}
|
|
@@ -1499,10 +1584,21 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1499
1584
|
balances[accountId] = effective;
|
|
1500
1585
|
}
|
|
1501
1586
|
}
|
|
1502
|
-
// Update prices in state
|
|
1587
|
+
// Update prices in state. Update mode only seeds missing entries so
|
|
1588
|
+
// balance-only refreshes do not clobber existing price data.
|
|
1503
1589
|
if (normalizedResponse.assetsPrice) {
|
|
1504
|
-
|
|
1505
|
-
|
|
1590
|
+
if (mode === 'update') {
|
|
1591
|
+
for (const [key, value] of Object.entries(normalizedResponse.assetsPrice)) {
|
|
1592
|
+
if (prices[key]) {
|
|
1593
|
+
continue;
|
|
1594
|
+
}
|
|
1595
|
+
prices[key] = value;
|
|
1596
|
+
}
|
|
1597
|
+
}
|
|
1598
|
+
else {
|
|
1599
|
+
for (const [key, value] of Object.entries(normalizedResponse.assetsPrice)) {
|
|
1600
|
+
prices[key] = value;
|
|
1601
|
+
}
|
|
1506
1602
|
}
|
|
1507
1603
|
}
|
|
1508
1604
|
});
|
|
@@ -1745,7 +1841,13 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1745
1841
|
const seenIds = new Set();
|
|
1746
1842
|
const accountsForSource = assignedChains
|
|
1747
1843
|
.flatMap((chainId) => chainToAccounts.get(chainId) ?? [])
|
|
1748
|
-
.filter((account) =>
|
|
1844
|
+
.filter((account) => {
|
|
1845
|
+
if (seenIds.has(account.id)) {
|
|
1846
|
+
return false;
|
|
1847
|
+
}
|
|
1848
|
+
seenIds.add(account.id);
|
|
1849
|
+
return true;
|
|
1850
|
+
});
|
|
1749
1851
|
if (accountsForSource.length > 0) {
|
|
1750
1852
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeDataSource).call(this, source, accountsForSource, assignedChains);
|
|
1751
1853
|
}
|
|
@@ -1932,16 +2034,22 @@ async function _AssetsController_handleAccountGroupChanged() {
|
|
|
1932
2034
|
accountIds: accounts.map((a) => a.id),
|
|
1933
2035
|
});
|
|
1934
2036
|
__classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, new Set(accounts.map((a) => a.id)), "f");
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
2037
|
+
const releaseLock = await __classPrivateFieldGet(this, _AssetsController_accountRefreshMutex, "f").acquire();
|
|
2038
|
+
try {
|
|
2039
|
+
if (accounts.length > 0) {
|
|
2040
|
+
await this.getAssets(accounts, {
|
|
2041
|
+
chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
|
|
2042
|
+
forceUpdate: true,
|
|
2043
|
+
});
|
|
2044
|
+
}
|
|
2045
|
+
// Subscribe after fetch so WS notifications can recover state
|
|
2046
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
2047
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
|
|
2048
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureDefaultTrackedAssetsSeeded).call(this);
|
|
2049
|
+
}
|
|
2050
|
+
finally {
|
|
2051
|
+
releaseLock();
|
|
1942
2052
|
}
|
|
1943
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
|
|
1944
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureDefaultTrackedAssetsSeeded).call(this);
|
|
1945
2053
|
}, _AssetsController_handleEnabledNetworksChanged = async function _AssetsController_handleEnabledNetworksChanged(enabledNetworkMap) {
|
|
1946
2054
|
const previousChains = __classPrivateFieldGet(this, _AssetsController_enabledChains, "f");
|
|
1947
2055
|
__classPrivateFieldSet(this, _AssetsController_enabledChains, __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_extractEnabledChains).call(this, enabledNetworkMap), "f");
|