@metamask-previews/assets-controller 2.0.2-preview-980f677 → 2.0.2-preview-3d4d0d0ef

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 (68) hide show
  1. package/CHANGELOG.md +0 -8
  2. package/dist/AssetsController.cjs +27 -118
  3. package/dist/AssetsController.cjs.map +1 -1
  4. package/dist/AssetsController.d.cts +4 -16
  5. package/dist/AssetsController.d.cts.map +1 -1
  6. package/dist/AssetsController.d.mts +4 -16
  7. package/dist/AssetsController.d.mts.map +1 -1
  8. package/dist/AssetsController.mjs +27 -118
  9. package/dist/AssetsController.mjs.map +1 -1
  10. package/dist/data-sources/AccountsApiDataSource.cjs +0 -1
  11. package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
  12. package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
  13. package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
  14. package/dist/data-sources/AccountsApiDataSource.mjs +0 -1
  15. package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
  16. package/dist/data-sources/BackendWebsocketDataSource.cjs +1 -1
  17. package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -1
  18. package/dist/data-sources/BackendWebsocketDataSource.mjs +1 -1
  19. package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -1
  20. package/dist/data-sources/PriceDataSource.cjs +14 -20
  21. package/dist/data-sources/PriceDataSource.cjs.map +1 -1
  22. package/dist/data-sources/PriceDataSource.d.cts +2 -2
  23. package/dist/data-sources/PriceDataSource.d.cts.map +1 -1
  24. package/dist/data-sources/PriceDataSource.d.mts +2 -2
  25. package/dist/data-sources/PriceDataSource.d.mts.map +1 -1
  26. package/dist/data-sources/PriceDataSource.mjs +14 -20
  27. package/dist/data-sources/PriceDataSource.mjs.map +1 -1
  28. package/dist/data-sources/RpcDataSource.cjs +0 -2
  29. package/dist/data-sources/RpcDataSource.cjs.map +1 -1
  30. package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
  31. package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
  32. package/dist/data-sources/RpcDataSource.mjs +0 -2
  33. package/dist/data-sources/RpcDataSource.mjs.map +1 -1
  34. package/dist/data-sources/SnapDataSource.cjs +2 -3
  35. package/dist/data-sources/SnapDataSource.cjs.map +1 -1
  36. package/dist/data-sources/SnapDataSource.d.cts.map +1 -1
  37. package/dist/data-sources/SnapDataSource.d.mts.map +1 -1
  38. package/dist/data-sources/SnapDataSource.mjs +2 -3
  39. package/dist/data-sources/SnapDataSource.mjs.map +1 -1
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +1 -1
  42. package/dist/index.d.cts.map +1 -1
  43. package/dist/index.d.mts +1 -1
  44. package/dist/index.d.mts.map +1 -1
  45. package/dist/index.mjs.map +1 -1
  46. package/dist/middlewares/index.cjs +1 -5
  47. package/dist/middlewares/index.cjs.map +1 -1
  48. package/dist/middlewares/index.d.cts +0 -2
  49. package/dist/middlewares/index.d.cts.map +1 -1
  50. package/dist/middlewares/index.d.mts +0 -2
  51. package/dist/middlewares/index.d.mts.map +1 -1
  52. package/dist/middlewares/index.mjs +0 -1
  53. package/dist/middlewares/index.mjs.map +1 -1
  54. package/dist/types.cjs.map +1 -1
  55. package/dist/types.d.cts +0 -16
  56. package/dist/types.d.cts.map +1 -1
  57. package/dist/types.d.mts +0 -16
  58. package/dist/types.d.mts.map +1 -1
  59. package/dist/types.mjs.map +1 -1
  60. package/package.json +3 -4
  61. package/dist/middlewares/ParallelMiddleware.cjs +0 -216
  62. package/dist/middlewares/ParallelMiddleware.cjs.map +0 -1
  63. package/dist/middlewares/ParallelMiddleware.d.cts +0 -45
  64. package/dist/middlewares/ParallelMiddleware.d.cts.map +0 -1
  65. package/dist/middlewares/ParallelMiddleware.d.mts +0 -45
  66. package/dist/middlewares/ParallelMiddleware.d.mts.map +0 -1
  67. package/dist/middlewares/ParallelMiddleware.mjs +0 -214
  68. package/dist/middlewares/ParallelMiddleware.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -7,14 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- ### Added
