@metamask/assets-controller 5.0.1 → 6.1.0

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.
Files changed (78) hide show
  1. package/CHANGELOG.md +54 -1
  2. package/dist/AssetsController.cjs +172 -45
  3. package/dist/AssetsController.cjs.map +1 -1
  4. package/dist/AssetsController.d.cts +12 -4
  5. package/dist/AssetsController.d.cts.map +1 -1
  6. package/dist/AssetsController.d.mts +12 -4
  7. package/dist/AssetsController.d.mts.map +1 -1
  8. package/dist/AssetsController.mjs +173 -46
  9. package/dist/AssetsController.mjs.map +1 -1
  10. package/dist/data-sources/BackendWebsocketDataSource.cjs +48 -30
  11. package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -1
  12. package/dist/data-sources/BackendWebsocketDataSource.d.cts +3 -1
  13. package/dist/data-sources/BackendWebsocketDataSource.d.cts.map +1 -1
  14. package/dist/data-sources/BackendWebsocketDataSource.d.mts +3 -1
  15. package/dist/data-sources/BackendWebsocketDataSource.d.mts.map +1 -1
  16. package/dist/data-sources/BackendWebsocketDataSource.mjs +48 -30
  17. package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -1
  18. package/dist/data-sources/RpcDataSource.cjs +26 -8
  19. package/dist/data-sources/RpcDataSource.cjs.map +1 -1
  20. package/dist/data-sources/RpcDataSource.d.cts +8 -3
  21. package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
  22. package/dist/data-sources/RpcDataSource.d.mts +8 -3
  23. package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
  24. package/dist/data-sources/RpcDataSource.mjs +26 -8
  25. package/dist/data-sources/RpcDataSource.mjs.map +1 -1
  26. package/dist/data-sources/TokenDataSource.cjs +27 -12
  27. package/dist/data-sources/TokenDataSource.cjs.map +1 -1
  28. package/dist/data-sources/TokenDataSource.d.cts.map +1 -1
  29. package/dist/data-sources/TokenDataSource.d.mts.map +1 -1
  30. package/dist/data-sources/TokenDataSource.mjs +27 -12
  31. package/dist/data-sources/TokenDataSource.mjs.map +1 -1
  32. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.cjs +8 -0
  33. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.cjs.map +1 -1
  34. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.cts.map +1 -1
  35. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.d.mts.map +1 -1
  36. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.mjs +8 -0
  37. package/dist/data-sources/evm-rpc-services/clients/MulticallClient.mjs.map +1 -1
  38. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs +8 -6
  39. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs.map +1 -1
  40. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts +4 -2
  41. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts.map +1 -1
  42. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts +4 -2
  43. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts.map +1 -1
  44. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs +8 -6
  45. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs.map +1 -1
  46. package/dist/utils/formatExchangeRatesForBridge.cjs +10 -8
  47. package/dist/utils/formatExchangeRatesForBridge.cjs.map +1 -1
  48. package/dist/utils/formatExchangeRatesForBridge.d.cts +5 -3
  49. package/dist/utils/formatExchangeRatesForBridge.d.cts.map +1 -1
  50. package/dist/utils/formatExchangeRatesForBridge.d.mts +5 -3
  51. package/dist/utils/formatExchangeRatesForBridge.d.mts.map +1 -1
  52. package/dist/utils/formatExchangeRatesForBridge.mjs +11 -9
  53. package/dist/utils/formatExchangeRatesForBridge.mjs.map +1 -1
  54. package/dist/utils/formatStateForTransactionPay.cjs +8 -6
  55. package/dist/utils/formatStateForTransactionPay.cjs.map +1 -1
  56. package/dist/utils/formatStateForTransactionPay.d.cts +2 -2
  57. package/dist/utils/formatStateForTransactionPay.d.cts.map +1 -1
  58. package/dist/utils/formatStateForTransactionPay.d.mts +2 -2
  59. package/dist/utils/formatStateForTransactionPay.d.mts.map +1 -1
  60. package/dist/utils/formatStateForTransactionPay.mjs +8 -6
  61. package/dist/utils/formatStateForTransactionPay.mjs.map +1 -1
  62. package/dist/utils/index.cjs +4 -1
  63. package/dist/utils/index.cjs.map +1 -1
  64. package/dist/utils/index.d.cts +1 -0
  65. package/dist/utils/index.d.cts.map +1 -1
  66. package/dist/utils/index.d.mts +1 -0
  67. package/dist/utils/index.d.mts.map +1 -1
  68. package/dist/utils/index.mjs +1 -0
  69. package/dist/utils/index.mjs.map +1 -1
  70. package/dist/utils/native-assets.cjs +63 -0
  71. package/dist/utils/native-assets.cjs.map +1 -0
  72. package/dist/utils/native-assets.d.cts +19 -0
  73. package/dist/utils/native-assets.d.cts.map +1 -0
  74. package/dist/utils/native-assets.d.mts +19 -0
  75. package/dist/utils/native-assets.d.mts.map +1 -0
  76. package/dist/utils/native-assets.mjs +58 -0
  77. package/dist/utils/native-assets.mjs.map +1 -0
  78. package/package.json +11 -10
