@metamask-previews/assets-controller 14.0.3-preview-64bce4b11 → 14.0.3-preview-a38f058

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,12 +9,12 @@ 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
 
14
- ### Fixed
15
-
16
- - Fix stale ARC USDC/EURC balances after confirmed swaps by running an authoritative RPC balance refresh for post-transaction asset updates ([#10058](https://github.com/MetaMask/core/pull/10058))
17
-
18
18
  ## [14.0.3]
19
19
 
20
20
  ### 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);
@@ -473,27 +458,9 @@ class AssetsController extends base_controller_1.BaseController {
473
458
  }
474
459
  // Collect custom assets for all requested accounts
475
460
  const customAssets = [];
476
- const chainIdSet = new Set(chainIds);
477
461
  for (const account of accounts) {
478
462
  const accountCustomAssets = this.getCustomAssets(account.id);
479
463
  customAssets.push(...accountCustomAssets);
480
- // When refreshing after a confirmed transaction, also include graduated
481
- // tokens — ERC-20s currently in assetsBalance but removed from
482
- // customAssets by CustomAssetGraduationMiddleware. The Accounts API
483
- // indexes incoming transfers (received tokens) slower than outgoing
484
- // ones, so without a direct RPC query the "to" token in a swap keeps
485
- // the stale API-cached balance until the next polling cycle.
486
- if (options?.postTransaction) {
487
- const stateBalances = this.state.assetsBalance[account.id] ?? {};
488
- for (const assetId of Object.keys(stateBalances)) {
489
- const assetChainId = assetId.split('/')[0];
490
- if (chainIdSet.has(assetChainId) &&
491
- !(0, index_js_1.isStakingContractAssetId)(assetId) &&
492
- !customAssets.includes(assetId)) {
493
- customAssets.push(assetId);
494
- }
495
- }
496
- }
497
464
  }
498
465
  if (options?.forceUpdate) {
499
466
  // Pipeline spans only on unlock/first-init fetch; later forceUpdates pass
@@ -592,15 +559,11 @@ class AssetsController extends base_controller_1.BaseController {
592
559
  __classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, true, "f");
593
560
  // Background (slow) lane — flattened sibling of the fast lane (not nested
594
561
  // inside its withTrace callback). Still fire-and-forget so UI is not blocked.
595
- const slowPipelineChainIds = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSlowPipelineChainIds).call(this, chainIds, response, { forceAll: options?.postTransaction === true });
562
+ const slowPipelineChainIds = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSlowPipelineChainIds).call(this, chainIds, response);
596
563
  if (slowPipelineChainIds.length > 0) {
597
- let slowSources;
598
- if (options?.postTransaction || !__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
599
- slowSources = [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
600
- }
601
- else {
602
- slowSources = [__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
603
- }
564
+ const slowSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
565
+ ? [__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")]
566
+ : [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
604
567
  const slowRequest = { ...request, chainIds: slowPipelineChainIds };
605
568
  (0, trace_js_1.withTrace)({
606
569
  name: TRACE_BACKGROUND_FETCH,
@@ -1207,7 +1170,7 @@ class AssetsController extends base_controller_1.BaseController {
1207
1170
  }
1208
1171
  }
1209
1172
  exports.AssetsController = AssetsController;
1210
- _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() {
1211
1174
  if (!__classPrivateFieldGet(this, _AssetsController_trace, "f") || __classPrivateFieldGet(this, _AssetsController_stateSizeReported, "f")) {
1212
1175
  return;
1213
1176
  }
@@ -1260,6 +1223,12 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1260
1223
  return [selectedAccount];
1261
1224
  }
1262
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');
1263
1232
  }, _AssetsController_allBalanceDataSources_get = function _AssetsController_allBalanceDataSources_get() {
1264
1233
  return [
1265
1234
  __classPrivateFieldGet(this, _AssetsController_accountActivityDataSource, "f"),
@@ -1319,16 +1288,14 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1319
1288
  }
1320
1289
  return reference;
1321
1290
  }, _AssetsController_subscribeToEvents = function _AssetsController_subscribeToEvents() {
1322
- // Subscribe to account group changes (when user switches between account groups like Account 1 -> Account 2)
1323
1291
  this.messenger.subscribe('AccountTreeController:selectedAccountGroupChange', (groupId, previousGroupId) => {
1324
1292
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleAccountGroupChanged).call(this, groupId, previousGroupId).catch(console.error);
1325
1293
  });
1326
- // Catch post-init tree mutations that change the selected account set
1327
- // (e.g. a snap account added to the current group) without changing
1328
- // the selected group id. Intermediate `:stateChange` events during
1329
- // `AccountTreeController.init()` are ignored until `:initialized`.
1330
- this.messenger.subscribe('AccountTreeController:stateChange', () => {
1331
- __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);
1332
1299
  });
1333
1300
  // Subscribe to network enablement changes (only enabledNetworkMap)
1334
1301
  this.messenger.subscribe('NetworkEnablementController:stateChange', ({ enabledNetworkMap }) => {
@@ -1355,20 +1322,17 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1355
1322
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleNetworkDidChange).call(this, networkState).catch(console.error);
1356
1323
  });
1357
1324
  // Client + Keyring lifecycle: only run when UI is open AND keyring is unlocked
1358
- this.messenger.subscribe('ClientController:stateChange', (isUiOpen) => {
1359
- __classPrivateFieldSet(this, _AssetsController_uiOpen, isUiOpen, "f");
1325
+ this.messenger.subscribe('ClientController:stateChange', () => {
1360
1326
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
1361
1327
  }, client_controller_1.clientControllerSelectors.selectIsUiOpen);
1362
1328
  // eslint-disable-next-line @typescript-eslint/no-misused-promises
1363
1329
  this.messenger.subscribe('KeyringController:unlock', async () => {
1364
- __classPrivateFieldSet(this, _AssetsController_keyringUnlocked, true, "f");
1365
1330
  await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runSpamCleanup).call(this).catch(() => {
1366
1331
  /* Do nothing */
1367
1332
  });
1368
1333
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
1369
1334
  });
1370
1335
  this.messenger.subscribe('KeyringController:lock', () => {
1371
- __classPrivateFieldSet(this, _AssetsController_keyringUnlocked, false, "f");
1372
1336
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
1373
1337
  });
1374
1338
  // Subscribe to unapproved transactions - TXs that need confirmation.
@@ -1382,35 +1346,19 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1382
1346
  // RpcDataSource also listens for transactionConfirmed, but only refreshes
1383
1347
  // chains it owns via an active subscription.
1384
1348
  this.messenger.subscribe('TransactionController:transactionConfirmed', (transactionMeta) => {
1385
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_refreshAssetsForTransaction).call(this, transactionMeta, {
1386
- postTransaction: true,
1387
- });
1388
- });
1389
- // Start tracking only after the account tree is fully built. Unlock can
1390
- // happen before `AccountTreeController.init()`, and `:stateChange` fires
1391
- // for intermediate mutations during that build.
1392
- this.messenger.subscribe('AccountTreeController:initialized', () => {
1393
- __classPrivateFieldSet(this, _AssetsController_accountTreeInitialized, true, "f");
1394
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
1395
- });
1396
- this.messenger.subscribe('AccountTreeController:uninitialized', () => {
1397
- __classPrivateFieldSet(this, _AssetsController_accountTreeInitialized, false, "f");
1398
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
1349
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_refreshAssetsForTransaction).call(this, transactionMeta);
1399
1350
  });
1400
- }, _AssetsController_refreshAssetsForTransaction = function _AssetsController_refreshAssetsForTransaction(transactionMeta, options) {
1351
+ }, _AssetsController_refreshAssetsForTransaction = function _AssetsController_refreshAssetsForTransaction(transactionMeta) {
1401
1352
  const hexChainId = transactionMeta.chainId;
1402
1353
  if (!hexChainId) {
1403
1354
  return;
1404
1355
  }
1405
1356
  const caipChainId = `eip155:${parseInt(hexChainId, 16)}`;
1406
1357
  // AccountActivity pushes live balance updates for its active chains; a
1407
- // pre-confirmation force getAssets would be redundant and can race the
1408
- // WebSocket path. After confirmation, still run the post-transaction RPC
1409
- // pass because AccountActivity may update only part of a swap pair.
1410
- if (!options?.postTransaction &&
1411
- __classPrivateFieldGet(this, _AssetsController_accountActivityDataSource, "f")
1412
- .getActiveChainsSync()
1413
- .includes(caipChainId)) {
1358
+ // force getAssets would be redundant and can race the WebSocket path.
1359
+ if (__classPrivateFieldGet(this, _AssetsController_accountActivityDataSource, "f")
1360
+ .getActiveChainsSync()
1361
+ .includes(caipChainId)) {
1414
1362
  return;
1415
1363
  }
1416
1364
  const fromAddress = transactionMeta.txParams.from?.toLowerCase();
@@ -1424,13 +1372,12 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1424
1372
  this.getAssets([matchedAccount], {
1425
1373
  chainIds: [caipChainId],
1426
1374
  forceUpdate: true,
1427
- postTransaction: options?.postTransaction,
1428
1375
  }).catch((error) => {
1429
1376
  log('Failed to refresh assets after transaction event', { error });
1430
1377
  });
1431
1378
  }, _AssetsController_runSpamCleanup = async function _AssetsController_runSpamCleanup() {
1432
1379
  try {
1433
- const shouldRun = __classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f") &&
1380
+ const shouldRun = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isKeyringUnlocked).call(this) &&
1434
1381
  __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this) &&
1435
1382
  (0, healAssetsInfoMetadata_js_1.isUnlockCleanupEnabled)(this.messenger.call('RemoteFeatureFlagController:getState')
1436
1383
  ?.remoteFeatureFlags);
@@ -1462,67 +1409,15 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1462
1409
  log('Failed to run spam cleanup', { error });
1463
1410
  }
1464
1411
  }, _AssetsController_updateActive = function _AssetsController_updateActive() {
1465
- 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);
1466
1415
  if (shouldRun) {
1467
1416
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_start).call(this);
1468
1417
  }