11
-
12
- - Add `currentCurrency` state (ISO 4217 code, default `'usd'`) and `setCurrentCurrency(currentCurrency)` to `AssetsController`. Changing the currency updates state and triggers a one-off price refetch so displayed prices use the new currency ([#7991](https://github.com/MetaMask/core/pull/7991))
13
- - Add support for forcibly updating prices ([#7991](https://github.com/MetaMask/core/pull/7991))
14
- - Add parallel middlewares in `ParallelMiddleware.ts`: `createParallelBalanceMiddleware` runs balance data sources (Accounts API, Snap, RPC) in parallel with chain partitioning and a fallback round for failed chains; `createParallelMiddleware` runs TokenDataSource and PriceDataSource in parallel (same request, merged response). Both use `mergeDataResponses` and limited concurrency via `p-limit` ([#7950](https://github.com/MetaMask/core/pull/7950))
15
- - Add `@metamask/client-controller` dependency and subscribe to `ClientController:stateChange`. Asset tracking runs only when the UI is open (ClientController) and the keyring is unlocked (KeyringController), and stops when either the UI closes or the keyring locks (Client + Keyring lifecycle) ([#7950](https://github.com/MetaMask/core/pull/7950))
16
- - Add full and merge update modes: `DataResponse.updateMode` and type `AssetsUpdateMode` (`'full'` | `'merge'`). Fetch uses `'full'` (response is authoritative for scope; custom assets not in response are preserved). Subscriptions could use `'merge'` or `'full'` depending on data sources. Default is `'merge'` when omitted ([#7950](https://github.com/MetaMask/core/pull/7950))
17
-
18
10
  ### Changed
19
11
 
20
12
  - Bump `@metamask/transaction-controller` from `^62.17.1` to `^62.18.0` ([#8005](https://github.com/MetaMask/core/pull/8005))
@@ -13,11 +13,10 @@ 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_trackMetaMetricsEvent, _AssetsController_firstInitFetchReported, _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_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_updateActive, _AssetsController_registerActionHandlers, _AssetsController_executeMiddlewares, _AssetsController_updateState, _AssetsController_getAssetsFromState, _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;
16
+ var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_trackMetaMetricsEvent, _AssetsController_firstInitFetchReported, _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_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_registerActionHandlers, _AssetsController_executeMiddlewares, _AssetsController_updateState, _AssetsController_getAssetsFromState, _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;
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");
20
- const client_controller_1 = require("@metamask/client-controller");
21
20
  const utils_1 = require("@metamask/utils");
22
21
  const async_mutex_1 = require("async-mutex");
23
22
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
@@ -31,7 +30,6 @@ const StakedBalanceDataSource_1 = require("./data-sources/StakedBalanceDataSourc
31
30
  const TokenDataSource_1 = require("./data-sources/TokenDataSource.cjs");
32
31
  const logger_1 = require("./logger.cjs");
33
32
  const DetectionMiddleware_1 = require("./middlewares/DetectionMiddleware.cjs");
34
- const ParallelMiddleware_1 = require("./middlewares/ParallelMiddleware.cjs");
35
33
  const utils_2 = require("./utils.cjs");
36
34
  // ============================================================================
37
35
  // CONTROLLER CONSTANTS
@@ -64,7 +62,6 @@ function getDefaultAssetsControllerState() {
64
62
  assetsPrice: {},
65
63
  customAssets: {},
66
64
  assetPreferences: {},
67
- selectedCurrency: 'usd',
68
65
  };
69
66
  }
70
67
  exports.getDefaultAssetsControllerState = getDefaultAssetsControllerState;
@@ -102,12 +99,6 @@ const stateMetadata = {
102
99
  includeInDebugSnapshot: false,
103
100
  usedInUi: true,
104
101
  },
105
- selectedCurrency: {
106
- persist: true,
107
- includeInStateLogs: false,
108
- includeInDebugSnapshot: false,
109
- usedInUi: true,
110
- },
111
102
  };
112
103
  // ============================================================================
113
104
  // HELPER FUNCTIONS
@@ -161,9 +152,6 @@ function normalizeResponse(response) {
161
152
  if (response.errors) {
162
153
  normalized.errors = { ...response.errors };
163
154
  }
164
- if (response.updateMode) {
165
- normalized.updateMode = response.updateMode;
166
- }
167
155
  return normalized;
168
156
  }
169
157
  // ============================================================================
@@ -185,10 +173,8 @@ function normalizeResponse(response) {
185
173
  * based on which chains they support. When active chains change, the controller
186
174
  * dynamically adjusts subscriptions.
187
175
  *
188
- * 4. **Client + Keyring Lifecycle**: Starts subscriptions only when both the UI is
189
- * open (ClientController) and the wallet is unlocked (KeyringController).
190
- * Stops when either the UI closes or the keyring locks. See client-controller
191
- * README for the combined pattern.
176
+ * 4. **Keyring Lifecycle**: Listens to KeyringController unlock/lock events to
177
+ * start/stop subscriptions when the wallet is unlocked or locked.
192
178
  *
193
179
  * ## Architecture
194
180
  *
@@ -218,10 +204,6 @@ class AssetsController extends base_controller_1.BaseController {
218
204
  _AssetsController_trackMetaMetricsEvent.set(this, void 0);
219
205
  /** Whether we have already reported first init fetch for this session (reset on #stop). */
220
206
  _AssetsController_firstInitFetchReported.set(this, false);
221
- /** Whether the client (UI) is open. Combined with #keyringUnlocked for #updateActive. */
222
- _AssetsController_uiOpen.set(this, false);
223
- /** Whether the keyring is unlocked. Combined with #uiOpen for #updateActive. */
224
- _AssetsController_keyringUnlocked.set(this, false);
225
207
  _AssetsController_controllerMutex.set(this, new async_mutex_1.Mutex());
226
208
  /**
227
209
  * Active balance subscriptions keyed by account ID.
@@ -278,7 +260,6 @@ class AssetsController extends base_controller_1.BaseController {
278
260
  }), "f");
279
261
  __classPrivateFieldSet(this, _AssetsController_priceDataSource, new PriceDataSource_1.PriceDataSource({
280
262
  queryApiClient,
281
- getSelectedCurrency: () => this.state.selectedCurrency,
282
263
  ...priceDataSourceConfig,
283
264
  }), "f");
284
265
  __classPrivateFieldSet(this, _AssetsController_detectionMiddleware, new DetectionMiddleware_1.DetectionMiddleware(), "f");
@@ -292,7 +273,7 @@ class AssetsController extends base_controller_1.BaseController {
292
273
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_initializeState).call(this);
293
274
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToEvents).call(this);
294
275
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_registerActionHandlers).call(this);
295
- // Subscriptions start only when both UI is open and keyring unlocked -> #updateActive().
276
+ // Subscriptions start only on KeyringController:unlock -> #start(), not here.
296
277
  // Subscribe to basic-functionality changes after construction so a synchronous
297
278
  // onChange during subscribe cannot run before data sources are initialized.
298
279
  if (subscribeToBasicFunctionalityChange) {
@@ -356,9 +337,6 @@ class AssetsController extends base_controller_1.BaseController {
356
337
  const chainIds = options?.chainIds ?? [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")];
357
338
  const assetTypes = options?.assetTypes ?? ['fungible'];
358
339
  const dataTypes = options?.dataTypes ?? ['balance', 'metadata', 'price'];
359
- if (accounts.length === 0 || chainIds.length === 0) {
360
- return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
361
- }
362
340
  // Collect custom assets for all requested accounts
363
341
  const customAssets = [];
364
342
  for (const account of accounts) {
@@ -372,21 +350,16 @@ class AssetsController extends base_controller_1.BaseController {
372
350
  dataTypes,
373
351
  customAssets: customAssets.length > 0 ? customAssets : undefined,
374
352
  forceUpdate: true,
375
- assetsForPriceUpdate: options?.assetsForPriceUpdate,
376
353
  });
377
354
  const sources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
378
355
  ? [
379
- (0, ParallelMiddleware_1.createParallelBalanceMiddleware)([
380
- __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
381
- __classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"),
382
- __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
383
- __classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
384
- ]),
356
+ __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
357
+ __classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"),
358
+ __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
359
+ __classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
385
360
  __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
386
- (0, ParallelMiddleware_1.createParallelMiddleware)([
387
- __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
388
- __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
389
- ]),
361
+ __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
362
+ __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
390
363
  ]
391
364
  : [
392
365
  __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
@@ -394,7 +367,7 @@ class AssetsController extends base_controller_1.BaseController {
394
367
  __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
395
368
  ];
396
369
  const { response, durationByDataSource } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, sources, request);
397
- await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...response, updateMode: 'full' });
370
+ await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, response);
398
371
  if (__classPrivateFieldGet(this, _AssetsController_trackMetaMetricsEvent, "f") && !__classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")) {
399
372
  __classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, true, "f");
400
373
  const durationMs = Date.now() - startTime;
@@ -557,34 +530,6 @@ class AssetsController extends base_controller_1.BaseController {
557
530
  });
558
531
  }
559
532
  // ============================================================================
560
- // CURRENT CURRENCY MANAGEMENT
561
- // ============================================================================
562
- /**
563
- * Set the current currency.
564
- *
565
- * @param selectedCurrency - The ISO 4217 currency code to set.
566
- */
567
- setSelectedCurrency(selectedCurrency) {
568
- const previousCurrency = this.state.selectedCurrency;
569
- if (previousCurrency === selectedCurrency) {
570
- return;
571
- }
572
- this.update((state) => {
573
- state.selectedCurrency = selectedCurrency;
574
- });
575
- log('Current currency changed', {
576
- previousCurrency,
577
- selectedCurrency,
578
- });
579
- this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
580
- forceUpdate: true,
581
- dataTypes: ['price'],
582
- assetsForPriceUpdate: Object.values(this.state.assetsBalance).flatMap((balances) => Object.keys(balances)),
583
- }).catch((error) => {
584
- log('Failed to fetch asset prices after current currency change', error);
585
- });
586
- }
587
- // ============================================================================
588
533
  // SUBSCRIPTIONS
589
534
  // ============================================================================
590
535
  /**
@@ -662,15 +607,9 @@ class AssetsController extends base_controller_1.BaseController {
662
607
  hasBalance: Boolean(response.assetsBalance),
663
608
  hasPrice: Boolean(response.assetsPrice),
664
609
  });
665
- // Run through enrichment middlewares (Detection, then Token + Price in parallel)
610
+ // Run through enrichment middlewares (Event Stack: Detection Token Price)
666
611
  // Include 'metadata' in dataTypes so TokenDataSource runs to enrich detected assets
667
- const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [
668
- __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
669
- (0, ParallelMiddleware_1.createParallelMiddleware)([
670
- __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
671
- __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
672
- ]),
673
- ], request ?? {
612
+ const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"), __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f")], request ?? {
674
613
  accountsWithSupportedChains: [],
675
614
  chainIds: [],
676
615
  dataTypes: ['balance', 'metadata', 'price'],
@@ -710,7 +649,7 @@ class AssetsController extends base_controller_1.BaseController {
710
649
  }
711
650
  }
712
651
  exports.AssetsController = AssetsController;
713
- _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctionality = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_trackMetaMetricsEvent = new WeakMap(), _AssetsController_firstInitFetchReported = 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_instances = new WeakSet(), _AssetsController_selectedAccounts_get = function _AssetsController_selectedAccounts_get() {
652
+ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctionality = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_trackMetaMetricsEvent = new WeakMap(), _AssetsController_firstInitFetchReported = 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_instances = new WeakSet(), _AssetsController_selectedAccounts_get = function _AssetsController_selectedAccounts_get() {
714
653
  return this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
715
654
  }, _AssetsController_allBalanceDataSources_get = function _AssetsController_allBalanceDataSources_get() {
716
655
  return [
@@ -760,27 +699,9 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
760
699
  this.messenger.subscribe('NetworkEnablementController:stateChange', ({ enabledNetworkMap }) => {
761
700
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleEnabledNetworksChanged).call(this, enabledNetworkMap).catch(console.error);
762
701
  });
763
- // Client + Keyring lifecycle: only run when UI is open AND keyring is unlocked
764
- this.messenger.subscribe('ClientController:stateChange', (isUiOpen) => {
765
- __classPrivateFieldSet(this, _AssetsController_uiOpen, isUiOpen, "f");
766
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
767
- }, client_controller_1.clientControllerSelectors.selectIsUiOpen);
768
- this.messenger.subscribe('KeyringController:unlock', () => {
769
- __classPrivateFieldSet(this, _AssetsController_keyringUnlocked, true, "f");
770
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
771
- });
772
- this.messenger.subscribe('KeyringController:lock', () => {
773
- __classPrivateFieldSet(this, _AssetsController_keyringUnlocked, false, "f");
774
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
775
- });
776
- }, _AssetsController_updateActive = function _AssetsController_updateActive() {
777
- const shouldRun = __classPrivateFieldGet(this, _AssetsController_uiOpen, "f") && __classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f");
778
- if (shouldRun) {
779
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_start).call(this);
780
- }
781
- else {
782
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
783
- }
702
+ // Keyring lifecycle: start when unlocked, stop when locked
703
+ this.messenger.subscribe('KeyringController:unlock', () => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_start).call(this));
704
+ this.messenger.subscribe('KeyringController:lock', () => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this));
784
705
  }, _AssetsController_registerActionHandlers = function _AssetsController_registerActionHandlers() {
785
706
  this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
786
707
  }, _AssetsController_executeMiddlewares =
@@ -838,8 +759,8 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
838
759
  // STATE MANAGEMENT
839
760
  // ============================================================================
840
761
  async function _AssetsController_updateState(response) {
762
+ // Normalize asset IDs (checksum EVM addresses) before storing in state
841
763
  const normalizedResponse = normalizeResponse(response);
842
- const mode = normalizedResponse.updateMode ?? 'merge';
843
764
  const releaseLock = await __classPrivateFieldGet(this, _AssetsController_controllerMutex, "f").acquire();
844
765
  try {
845
766
  const previousState = this.state;
@@ -865,27 +786,15 @@ async function _AssetsController_updateState(response) {
865
786
  if (normalizedResponse.assetsBalance) {
866
787
  for (const [accountId, accountBalances] of Object.entries(normalizedResponse.assetsBalance)) {
867
788
  const previousBalances = previousState.assetsBalance[accountId] ?? {};
868
- const customAssetIds = state.customAssets[accountId] ?? [];
869
- // Full: response is authoritative; preserve custom assets not in response. Merge: response overlays previous.
870
- const effective = mode === 'full'
871
- ? (() => {
872
- const next = {
873
- ...accountBalances,
874
- };
875
- for (const customId of customAssetIds) {
876
- if (!(customId in next)) {
877
- const prev = previousBalances[customId];
878
- next[customId] =
879
- prev ?? { amount: '0' };
880
- }
881
- }
882
- return next;
883
- })()
884
- : { ...previousBalances, ...accountBalances };
885
- for (const [assetId, balance] of Object.entries(effective)) {
789
+ if (!balances[accountId]) {
790
+ balances[accountId] = {};
791
+ }
792
+ for (const [assetId, balance] of Object.entries(accountBalances)) {
886
793
  const previousBalance = previousBalances[assetId];
887
- const newAmount = balance.amount;
794
+ const balanceData = balance;
795
+ const newAmount = balanceData.amount;
888
796
  const oldAmount = previousBalance?.amount;
797
+ // Track if balance actually changed
889
798
  if (oldAmount !== newAmount) {
890
799
  changedBalances.push({
891
800
  accountId,
@@ -895,7 +804,7 @@ async function _AssetsController_updateState(response) {
895
804
  });
896
805
  }
897
806
  }
898
- balances[accountId] = effective;
807
+ Object.assign(balances[accountId], accountBalances);
899
808
  }
900
809
  }
901
810
  // Update prices in state
@@ -1073,7 +982,7 @@ async function _AssetsController_updateState(response) {
1073
982
  }
1074
983
  __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").clear();
1075
984
  }, _AssetsController_subscribeAssets = function _AssetsController_subscribeAssets() {
1076
- if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length === 0 || __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size === 0) {
985
+ if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length === 0) {
1077
986
  return;
1078
987
  }
1079
988
  // Subscribe to balance updates (batched by data source)