@@ -9,7 +9,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
10
10
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
11
11
  };
12
- var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_trace, _AssetsController_firstInitFetchReported, _AssetsController_stateSizeReported, _AssetsController_emitTrace, _AssetsController_emitStateSizeTrace, _AssetsController_uiOpen, _AssetsController_keyringUnlocked, _AssetsController_controllerMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_selectedAccounts_get, _AssetsController_backendWebsocketDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_stakedBalanceDataSource, _AssetsController_allBalanceDataSources_get, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_tokenDataSource, _AssetsController_unsubscribeBasicFunctionality, _AssetsController_onActiveChainsUpdated, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_updateActive, _AssetsController_registerActionHandlers, _AssetsController_handleActiveChainsUpdate, _AssetsController_executeMiddlewares, _AssetsController_resolveNativeAssetIds, _AssetsController_getNativeAssetIdsForEnabledChains, _AssetsController_getNativeAssetIdsForAccount, _AssetsController_ensureNativeBalancesDefaultZero, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_shouldHideNativeToken, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeAssets, _AssetsController_subscribeAssetsBalance, _AssetsController_subscribeStakedBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_subscribeDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged;
12
+ var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_trace, _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_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_resolveNativeAssetIds, _AssetsController_getNativeAssetIdsForEnabledChains, _AssetsController_getNativeAssetIdsForAccount, _AssetsController_ensureNativeBalancesDefaultZero, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_shouldHideNativeToken, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeAssets, _AssetsController_subscribeAssetsBalance, _AssetsController_subscribeStakedBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_subscribeDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged;
13
13
  import { BaseController } from "@metamask/base-controller";
14
14
  import { clientControllerSelectors } from "@metamask/client-controller";
15
15
  import { CHAIN_IDS_WITH_NO_NATIVE_TOKEN } from "@metamask/controller-utils";
@@ -28,7 +28,9 @@ import { TokenDataSource } from "./data-sources/TokenDataSource.mjs";
28
28
  import { projectLogger, createModuleLogger } from "./logger.mjs";
29
29
  import { DetectionMiddleware } from "./middlewares/DetectionMiddleware.mjs";
30
30
  import { createParallelBalanceMiddleware, createParallelMiddleware } from "./middlewares/ParallelMiddleware.mjs";
31
- import { normalizeAssetId, formatExchangeRatesForBridge, formatStateForTransactionPay } from "./utils/index.mjs";
31
+ import { normalizeAssetId, formatExchangeRatesForBridge, formatStateForTransactionPay, buildNativeAssetsFromConstant, buildNativeAssetsFromApi } from "./utils/index.mjs";
32
+ import { ZERO_ADDRESS } from "./utils/constants.mjs";
33
+ const NATIVE_ASSETS_QUERY_KEY = ['nativeAssets'];
32
34
  // ============================================================================
33
35
  // CONTROLLER CONSTANTS
34
36
  // ============================================================================