1469
1418
  else {
1470
1419
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
1471
1420
  }
1472
- }, _AssetsController_handleAccountTreeStateChange = function _AssetsController_handleAccountTreeStateChange() {
1473
- const shouldRun = __classPrivateFieldGet(this, _AssetsController_uiOpen, "f") &&
1474
- __classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f") &&
1475
- __classPrivateFieldGet(this, _AssetsController_accountTreeInitialized, "f") &&
1476
- __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").size > 0;
1477
- if (!shouldRun) {
1478
- return;
1479
- }
1480
- const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
1481
- const currentIds = new Set(accounts.map((a) => a.id));
1482
- const accountsChanged = currentIds.size !== __classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").size ||
1483
- [...currentIds].some((id) => !__classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").has(id));
1484
- if (!accountsChanged) {
1485
- return;
1486
- }
1487
- const hasOverlap = [...currentIds].some((id) => __classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").has(id));
1488
- if (!hasOverlap && __classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").size > 0) {
1489
- return;
1490
- }
1491
- log('Account tree changed with new accounts, re-subscribing', {
1492
- previousCount: __classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").size,
1493
- currentCount: currentIds.size,
1494
- });
1495
- const newAccounts = accounts.filter((account) => !__classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").has(account.id));
1496
- __classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, currentIds, "f");
1497
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
1498
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureDefaultTrackedAssetsSeeded).call(this);
1499
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runAccountTreeRefresh).call(this, accounts, newAccounts).catch((error) => {
1500
- log('Failed to refresh assets after tree change', error);
1501
- });
1502
- }, _AssetsController_runAccountTreeRefresh = async function _AssetsController_runAccountTreeRefresh(accounts, newAccounts = []) {
1503
- const releaseLock = await __classPrivateFieldGet(this, _AssetsController_accountRefreshMutex, "f").acquire();
1504
- try {
1505
- await this.getAssets(accounts, {
1506
- chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
1507
- forceUpdate: true,
1508
- });
1509
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this, { skipInitialFetch: true });
1510
- if (newAccounts.length > 0) {
1511
- await this.getAssets(newAccounts, {
1512
- chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
1513
- forceUpdate: true,
1514
- });
1515
- }
1516
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_fetchMissingPricesWithoutCache).call(this, accounts, [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")]);
1517
- }
1518
- catch (error) {
1519
- log('Failed to fetch assets after tree change', error);
1520
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this, { skipInitialFetch: true });
1521
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_fetchMissingPricesWithoutCache).call(this, accounts, [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")]);
1522
- }
1523
- finally {
1524
- releaseLock();
1525
- }
1526
1421
  }, _AssetsController_runStartupRefresh =
