@metamask-previews/assets-controller 14.0.3-preview-6b7c25c → 14.0.3-preview-00a181c

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 CHANGED
@@ -9,8 +9,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  ### Changed
11
11
 
12
+ - **BREAKING:** `AssetsControllerMessenger` now requires `AccountTreeController:isInitialized`, `ClientController:getState`, and `KeyringController:isUnlocked` so lifecycle checks read controller state on demand instead of mirroring it from events ([#10059](https://github.com/MetaMask/core/pull/10059))
13
+ - Hosts that restrict which actions flow through the `AssetsController` messenger must delegate these three actions
14
+ - `AccountTreeController:stateChange` is no longer subscribed to; remove it from allowed events if your messenger wiring lists events explicitly
15
+ - Revert to `selectedAccountGroupChange` for account-group switches; snap accounts added mid-session are picked up on restart ([#10059](https://github.com/MetaMask/core/pull/10059))
12
16
  - Bump `@metamask/transaction-controller` from `^69.6.1` to `^69.7.0` ([#10046](https://github.com/MetaMask/core/pull/10046))
13
17
 
18
+ ### Fixed
19
+
20
+ - Fix stale balances surviving in state when the Accounts API returns no entry for an asset it does not index (or reports an untrusted `0`), which the `merge` update kept as the previous amount ([#10061](https://github.com/MetaMask/core/pull/10061))
21
+ - `RpcFallbackMiddleware` now re-reads EVM assets tracked in state (`assetsBalance` or `customAssets`) whose balance is empty in the current response, passing them to `RpcDataSource` as `customAssets`, in addition to its existing retry of chains in `response.errors`. Staking vault assets and assets on chains outside the request or the account's supported set are excluded.
22
+ - Balances from chains the RPC read itself failed on are discarded instead of merged, so a transient RPC failure can no longer overwrite a correct upstream balance with the failure stub's native `0` (or, previously, falsely clear the chain's error as "recovered"). The chain's error is kept only when it was already errored upstream.
23
+ - `RpcDataSource.assetsMiddleware` now propagates per-chain fetch errors onto the pipeline response (previously it only used them internally), which is what lets `RpcFallbackMiddleware` identify the failed chains.
24
+
14
25
  ## [14.0.3]
15
26
 
16
27
  ### Changed
@@ -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_emitStateSizeTrace, _AssetsController_uiOpen, _AssetsController_keyringUnlocked, _AssetsController_accountTreeInitialized, _AssetsController_controllerMutex, _AssetsController_accountRefreshMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_lastKnownAccountIds, _AssetsController_getSelectedAccounts, _AssetsController_accountActivityDataSource, _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_refreshAssetsForTransaction, _AssetsController_runSpamCleanup, _AssetsController_updateActive, _AssetsController_handleAccountTreeStateChange, _AssetsController_runAccountTreeRefresh, _AssetsController_runStartupRefresh, _AssetsController_registerActionHandlers, _AssetsController_handleActiveChainsUpdate, _AssetsController_executeMiddlewares, _AssetsController_assertNonEmptyAccountId, _AssetsController_normalizeAssetIdOrThrow, _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_getAssetFromState, _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;
16
+ var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_trace, _AssetsController_captureException, _AssetsController_firstInitFetchReported, _AssetsController_stateSizeReported, _AssetsController_emitStateSizeTrace, _AssetsController_controllerMutex, _AssetsController_accountRefreshMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_getSelectedAccounts, _AssetsController_isAccountTreeInitialized, _AssetsController_isUiOpen, _AssetsController_isKeyringUnlocked, _AssetsController_accountActivityDataSource, _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_refreshAssetsForTransaction, _AssetsController_runSpamCleanup, _AssetsController_updateActive, _AssetsController_runStartupRefresh, _AssetsController_registerActionHandlers, _AssetsController_handleActiveChainsUpdate, _AssetsController_executeMiddlewares, _AssetsController_assertNonEmptyAccountId, _AssetsController_normalizeAssetIdOrThrow, _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_getAssetFromState, _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");
@@ -305,15 +305,6 @@ class AssetsController extends base_controller_1.BaseController {
305
305
  _AssetsController_firstInitFetchReported.set(this, false);
306
306
  /** Whether we have already reported state size for this session (reset on #stop). */
307
307
  _AssetsController_stateSizeReported.set(this, false);
308
- /** Whether the client (UI) is open. Combined with #keyringUnlocked for #updateActive. */
309
- _AssetsController_uiOpen.set(this, false);
310
- /** Whether the keyring is unlocked. Combined with #uiOpen for #updateActive. */
311
- _AssetsController_keyringUnlocked.set(this, false);
312
- /**
313
- * Whether `AccountTreeController` has finished `init()`. Unlock / UI-open
314
- * alone must not start fetches — the tree can still be mid-build.
315
- */
316
- _AssetsController_accountTreeInitialized.set(this, false);
317
308
  _AssetsController_controllerMutex.set(this, new async_mutex_1.Mutex());
318
309
  /** Serializes account-switch fetch + subscribe to prevent overlapping races. */
319
310
  _AssetsController_accountRefreshMutex.set(this, new async_mutex_1.Mutex());
@@ -326,12 +317,6 @@ class AssetsController extends base_controller_1.BaseController {
326
317
  _AssetsController_activeSubscriptions.set(this, new Map());
327
318
  /** Currently enabled chains from NetworkEnablementController */
328
319
  _AssetsController_enabledChains.set(this, new Set());
329
- /**
330
- * Snapshot of account IDs that were active when the last subscription/fetch
331
- * cycle ran. Used by #handleAccountTreeStateChange to skip redundant
332
- * re-subscriptions when the account set hasn't actually changed.
333
- */
334
- _AssetsController_lastKnownAccountIds.set(this, new Set());
335
320
  _AssetsController_accountActivityDataSource.set(this, void 0);
336
321
  _AssetsController_accountsApiDataSource.set(this, void 0);
337
322
  _AssetsController_snapDataSource.set(this, void 0);
@@ -1185,7 +1170,7 @@ class AssetsController extends base_controller_1.BaseController {
1185
1170
  }
1186
1171
  }
1187
1172
  exports.AssetsController = AssetsController;
1188
- _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_accountTreeInitialized = new WeakMap(), _AssetsController_controllerMutex = new WeakMap(), _AssetsController_accountRefreshMutex = new WeakMap(), _AssetsController_activeSubscriptions = new WeakMap(), _AssetsController_enabledChains = new WeakMap(), _AssetsController_lastKnownAccountIds = new WeakMap(), _AssetsController_accountActivityDataSource = 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_emitStateSizeTrace = function _AssetsController_emitStateSizeTrace() {
1173
+ _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_controllerMutex = new WeakMap(), _AssetsController_accountRefreshMutex = new WeakMap(), _AssetsController_activeSubscriptions = new WeakMap(), _AssetsController_enabledChains = new WeakMap(), _AssetsController_accountActivityDataSource = 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_emitStateSizeTrace = function _AssetsController_emitStateSizeTrace() {
1189
1174
  if (!__classPrivateFieldGet(this, _AssetsController_trace, "f") || __classPrivateFieldGet(this, _AssetsController_stateSizeReported, "f")) {
1190
1175
  return;
1191
1176
  }
@@ -1238,6 +1223,12 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1238
1223
  return [selectedAccount];
1239
1224
  }
1240
1225
  return [];
1226
+ }, _AssetsController_isAccountTreeInitialized = function _AssetsController_isAccountTreeInitialized() {
1227
+ return this.messenger.call('AccountTreeController:isInitialized');
1228
+ }, _AssetsController_isUiOpen = function _AssetsController_isUiOpen() {
1229
+ return client_controller_1.clientControllerSelectors.selectIsUiOpen(this.messenger.call('ClientController:getState'));
1230
+ }, _AssetsController_isKeyringUnlocked = function _AssetsController_isKeyringUnlocked() {
1231
+ return this.messenger.call('KeyringController:isUnlocked');
1241
1232
  }, _AssetsController_allBalanceDataSources_get = function _AssetsController_allBalanceDataSources_get() {
1242
1233
  return [
1243
1234
  __classPrivateFieldGet(this, _AssetsController_accountActivityDataSource, "f"),
@@ -1297,16 +1288,14 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1297
1288
  }
1298
1289
  return reference;
1299
1290
  }, _AssetsController_subscribeToEvents = function _AssetsController_subscribeToEvents() {
1300
- // Subscribe to account group changes (when user switches between account groups like Account 1 -> Account 2)
1301
1291
  this.messenger.subscribe('AccountTreeController:selectedAccountGroupChange', (groupId, previousGroupId) => {
1302
1292
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleAccountGroupChanged).call(this, groupId, previousGroupId).catch(console.error);
1303
1293
  });
1304
- // Catch post-init tree mutations that change the selected account set
1305
- // (e.g. a snap account added to the current group) without changing
1306
- // the selected group id. Intermediate `:stateChange` events during
1307
- // `AccountTreeController.init()` are ignored until `:initialized`.
1308
- this.messenger.subscribe('AccountTreeController:stateChange', () => {
1309
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleAccountTreeStateChange).call(this);
1294
+ this.messenger.subscribe('AccountTreeController:initialized', () => {
1295
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
1296
+ });
1297
+ this.messenger.subscribe('AccountTreeController:uninitialized', () => {
1298
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
1310
1299
  });
1311
1300
  // Subscribe to network enablement changes (only enabledNetworkMap)
1312
1301
  this.messenger.subscribe('NetworkEnablementController:stateChange', ({ enabledNetworkMap }) => {
@@ -1333,20 +1322,17 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1333
1322
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleNetworkDidChange).call(this, networkState).catch(console.error);
1334
1323
  });
1335
1324
  // Client + Keyring lifecycle: only run when UI is open AND keyring is unlocked
1336
- this.messenger.subscribe('ClientController:stateChange', (isUiOpen) => {
1337
- __classPrivateFieldSet(this, _AssetsController_uiOpen, isUiOpen, "f");
1325
+ this.messenger.subscribe('ClientController:stateChange', () => {
1338
1326
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
1339
1327
  }, client_controller_1.clientControllerSelectors.selectIsUiOpen);
1340
1328
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
1341
1329
  this.messenger.subscribe('KeyringController:unlock', async () => {
1342
- __classPrivateFieldSet(this, _AssetsController_keyringUnlocked, true, "f");
1343
1330
  await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runSpamCleanup).call(this).catch(() => {
1344
1331
  /* Do nothing */
1345
1332
  });
1346
1333
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
1347
1334
  });
1348
1335
  this.messenger.subscribe('KeyringController:lock', () => {
1349
- __classPrivateFieldSet(this, _AssetsController_keyringUnlocked, false, "f");
1350
1336
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
1351
1337
  });
1352
1338
  // Subscribe to unapproved transactions - TXs that need confirmation.
@@ -1362,17 +1348,6 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1362
1348
  this.messenger.subscribe('TransactionController:transactionConfirmed', (transactionMeta) => {
1363
1349
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_refreshAssetsForTransaction).call(this, transactionMeta);
1364
1350
  });
1365
- // Start tracking only after the account tree is fully built. Unlock can
1366
- // happen before `AccountTreeController.init()`, and `:stateChange` fires
1367
- // for intermediate mutations during that build.
1368
- this.messenger.subscribe('AccountTreeController:initialized', () => {
1369
- __classPrivateFieldSet(this, _AssetsController_accountTreeInitialized, true, "f");
1370
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
1371
- });
1372
- this.messenger.subscribe('AccountTreeController:uninitialized', () => {
1373
- __classPrivateFieldSet(this, _AssetsController_accountTreeInitialized, false, "f");
1374
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
1375
- });
1376
1351
  }, _AssetsController_refreshAssetsForTransaction = function _AssetsController_refreshAssetsForTransaction(transactionMeta) {
1377
1352
  const hexChainId = transactionMeta.chainId;
1378
1353
  if (!hexChainId) {
@@ -1402,7 +1377,7 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1402
1377
  });
1403
1378
  }, _AssetsController_runSpamCleanup = async function _AssetsController_runSpamCleanup() {
1404
1379
  try {
1405
- const shouldRun = __classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f") &&
1380
+ const shouldRun = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isKeyringUnlocked).call(this) &&
1406
1381
  __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this) &&
1407
1382
  (0, healAssetsInfoMetadata_js_1.isUnlockCleanupEnabled)(this.messenger.call('RemoteFeatureFlagController:getState')
1408
1383
  ?.remoteFeatureFlags);
@@ -1434,67 +1409,15 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1434
1409
  log('Failed to run spam cleanup', { error });
1435
1410
  }
1436
1411
  }, _AssetsController_updateActive = function _AssetsController_updateActive() {
1437
- const shouldRun = __classPrivateFieldGet(this, _AssetsController_uiOpen, "f") && __classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f") && __classPrivateFieldGet(this, _AssetsController_accountTreeInitialized, "f");
1412
+ const shouldRun = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isUiOpen).call(this) &&
1413
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isKeyringUnlocked).call(this) &&
1414
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isAccountTreeInitialized).call(this);
1438
1415
  if (shouldRun) {
1439
1416
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_start).call(this);
1440
1417
  }
1441
1418
  else {
1442
1419
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
1443
1420
  }
1444
- }, _AssetsController_handleAccountTreeStateChange = function _AssetsController_handleAccountTreeStateChange() {
1445
- const shouldRun = __classPrivateFieldGet(this, _AssetsController_uiOpen, "f") &&
1446
- __classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f") &&
1447
- __classPrivateFieldGet(this, _AssetsController_accountTreeInitialized, "f") &&
1448
- __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").size > 0;
1449
- if (!shouldRun) {
1450
- return;
1451
- }
1452
- const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
1453
- const currentIds = new Set(accounts.map((a) => a.id));
1454
- const accountsChanged = currentIds.size !== __classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").size ||
1455
- [...currentIds].some((id) => !__classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").has(id));
1456
- if (!accountsChanged) {
1457
- return;
1458
- }
1459
- const hasOverlap = [...currentIds].some((id) => __classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").has(id));
1460
- if (!hasOverlap && __classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").size > 0) {
1461
- return;
1462
- }
1463
- log('Account tree changed with new accounts, re-subscribing', {
1464
- previousCount: __classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").size,
1465
- currentCount: currentIds.size,
1466
- });
1467
- const newAccounts = accounts.filter((account) => !__classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").has(account.id));
1468
- __classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, currentIds, "f");
1469
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
1470
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureDefaultTrackedAssetsSeeded).call(this);
1471
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runAccountTreeRefresh).call(this, accounts, newAccounts).catch((error) => {
1472
- log('Failed to refresh assets after tree change', error);
1473
- });
1474
- }, _AssetsController_runAccountTreeRefresh = async function _AssetsController_runAccountTreeRefresh(accounts, newAccounts = []) {
1475
- const releaseLock = await __classPrivateFieldGet(this, _AssetsController_accountRefreshMutex, "f").acquire();
1476
- try {
1477
- await this.getAssets(accounts, {
1478
- chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
1479
- forceUpdate: true,
1480
- });
1481
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this, { skipInitialFetch: true });
1482
- if (newAccounts.length > 0) {
1483
- await this.getAssets(newAccounts, {
1484
- chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
1485
- forceUpdate: true,
1486
- });
1487
- }
1488
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_fetchMissingPricesWithoutCache).call(this, accounts, [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")]);
1489
- }
1490
- catch (error) {
1491
- log('Failed to fetch assets after tree change', error);
1492
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this, { skipInitialFetch: true });
1493
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_fetchMissingPricesWithoutCache).call(this, accounts, [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")]);
1494
- }
1495
- finally {
1496
- releaseLock();
1497
- }
1498
1421
  }, _AssetsController_runStartupRefresh =