@@ -204,7 +206,7 @@ function normalizeResponse(response) {
204
206
  * - The controller does NOT manage polling - it simply receives pushed updates
205
207
  */
206
208
  export class AssetsController extends BaseController {
207
- constructor({ messenger, state = {}, defaultUpdateInterval = DEFAULT_POLLING_INTERVAL_MS, isEnabled = () => true, isBasicFunctionality, subscribeToBasicFunctionalityChange, queryApiClient, rpcDataSourceConfig, trace, accountsApiDataSourceConfig, priceDataSourceConfig, stakedBalanceDataSourceConfig, }) {
209
+ constructor({ messenger, state = {}, defaultUpdateInterval = DEFAULT_POLLING_INTERVAL_MS, isEnabled = () => true, isBasicFunctionality, subscribeToBasicFunctionalityChange, queryApiClient, rpcDataSourceConfig, trace, accountsApiDataSourceConfig, priceDataSourceConfig, stakedBalanceDataSourceConfig, isOnboarded, }) {
208
210
  super({
209
211
  name: CONTROLLER_NAME,
210
212
  messenger,
@@ -241,6 +243,12 @@ export class AssetsController extends BaseController {
241
243
  _AssetsController_activeSubscriptions.set(this, new Map());
242
244
  /** Currently enabled chains from NetworkEnablementController */
243
245
  _AssetsController_enabledChains.set(this, new Set());
246
+ /**
247
+ * Snapshot of account IDs that were active when the last subscription/fetch
248
+ * cycle ran. Used by #handleAccountTreeStateChange to skip redundant
249
+ * re-subscriptions when the account set hasn't actually changed.
250
+ */
251
+ _AssetsController_lastKnownAccountIds.set(this, new Set());
244
252
  _AssetsController_backendWebsocketDataSource.set(this, void 0);
245
253
  _AssetsController_accountsApiDataSource.set(this, void 0);
246
254
  _AssetsController_snapDataSource.set(this, void 0);
@@ -250,12 +258,15 @@ export class AssetsController extends BaseController {
250
258
  _AssetsController_detectionMiddleware.set(this, void 0);
251
259
  _AssetsController_tokenDataSource.set(this, void 0);
252
260
  _AssetsController_unsubscribeBasicFunctionality.set(this, null);
261
+ _AssetsController_queryApiClient.set(this, void 0);
253
262
  _AssetsController_onActiveChainsUpdated.set(this, void 0);
254
263
  __classPrivateFieldSet(this, _AssetsController_isEnabled, isEnabled(), "f");
255
264
  __classPrivateFieldSet(this, _AssetsController_isBasicFunctionality, isBasicFunctionality ?? (() => true), "f");
256
265
  __classPrivateFieldSet(this, _AssetsController_defaultUpdateInterval, defaultUpdateInterval, "f");
257
266
  __classPrivateFieldSet(this, _AssetsController_trace, trace, "f");
267
+ __classPrivateFieldSet(this, _AssetsController_queryApiClient, queryApiClient, "f");
258
268
  const rpcConfig = rpcDataSourceConfig ?? {};
269
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_initializeNativeAssetsMap).call(this, queryApiClient);
259
270
  __classPrivateFieldSet(this, _AssetsController_onActiveChainsUpdated, (dataSourceName, chains, previousChains) => {
260
271
  try {
261
272
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleActiveChainsUpdate).call(this, dataSourceName, chains, previousChains);
@@ -271,6 +282,7 @@ export class AssetsController extends BaseController {
271
282
  messenger: this.messenger,
272
283
  queryApiClient,
273
284
  onActiveChainsUpdated: __classPrivateFieldGet(this, _AssetsController_onActiveChainsUpdated, "f"),
285
+ isNativeAsset: (assetId) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isNativeAsset).call(this, assetId),
274
286
  }), "f");
275
287
  __classPrivateFieldSet(this, _AssetsController_accountsApiDataSource, new AccountsApiDataSource({
276
288
  queryApiClient,
@@ -284,7 +296,10 @@ export class AssetsController extends BaseController {
284
296
  __classPrivateFieldSet(this, _AssetsController_rpcDataSource, new RpcDataSource({
285
297
  messenger: this.messenger,
286
298
  onActiveChainsUpdated: __classPrivateFieldGet(this, _AssetsController_onActiveChainsUpdated, "f"),
299
+ getNativeAssetForChain: (chainId) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getNativeAssetMap).call(this)[chainId] ??
300
+ `${chainId}/erc20:${ZERO_ADDRESS}`,
287
301
  ...rpcConfig,
302
+ isOnboarded: rpcConfig.isOnboarded ?? isOnboarded,
288
303
  }), "f");
289
304
  __classPrivateFieldSet(this, _AssetsController_stakedBalanceDataSource, new StakedBalanceDataSource({
290
305
  messenger: this.messenger,
@@ -294,8 +309,7 @@ export class AssetsController extends BaseController {
294
309
  __classPrivateFieldSet(this, _AssetsController_tokenDataSource, new TokenDataSource(this.messenger, {
295
310
  queryApiClient,
296
311
  getNativeAssetIds: () => {
297
- const { nativeAssetIdentifiers } = this.messenger.call('NetworkEnablementController:getState');
298
- return Object.values(nativeAssetIdentifiers);
312
+ return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getNativeAssetIdsForEnabledChains).call(this);
299
313
  },
300
314
  }), "f");
301
315
  __classPrivateFieldSet(this, _AssetsController_priceDataSource, new PriceDataSource({
@@ -483,12 +497,12 @@ export class AssetsController extends BaseController {
483
497
  * @returns Bridge-compatible exchange rate state derived from assetsPrice and selectedCurrency.
484
498
  */
485
499
  getExchangeRatesForBridge() {
486
- const { nativeAssetIdentifiers } = this.messenger.call('NetworkEnablementController:getState');
487
500
  const { networkConfigurationsByChainId } = this.messenger.call('NetworkController:getState');
488
501
  return formatExchangeRatesForBridge({
502
+ assetsInfo: this.state.assetsInfo,
489
503
  assetsPrice: this.state.assetsPrice,
490
504
  selectedCurrency: this.state.selectedCurrency,
491
- nativeAssetIdentifiers,
505
+ nativeAssetIdentifiers: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getNativeAssetMap).call(this),
492
506
  networkConfigurationsByChainId,
493
507
  });
494
508
  }
@@ -502,8 +516,7 @@ export class AssetsController extends BaseController {
502
516
  * @returns Legacy-compatible state for transaction-pay-controller.
503
517
  */
504
518
  getStateForTransactionPay() {
505
- const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get);
506
- const { nativeAssetIdentifiers } = this.messenger.call('NetworkEnablementController:getState');
519
+ const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
507
520
  const { networkConfigurationsByChainId } = this.messenger.call('NetworkController:getState');
508
521
  return formatStateForTransactionPay({
509
522
  assetsBalance: this.state.assetsBalance,
@@ -511,7 +524,7 @@ export class AssetsController extends BaseController {
511
524
  assetsPrice: this.state.assetsPrice,
512
525
  selectedCurrency: this.state.selectedCurrency,
513
526
  accounts: accounts.map((a) => ({ id: a.id, address: a.address })),
514
- nativeAssetIdentifiers,
527
+ nativeAssetIdentifiers: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getNativeAssetMap).call(this),
515
528
  networkConfigurationsByChainId,
516
529
  });
517
530
  }
@@ -555,7 +568,7 @@ export class AssetsController extends BaseController {
555
568
  if (pendingMetadata) {
556
569
  const parsed = parseCaipAssetType(normalizedAssetId);
557
570
  let tokenType = 'erc20';
558
- if (parsed.assetNamespace === 'slip44') {
571
+ if (__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isNativeAsset).call(this, normalizedAssetId)) {
559
572
  tokenType = 'native';
560
573
  }
561
574
  else if (parsed.assetNamespace === 'spl') {
@@ -575,7 +588,7 @@ export class AssetsController extends BaseController {
575
588
  }
576
589
  });
577
590
  // Fetch data for the newly added custom asset (merge to preserve other chains)
578
- const account = __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).find((a) => a.id === accountId);
591
+ const account = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).find((a) => a.id === accountId);
579
592
  if (account) {
580
593
  const chainId = extractChainId(normalizedAssetId);
581
594
  await this.getAssets([account], {
@@ -674,7 +687,7 @@ export class AssetsController extends BaseController {
674
687
  if (!__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
675
688
  return;
676
689
  }
677
- this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
690
+ this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this), {
678
691
  forceUpdate: true,
679
692
  dataTypes: ['price'],
680
693
  assetsForPriceUpdate: Object.values(this.state.assetsBalance).flatMap((balances) => Object.keys(balances)),
@@ -699,10 +712,11 @@ export class AssetsController extends BaseController {
699
712
  const subscriptionKey = 'ds:PriceDataSource';
700
713
  const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
701
714
  const isUpdate = existingSubscription !== undefined;
715
+ const request = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildDataRequest).call(this, accounts, chainIds, {
716
+ dataTypes: ['price'],
717
+ });
702
718
  const subscribeReq = {
703
- request: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildDataRequest).call(this, accounts, chainIds, {
704
- dataTypes: ['price'],
705
- }),
719
+ request,
706
720
  subscriptionId: subscriptionKey,
707
721
  isUpdate,
708
722
  onAssetsUpdate: (response) => this.handleAssetsUpdate(response, 'PriceDataSource'),
@@ -829,7 +843,7 @@ export class AssetsController extends BaseController {
829
843
  this.messenger.unregisterActionHandler('AssetsController:unhideAsset');
830
844
  }
831
845
  }
832
- _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctionality = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_trace = 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_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_tokenDataSource = new WeakMap(), _AssetsController_unsubscribeBasicFunctionality = new WeakMap(), _AssetsController_onActiveChainsUpdated = new WeakMap(), _AssetsController_instances = new WeakSet(), _AssetsController_emitTrace = function _AssetsController_emitTrace(name, data, tags = {
846
+ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctionality = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_trace = 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_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 = {
833
847
  controller: 'AssetsController',
834
848
  }) {
835
849
  if (!__classPrivateFieldGet(this, _AssetsController_trace, "f")) {
@@ -875,8 +889,16 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
875
889
  price_entries: Object.keys(assetsPrice).length,
876
890
  custom_asset_entries: customAssetEntries,
877
891
  });
878
- }, _AssetsController_selectedAccounts_get = function _AssetsController_selectedAccounts_get() {
879
- return this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
892
+ }, _AssetsController_getSelectedAccounts = function _AssetsController_getSelectedAccounts() {
893
+ const accounts = this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
894
+ if (accounts.length > 0) {
895
+ return accounts;
896
+ }
897
+ const selectedAccount = this.messenger.call('AccountsController:getSelectedAccount');
898
+ if (selectedAccount) {
899
+ return [selectedAccount];
900
+ }
901
+ return [];
880
902
  }, _AssetsController_allBalanceDataSources_get = function _AssetsController_allBalanceDataSources_get() {
881
903
  return [
882
904
  __classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f"),
@@ -884,6 +906,25 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
884
906
  __classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"),
885
907
  __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
886
908
  ];
909
+ }, _AssetsController_initializeNativeAssetsMap = function _AssetsController_initializeNativeAssetsMap(queryApiClient) {
910
+ queryApiClient.queryClient
911
+ .fetchQuery({
912
+ queryKey: NATIVE_ASSETS_QUERY_KEY,
913
+ queryFn: buildNativeAssetsFromApi,
914
+ staleTime: Infinity,
915
+ gcTime: Infinity,
916
+ })
917
+ .catch((error) => {
918
+ // Failure to populate native asset cache is non-fatal;
919
+ // #isNativeAsset falls back to the seed data from buildNativeAssetsFromConstant.
920
+ log('Failed to populate native asset cache, falling back to seed data', error);
921
+ });
922
+ // Seed the cache synchronously so that synchronous consumers (e.g.
923
+ // #isNativeAsset, #resolveNativeAssetIds) have data available immediately.
924
+ // When fetchQuery resolves (currently instant, future: API), it overwrites
925
+ // this with potentially fresher data.
926
+ const initialNativeAssetMap = buildNativeAssetsFromConstant();
927
+ queryApiClient.setCachedData(NATIVE_ASSETS_QUERY_KEY, initialNativeAssetMap);
887
928
  }, _AssetsController_initializeState = function _AssetsController_initializeState() {
888
929
  const { enabledNetworkMap } = this.messenger.call('NetworkEnablementController:getState');
889
930
  __classPrivateFieldSet(this, _AssetsController_enabledChains, __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_extractEnabledChains).call(this, enabledNetworkMap), "f");
@@ -929,7 +970,7 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
929
970
  // when init() calls this.update(). #start() is idempotent so
930
971
  // repeated fires are safe.
931
972
  this.messenger.subscribe('AccountTreeController:stateChange', () => {
932
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
973
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleAccountTreeStateChange).call(this);
933
974
  });
934
975
  // Subscribe to network enablement changes (only enabledNetworkMap)
935
976
  this.messenger.subscribe('NetworkEnablementController:stateChange', ({ enabledNetworkMap }) => {
@@ -948,6 +989,33 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
948
989
  __classPrivateFieldSet(this, _AssetsController_keyringUnlocked, false, "f");
949
990
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
950
991
  });
992
+ // Subscribe to unapproved transactions - TXs that need confirmation
993
+ // Ensures that balances for the account making transaction are updated (e.g. for gas estimations)
994
+ this.messenger.subscribe('TransactionController:unapprovedTransactionAdded', (transactionMeta) => {
995
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_onUnapprovedTransactionAdded).call(this, transactionMeta);
996
+ });
997
+ }, _AssetsController_onUnapprovedTransactionAdded = function _AssetsController_onUnapprovedTransactionAdded(transactionMeta) {
998
+ const hexChainId = transactionMeta.chainId;
999
+ if (!hexChainId) {
1000
+ return;
1001
+ }
1002
+ const caipChainId = `eip155:${parseInt(hexChainId, 16)}`;
1003
+ const fromAddress = transactionMeta.txParams.from?.toLowerCase();
1004
+ if (!fromAddress) {
1005
+ return;
1006
+ }
1007
+ const matchedAccount = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).find((account) => account.address.toLowerCase() === fromAddress);
1008
+ if (!matchedAccount) {
1009
+ return;
1010
+ }
1011
+ this.getAssets([matchedAccount], {
1012
+ chainIds: [caipChainId],
1013
+ forceUpdate: true,
1014
+ }).catch((error) => {
1015
+ log('Failed to refresh assets after unapproved transaction added', {
1016
+ error,
1017
+ });
1018
+ });
951
1019
  }, _AssetsController_updateActive = function _AssetsController_updateActive() {
952
1020
  const shouldRun = __classPrivateFieldGet(this, _AssetsController_uiOpen, "f") && __classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f");
953
1021
  if (shouldRun) {
@@ -956,6 +1024,36 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
956
1024
  else {
957
1025
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
958
1026
  }
1027
+ }, _AssetsController_handleAccountTreeStateChange = function _AssetsController_handleAccountTreeStateChange() {
1028
+ const shouldRun = __classPrivateFieldGet(this, _AssetsController_uiOpen, "f") && __classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f");
1029
+ if (!shouldRun) {
1030
+ return;
1031
+ }
1032
+ if (__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").size > 0) {
1033
+ const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
1034
+ const currentIds = new Set(accounts.map((a) => a.id));
1035
+ const accountsChanged = currentIds.size !== __classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").size ||
1036
+ [...currentIds].some((id) => !__classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").has(id));
1037
+ if (!accountsChanged) {
1038
+ return;
1039
+ }
1040
+ log('Account tree changed with new accounts, re-subscribing', {
1041
+ previousCount: __classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").size,
1042
+ currentCount: currentIds.size,
1043
+ });
1044
+ __classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, currentIds, "f");
1045
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
1046
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
1047
+ this.getAssets(accounts, {
1048
+ chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
1049
+ forceUpdate: true,
1050
+ }).catch((error) => {
1051
+ log('Failed to fetch assets after tree change', error);
1052
+ });
1053
+ }
1054
+ else {
1055
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_start).call(this);
1056
+ }
959
1057
  }, _AssetsController_registerActionHandlers = function _AssetsController_registerActionHandlers() {
960
1058
  this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
961
1059
  }, _AssetsController_handleActiveChainsUpdate = function _AssetsController_handleActiveChainsUpdate(dataSourceId, activeChains, previousChains) {
@@ -976,11 +1074,11 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
976
1074
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
977
1075
  }
978
1076
  // If chains were added and we have selected accounts, do one-time fetch
979
- if (addedChains.length > 0 && __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
1077
+ if (addedChains.length > 0 && __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).length > 0) {
980
1078
  const addedEnabledChains = addedChains.filter((chain) => __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").has(chain));
981
1079
  if (addedEnabledChains.length > 0) {
982
1080
  log('Fetching balances for newly added chains', { addedEnabledChains });
983
- this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
1081
+ this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this), {
984
1082
  chainIds: addedEnabledChains,
985
1083
  forceUpdate: true,
986
1084
  updateMode: 'merge',
@@ -1064,11 +1162,28 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
1064
1162
  });
1065
1163
  }
1066
1164
  return { response: result.response, durationByDataSource };
1165
+ }, _AssetsController_getNativeAssetMap = function _AssetsController_getNativeAssetMap() {
1166
+ return (__classPrivateFieldGet(this, _AssetsController_queryApiClient, "f").getCachedData(NATIVE_ASSETS_QUERY_KEY) ?? {});
1167
+ }, _AssetsController_isNativeAsset = function _AssetsController_isNativeAsset(assetId) {
1168
+ const parsed = parseCaipAssetType(assetId);
1169
+ if (parsed.assetNamespace === 'slip44') {
1170
+ return true;
1171
+ }
1172
+ const lower = assetId.toLowerCase();
1173
+ const isInNativeAssetMap = Object.values(__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getNativeAssetMap).call(this)).some((id) => id.toLowerCase() === lower);
1174
+ if (isInNativeAssetMap) {
1175
+ return true;
1176
+ }
1177
+ if (parsed.assetNamespace === 'erc20' &&
1178
+ parsed.assetReference === ZERO_ADDRESS) {
1179
+ return true;
1180
+ }
1181
+ return false;
1067
1182
  }, _AssetsController_resolveNativeAssetIds = function _AssetsController_resolveNativeAssetIds(chains) {
1068
- const { nativeAssetIdentifiers } = this.messenger.call('NetworkEnablementController:getState');
1183
+ const nativeAssetMap = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getNativeAssetMap).call(this);
1069
1184
  const ids = [];
1070
1185
  for (const chainId of chains) {
1071
- const nativeId = nativeAssetIdentifiers?.[chainId];
1186
+ const nativeId = nativeAssetMap[chainId];
1072
1187
  if (nativeId) {
1073
1188
  ids.push(nativeId);
1074
1189
  }
@@ -1079,7 +1194,7 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
1079
1194
  }, _AssetsController_getNativeAssetIdsForAccount = function _AssetsController_getNativeAssetIdsForAccount(account) {
1080
1195
  return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_resolveNativeAssetIds).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getEnabledChainsForAccount).call(this, account));
1081
1196
  }, _AssetsController_ensureNativeBalancesDefaultZero = function _AssetsController_ensureNativeBalancesDefaultZero() {
1082
- const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get);
1197
+ const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
1083
1198
  if (accounts.length === 0) {
1084
1199
  return;
1085
1200
  }
@@ -1168,7 +1283,7 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
1168
1283
  return next;
1169
1284
  })();
1170
1285
  // Ensure native tokens have an entry (0 if missing) for chains this account supports
1171
- const account = __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).find((a) => a.id === accountId);
1286
+ const account = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).find((a) => a.id === accountId);
1172
1287
  const nativeAssetIdsForAccount = account
1173
1288
  ? __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getNativeAssetIdsForAccount).call(this, account)
1174
1289
  : __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getNativeAssetIdsForEnabledChains).call(this);
@@ -1286,7 +1401,7 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
1286
1401
  }
1287
1402
  const assetChainId = extractChainId(typedAssetId);
1288
1403
  // Skip native tokens on Tempo networks
1289
- if (__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_shouldHideNativeToken).call(this, assetChainId, typedAssetId, metadata)) {
1404
+ if (__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_shouldHideNativeToken).call(this, assetChainId, metadata)) {
1290
1405
  continue;
1291
1406
  }
