@metamask-previews/assets-controller 9.1.0-preview-2226dd478 → 9.1.0-preview-18dd0df9c
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 +7 -2
- package/dist/AssetsController.cjs +247 -107
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +11 -8
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +11 -8
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +247 -107
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.cjs +10 -0
- package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.cts +8 -0
- package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.mts +8 -0
- package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.mjs +10 -0
- package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.cjs +36 -60
- package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.d.cts +8 -0
- package/dist/data-sources/BackendWebsocketDataSource.d.cts.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.d.mts +8 -0
- package/dist/data-sources/BackendWebsocketDataSource.d.mts.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.mjs +36 -57
- package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -1
- package/dist/data-sources/PriceDataSource.cjs +18 -9
- 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 +19 -10
- package/dist/data-sources/PriceDataSource.mjs.map +1 -1
- package/dist/data-sources/RpcDataSource.cjs +29 -9
- package/dist/data-sources/RpcDataSource.cjs.map +1 -1
- package/dist/data-sources/RpcDataSource.d.cts +5 -0
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
- package/dist/data-sources/RpcDataSource.d.mts +5 -0
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
- package/dist/data-sources/RpcDataSource.mjs +29 -9
- package/dist/data-sources/RpcDataSource.mjs.map +1 -1
- package/dist/middlewares/DetectionMiddleware.cjs +22 -1
- package/dist/middlewares/DetectionMiddleware.cjs.map +1 -1
- package/dist/middlewares/DetectionMiddleware.d.cts +3 -0
- package/dist/middlewares/DetectionMiddleware.d.cts.map +1 -1
- package/dist/middlewares/DetectionMiddleware.d.mts +3 -0
- package/dist/middlewares/DetectionMiddleware.d.mts.map +1 -1
- package/dist/middlewares/DetectionMiddleware.mjs +22 -1
- package/dist/middlewares/DetectionMiddleware.mjs.map +1 -1
- package/dist/middlewares/ParallelMiddleware.cjs +4 -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 +4 -0
- package/dist/middlewares/ParallelMiddleware.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +8 -10
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +8 -10
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/dedupingBatchFetcher.cjs +11 -0
- package/dist/utils/dedupingBatchFetcher.cjs.map +1 -1
- package/dist/utils/dedupingBatchFetcher.d.cts +7 -0
- package/dist/utils/dedupingBatchFetcher.d.cts.map +1 -1
- package/dist/utils/dedupingBatchFetcher.d.mts +7 -0
- package/dist/utils/dedupingBatchFetcher.d.mts.map +1 -1
- package/dist/utils/dedupingBatchFetcher.mjs +11 -0
- package/dist/utils/dedupingBatchFetcher.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,13 +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
|
|
|
14
15
|
### Fixed
|
|
15
16
|
|
|
16
|
-
- Fix stale token balances after transactions when switching accounts or when websocket subscriptions reconnect; `AssetsController` now fetches before re-subscribing on account switch
|
|
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))
|
|
17
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))
|
|
18
|
-
- `BackendWebsocketDataSource` re-subscribes when subscribed accounts change (case-insensitive EVM address matching), serializes subscribe/unsubscribe to prevent races on account switch, and registers
|
|
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
|
+
- `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))
|
|
22
|
+
- `AssetsController` refreshes data-source `activeChains`, re-subscribes, and force-fetches balances for the newly selected EVM chain when the user switches networks via `NetworkController:networkDidChange`
|
|
23
|
+
- `AssetsController` bypasses the price deduper cache and fetches spot prices for assets on a newly selected or added EVM network only when those assets have no entry in `assetsPrice` yet; `DetectionMiddleware` queues newly detected assets for the same pipeline price fetch so RPC-detected tokens are priced without waiting for the poll interval
|
|
19
24
|
|
|
20
25
|
## [9.1.0]
|
|
21
26
|
|
|
@@ -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_accountRefreshMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_lastKnownAccountIds,
|
|
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_onTransactionConfirmed, _AssetsController_onAccountActivityBalanceUpdated, _AssetsController_updateActive, _AssetsController_handleAccountTreeStateChange, _AssetsController_runAccountTreeRefresh, _AssetsController_registerActionHandlers, _AssetsController_handleActiveChainsUpdate, _AssetsController_executeMiddlewares, _AssetsController_fetchMissingPricesWithoutCache, _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_refreshActiveChainsOnNetworkSwitch, _AssetsController_getSelectedEvmChainIdFromNetworkState, _AssetsController_handleNetworkDidChange, _AssetsController_refreshAssetsAfterNetworkChange, _AssetsController_refreshAssetsAfterNetworkAdded;
|
|
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
|
|
@@ -62,15 +63,6 @@ const MESSENGER_EXPOSED_METHODS = [
|
|
|
62
63
|
];
|
|
63
64
|
/** Default polling interval hint for data sources (30 seconds) */
|
|
64
65
|
const DEFAULT_POLLING_INTERVAL_MS = 30000;
|
|
65
|
-
/** Sources whose passive polling must not overwrite recent websocket balances. */
|
|
66
|
-
const POLLING_BALANCE_SOURCES = new Set([
|
|
67
|
-
'AccountsApiDataSource',
|
|
68
|
-
'RpcDataSource',
|
|
69
|
-
'SnapDataSource',
|
|
70
|
-
'StakedBalanceDataSource',
|
|
71
|
-
]);
|
|
72
|
-
/** How long websocket balance updates block stale polling overwrites. */
|
|
73
|
-
const WS_BALANCE_FRESHNESS_MS = 120000;
|
|
74
66
|
// ============================================================================
|
|
75
67
|
// TRACE NAMES — used in Sentry spans (search these strings in Discover)
|
|
76
68
|
// ============================================================================
|
|
@@ -201,9 +193,6 @@ function normalizeResponse(response) {
|
|
|
201
193
|
if (response.updateMode) {
|
|
202
194
|
normalized.updateMode = response.updateMode;
|
|
203
195
|
}
|
|
204
|
-
if (response.sourceId) {
|
|
205
|
-
normalized.sourceId = response.sourceId;
|
|
206
|
-
}
|
|
207
196
|
return normalized;
|
|
208
197
|
}
|
|
209
198
|
// ============================================================================
|
|
@@ -284,11 +273,6 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
284
273
|
* re-subscriptions when the account set hasn't actually changed.
|
|
285
274
|
*/
|
|
286
275
|
_AssetsController_lastKnownAccountIds.set(this, new Set());
|
|
287
|
-
/**
|
|
288
|
-
* Per `accountId:assetId`, timestamp until which websocket balance updates
|
|
289
|
-
* should not be overwritten by polling/API fetches.
|
|
290
|
-
*/
|
|
291
|
-
_AssetsController_wsBalanceFreshUntil.set(this, new Map());
|
|
292
276
|
_AssetsController_backendWebsocketDataSource.set(this, void 0);
|
|
293
277
|
_AssetsController_accountsApiDataSource.set(this, void 0);
|
|
294
278
|
_AssetsController_snapDataSource.set(this, void 0);
|
|
@@ -437,9 +421,9 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
437
421
|
// creation, RPC is slow on many chains). Results are committed to state
|
|
438
422
|
// immediately so the UI can display balances without waiting for them.
|
|
439
423
|
//
|
|
440
|
-
//
|
|
441
|
-
//
|
|
442
|
-
//
|
|
424
|
+
// Fast/slow pipelines use merge 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.
|
|
443
427
|
const fastSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
444
428
|
? [
|
|
445
429
|
(0, ParallelMiddleware_1.createParallelBalanceMiddleware)([
|
|
@@ -459,39 +443,32 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
459
443
|
]
|
|
460
444
|
: [__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f")];
|
|
461
445
|
const { response, durationByDataSource } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, fastSources, request);
|
|
462
|
-
|
|
463
|
-
// StakedBalance), so it must always merge to avoid wiping Snap/RPC
|
|
464
|
-
// balances that the background pipeline hasn't yet replaced.
|
|
465
|
-
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, {
|
|
466
|
-
...response,
|
|
467
|
-
updateMode: 'merge',
|
|
468
|
-
sourceId: 'getAssets:forceUpdate',
|
|
469
|
-
});
|
|
446
|
+
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...response, updateMode: 'merge' });
|
|
470
447
|
// Background pipeline: snap and RPC run in parallel after the fast path
|
|
471
448
|
// commits to state. Their balances are merged together before detection.
|
|
472
449
|
// Token + price enrichment matches the pre-split behavior: only when basic
|
|
473
450
|
// functionality is on (RPC-only mode must not call token/price APIs).
|
|
474
|
-
const
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
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: 'merge' }))
|
|
470
|
+
.catch((error) => log('Background pipeline failed', { error }));
|
|
471
|
+
}
|
|
495
472
|
const durationMs = performance.now() - startTime;
|
|
496
473
|
// Emit trace for every full fetch (Assets Health dashboard)
|
|
497
474
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_emitTrace).call(this, TRACE_FULL_FETCH, {
|
|
@@ -883,7 +860,8 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
883
860
|
// RPC already fetches custom assets on purpose, and Snap handles non-EVM
|
|
884
861
|
// chains the rule does not apply to, so skip the middleware for those.
|
|
885
862
|
const shouldGraduateCustomAssets = sourceId === 'AccountsApiDataSource' ||
|
|
886
|
-
sourceId === 'BackendWebsocketDataSource'
|
|
863
|
+
sourceId === 'BackendWebsocketDataSource' ||
|
|
864
|
+
sourceId === 'AccountActivityService';
|
|
887
865
|
const enrichmentSources = [
|
|
888
866
|
...(shouldGraduateCustomAssets
|
|
889
867
|
? [__classPrivateFieldGet(this, _AssetsController_customAssetGraduationMiddleware, "f")]
|
|
@@ -897,11 +875,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
897
875
|
]));
|
|
898
876
|
}
|
|
899
877
|
const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, enrichmentSources, pipelineRequest, response);
|
|
900
|
-
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this,
|
|
901
|
-
if (sourceId === 'BackendWebsocketDataSource' &&
|
|
902
|
-
enrichedResponse.assetsBalance) {
|
|
903
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_markWsBalancesFresh).call(this, enrichedResponse.assetsBalance);
|
|
904
|
-
}
|
|
878
|
+
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, enrichedResponse);
|
|
905
879
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_emitTrace).call(this, TRACE_UPDATE_PIPELINE, {
|
|
906
880
|
source: sourceId,
|
|
907
881
|
duration_ms: performance.now() - updateStart,
|
|
@@ -949,7 +923,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
949
923
|
}
|
|
950
924
|
}
|
|
951
925
|
exports.AssetsController = AssetsController;
|
|
952
|
-
_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(),
|
|
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 = {
|
|
953
927
|
controller: 'AssetsController',
|
|
954
928
|
}) {
|
|
955
929
|
if (!__classPrivateFieldGet(this, _AssetsController_trace, "f")) {
|
|
@@ -1075,11 +1049,11 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
|
|
|
1075
1049
|
// The base-controller `:stateChange` event is guaranteed to fire
|
|
1076
1050
|
// when init() calls this.update(). #start() is idempotent so
|
|
1077
1051
|
// repeated fires are safe.
|
|
1078
|
-
this.messenger.subscribe('AccountTreeController:
|
|
1052
|
+
this.messenger.subscribe('AccountTreeController:stateChanged', () => {
|
|
1079
1053
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleAccountTreeStateChange).call(this);
|
|
1080
1054
|
});
|
|
1081
1055
|
// Subscribe to network enablement changes (only enabledNetworkMap)
|
|
1082
|
-
this.messenger.subscribe('NetworkEnablementController:
|
|
1056
|
+
this.messenger.subscribe('NetworkEnablementController:stateChanged', ({ enabledNetworkMap }) => {
|
|
1083
1057
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleEnabledNetworksChanged).call(this, enabledNetworkMap).catch(console.error);
|
|
1084
1058
|
});
|
|
1085
1059
|
// When a network is added or removed from NetworkController, refresh
|
|
@@ -1090,13 +1064,20 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
|
|
|
1090
1064
|
// enabled in NetworkEnablementController.
|
|
1091
1065
|
this.messenger.subscribe('NetworkController:networkAdded', (networkConfiguration) => {
|
|
1092
1066
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleNetworkAdded).call(this, networkConfiguration.chainId);
|
|
1093
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m",
|
|
1067
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_refreshAssetsAfterNetworkAdded).call(this, networkConfiguration.chainId).catch((error) => {
|
|
1068
|
+
log('Failed to refresh assets after network added', { error });
|
|
1069
|
+
});
|
|
1094
1070
|
});
|
|
1095
1071
|
this.messenger.subscribe('NetworkController:networkRemoved', () => {
|
|
1096
1072
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_refreshAssetsAfterNetworkChange).call(this);
|
|
1097
1073
|
});
|
|
1074
|
+
// Selected EVM network switch (network picker). Enablement changes are
|
|
1075
|
+
// handled separately via NetworkEnablementController:stateChanged.
|
|
1076
|
+
this.messenger.subscribe('NetworkController:networkDidChange', (networkState) => {
|
|
1077
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleNetworkDidChange).call(this, networkState).catch(console.error);
|
|
1078
|
+
});
|
|
1098
1079
|
// Client + Keyring lifecycle: only run when UI is open AND keyring is unlocked
|
|
1099
|
-
this.messenger.subscribe('ClientController:
|
|
1080
|
+
this.messenger.subscribe('ClientController:stateChanged', (isUiOpen) => {
|
|
1100
1081
|
__classPrivateFieldSet(this, _AssetsController_uiOpen, isUiOpen, "f");
|
|
1101
1082
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
|
|
1102
1083
|
}, client_controller_1.clientControllerSelectors.selectIsUiOpen);
|
|
@@ -1113,6 +1094,18 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
|
|
|
1113
1094
|
this.messenger.subscribe('TransactionController:unapprovedTransactionAdded', (transactionMeta) => {
|
|
1114
1095
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_onUnapprovedTransactionAdded).call(this, transactionMeta);
|
|
1115
1096
|
});
|
|
1097
|
+
// Post-tx refresh via the full fetch pipeline (Accounts API + RPC fallback).
|
|
1098
|
+
// RpcDataSource also listens for transactionConfirmed, but only refreshes
|
|
1099
|
+
// chains it owns via an active subscription.
|
|
1100
|
+
this.messenger.subscribe('TransactionController:transactionConfirmed', (transactionMeta) => {
|
|
1101
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_onTransactionConfirmed).call(this, transactionMeta);
|
|
1102
|
+
});
|
|
1103
|
+
// Real-time post-tx balances from AccountActivityService (same WS payload as
|
|
1104
|
+
// TokenBalancesController; BackendWebsocketDataSource may not receive the
|
|
1105
|
+
// callback when AccountActivityService owns the server subscription).
|
|
1106
|
+
this.messenger.subscribe('AccountActivityService:balanceUpdated', (event) => {
|
|
1107
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_onAccountActivityBalanceUpdated).call(this, event);
|
|
1108
|
+
});
|
|
1116
1109
|
}, _AssetsController_onUnapprovedTransactionAdded = function _AssetsController_onUnapprovedTransactionAdded(transactionMeta) {
|
|
1117
1110
|
const hexChainId = transactionMeta.chainId;
|
|
1118
1111
|
if (!hexChainId) {
|
|
@@ -1135,6 +1128,46 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
|
|
|
1135
1128
|
error,
|
|
1136
1129
|
});
|
|
1137
1130
|
});
|
|
1131
|
+
}, _AssetsController_onTransactionConfirmed = function _AssetsController_onTransactionConfirmed(transactionMeta) {
|
|
1132
|
+
const hexChainId = transactionMeta.chainId;
|
|
1133
|
+
if (!hexChainId) {
|
|
1134
|
+
return;
|
|
1135
|
+
}
|
|
1136
|
+
const caipChainId = `eip155:${parseInt(hexChainId, 16)}`;
|
|
1137
|
+
const fromAddress = transactionMeta.txParams.from?.toLowerCase();
|
|
1138
|
+
if (!fromAddress) {
|
|
1139
|
+
return;
|
|
1140
|
+
}
|
|
1141
|
+
const matchedAccount = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).find((account) => account.address.toLowerCase() === fromAddress);
|
|
1142
|
+
if (!matchedAccount) {
|
|
1143
|
+
return;
|
|
1144
|
+
}
|
|
1145
|
+
this.getAssets([matchedAccount], {
|
|
1146
|
+
chainIds: [caipChainId],
|
|
1147
|
+
forceUpdate: true,
|
|
1148
|
+
}).catch((error) => {
|
|
1149
|
+
log('Failed to refresh assets after transaction confirmed', { error });
|
|
1150
|
+
});
|
|
1151
|
+
}, _AssetsController_onAccountActivityBalanceUpdated = function _AssetsController_onAccountActivityBalanceUpdated({ address, chain, updates, }) {
|
|
1152
|
+
const account = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).find((a) => a.address.startsWith('0x')
|
|
1153
|
+
? a.address.toLowerCase() === address.toLowerCase()
|
|
1154
|
+
: a.address === address);
|
|
1155
|
+
if (!account) {
|
|
1156
|
+
return;
|
|
1157
|
+
}
|
|
1158
|
+
const chainId = chain;
|
|
1159
|
+
const response = (0, processAccountActivityBalanceUpdates_1.processAccountActivityBalanceUpdates)(updates, account.id, (assetId) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetType).call(this, assetId));
|
|
1160
|
+
if (!response.assetsBalance) {
|
|
1161
|
+
return;
|
|
1162
|
+
}
|
|
1163
|
+
const request = {
|
|
1164
|
+
accountsWithSupportedChains: [{ account, supportedChains: [chainId] }],
|
|
1165
|
+
chainIds: [chainId],
|
|
1166
|
+
dataTypes: ['balance', 'metadata'],
|
|
1167
|
+
};
|
|
1168
|
+
this.handleAssetsUpdate(response, 'AccountActivityService', request).catch((error) => {
|
|
1169
|
+
log('Failed to apply AccountActivityService balance update', { error });
|
|
1170
|
+
});
|
|
1138
1171
|
}, _AssetsController_updateActive = function _AssetsController_updateActive() {
|
|
1139
1172
|
const shouldRun = __classPrivateFieldGet(this, _AssetsController_uiOpen, "f") && __classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f");
|
|
1140
1173
|
if (shouldRun) {
|
|
@@ -1303,6 +1336,41 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1303
1336
|
});
|
|
1304
1337
|
}
|
|
1305
1338
|
return { response: result.response, durationByDataSource };
|
|
1339
|
+
}, _AssetsController_fetchMissingPricesWithoutCache = function _AssetsController_fetchMissingPricesWithoutCache(accounts, chainIds) {
|
|
1340
|
+
if (!__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this) || accounts.length === 0) {
|
|
1341
|
+
return;
|
|
1342
|
+
}
|
|
1343
|
+
const accountIds = new Set(accounts.map((account) => account.id));
|
|
1344
|
+
const chainFilter = new Set(chainIds);
|
|
1345
|
+
const assetsForPriceUpdate = [];
|
|
1346
|
+
const prices = this.state.assetsPrice;
|
|
1347
|
+
for (const [accountId, accountBalances] of Object.entries(this.state.assetsBalance)) {
|
|
1348
|
+
if (!accountIds.has(accountId)) {
|
|
1349
|
+
continue;
|
|
1350
|
+
}
|
|
1351
|
+
for (const assetId of Object.keys(accountBalances)) {
|
|
1352
|
+
if (!chainFilter.has(assetId.split('/')[0])) {
|
|
1353
|
+
continue;
|
|
1354
|
+
}
|
|
1355
|
+
const normalizedAssetId = (0, utils_2.normalizeAssetId)(assetId);
|
|
1356
|
+
if (prices[normalizedAssetId] ?? prices[assetId]) {
|
|
1357
|
+
continue;
|
|
1358
|
+
}
|
|
1359
|
+
assetsForPriceUpdate.push(normalizedAssetId);
|
|
1360
|
+
}
|
|
1361
|
+
}
|
|
1362
|
+
if (assetsForPriceUpdate.length === 0) {
|
|
1363
|
+
return;
|
|
1364
|
+
}
|
|
1365
|
+
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f").invalidatePriceCache();
|
|
1366
|
+
this.getAssets(accounts, {
|
|
1367
|
+
forceUpdate: true,
|
|
1368
|
+
dataTypes: ['price'],
|
|
1369
|
+
chainIds,
|
|
1370
|
+
assetsForPriceUpdate,
|
|
1371
|
+
}).catch((error) => {
|
|
1372
|
+
log('Failed to fetch missing prices', { error });
|
|
1373
|
+
});
|
|
1306
1374
|
}, _AssetsController_getNativeAssetMap = function _AssetsController_getNativeAssetMap() {
|
|
1307
1375
|
return (__classPrivateFieldGet(this, _AssetsController_queryApiClient, "f").getCachedData(NATIVE_ASSETS_QUERY_KEY) ?? {});
|
|
1308
1376
|
}, _AssetsController_isNativeAsset = function _AssetsController_isNativeAsset(assetId) {
|
|
@@ -1344,6 +1412,17 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1344
1412
|
return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_resolveNativeAssetIds).call(this, __classPrivateFieldGet(this, _AssetsController_enabledChains, "f"));
|
|
1345
1413
|
}, _AssetsController_getNativeAssetIdsForAccount = function _AssetsController_getNativeAssetIdsForAccount(account) {
|
|
1346
1414
|
return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_resolveNativeAssetIds).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getEnabledChainsForAccount).call(this, account));
|
|
1415
|
+
}, _AssetsController_getSlowPipelineChainIds = function _AssetsController_getSlowPipelineChainIds(chainIds, fastResponse) {
|
|
1416
|
+
const accountsApiChains = new Set(__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f").getActiveChainsSync());
|
|
1417
|
+
return chainIds.filter((chainId) => {
|
|
1418
|
+
if (fastResponse.errors?.[chainId]) {
|
|
1419
|
+
return true;
|
|
1420
|
+
}
|
|
1421
|
+
if (!accountsApiChains.has(chainId)) {
|
|
1422
|
+
return true;
|
|
1423
|
+
}
|
|
1424
|
+
return false;
|
|
1425
|
+
});
|
|
1347
1426
|
}, _AssetsController_ensureNativeBalancesDefaultZero = function _AssetsController_ensureNativeBalancesDefaultZero() {
|
|
1348
1427
|
const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
|
|
1349
1428
|
if (accounts.length === 0) {
|
|
@@ -1361,7 +1440,7 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1361
1440
|
balances[accountId] = {};
|
|
1362
1441
|
}
|
|
1363
1442
|
for (const nativeAssetId of nativeAssetIds) {
|
|
1364
|
-
if (!(
|
|
1443
|
+
if (!Object.prototype.hasOwnProperty.call(balances[accountId], nativeAssetId)) {
|
|
1365
1444
|
balances[accountId][nativeAssetId] = { amount: '0' };
|
|
1366
1445
|
}
|
|
1367
1446
|
}
|
|
@@ -1411,37 +1490,9 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1411
1490
|
}
|
|
1412
1491
|
}
|
|
1413
1492
|
});
|
|
1414
|
-
}, _AssetsController_filterBalancesRespectingWsFreshness = function _AssetsController_filterBalancesRespectingWsFreshness(accountId, accountBalances, sourceId) {
|
|
1415
|
-
if (!sourceId || !POLLING_BALANCE_SOURCES.has(sourceId)) {
|
|
1416
|
-
return accountBalances;
|
|
1417
|
-
}
|
|
1418
|
-
const now = Date.now();
|
|
1419
|
-
const filtered = {};
|
|
1420
|
-
for (const [assetId, balance] of Object.entries(accountBalances)) {
|
|
1421
|
-
const freshUntil = __classPrivateFieldGet(this, _AssetsController_wsBalanceFreshUntil, "f").get(`${accountId}:${assetId}`);
|
|
1422
|
-
if (freshUntil !== undefined && now < freshUntil) {
|
|
1423
|
-
continue;
|
|
1424
|
-
}
|
|
1425
|
-
filtered[assetId] = balance;
|
|
1426
|
-
}
|
|
1427
|
-
return filtered;
|
|
1428
|
-
}, _AssetsController_markWsBalancesFresh = function _AssetsController_markWsBalancesFresh(assetsBalance) {
|
|
1429
|
-
const freshUntil = Date.now() + WS_BALANCE_FRESHNESS_MS;
|
|
1430
|
-
for (const [accountId, balances] of Object.entries(assetsBalance)) {
|
|
1431
|
-
for (const assetId of Object.keys(balances)) {
|
|
1432
|
-
__classPrivateFieldGet(this, _AssetsController_wsBalanceFreshUntil, "f").set(`${accountId}:${assetId}`, freshUntil);
|
|
1433
|
-
}
|
|
1434
|
-
}
|
|
1435
|
-
}, _AssetsController_clearWsBalanceFreshness = function _AssetsController_clearWsBalanceFreshness(assetsBalance) {
|
|
1436
|
-
for (const [accountId, balances] of Object.entries(assetsBalance)) {
|
|
1437
|
-
for (const assetId of Object.keys(balances)) {
|
|
1438
|
-
__classPrivateFieldGet(this, _AssetsController_wsBalanceFreshUntil, "f").delete(`${accountId}:${assetId}`);
|
|
1439
|
-
}
|
|
1440
|
-
}
|
|
1441
1493
|
}, _AssetsController_updateState = async function _AssetsController_updateState(response) {
|
|
1442
1494
|
const normalizedResponse = normalizeResponse(response);
|
|
1443
1495
|
const mode = normalizedResponse.updateMode ?? 'merge';
|
|
1444
|
-
const assetsBalanceToApply = normalizedResponse.assetsBalance;
|
|
1445
1496
|
const releaseLock = await __classPrivateFieldGet(this, _AssetsController_controllerMutex, "f").acquire();
|
|
1446
1497
|
try {
|
|
1447
1498
|
const previousState = this.state;
|
|
@@ -1502,9 +1553,8 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1502
1553
|
}
|
|
1503
1554
|
}
|
|
1504
1555
|
}
|
|
1505
|
-
if (
|
|
1506
|
-
for (const [accountId, accountBalances] of Object.entries(
|
|
1507
|
-
const filteredAccountBalances = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_filterBalancesRespectingWsFreshness).call(this, accountId, accountBalances, normalizedResponse.sourceId);
|
|
1556
|
+
if (normalizedResponse.assetsBalance) {
|
|
1557
|
+
for (const [accountId, accountBalances] of Object.entries(normalizedResponse.assetsBalance)) {
|
|
1508
1558
|
const previousBalances = previousState.assetsBalance[accountId] ?? {};
|
|
1509
1559
|
const customAssetIds = state.customAssets[accountId] ?? [];
|
|
1510
1560
|
// Full: response is authoritative for the chains it covered;
|
|
@@ -1513,10 +1563,10 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1513
1563
|
// are never inadvertently reset to zero.
|
|
1514
1564
|
// Merge: response overlays previous balances.
|
|
1515
1565
|
const effective = mode === 'merge'
|
|
1516
|
-
? { ...previousBalances, ...
|
|
1566
|
+
? { ...previousBalances, ...accountBalances }
|
|
1517
1567
|
: (() => {
|
|
1518
1568
|
// Determine which chain namespaces this response covers.
|
|
1519
|
-
const coveredChains = new Set(Object.keys(
|
|
1569
|
+
const coveredChains = new Set(Object.keys(accountBalances).map((assetId) => assetId.split('/')[0]));
|
|
1520
1570
|
// Start from previous balances, dropping only entries for
|
|
1521
1571
|
// chains this response is authoritative over.
|
|
1522
1572
|
const next = {};
|
|
@@ -1526,10 +1576,10 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1526
1576
|
}
|
|
1527
1577
|
}
|
|
1528
1578
|
// Apply the response (authoritative for covered chains).
|
|
1529
|
-
Object.assign(next,
|
|
1579
|
+
Object.assign(next, accountBalances);
|
|
1530
1580
|
// Preserve custom assets that the response omitted.
|
|
1531
1581
|
for (const customId of customAssetIds) {
|
|
1532
|
-
if (!(customId
|
|
1582
|
+
if (!Object.prototype.hasOwnProperty.call(next, customId)) {
|
|
1533
1583
|
const prev = previousBalances[customId];
|
|
1534
1584
|
next[customId] =
|
|
1535
1585
|
prev ?? { amount: '0' };
|
|
@@ -1543,7 +1593,7 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1543
1593
|
? __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getNativeAssetIdsForAccount).call(this, account)
|
|
1544
1594
|
: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getNativeAssetIdsForEnabledChains).call(this);
|
|
1545
1595
|
for (const nativeAssetId of nativeAssetIdsForAccount) {
|
|
1546
|
-
if (!(nativeAssetId
|
|
1596
|
+
if (!Object.prototype.hasOwnProperty.call(effective, nativeAssetId)) {
|
|
1547
1597
|
effective[nativeAssetId] = { amount: '0' };
|
|
1548
1598
|
}
|
|
1549
1599
|
}
|
|
@@ -1575,7 +1625,6 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1575
1625
|
balances[accountId] = effective;
|
|
1576
1626
|
}
|
|
1577
1627
|
}
|
|
1578
|
-
// Update prices in state
|
|
1579
1628
|
if (normalizedResponse.assetsPrice) {
|
|
1580
1629
|
for (const [key, value] of Object.entries(normalizedResponse.assetsPrice)) {
|
|
1581
1630
|
prices[key] = value;
|
|
@@ -1638,12 +1687,6 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1638
1687
|
});
|
|
1639
1688
|
}
|
|
1640
1689
|
}
|
|
1641
|
-
// Authoritative fetch on account switch — drop WS freshness locks so API
|
|
1642
|
-
// balances (e.g. receiver +1 USDC) replace stale values from a prior send.
|
|
1643
|
-
if (normalizedResponse.sourceId === 'getAssets:forceUpdate' &&
|
|
1644
|
-
assetsBalanceToApply) {
|
|
1645
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_clearWsBalanceFreshness).call(this, assetsBalanceToApply);
|
|
1646
|
-
}
|
|
1647
1690
|
}
|
|
1648
1691
|
finally {
|
|
1649
1692
|
releaseLock();
|
|
@@ -1827,7 +1870,13 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1827
1870
|
const seenIds = new Set();
|
|
1828
1871
|
const accountsForSource = assignedChains
|
|
1829
1872
|
.flatMap((chainId) => chainToAccounts.get(chainId) ?? [])
|
|
1830
|
-
.filter((account) =>
|
|
1873
|
+
.filter((account) => {
|
|
1874
|
+
if (seenIds.has(account.id)) {
|
|
1875
|
+
return false;
|
|
1876
|
+
}
|
|
1877
|
+
seenIds.add(account.id);
|
|
1878
|
+
return true;
|
|
1879
|
+
});
|
|
1831
1880
|
if (accountsForSource.length > 0) {
|
|
1832
1881
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeDataSource).call(this, source, accountsForSource, assignedChains);
|
|
1833
1882
|
}
|
|
@@ -2089,11 +2138,102 @@ async function _AssetsController_handleAccountGroupChanged() {
|
|
|
2089
2138
|
caipChainId,
|
|
2090
2139
|
});
|
|
2091
2140
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureDefaultTrackedAssetsSeeded).call(this, [caipChainId]);
|
|
2141
|
+
}, _AssetsController_refreshActiveChainsOnNetworkSwitch =
|
|
2142
|
+
/**
|
|
2143
|
+
* Refresh data-source `activeChains` after an EVM network switch so API/WS/Rpc
|
|
2144
|
+
* chain claiming is not stuck on an empty or stale init-time list.
|
|
2145
|
+
*/
|
|
2146
|
+
async function _AssetsController_refreshActiveChainsOnNetworkSwitch() {
|
|
2147
|
+
await Promise.all([
|
|
2148
|
+
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f").refreshActiveChains(),
|
|
2149
|
+
__classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f").refreshActiveChains(),
|
|
2150
|
+
]);
|
|
2151
|
+
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f").refreshActiveChainsFromNetworkState();
|
|
2152
|
+
}, _AssetsController_getSelectedEvmChainIdFromNetworkState = function _AssetsController_getSelectedEvmChainIdFromNetworkState(networkState) {
|
|
2153
|
+
try {
|
|
2154
|
+
const networkClient = this.messenger.call('NetworkController:getNetworkClientById', networkState.selectedNetworkClientId);
|
|
2155
|
+
const hexChainId = networkClient.configuration?.chainId;
|
|
2156
|
+
if (!hexChainId) {
|
|
2157
|
+
return undefined;
|
|
2158
|
+
}
|
|
2159
|
+
return `eip155:${parseInt(hexChainId, 16)}`;
|
|
2160
|
+
}
|
|
2161
|
+
catch {
|
|
2162
|
+
return undefined;
|
|
2163
|
+
}
|
|
2164
|
+
}, _AssetsController_handleNetworkDidChange =
|
|
2165
|
+
/**
|
|
2166
|
+
* Refresh subscriptions and fetch balances when the user switches the
|
|
2167
|
+
* selected EVM network in the UI (`NetworkController:networkDidChange`).
|
|
2168
|
+
*
|
|
2169
|
+
* @param networkState - NetworkController state after the switch.
|
|
2170
|
+
*/
|
|
2171
|
+
async function _AssetsController_handleNetworkDidChange(networkState) {
|
|
2172
|
+
if (!__classPrivateFieldGet(this, _AssetsController_uiOpen, "f") || !__classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f") || !__classPrivateFieldGet(this, _AssetsController_isEnabled, "f").call(this)) {
|
|
2173
|
+
return;
|
|
2174
|
+
}
|
|
2175
|
+
const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
|
|
2176
|
+
if (accounts.length === 0) {
|
|
2177
|
+
return;
|
|
2178
|
+
}
|
|
2179
|
+
const selectedChainId = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedEvmChainIdFromNetworkState).call(this, networkState);
|
|
2180
|
+
if (!selectedChainId) {
|
|
2181
|
+
return;
|
|
2182
|
+
}
|
|
2183
|
+
log('Selected EVM network switched', {
|
|
2184
|
+
selectedNetworkClientId: networkState.selectedNetworkClientId,
|
|
2185
|
+
selectedChainId,
|
|
2186
|
+
});
|
|
2187
|
+
const releaseLock = await __classPrivateFieldGet(this, _AssetsController_accountRefreshMutex, "f").acquire();
|
|
2188
|
+
try {
|
|
2189
|
+
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_refreshActiveChainsOnNetworkSwitch).call(this);
|
|
2190
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
2191
|
+
await this.getAssets(accounts, {
|
|
2192
|
+
chainIds: [selectedChainId],
|
|
2193
|
+
forceUpdate: true,
|
|
2194
|
+
dataTypes: ['balance', 'metadata', 'price'],
|
|
2195
|
+
});
|
|
2196
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
|
|
2197
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_fetchMissingPricesWithoutCache).call(this, accounts, [selectedChainId]);
|
|
2198
|
+
}
|
|
2199
|
+
finally {
|
|
2200
|
+
releaseLock();
|
|
2201
|
+
}
|
|
2092
2202
|
}, _AssetsController_refreshAssetsAfterNetworkChange = function _AssetsController_refreshAssetsAfterNetworkChange() {
|
|
2093
|
-
|
|
2203
|
+
const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
|
|
2204
|
+
if (accounts.length === 0) {
|
|
2205
|
+
return;
|
|
2206
|
+
}
|
|
2207
|
+
this.getAssets(accounts, {
|
|
2094
2208
|
forceUpdate: true,
|
|
2209
|
+
dataTypes: ['balance', 'metadata'],
|
|
2095
2210
|
}).catch((error) => {
|
|
2096
2211
|
log('Failed to refresh assets after network change', { error });
|
|
2097
2212
|
});
|
|
2213
|
+
}, _AssetsController_refreshAssetsAfterNetworkAdded =
|
|
2214
|
+
/**
|
|
2215
|
+
* Refresh balances and fetch missing prices after a network is added.
|
|
2216
|
+
*
|
|
2217
|
+
* @param hexChainId - Hex chain id of the newly-added network.
|
|
2218
|
+
*/
|
|
2219
|
+
async function _AssetsController_refreshAssetsAfterNetworkAdded(hexChainId) {
|
|
2220
|
+
const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
|
|
2221
|
+
if (accounts.length === 0) {
|
|
2222
|
+
return;
|
|
2223
|
+
}
|
|
2224
|
+
let caipChainId;
|
|
2225
|
+
try {
|
|
2226
|
+
caipChainId = `eip155:${parseInt(hexChainId, 16)}`;
|
|
2227
|
+
}
|
|
2228
|
+
catch {
|
|
2229
|
+
return;
|
|
2230
|
+
}
|
|
2231
|
+
await this.getAssets(accounts, {
|
|
2232
|
+
chainIds: [caipChainId],
|
|
2233
|
+
forceUpdate: true,
|
|
2234
|
+
dataTypes: ['balance', 'metadata', 'price'],
|
|
2235
|
+
});
|
|
2236
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
|
|
2237
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_fetchMissingPricesWithoutCache).call(this, accounts, [caipChainId]);
|
|
2098
2238
|
};
|
|
2099
2239
|
//# sourceMappingURL=AssetsController.cjs.map
|