@metamask-previews/assets-controller 2.0.2-preview-d1f62d044 → 2.0.2-preview-06d68e653

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 (66) hide show
  1. package/CHANGELOG.md +0 -6
  2. package/dist/AssetsController.cjs +27 -81
  3. package/dist/AssetsController.cjs.map +1 -1
  4. package/dist/AssetsController.d.cts +3 -6
  5. package/dist/AssetsController.d.cts.map +1 -1
  6. package/dist/AssetsController.d.mts +3 -6
  7. package/dist/AssetsController.d.mts.map +1 -1
  8. package/dist/AssetsController.mjs +27 -81
  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 +1 -4
  21. package/dist/data-sources/PriceDataSource.cjs.map +1 -1
  22. package/dist/data-sources/PriceDataSource.d.cts.map +1 -1
  23. package/dist/data-sources/PriceDataSource.d.mts.map +1 -1
  24. package/dist/data-sources/PriceDataSource.mjs +1 -4
  25. package/dist/data-sources/PriceDataSource.mjs.map +1 -1
  26. package/dist/data-sources/RpcDataSource.cjs +0 -2
  27. package/dist/data-sources/RpcDataSource.cjs.map +1 -1
  28. package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
  29. package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
  30. package/dist/data-sources/RpcDataSource.mjs +0 -2
  31. package/dist/data-sources/RpcDataSource.mjs.map +1 -1
  32. package/dist/data-sources/SnapDataSource.cjs +2 -3
  33. package/dist/data-sources/SnapDataSource.cjs.map +1 -1
  34. package/dist/data-sources/SnapDataSource.d.cts.map +1 -1
  35. package/dist/data-sources/SnapDataSource.d.mts.map +1 -1
  36. package/dist/data-sources/SnapDataSource.mjs +2 -3
  37. package/dist/data-sources/SnapDataSource.mjs.map +1 -1
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.d.cts +1 -1
  40. package/dist/index.d.cts.map +1 -1
  41. package/dist/index.d.mts +1 -1
  42. package/dist/index.d.mts.map +1 -1
  43. package/dist/index.mjs.map +1 -1
  44. package/dist/middlewares/index.cjs +1 -5
  45. package/dist/middlewares/index.cjs.map +1 -1
  46. package/dist/middlewares/index.d.cts +0 -2
  47. package/dist/middlewares/index.d.cts.map +1 -1
  48. package/dist/middlewares/index.d.mts +0 -2
  49. package/dist/middlewares/index.d.mts.map +1 -1
  50. package/dist/middlewares/index.mjs +0 -1
  51. package/dist/middlewares/index.mjs.map +1 -1
  52. package/dist/types.cjs.map +1 -1
  53. package/dist/types.d.cts +0 -14
  54. package/dist/types.d.cts.map +1 -1
  55. package/dist/types.d.mts +0 -14
  56. package/dist/types.d.mts.map +1 -1
  57. package/dist/types.mjs.map +1 -1
  58. package/package.json +2 -4
  59. package/dist/middlewares/ParallelMiddleware.cjs +0 -216
  60. package/dist/middlewares/ParallelMiddleware.cjs.map +0 -1
  61. package/dist/middlewares/ParallelMiddleware.d.cts +0 -45
  62. package/dist/middlewares/ParallelMiddleware.d.cts.map +0 -1
  63. package/dist/middlewares/ParallelMiddleware.d.mts +0 -45
  64. package/dist/middlewares/ParallelMiddleware.d.mts.map +0 -1
  65. package/dist/middlewares/ParallelMiddleware.mjs +0 -214
  66. package/dist/middlewares/ParallelMiddleware.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -7,12 +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 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))
13
- - 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))
14
- - 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))
15
-
16
10
  ### Changed
17
11
 
18
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
@@ -154,9 +152,6 @@ function normalizeResponse(response) {
154
152
  if (response.errors) {
155
153
  normalized.errors = { ...response.errors };
156
154
  }
157
- if (response.updateMode) {
158
- normalized.updateMode = response.updateMode;
159
- }
160
155
  return normalized;
161
156
  }
162
157
  // ============================================================================