1292
1407
  if (!chainIdSet.has(assetChainId)) {
@@ -1322,14 +1437,12 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
1322
1437
  }
1323
1438
  }
1324
1439
  return result;
1325
- }, _AssetsController_shouldHideNativeToken = function _AssetsController_shouldHideNativeToken(chainId, assetId, metadata) {
1440
+ }, _AssetsController_shouldHideNativeToken = function _AssetsController_shouldHideNativeToken(chainId, metadata) {
1326
1441
  // Check if it's a chain that should skip native tokens
1327
1442
  if (!CHAIN_IDS_WITH_NO_NATIVE_TOKEN.includes(chainId)) {
1328
1443
  return false;
1329
1444
  }
1330
- // Check if it's a native token (either by metadata type or assetId format)
1331
- const isNative = metadata.type === 'native' || assetId.includes('/slip44:');
1332
- return isNative;
1445
+ return metadata.type === 'native';
1333
1446
  }, _AssetsController_tokenStandardToAssetType = function _AssetsController_tokenStandardToAssetType(tokenStandard) {
1334
1447
  switch (tokenStandard) {
1335
1448
  case 'native':
@@ -1346,7 +1459,7 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
1346
1459
  return 'fungible';
1347
1460
  }
1348
1461
  }, _AssetsController_start = function _AssetsController_start() {
1349
- const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get);
1462
+ const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
1350
1463
  const chainIds = [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")];
1351
1464
  if (accounts.length === 0 || chainIds.length === 0) {
1352
1465
  return;
@@ -1358,6 +1471,7 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
1358
1471
  selectedAccountCount: accounts.length,
1359
1472
  enabledChainCount: chainIds.length,
1360
1473
  });
