@metamask-previews/assets-controller 9.1.0-preview-773e4e83d → 9.1.0-preview-1ec310ea7
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 +0 -6
- package/dist/AssetsController.cjs +25 -113
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +25 -113
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.cjs +1 -4
- 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 +1 -4
- package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.cjs +103 -214
- package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.d.cts +0 -7
- package/dist/data-sources/BackendWebsocketDataSource.d.cts.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.d.mts +0 -7
- package/dist/data-sources/BackendWebsocketDataSource.d.mts.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.mjs +103 -214
- package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +0 -7
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +0 -7
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -11,12 +11,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
11
11
|
|
|
12
12
|
- Bump `@metamask/transaction-controller` from `^68.1.1` to `^68.2.0` ([#9253](https://github.com/MetaMask/core/pull/9253))
|
|
13
13
|
|
|
14
|
-
### Fixed
|
|
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, serializes overlapping refresh work, treats `getAssets({ forceUpdate: true })` as authoritative over recent websocket freshness guards, and prevents passive polling from overwriting websocket balances for 120 seconds ([#9265](https://github.com/MetaMask/core/pull/9265))
|
|
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 optional channel callbacks for more reliable notification delivery ([#9265](https://github.com/MetaMask/core/pull/9265))
|
|
19
|
-
|
|
20
14
|
## [9.1.0]
|
|
21
15
|
|
|
22
16
|
### 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,
|
|
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;
|
|
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
|
// ============================================================================
|
|
@@ -267,8 +255,6 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
267
255
|
/** Whether the keyring is unlocked. Combined with #uiOpen for #updateActive. */
|
|
268
256
|
_AssetsController_keyringUnlocked.set(this, false);
|
|
269
257
|
_AssetsController_controllerMutex.set(this, new async_mutex_1.Mutex());
|
|
270
|
-
/** Serializes account-switch fetch + subscribe to prevent overlapping races. */
|
|
271
|
-
_AssetsController_accountRefreshMutex.set(this, new async_mutex_1.Mutex());
|
|
272
258
|
/**
|
|
273
259
|
* Active balance subscriptions keyed by account ID.
|
|
274
260
|
* Each account has one logical subscription that may span multiple data sources.
|
|
@@ -284,11 +270,6 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
284
270
|
* re-subscriptions when the account set hasn't actually changed.
|
|
285
271
|
*/
|
|
286
272
|
_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
273
|
_AssetsController_backendWebsocketDataSource.set(this, void 0);
|
|
293
274
|
_AssetsController_accountsApiDataSource.set(this, void 0);
|
|
294
275
|
_AssetsController_snapDataSource.set(this, void 0);
|
|
@@ -462,11 +443,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
462
443
|
// The fast pipeline only contains a subset of data sources (AccountsApi +
|
|
463
444
|
// StakedBalance), so it must always merge to avoid wiping Snap/RPC
|
|
464
445
|
// 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
|
|
@@ -486,11 +463,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
486
463
|
]
|
|
487
464
|
: []),
|
|
488
465
|
], request)
|
|
489
|
-
.then(({ response: slowResponse }) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, {
|
|
490
|
-
...slowResponse,
|
|
491
|
-
updateMode: 'merge',
|
|
492
|
-
sourceId: 'getAssets:forceUpdate',
|
|
493
|
-
}))
|
|
466
|
+
.then(({ response: slowResponse }) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...slowResponse, updateMode: 'merge' }))
|
|
494
467
|
.catch((error) => log('Background pipeline failed', { error }));
|
|
495
468
|
const durationMs = performance.now() - startTime;
|
|
496
469
|
// Emit trace for every full fetch (Assets Health dashboard)
|
|
@@ -897,11 +870,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
897
870
|
]));
|
|
898
871
|
}
|
|
899
872
|
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
|
-
}
|
|
873
|
+
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, enrichedResponse);
|
|
905
874
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_emitTrace).call(this, TRACE_UPDATE_PIPELINE, {
|
|
906
875
|
source: sourceId,
|
|
907
876
|
duration_ms: performance.now() - updateStart,
|
|
@@ -949,7 +918,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
949
918
|
}
|
|
950
919
|
}
|
|
951
920
|
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(),
|
|
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 = {
|
|
953
922
|
controller: 'AssetsController',
|
|
954
923
|
}) {
|
|
955
924
|
if (!__classPrivateFieldGet(this, _AssetsController_trace, "f")) {
|
|
@@ -1156,39 +1125,23 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
|
|
|
1156
1125
|
if (!accountsChanged) {
|
|
1157
1126
|
return;
|
|
1158
1127
|
}
|
|
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
|
-
}
|
|
1163
1128
|
log('Account tree changed with new accounts, re-subscribing', {
|
|
1164
1129
|
previousCount: __classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").size,
|
|
1165
1130
|
currentCount: currentIds.size,
|
|
1166
1131
|
});
|
|
1167
1132
|
__classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, currentIds, "f");
|
|
1133
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
1168
1134
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
|
|
1169
1135
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureDefaultTrackedAssetsSeeded).call(this);
|
|
1170
|
-
|
|
1171
|
-
log('Failed to refresh assets after tree change', error);
|
|
1172
|
-
});
|
|
1173
|
-
}
|
|
1174
|
-
else {
|
|
1175
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_start).call(this);
|
|
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, {
|
|
1136
|
+
this.getAssets(accounts, {
|
|
1181
1137
|
chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
|
|
1182
1138
|
forceUpdate: true,
|
|
1139
|
+
}).catch((error) => {
|
|
1140
|
+
log('Failed to fetch assets after tree change', error);
|
|
1183
1141
|
});
|
|
1184
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
1185
1142
|
}
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
1189
|
-
}
|
|
1190
|
-
finally {
|
|
1191
|
-
releaseLock();
|
|
1143
|
+
else {
|
|
1144
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_start).call(this);
|
|
1192
1145
|
}
|
|
1193
1146
|
}, _AssetsController_registerActionHandlers = function _AssetsController_registerActionHandlers() {
|
|
1194
1147
|
this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
|
|
@@ -1411,37 +1364,9 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1411
1364
|
}
|
|
1412
1365
|
}
|
|
1413
1366
|
});
|
|
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
1367
|
}, _AssetsController_updateState = async function _AssetsController_updateState(response) {
|
|
1442
1368
|
const normalizedResponse = normalizeResponse(response);
|
|
1443
1369
|
const mode = normalizedResponse.updateMode ?? 'merge';
|
|
1444
|
-
const assetsBalanceToApply = normalizedResponse.assetsBalance;
|
|
1445
1370
|
const releaseLock = await __classPrivateFieldGet(this, _AssetsController_controllerMutex, "f").acquire();
|
|
1446
1371
|
try {
|
|
1447
1372
|
const previousState = this.state;
|
|
@@ -1502,9 +1427,8 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1502
1427
|
}
|
|
1503
1428
|
}
|
|
1504
1429
|
}
|
|
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);
|
|
1430
|
+
if (normalizedResponse.assetsBalance) {
|
|
1431
|
+
for (const [accountId, accountBalances] of Object.entries(normalizedResponse.assetsBalance)) {
|
|
1508
1432
|
const previousBalances = previousState.assetsBalance[accountId] ?? {};
|
|
1509
1433
|
const customAssetIds = state.customAssets[accountId] ?? [];
|
|
1510
1434
|
// Full: response is authoritative for the chains it covered;
|
|
@@ -1513,10 +1437,10 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1513
1437
|
// are never inadvertently reset to zero.
|
|
1514
1438
|
// Merge: response overlays previous balances.
|
|
1515
1439
|
const effective = mode === 'merge'
|
|
1516
|
-
? { ...previousBalances, ...
|
|
1440
|
+
? { ...previousBalances, ...accountBalances }
|
|
1517
1441
|
: (() => {
|
|
1518
1442
|
// Determine which chain namespaces this response covers.
|
|
1519
|
-
const coveredChains = new Set(Object.keys(
|
|
1443
|
+
const coveredChains = new Set(Object.keys(accountBalances).map((assetId) => assetId.split('/')[0]));
|
|
1520
1444
|
// Start from previous balances, dropping only entries for
|
|
1521
1445
|
// chains this response is authoritative over.
|
|
1522
1446
|
const next = {};
|
|
@@ -1526,7 +1450,7 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1526
1450
|
}
|
|
1527
1451
|
}
|
|
1528
1452
|
// Apply the response (authoritative for covered chains).
|
|
1529
|
-
Object.assign(next,
|
|
1453
|
+
Object.assign(next, accountBalances);
|
|
1530
1454
|
// Preserve custom assets that the response omitted.
|
|
1531
1455
|
for (const customId of customAssetIds) {
|
|
1532
1456
|
if (!(customId in next)) {
|
|
@@ -1638,12 +1562,6 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
1638
1562
|
});
|
|
1639
1563
|
}
|
|
1640
1564
|
}
|
|
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
1565
|
}
|
|
1648
1566
|
finally {
|
|
1649
1567
|
releaseLock();
|
|
@@ -2014,22 +1932,16 @@ async function _AssetsController_handleAccountGroupChanged() {
|
|
|
2014
1932
|
accountIds: accounts.map((a) => a.id),
|
|
2015
1933
|
});
|
|
2016
1934
|
__classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, new Set(accounts.map((a) => a.id)), "f");
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
}
|
|
2025
|
-
// Subscribe after fetch so WS notifications can recover state
|
|
2026
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
2027
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
|
|
2028
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureDefaultTrackedAssetsSeeded).call(this);
|
|
2029
|
-
}
|
|
2030
|
-
finally {
|
|
2031
|
-
releaseLock();
|
|
1935
|
+
// Subscribe and fetch for the new account group
|
|
1936
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
1937
|
+
if (accounts.length > 0) {
|
|
1938
|
+
await this.getAssets(accounts, {
|
|
1939
|
+
chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
|
|
1940
|
+
forceUpdate: true,
|
|
1941
|
+
});
|
|
2032
1942
|
}
|
|
1943
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
|
|
1944
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureDefaultTrackedAssetsSeeded).call(this);
|
|
2033
1945
|
}, _AssetsController_handleEnabledNetworksChanged = async function _AssetsController_handleEnabledNetworksChanged(enabledNetworkMap) {
|
|
2034
1946
|
const previousChains = __classPrivateFieldGet(this, _AssetsController_enabledChains, "f");
|
|
2035
1947
|
__classPrivateFieldSet(this, _AssetsController_enabledChains, __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_extractEnabledChains).call(this, enabledNetworkMap), "f");
|