@@ -178,10 +173,8 @@ function normalizeResponse(response) {
178
173
  * based on which chains they support. When active chains change, the controller
179
174
  * dynamically adjusts subscriptions.
180
175
  *
181
- * 4. **Client + Keyring Lifecycle**: Starts subscriptions only when both the UI is
182
- * open (ClientController) and the wallet is unlocked (KeyringController).
183
- * Stops when either the UI closes or the keyring locks. See client-controller
184
- * 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.
185
178
  *
186
179
  * ## Architecture
187
180
  *
@@ -211,10 +204,6 @@ class AssetsController extends base_controller_1.BaseController {
211
204
  _AssetsController_trackMetaMetricsEvent.set(this, void 0);
212
205
  /** Whether we have already reported first init fetch for this session (reset on #stop). */
213
206
  _AssetsController_firstInitFetchReported.set(this, false);
214
- /** Whether the client (UI) is open. Combined with #keyringUnlocked for #updateActive. */
215
- _AssetsController_uiOpen.set(this, false);
216
- /** Whether the keyring is unlocked. Combined with #uiOpen for #updateActive. */
217
- _AssetsController_keyringUnlocked.set(this, false);
218
207
  _AssetsController_controllerMutex.set(this, new async_mutex_1.Mutex());
219
208
  /**
220
209
  * Active balance subscriptions keyed by account ID.
@@ -284,7 +273,7 @@ class AssetsController extends base_controller_1.BaseController {
284
273
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_initializeState).call(this);
285
274
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToEvents).call(this);
286
275
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_registerActionHandlers).call(this);
287
- // Subscriptions start only when both UI is open and keyring unlocked -> #updateActive().
276
+ // Subscriptions start only on KeyringController:unlock -> #start(), not here.
288
277
  // Subscribe to basic-functionality changes after construction so a synchronous
289
278
  // onChange during subscribe cannot run before data sources are initialized.
290
279
  if (subscribeToBasicFunctionalityChange) {
@@ -348,9 +337,6 @@ class AssetsController extends base_controller_1.BaseController {
348
337
  const chainIds = options?.chainIds ?? [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")];
349
338
  const assetTypes = options?.assetTypes ?? ['fungible'];
350
339
  const dataTypes = options?.dataTypes ?? ['balance', 'metadata', 'price'];
351
- if (accounts.length === 0 || chainIds.length === 0) {
352
- return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
353
- }
354
340
  // Collect custom assets for all requested accounts
355
341
  const customAssets = [];
356
342
  for (const account of accounts) {
@@ -367,17 +353,13 @@ class AssetsController extends base_controller_1.BaseController {
367
353
  });
368
354
  const sources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
369
355
  ? [
370
- (0, ParallelMiddleware_1.createParallelBalanceMiddleware)([
371
- __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
372
- __classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"),
373
- __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
374
- __classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
375
- ]),
356
+ __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
357
+ __classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"),
358
+ __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
359
+ __classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
376
360
  __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
377
- (0, ParallelMiddleware_1.createParallelMiddleware)([
378
- __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
379
- __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
380
- ]),
361
+ __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
362
+ __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
381
363
  ]
382
364
  : [
383
365
  __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
@@ -385,7 +367,7 @@ class AssetsController extends base_controller_1.BaseController {
385
367
  __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
386
368
  ];
387
369
  const { response, durationByDataSource } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, sources, request);
388
- 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);
389
371
  if (__classPrivateFieldGet(this, _AssetsController_trackMetaMetricsEvent, "f") && !__classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")) {
390
372
  __classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, true, "f");
391
373
  const durationMs = Date.now() - startTime;
@@ -625,15 +607,9 @@ class AssetsController extends base_controller_1.BaseController {
625
607
  hasBalance: Boolean(response.assetsBalance),
626
608
  hasPrice: Boolean(response.assetsPrice),
627
609
  });
628
- // Run through enrichment middlewares (Detection, then Token + Price in parallel)
610
+ // Run through enrichment middlewares (Event Stack: Detection Token Price)
629
611
  // Include 'metadata' in dataTypes so TokenDataSource runs to enrich detected assets
630
- const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [
631
- __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
632
- (0, ParallelMiddleware_1.createParallelMiddleware)([
633
- __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
634
- __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
635
- ]),
636
- ], 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 ?? {
637
613
  accountsWithSupportedChains: [],
638
614
  chainIds: [],
639
615
  dataTypes: ['balance', 'metadata', 'price'],
@@ -673,7 +649,7 @@ class AssetsController extends base_controller_1.BaseController {
673
649
  }
674
650
  }
675
651
  exports.AssetsController = AssetsController;
676
- _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() {
677
653
  return this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
678
654
  }, _AssetsController_allBalanceDataSources_get = function _AssetsController_allBalanceDataSources_get() {
679
655
  return [
@@ -723,27 +699,9 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
723
699
  this.messenger.subscribe('NetworkEnablementController:stateChange', ({ enabledNetworkMap }) => {
724
700
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleEnabledNetworksChanged).call(this, enabledNetworkMap).catch(console.error);
725
701
  });
726
- // Client + Keyring lifecycle: only run when UI is open AND keyring is unlocked
727
- this.messenger.subscribe('ClientController:stateChange', (isUiOpen) => {
728
- __classPrivateFieldSet(this, _AssetsController_uiOpen, isUiOpen, "f");
729
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
730
- }, client_controller_1.clientControllerSelectors.selectIsUiOpen);
731
- this.messenger.subscribe('KeyringController:unlock', () => {
732
- __classPrivateFieldSet(this, _AssetsController_keyringUnlocked, true, "f");
733
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
734
- });
735
- this.messenger.subscribe('KeyringController:lock', () => {
736
- __classPrivateFieldSet(this, _AssetsController_keyringUnlocked, false, "f");
737
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
738
- });
739
- }, _AssetsController_updateActive = function _AssetsController_updateActive() {
740
- const shouldRun = __classPrivateFieldGet(this, _AssetsController_uiOpen, "f") && __classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f");
741
- if (shouldRun) {
742
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_start).call(this);
743
- }
744
- else {
745
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
746
- }
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));
747
705
  }, _AssetsController_registerActionHandlers = function _AssetsController_registerActionHandlers() {
748
706
  this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
749
707
  }, _AssetsController_executeMiddlewares =
@@ -801,8 +759,8 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
801
759
  // STATE MANAGEMENT
802
760
  // ============================================================================
803
761
  async function _AssetsController_updateState(response) {
762
+ // Normalize asset IDs (checksum EVM addresses) before storing in state
804
763
  const normalizedResponse = normalizeResponse(response);
805
- const mode = normalizedResponse.updateMode ?? 'merge';
806
764
  const releaseLock = await __classPrivateFieldGet(this, _AssetsController_controllerMutex, "f").acquire();
807
765
  try {
808
766
  const previousState = this.state;
@@ -828,27 +786,15 @@ async function _AssetsController_updateState(response) {
828
786
  if (normalizedResponse.assetsBalance) {
829
787
  for (const [accountId, accountBalances] of Object.entries(normalizedResponse.assetsBalance)) {
830
788
  const previousBalances = previousState.assetsBalance[accountId] ?? {};
831
- const customAssetIds = state.customAssets[accountId] ?? [];
832
- // Full: response is authoritative; preserve custom assets not in response. Merge: response overlays previous.
833
- const effective = mode === 'full'
834
- ? (() => {
835
- const next = {
836
- ...accountBalances,
837
- };
838
- for (const customId of customAssetIds) {
839
- if (!(customId in next)) {
840
- const prev = previousBalances[customId];
841
- next[customId] =
842
- prev ?? { amount: '0' };
843
- }
844
- }
845
- return next;
846
- })()
847
- : { ...previousBalances, ...accountBalances };
848
- 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)) {
849
793
  const previousBalance = previousBalances[assetId];
850
- const newAmount = balance.amount;
794
+ const balanceData = balance;
795
+ const newAmount = balanceData.amount;
851
796
  const oldAmount = previousBalance?.amount;
797
+ // Track if balance actually changed
852
798
  if (oldAmount !== newAmount) {
853
799
  changedBalances.push({
854
800
  accountId,
@@ -858,7 +804,7 @@ async function _AssetsController_updateState(response) {
858
804
  });
859
805
  }
860
806
  }
861
- balances[accountId] = effective;
807
+ Object.assign(balances[accountId], accountBalances);
862
808
  }
863
809
  }
864
810
  // Update prices in state
@@ -1036,7 +982,7 @@ async function _AssetsController_updateState(response) {
1036
982
  }
1037
983
  __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").clear();
1038
984
  }, _AssetsController_subscribeAssets = function _AssetsController_subscribeAssets() {
1039
- 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) {
1040
986
  return;
1041
987
  }
1042
988
  // Subscribe to balance updates (batched by data source)