1474
+ __classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, new Set(accounts.map((a) => a.id)), "f");
1361
1475
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
1362
1476
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
1363
1477
  this.getAssets(accounts, {
@@ -1373,6 +1487,7 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
1373
1487
  });
1374
1488
  __classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, false, "f");
1375
1489
  __classPrivateFieldSet(this, _AssetsController_stateSizeReported, false, "f");
1490
+ __classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, new Set(), "f");
1376
1491
  // Stop price subscription first (uses direct messenger call)
1377
1492
  this.unsubscribeAssetsPrice();
1378
1493
  // Stop balance subscriptions by properly notifying data sources via messenger
@@ -1395,23 +1510,21 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
1395
1510
  }
1396
1511
  __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").clear();
1397
1512
  }, _AssetsController_subscribeAssets = function _AssetsController_subscribeAssets() {
1398
- if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length === 0 || __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size === 0) {
1513
+ const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
1514
+ const enabledChains = [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")];
1515
+ if (accounts.length === 0 || enabledChains.length === 0) {
1399
1516
  return;
1400
1517
  }
1401
1518
  // Subscribe to balance updates (batched by data source)
1402
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalance).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [
1403
- ...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f"),
1404
- ]);
1519
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalance).call(this, accounts, enabledChains);
1405
1520
  // Subscribe to staked balance updates (separate from regular balance chain-claiming)