1499
1422
  /**
1500
1423
  * Force-fetch balances then subscribe. Used on unlock / first startup.
@@ -1529,7 +1452,7 @@ async function _AssetsController_runStartupRefresh(accounts) {
1529
1452
  }, _AssetsController_registerActionHandlers = function _AssetsController_registerActionHandlers() {
1530
1453
  this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
1531
1454
  }, _AssetsController_handleActiveChainsUpdate = function _AssetsController_handleActiveChainsUpdate(dataSourceId, activeChains, previousChains) {
1532
- if (!__classPrivateFieldGet(this, _AssetsController_uiOpen, "f") || !__classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f") || !__classPrivateFieldGet(this, _AssetsController_isEnabled, "f").call(this)) {
1455
+ if (!__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isUiOpen).call(this) || !__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isKeyringUnlocked).call(this) || !__classPrivateFieldGet(this, _AssetsController_isEnabled, "f").call(this)) {
1533
1456
  return;
1534
1457
  }
1535
1458
  log('Data source active chains changed', {
@@ -2102,7 +2025,6 @@ async function _AssetsController_executeMiddlewares(params) {
2102
2025
  selectedAccountCount: accounts.length,
2103
2026
  enabledChainCount: chainIds.length,
2104
2027
  });
2105
- __classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, new Set(accounts.map((a) => a.id)), "f");
2106
2028
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runStartupRefresh).call(this, accounts).catch((error) => {
2107
2029
  log('Failed to start asset tracking', error);
2108
2030
  });
@@ -2113,7 +2035,6 @@ async function _AssetsController_executeMiddlewares(params) {
2113
2035
  });
2114
2036
  __classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, false, "f");
2115
2037
  __classPrivateFieldSet(this, _AssetsController_stateSizeReported, false, "f");
2116
- __classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, new Set(), "f");
2117
2038
  // Stop price subscription first (uses direct messenger call)
2118
2039
  this.unsubscribeAssetsPrice();
2119
2040
  // Stop balance subscriptions by properly notifying data sources via messenger
@@ -2382,7 +2303,6 @@ async function _AssetsController_executeMiddlewares(params) {
2382
2303
  // EVENT HANDLERS
2383
2304
  // ============================================================================
2384
2305
  async function _AssetsController_handleAccountGroupChanged(groupId, previousGroupId = '') {
2385
- // The selected account group can be empty during onboarding or wallet reset.
2386
2306
  if (!groupId) {
2387
2307
  return;
2388
2308
  }
@@ -2403,7 +2323,6 @@ async function _AssetsController_handleAccountGroupChanged(groupId, previousGrou
2403
2323
  groupId,
2404
2324
  previousGroupId,
2405
2325
  });
2406
- __classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, new Set(accounts.map((a) => a.id)), "f");
2407
2326
  const releaseLock = await __classPrivateFieldGet(this, _AssetsController_accountRefreshMutex, "f").acquire();
2408
2327
  try {
2409
2328
  if (accounts.length > 0) {
@@ -2414,8 +2333,6 @@ async function _AssetsController_handleAccountGroupChanged(groupId, previousGrou
2414
2333
  }
2415
2334
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
2416
2335
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureDefaultTrackedAssetsSeeded).call(this);
2417
- // Subscribe after seed so the price poll sees natives / defaults.
2418
- // Balances were just force-fetched — skip AccountsApi's subscribe-time poll.
2419
2336
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this, { skipInitialFetch: true });
2420
2337
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_fetchMissingPricesWithoutCache).call(this, accounts, [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")]);
2421
2338
  }
@@ -2513,7 +2430,7 @@ async function _AssetsController_refreshActiveChainsOnNetworkSwitch() {
2513
2430
  * @param networkState - NetworkController state after the switch.
2514
2431
  */
2515
2432
  async function _AssetsController_handleNetworkDidChange(networkState) {
2516
- if (!__classPrivateFieldGet(this, _AssetsController_uiOpen, "f") || !__classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f") || !__classPrivateFieldGet(this, _AssetsController_isEnabled, "f").call(this)) {
2433
+ if (!__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isUiOpen).call(this) || !__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isKeyringUnlocked).call(this) || !__classPrivateFieldGet(this, _AssetsController_isEnabled, "f").call(this)) {
2517
2434
  return;
2518
2435
  }
2519
2436
  const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);