1527
1422
  /**
1528
1423
  * Force-fetch balances then subscribe. Used on unlock / first startup.
@@ -1557,7 +1452,7 @@ async function _AssetsController_runStartupRefresh(accounts) {
1557
1452
  }, _AssetsController_registerActionHandlers = function _AssetsController_registerActionHandlers() {
1558
1453
  this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
1559
1454
  }, _AssetsController_handleActiveChainsUpdate = function _AssetsController_handleActiveChainsUpdate(dataSourceId, activeChains, previousChains) {
1560
- 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)) {
1561
1456
  return;
1562
1457
  }
1563
1458
  log('Data source active chains changed', {
@@ -1775,11 +1670,7 @@ async function _AssetsController_executeMiddlewares(params) {
1775
1670
  return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_resolveNativeAssetIds).call(this, __classPrivateFieldGet(this, _AssetsController_enabledChains, "f"));
1776
1671
  }, _AssetsController_getNativeAssetIdsForAccount = function _AssetsController_getNativeAssetIdsForAccount(account) {
1777
1672
  return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_resolveNativeAssetIds).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getEnabledChainsForAccount).call(this, account));
1778
- }, _AssetsController_getSlowPipelineChainIds = function _AssetsController_getSlowPipelineChainIds(chainIds, fastResponse, options) {
1779
- // Post-transaction: always run RPC to override potentially stale Accounts API data.
1780
- if (options?.forceAll) {
1781
- return chainIds;
1782
- }
1673
+ }, _AssetsController_getSlowPipelineChainIds = function _AssetsController_getSlowPipelineChainIds(chainIds, fastResponse) {
1783
1674
  const accountsApiChains = new Set(__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f").getActiveChainsSync());
1784
1675
  return chainIds.filter((chainId) => {
1785
1676
  if (fastResponse.errors?.[chainId]) {
@@ -2134,7 +2025,6 @@ async function _AssetsController_executeMiddlewares(params) {
2134
2025
  selectedAccountCount: accounts.length,
2135
2026
  enabledChainCount: chainIds.length,
2136
2027
  });
2137
- __classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, new Set(accounts.map((a) => a.id)), "f");
2138
2028
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runStartupRefresh).call(this, accounts).catch((error) => {
2139
2029
  log('Failed to start asset tracking', error);
2140
2030
  });
@@ -2145,7 +2035,6 @@ async function _AssetsController_executeMiddlewares(params) {
2145
2035
  });
2146
2036
  __classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, false, "f");
2147
2037
  __classPrivateFieldSet(this, _AssetsController_stateSizeReported, false, "f");
2148
- __classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, new Set(), "f");
2149
2038
  // Stop price subscription first (uses direct messenger call)
2150
2039
  this.unsubscribeAssetsPrice();
2151
2040
  // Stop balance subscriptions by properly notifying data sources via messenger
@@ -2414,7 +2303,6 @@ async function _AssetsController_executeMiddlewares(params) {
2414
2303
  // EVENT HANDLERS
2415
2304
  // ============================================================================
2416
2305
  async function _AssetsController_handleAccountGroupChanged(groupId, previousGroupId = '') {
2417
- // The selected account group can be empty during onboarding or wallet reset.
2418
2306
  if (!groupId) {
2419
2307
  return;
2420
2308
  }
@@ -2435,7 +2323,6 @@ async function _AssetsController_handleAccountGroupChanged(groupId, previousGrou
2435
2323
  groupId,
2436
2324
  previousGroupId,
2437
2325
  });
2438
- __classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, new Set(accounts.map((a) => a.id)), "f");
2439
2326
  const releaseLock = await __classPrivateFieldGet(this, _AssetsController_accountRefreshMutex, "f").acquire();
2440
2327
  try {
2441
2328
  if (accounts.length > 0) {
@@ -2446,8 +2333,6 @@ async function _AssetsController_handleAccountGroupChanged(groupId, previousGrou
2446
2333
  }
2447
2334
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
2448
2335
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureDefaultTrackedAssetsSeeded).call(this);
2449
- // Subscribe after seed so the price poll sees natives / defaults.
2450
- // Balances were just force-fetched — skip AccountsApi's subscribe-time poll.
2451
2336
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this, { skipInitialFetch: true });
2452
2337
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_fetchMissingPricesWithoutCache).call(this, accounts, [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")]);
2453
2338
  }
@@ -2545,7 +2430,7 @@ async function _AssetsController_refreshActiveChainsOnNetworkSwitch() {
2545
2430
  * @param networkState - NetworkController state after the switch.
2546
2431
  */
2547
2432
  async function _AssetsController_handleNetworkDidChange(networkState) {
2548
- 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)) {
2549
2434
  return;
2550
2435
  }
2551
2436
  const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);