1406
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeStakedBalance).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [
1407
- ...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f"),
1408
- ]);
1521
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeStakedBalance).call(this, accounts, enabledChains);
1409
1522
  // Subscribe to price updates for all assets held by selected accounts
1410
- this.subscribeAssetsPrice(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")]);
1523
+ this.subscribeAssetsPrice(accounts, enabledChains);
1411
1524
  }, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance(accounts, chainIds) {
1412
1525
  const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, accounts, new Set(chainIds));
1413
1526
  const remainingChains = new Set(chainToAccounts.keys());
1414
- // When basic functionality is on (getter true), use all balance data sources; when off (getter false), RPC only.
1527
+ // When basic functionality is on, use all balance data sources; when off, RPC only.
1415
1528
  const balanceDataSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
1416
1529
  ? __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get)
1417
1530
  : [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
@@ -1514,16 +1627,19 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
1514
1627
  }
1515
1628
  }, _AssetsController_buildDataRequest = function _AssetsController_buildDataRequest(accounts, chainIds, partial = {}) {
1516
1629
  const chainIdSet = new Set(chainIds);
1630
+ // Force update will pass in additional chains for wildcard account scope
1631
+ // Enables updates for chains that are not selected (e.g. for unapproved transactions)
1632
+ const forceUpdateChains = partial.forceUpdate ? chainIds : undefined;
1517
1633
  const accountsWithSupportedChains = accounts.map((account) => ({
1518
1634
  account,
1519
- supportedChains: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getEnabledChainsForAccount).call(this, account).filter((chain) => chainIdSet.has(chain)),
1635
+ supportedChains: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getEnabledChainsForAccount).call(this, account, forceUpdateChains).filter((chain) => chainIdSet.has(chain)),
1520
1636
  }));
