@metamask-previews/assets-controller 9.1.0-preview-bdb5ec714 → 9.1.0-preview-12040e2d0
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 +5 -2
- package/dist/AssetsController.cjs +19 -85
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +1 -1
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +1 -1
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +19 -85
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.cjs +1 -1
- package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.mjs +1 -1
- package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.cjs +21 -16
- package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.d.cts.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.d.mts.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.mjs +21 -16
- package/dist/data-sources/BackendWebsocketDataSource.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/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 +5 -9
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +5 -9
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -13,9 +13,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
13
13
|
|
|
14
14
|
### Fixed
|
|
15
15
|
|
|
16
|
-
- Fix stale token balances after transactions when switching accounts or when websocket subscriptions reconnect; `AssetsController` now fetches before re-subscribing on account switch
|
|
16
|
+
- 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
17
|
- `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
|
|
18
|
+
- `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))
|
|
19
|
+
- 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))
|
|
20
|
+
- 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))
|
|
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))
|
|
19
22
|
|
|
20
23
|
## [9.1.0]
|
|
21
24
|
|
|
@@ -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_updateActive, _AssetsController_handleAccountTreeStateChange, _AssetsController_runAccountTreeRefresh, _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;
|
|
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");
|
|
@@ -62,15 +62,6 @@ const MESSENGER_EXPOSED_METHODS = [
|
|
|
62
62
|
];
|
|
63
63
|
/** Default polling interval hint for data sources (30 seconds) */
|
|
64
64
|
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
65
|
// ============================================================================
|
|
75
66
|
// TRACE NAMES — used in Sentry spans (search these strings in Discover)
|
|
76
67
|
// ============================================================================
|
|
@@ -201,9 +192,6 @@ function normalizeResponse(response) {
|
|
|
201
192
|
if (response.updateMode) {
|
|
202
193
|
normalized.updateMode = response.updateMode;
|
|
203
194
|
}
|
|
204
|
-
if (response.sourceId) {
|
|
205
|
-
normalized.sourceId = response.sourceId;
|
|
206
|
-
}
|
|
207
195
|
return normalized;
|
|
208
196
|
}
|
|
209
197
|
// ============================================================================
|
|
@@ -284,11 +272,6 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
284
272
|
* re-subscriptions when the account set hasn't actually changed.
|
|
285
273
|
*/
|
|
286
274
|
_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
275
|
_AssetsController_backendWebsocketDataSource.set(this, void 0);
|
|
293
276
|
_AssetsController_accountsApiDataSource.set(this, void 0);
|
|
294
277
|
_AssetsController_snapDataSource.set(this, void 0);
|
|
@@ -437,9 +420,9 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
437
420
|
// creation, RPC is slow on many chains). Results are committed to state
|
|
438
421
|
// immediately so the UI can display balances without waiting for them.
|
|
439
422
|
//
|
|
440
|
-
//
|
|
441
|
-
//
|
|
442
|
-
//
|
|
423
|
+
// Fast/slow pipelines use 'update' so partial API snapshots cannot wipe
|
|
424
|
+
// tokens missing from the response (e.g. USDC when only native balance
|
|
425
|
+
// is returned). Balances present in the response are still refreshed.
|
|
443
426
|
const fastSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
444
427
|
? [
|
|
445
428
|
(0, ParallelMiddleware_1.createParallelBalanceMiddleware)([
|
|
@@ -459,14 +442,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
459
442
|
]
|
|
460
443
|
: [__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f")];
|
|
461
444
|
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
|
-
});
|
|
445
|
+
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...response, updateMode: 'update' });
|
|
470
446
|
// Background pipeline: snap and RPC run in parallel after the fast path
|
|
471
447
|
// commits to state. Their balances are merged together before detection.
|
|
472
448
|
// Token + price enrichment matches the pre-split behavior: only when basic
|
|
@@ -486,11 +462,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
486
462
|
]
|
|
487
463
|
: []),
|
|
488
464
|
], request)
|
|
489
|
-
.then(({ response: slowResponse }) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, {
|
|
490
|
-
...slowResponse,
|
|
491
|
-
updateMode: 'merge',
|
|
492
|
-
sourceId: 'getAssets:forceUpdate',
|
|
493
|
-
}))
|
|
465
|
+
.then(({ response: slowResponse }) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...slowResponse, updateMode: 'update' }))
|
|
494
466
|
.catch((error) => log('Background pipeline failed', { error }));
|
|
495
467
|
const durationMs = performance.now() - startTime;
|
|
496
468
|
// Emit trace for every full fetch (Assets Health dashboard)
|
|
@@ -897,11 +869,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
897
869
|
]));
|
|
898
870
|
}
|
|
899
871
|
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
|
-
}
|
|
872
|
+
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, enrichedResponse);
|
|
905
873
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_emitTrace).call(this, TRACE_UPDATE_PIPELINE, {
|
|
906
874
|
source: sourceId,
|
|
907
875
|
duration_ms: performance.now() - updateStart,
|
|
@@ -949,7 +917,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
949
917
|
}
|
|
950
918
|
}
|
|
951
919
|
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(),
|
|
920
|
+
_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
921
|
controller: 'AssetsController',
|
|
954
922
|
}) {
|
|
955
923
|
if (!__classPrivateFieldGet(this, _AssetsController_trace, "f")) {
|
|
@@ -1411,37 +1379,9 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1411
1379
|
}
|
|
1412
1380
|
}
|
|
1413
1381
|
});
|
|
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
1382
|
}, _AssetsController_updateState = async function _AssetsController_updateState(response) {
|
|
1442
1383
|
const normalizedResponse = normalizeResponse(response);
|
|
1443
1384
|
const mode = normalizedResponse.updateMode ?? 'merge';
|
|
1444
|
-
const assetsBalanceToApply = normalizedResponse.assetsBalance;
|
|
1445
1385
|
const releaseLock = await __classPrivateFieldGet(this, _AssetsController_controllerMutex, "f").acquire();
|
|
1446
1386
|
try {
|
|
1447
1387
|
const previousState = this.state;
|
|
@@ -1456,7 +1396,7 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1456
1396
|
const metadata = state.assetsInfo;
|
|
1457
1397
|
const balances = state.assetsBalance;
|
|
1458
1398
|
const prices = state.assetsPrice;
|
|
1459
|
-
if (normalizedResponse.assetsInfo) {
|
|
1399
|
+
if (normalizedResponse.assetsInfo && mode !== 'update') {
|
|
1460
1400
|
for (const [key, value] of Object.entries(normalizedResponse.assetsInfo)) {
|
|
1461
1401
|
if (!(0, lodash_1.isEqual)(previousState.assetsInfo[key], value)) {
|
|
1462
1402
|
changedMetadata.push(key);
|
|
@@ -1502,21 +1442,21 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1502
1442
|
}
|
|
1503
1443
|
}
|
|
1504
1444
|
}
|
|
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);
|
|
1445
|
+
if (normalizedResponse.assetsBalance) {
|
|
1446
|
+
for (const [accountId, accountBalances] of Object.entries(normalizedResponse.assetsBalance)) {
|
|
1508
1447
|
const previousBalances = previousState.assetsBalance[accountId] ?? {};
|
|
1509
1448
|
const customAssetIds = state.customAssets[accountId] ?? [];
|
|
1510
1449
|
// Full: response is authoritative for the chains it covered;
|
|
1511
1450
|
// balances for chains not in the response are preserved from
|
|
1512
1451
|
// previous state so unsupported chains (e.g. Ink on AccountsAPI)
|
|
1513
1452
|
// are never inadvertently reset to zero.
|
|
1514
|
-
// Merge: response overlays previous balances
|
|
1515
|
-
|
|
1516
|
-
|
|
1453
|
+
// Merge / update: response overlays previous balances (update never
|
|
1454
|
+
// removes tokens missing from a partial snapshot).
|
|
1455
|
+
const effective = mode === 'merge' || mode === 'update'
|
|
1456
|
+
? { ...previousBalances, ...accountBalances }
|
|
1517
1457
|
: (() => {
|
|
1518
1458
|
// Determine which chain namespaces this response covers.
|
|
1519
|
-
const coveredChains = new Set(Object.keys(
|
|
1459
|
+
const coveredChains = new Set(Object.keys(accountBalances).map((assetId) => assetId.split('/')[0]));
|
|
1520
1460
|
// Start from previous balances, dropping only entries for
|
|
1521
1461
|
// chains this response is authoritative over.
|
|
1522
1462
|
const next = {};
|
|
@@ -1526,7 +1466,7 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1526
1466
|
}
|
|
1527
1467
|
}
|
|
1528
1468
|
// Apply the response (authoritative for covered chains).
|
|
1529
|
-
Object.assign(next,
|
|
1469
|
+
Object.assign(next, accountBalances);
|
|
1530
1470
|
// Preserve custom assets that the response omitted.
|
|
1531
1471
|
for (const customId of customAssetIds) {
|
|
1532
1472
|
if (!(customId in next)) {
|
|
@@ -1575,8 +1515,8 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1575
1515
|
balances[accountId] = effective;
|
|
1576
1516
|
}
|
|
1577
1517
|
}
|
|
1578
|
-
// Update prices in state
|
|
1579
|
-
if (normalizedResponse.assetsPrice) {
|
|
1518
|
+
// Update prices in state (skipped for balance-only update mode)
|
|
1519
|
+
if (normalizedResponse.assetsPrice && mode !== 'update') {
|
|
1580
1520
|
for (const [key, value] of Object.entries(normalizedResponse.assetsPrice)) {
|
|
1581
1521
|
prices[key] = value;
|
|
1582
1522
|
}
|
|
@@ -1638,12 +1578,6 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1638
1578
|
});
|
|
1639
1579
|
}
|
|
1640
1580
|
}
|
|
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
1581
|
}
|
|
1648
1582
|
finally {
|
|
1649
1583
|
releaseLock();
|