1521
1637
  return {
1522
1638
  accountsWithSupportedChains,
1523
1639
  chainIds,
1524
1640
  ...partial,
1525
1641
  };
1526
- }, _AssetsController_getEnabledChainsForAccount = function _AssetsController_getEnabledChainsForAccount(account) {
1642
+ }, _AssetsController_getEnabledChainsForAccount = function _AssetsController_getEnabledChainsForAccount(account, additionalChains) {
1527
1643
  // Account scopes are CAIP-2 chain IDs like "eip155:1", "solana:mainnet", "bip122:..."
1528
1644
  const scopes = account.scopes ?? [];
1529
1645
  const result = [];
@@ -1536,6 +1652,7 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
1536
1652
  const { namespace, reference } = parseCaipChainId(scopeStr);
1537
1653
  // Wildcard scope (e.g., "eip155:0" means all enabled chains in that namespace)
1538
1654
  if (reference === '0') {
1655
+ // Add enabled chains
1539
1656
  for (const chain of __classPrivateFieldGet(this, _AssetsController_enabledChains, "f")) {
1540
1657
  if (isCaipChainId(chain)) {
1541
1658
  const chainParsed = parseCaipChainId(chain);
@@ -1544,6 +1661,15 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
1544
1661
  }
1545
1662
  }
1546
1663
  }
1664
+ // Add additional chains
1665
+ for (const chain of additionalChains ?? []) {
1666
+ if (isCaipChainId(chain)) {
1667
+ const chainParsed = parseCaipChainId(chain);
1668
+ if (chainParsed.namespace === namespace) {
1669
+ result.push(chain);
1670
+ }
1671
+ }
1672
+ }
1547
1673
  }
1548
1674
  else if (namespace === 'eip155' && isStrictHexString(reference)) {
1549
1675
  // Normalize hex to decimal for EIP155
@@ -1559,11 +1685,12 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
1559
1685
  // EVENT HANDLERS
1560
1686
  // ============================================================================
1561
1687
  async function _AssetsController_handleAccountGroupChanged() {
1562
- const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get);
1688
+ const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
1563
1689
  log('Account group changed', {
1564
1690
  accountCount: accounts.length,
1565
1691
  accountIds: accounts.map((a) => a.id),
1566
1692
  });
1693
+ __classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, new Set(accounts.map((a) => a.id)), "f");
1567
1694
  // Subscribe and fetch for the new account group
1568
1695
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
1569
1696
  if (accounts.length > 0) {
@@ -1602,8 +1729,8 @@ async function _AssetsController_handleAccountGroupChanged() {
1602
1729
  // Refresh subscriptions for new chain set
1603
1730
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
1604
1731
  // Do one-time fetch for newly enabled chains; merge so we keep existing chain balances
1605
- if (addedChains.length > 0 && __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
1606
- await this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
1732
+ if (addedChains.length > 0 && __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).length > 0) {
1733
+ await this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this), {
1607
1734
  chainIds: addedChains,
1608
1735
  forceUpdate: true,
1609
1736
  updateMode: 'merge',