@metamask-previews/assets-controller 0.2.0-preview-d01b2f93d → 1.0.0-preview-cbcea9611

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 (72) hide show
  1. package/CHANGELOG.md +20 -1
  2. package/dist/AssetsController.cjs +96 -161
  3. package/dist/AssetsController.cjs.map +1 -1
  4. package/dist/AssetsController.d.cts +9 -15
  5. package/dist/AssetsController.d.cts.map +1 -1
  6. package/dist/AssetsController.d.mts +9 -15
  7. package/dist/AssetsController.d.mts.map +1 -1
  8. package/dist/AssetsController.mjs +96 -161
  9. package/dist/AssetsController.mjs.map +1 -1
  10. package/dist/data-sources/AbstractDataSource.cjs +8 -0
  11. package/dist/data-sources/AbstractDataSource.cjs.map +1 -1
  12. package/dist/data-sources/AbstractDataSource.d.cts +6 -0
  13. package/dist/data-sources/AbstractDataSource.d.cts.map +1 -1
  14. package/dist/data-sources/AbstractDataSource.d.mts +6 -0
  15. package/dist/data-sources/AbstractDataSource.d.mts.map +1 -1
  16. package/dist/data-sources/AbstractDataSource.mjs +8 -0
  17. package/dist/data-sources/AbstractDataSource.mjs.map +1 -1
  18. package/dist/data-sources/AccountsApiDataSource.cjs +4 -2
  19. package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
  20. package/dist/data-sources/AccountsApiDataSource.d.cts +2 -2
  21. package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
  22. package/dist/data-sources/AccountsApiDataSource.d.mts +2 -2
  23. package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
  24. package/dist/data-sources/AccountsApiDataSource.mjs +4 -2
  25. package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
  26. package/dist/data-sources/BackendWebsocketDataSource.cjs +6 -3
  27. package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -1
  28. package/dist/data-sources/BackendWebsocketDataSource.d.cts +2 -2
  29. package/dist/data-sources/BackendWebsocketDataSource.d.cts.map +1 -1
  30. package/dist/data-sources/BackendWebsocketDataSource.d.mts +2 -2
  31. package/dist/data-sources/BackendWebsocketDataSource.d.mts.map +1 -1
  32. package/dist/data-sources/BackendWebsocketDataSource.mjs +6 -3
  33. package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -1
  34. package/dist/data-sources/RpcDataSource.cjs +9 -6
  35. package/dist/data-sources/RpcDataSource.cjs.map +1 -1
  36. package/dist/data-sources/RpcDataSource.d.cts +2 -2
  37. package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
  38. package/dist/data-sources/RpcDataSource.d.mts +2 -2
  39. package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
  40. package/dist/data-sources/RpcDataSource.mjs +9 -6
  41. package/dist/data-sources/RpcDataSource.mjs.map +1 -1
  42. package/dist/data-sources/SnapDataSource.cjs +4 -2
  43. package/dist/data-sources/SnapDataSource.cjs.map +1 -1
  44. package/dist/data-sources/SnapDataSource.d.cts +2 -2
  45. package/dist/data-sources/SnapDataSource.d.cts.map +1 -1
  46. package/dist/data-sources/SnapDataSource.d.mts +2 -2
  47. package/dist/data-sources/SnapDataSource.d.mts.map +1 -1
  48. package/dist/data-sources/SnapDataSource.mjs +4 -2
  49. package/dist/data-sources/SnapDataSource.mjs.map +1 -1
  50. package/dist/index.cjs +6 -1
  51. package/dist/index.cjs.map +1 -1
  52. package/dist/index.d.cts +3 -1
  53. package/dist/index.d.cts.map +1 -1
  54. package/dist/index.d.mts +3 -1
  55. package/dist/index.d.mts.map +1 -1
  56. package/dist/index.mjs +2 -0
  57. package/dist/index.mjs.map +1 -1
  58. package/dist/selectors/balance.cjs +306 -0
  59. package/dist/selectors/balance.cjs.map +1 -0
  60. package/dist/selectors/balance.d.cts +22 -0
  61. package/dist/selectors/balance.d.cts.map +1 -0
  62. package/dist/selectors/balance.d.mts +22 -0
  63. package/dist/selectors/balance.d.mts.map +1 -0
  64. package/dist/selectors/balance.mjs +297 -0
  65. package/dist/selectors/balance.mjs.map +1 -0
  66. package/dist/types.cjs.map +1 -1
  67. package/dist/types.d.cts +1 -15
  68. package/dist/types.d.cts.map +1 -1
  69. package/dist/types.d.mts +1 -15
  70. package/dist/types.d.mts.map +1 -1
  71. package/dist/types.mjs.map +1 -1
  72. package/package.json +5 -5
package/CHANGELOG.md CHANGED
@@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Changed
11
+
12
+ - Hide native tokens on Tempo networks (testnet and mainnet) in `getAssets` method ([#7882](https://github.com/MetaMask/core/pull/7882))
13
+ - Bump `@metamask/keyring-api` from `^21.0.0` to `^21.5.0` ([#7857](https://github.com/MetaMask/core/pull/7857))
14
+ - Bump `@metamask/keyring-internal-api` from `^9.0.0` to `^10.0.0` ([#7857](https://github.com/MetaMask/core/pull/7857))
15
+ - Bump `@metamask/keyring-snap-client` from `^8.0.0` to `^8.2.0` ([#7857](https://github.com/MetaMask/core/pull/7857))
16
+
17
+ ## [1.0.0]
18
+
19
+ ### Added
20
+
21
+ - Add balance selectors `getAggregatedBalanceForAccount`, `getGroupIdForAccount`, and `getInternalAccountsForGroup` with types `AggregatedBalanceEntry`, `AggregatedBalanceForAccount`, `EnabledNetworkMap`, and `AccountsById` for aggregated portfolio balance (optionally by account group), fiat total, and portfolio-weighted 1d price change ([#7864](https://github.com/MetaMask/core/pull/7864))
22
+
23
+ ### Changed
24
+
25
+ - **BREAKING:** Require `previousChains` in `handleActiveChainsUpdate(dataSourceId, activeChains, previousChains)` and in the `onActiveChainsUpdated` callback used by data sources; the third parameter is no longer optional. Callers and data sources must pass the previous chain list for correct added/removed chain diff computation ([#7867](https://github.com/MetaMask/core/pull/7867))
26
+ - Bump `@metamask/account-tree-controller` from `^4.0.0` to `^4.1.0` ([#7869](https://github.com/MetaMask/core/pull/7869))
27
+
10
28
  ### Removed
11
29
 
12
30
  - **BREAKING:** Remove `initDataSources` and related exports (`InitDataSourcesOptions`, `DataSources`, `DataSourceActions`, `DataSourceEvents`, `DataSourceAllowedActions`, `DataSourceAllowedEvents`, `RootMessenger`). Initialize assets by creating `AssetsController` with `queryApiClient`; the controller instantiates all data sources internally ([#7859](https://github.com/MetaMask/core/pull/7859))
@@ -48,6 +66,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
48
66
  - Refactor `RpcDataSource` to delegate polling to `BalanceFetcher` and `TokenDetector` services ([#7709](https://github.com/MetaMask/core/pull/7709))
49
67
  - Refactor `BalanceFetcher` and `TokenDetector` to extend `StaticIntervalPollingControllerOnly` for independent polling management ([#7709](https://github.com/MetaMask/core/pull/7709))
50
68
 
51
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@0.2.0...HEAD
69
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@1.0.0...HEAD
70
+ [1.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@0.2.0...@metamask/assets-controller@1.0.0
52
71
  [0.2.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@0.1.0...@metamask/assets-controller@0.2.0
53
72
  [0.1.0]: https://github.com/MetaMask/core/releases/tag/@metamask/assets-controller@0.1.0
@@ -1,19 +1,19 @@
1
1
  "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
+ };
2
7
  var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
8
  if (kind === "m") throw new TypeError("Private method is not writable");
4
9
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
10
  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");
6
11
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
12
  };
8
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
- };
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_defaultUpdateInterval, _AssetsController_controllerMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_selectedAccounts_get, _AssetsController_dataSources, _AssetsController_backendWebsocketDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_tokenDataSource, _AssetsController_getBalanceDataSource, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_registerActionHandlers, _AssetsController_executeMiddlewares, _AssetsController_assignChainsToDataSources, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeToDataSources, _AssetsController_subscribeAssetsBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_getAccountsForChains, _AssetsController_subscribeToDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged;
16
+ var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_defaultUpdateInterval, _AssetsController_controllerMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_selectedAccounts_get, _AssetsController_backendWebsocketDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_subscriptionBalanceDataSources_get, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_tokenDataSource, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_registerActionHandlers, _AssetsController_executeMiddlewares, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_shouldHideNativeToken, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeAssets, _AssetsController_subscribeAssetsBalance, _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");
@@ -207,12 +207,6 @@ class AssetsController extends base_controller_1.BaseController {
207
207
  _AssetsController_activeSubscriptions.set(this, new Map());
208
208
  /** Currently enabled chains from NetworkEnablementController */
209
209
  _AssetsController_enabledChains.set(this, new Set());
210
- /**
211
- * Registered data sources with their available chains.
212
- * Updated continuously and independently from subscription flows.
213
- * Key: sourceId, Value: Set of currently available chainIds
214
- */
215
- _AssetsController_dataSources.set(this, new Map());
216
210
  _AssetsController_backendWebsocketDataSource.set(this, void 0);
217
211
  _AssetsController_accountsApiDataSource.set(this, void 0);
218
212
  _AssetsController_snapDataSource.set(this, void 0);
@@ -223,24 +217,23 @@ class AssetsController extends base_controller_1.BaseController {
223
217
  __classPrivateFieldSet(this, _AssetsController_isEnabled, isEnabled(), "f");
224
218
  __classPrivateFieldSet(this, _AssetsController_defaultUpdateInterval, defaultUpdateInterval, "f");
225
219
  const rpcConfig = rpcDataSourceConfig ?? {};
220
+ const onActiveChainsUpdated = (dataSourceName, chains, previousChains) => this.handleActiveChainsUpdate(dataSourceName, chains, previousChains);
226
221
  __classPrivateFieldSet(this, _AssetsController_backendWebsocketDataSource, new BackendWebsocketDataSource_1.BackendWebsocketDataSource({
227
222
  messenger: this.messenger,
228
223
  queryApiClient,
229
- onActiveChainsUpdated: (chains) => this.handleActiveChainsUpdate('BackendWebsocketDataSource', chains),
224
+ onActiveChainsUpdated,
230
225
  }), "f");
231
226
  __classPrivateFieldSet(this, _AssetsController_accountsApiDataSource, new AccountsApiDataSource_1.AccountsApiDataSource({
232
227
  queryApiClient,
233
- onActiveChainsUpdated: (chains) => {
234
- this.handleActiveChainsUpdate('AccountsApiDataSource', chains);
235
- },
228
+ onActiveChainsUpdated,
236
229
  }), "f");
237
230
  __classPrivateFieldSet(this, _AssetsController_snapDataSource, new SnapDataSource_1.SnapDataSource({
238
231
  messenger: this.messenger,
239
- onActiveChainsUpdated: (chains) => this.handleActiveChainsUpdate('SnapDataSource', chains),
232
+ onActiveChainsUpdated,
240
233
  }), "f");
241
234
  __classPrivateFieldSet(this, _AssetsController_rpcDataSource, new RpcDataSource_1.RpcDataSource({
242
235
  messenger: this.messenger,
243
- onActiveChainsUpdated: (chains) => this.handleActiveChainsUpdate('RpcDataSource', chains),
236
+ onActiveChainsUpdated,
244
237
  ...rpcConfig,
245
238
  }), "f");
246
239
  __classPrivateFieldSet(this, _AssetsController_tokenDataSource, new TokenDataSource_1.TokenDataSource({
@@ -250,10 +243,6 @@ class AssetsController extends base_controller_1.BaseController {
250
243
  queryApiClient,
251
244
  }), "f");
252
245
  __classPrivateFieldSet(this, _AssetsController_detectionMiddleware, new DetectionMiddleware_1.DetectionMiddleware(), "f");
253
- __classPrivateFieldGet(this, _AssetsController_dataSources, "f").set('BackendWebsocketDataSource', new Set());
254
- __classPrivateFieldGet(this, _AssetsController_dataSources, "f").set('AccountsApiDataSource', new Set());
255
- __classPrivateFieldGet(this, _AssetsController_dataSources, "f").set('SnapDataSource', new Set());
256
- __classPrivateFieldGet(this, _AssetsController_dataSources, "f").set('RpcDataSource', new Set());
257
246
  if (!__classPrivateFieldGet(this, _AssetsController_isEnabled, "f")) {
258
247
  log('AssetsController is disabled, skipping initialization');
259
248
  return;
@@ -266,56 +255,34 @@ class AssetsController extends base_controller_1.BaseController {
266
255
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_registerActionHandlers).call(this);
267
256
  }
268
257
  // ============================================================================
269
- // DATA SOURCE MANAGEMENT
270
- // ============================================================================
271
- /**
272
- * Register data sources with the controller.
273
- * Order of the array determines subscription order.
274
- *
275
- * Data sources report chain changes via the onActiveChainsUpdated callback passed at construction.
276
- *
277
- * @param dataSourceIds - Array of data source identifiers to register.
278
- */
279
- registerDataSources(dataSourceIds) {
280
- for (const id of dataSourceIds) {
281
- log('Registering data source', { id });
282
- // Initialize available chains tracking for this source
283
- __classPrivateFieldGet(this, _AssetsController_dataSources, "f").set(id, new Set());
284
- }
285
- }
286
- // ============================================================================
287
258
  // DATA SOURCE CHAIN MANAGEMENT
288
259
  // ============================================================================
289
260
  /**
290
- * Handle when a data source's active chains change.
291
- * Active chains are chains that are both supported AND available.
292
- * Updates centralized chain tracking and triggers re-selection if needed.
261
+ * Handle when a data source's supported chains change.
262
+ * Used to refresh balance subscriptions and run a one-time fetch when a new chain is supported.
263
+ *
264
+ * - On any add/remove: re-subscribes to data sources so chain assignment stays correct.
265
+ * - When chains are added: fetches balances for the new chains (for selected accounts on enabled networks).
293
266
  *
294
- * Called from the onActiveChainsUpdated callbacks passed to data sources at construction.
267
+ * Controller does not store chains; sources report via this callback. previousChains is required for diff.
295
268
  *
296
269
  * @param dataSourceId - The identifier of the data source reporting the change.
297
- * @param activeChains - Array of currently active chain IDs for this source.
270
+ * @param activeChains - Currently active (supported and available) chain IDs for this source.
271
+ * @param previousChains - Previous chains; used to compute added/removed.
298
272
  */
299
- handleActiveChainsUpdate(dataSourceId, activeChains) {
273
+ handleActiveChainsUpdate(dataSourceId, activeChains, previousChains) {
300
274
  log('Data source active chains changed', {
301
275
  dataSourceId,
302
276
  chainCount: activeChains.length,
303
277
  chains: activeChains,
304
278
  });
305
- // When BackendWebsocketDataSource is updated via AccountsApiDataSource callback, sync its state
306
- if (dataSourceId === 'BackendWebsocketDataSource') {
307
- __classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f").setActiveChainsFromAccountsApi(activeChains);
308
- }
309
- const previousChains = __classPrivateFieldGet(this, _AssetsController_dataSources, "f").get(dataSourceId) ?? new Set();
310
- const newChains = new Set(activeChains);
311
- // Update centralized available chains tracking
312
- __classPrivateFieldGet(this, _AssetsController_dataSources, "f").set(dataSourceId, newChains);
313
- // Check for changes
314
- const addedChains = activeChains.filter((chain) => !previousChains.has(chain));
315
- const removedChains = Array.from(previousChains).filter((chain) => !newChains.has(chain));
279
+ const previous = previousChains;
280
+ const previousSet = new Set(previous);
281
+ const addedChains = activeChains.filter((ch) => !previousSet.has(ch));
282
+ const removedChains = previous.filter((ch) => !activeChains.includes(ch));
316
283
  if (addedChains.length > 0 || removedChains.length > 0) {
317
284
  // Refresh subscriptions to use updated data source availability
318
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToDataSources).call(this);
285
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
319
286
  }
320
287
  // If chains were added and we have selected accounts, do one-time fetch
321
288
  if (addedChains.length > 0 && __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
@@ -512,6 +479,9 @@ class AssetsController extends base_controller_1.BaseController {
512
479
  }
513
480
  });
514
481
  }
482
+ // ============================================================================
483
+ // SUBSCRIPTIONS
484
+ // ============================================================================
515
485
  /**
516
486
  * Subscribe to price updates for all assets held by the given accounts.
517
487
  * Polls PriceDataSource which fetches prices from balance state.
@@ -594,7 +564,7 @@ class AssetsController extends base_controller_1.BaseController {
594
564
  // ============================================================================
595
565
  destroy() {
596
566
  log('Destroying AssetsController', {
597
- dataSourceCount: __classPrivateFieldGet(this, _AssetsController_dataSources, "f").size,
567
+ dataSourceCount: __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get).length,
598
568
  subscriptionCount: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").size,
599
569
  });
600
570
  // Destroy instantiated data sources
@@ -607,8 +577,6 @@ class AssetsController extends base_controller_1.BaseController {
607
577
  'function') {
608
578
  __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f").destroy();
609
579
  }
610
- // Clear data sources
611
- __classPrivateFieldGet(this, _AssetsController_dataSources, "f").clear();
612
580
  // Stop all active subscriptions
613
581
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
614
582
  // Unregister action handlers
@@ -624,21 +592,15 @@ class AssetsController extends base_controller_1.BaseController {
624
592
  }
625
593
  }
626
594
  exports.AssetsController = AssetsController;
627
- _AssetsController_isEnabled = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_controllerMutex = new WeakMap(), _AssetsController_activeSubscriptions = new WeakMap(), _AssetsController_enabledChains = new WeakMap(), _AssetsController_dataSources = new WeakMap(), _AssetsController_backendWebsocketDataSource = new WeakMap(), _AssetsController_accountsApiDataSource = new WeakMap(), _AssetsController_snapDataSource = new WeakMap(), _AssetsController_rpcDataSource = new WeakMap(), _AssetsController_priceDataSource = new WeakMap(), _AssetsController_detectionMiddleware = new WeakMap(), _AssetsController_tokenDataSource = new WeakMap(), _AssetsController_instances = new WeakSet(), _AssetsController_selectedAccounts_get = function _AssetsController_selectedAccounts_get() {
595
+ _AssetsController_isEnabled = new WeakMap(), _AssetsController_defaultUpdateInterval = 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_priceDataSource = new WeakMap(), _AssetsController_detectionMiddleware = new WeakMap(), _AssetsController_tokenDataSource = new WeakMap(), _AssetsController_instances = new WeakSet(), _AssetsController_selectedAccounts_get = function _AssetsController_selectedAccounts_get() {
628
596
  return this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
629
- }, _AssetsController_getBalanceDataSource = function _AssetsController_getBalanceDataSource(sourceId) {
630
- switch (sourceId) {
631
- case 'BackendWebsocketDataSource':
632
- return __classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f");
633
- case 'AccountsApiDataSource':
634
- return __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f");
635
- case 'SnapDataSource':
636
- return __classPrivateFieldGet(this, _AssetsController_snapDataSource, "f");
637
- case 'RpcDataSource':
638
- return __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f");
639
- default:
640
- return undefined;
641
- }
597
+ }, _AssetsController_subscriptionBalanceDataSources_get = function _AssetsController_subscriptionBalanceDataSources_get() {
598
+ return [
599
+ __classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f"),
600
+ __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
601
+ __classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"),
602
+ __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
603
+ ];
642
604
  }, _AssetsController_initializeState = function _AssetsController_initializeState() {
643
605
  const { enabledNetworkMap } = this.messenger.call('NetworkEnablementController:getState');
644
606
  __classPrivateFieldSet(this, _AssetsController_enabledChains, __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_extractEnabledChains).call(this, enabledNetworkMap), "f");
@@ -713,32 +675,6 @@ async function _AssetsController_executeMiddlewares(middlewares, request, initia
713
675
  getAssetsState: () => this.state,
714
676
  });
715
677
  return result.response;
716
- }, _AssetsController_assignChainsToDataSources = function _AssetsController_assignChainsToDataSources(requestedChains) {
717
- const assignment = new Map();
718
- const remainingChains = new Set(requestedChains);
719
- for (const sourceId of __classPrivateFieldGet(this, _AssetsController_dataSources, "f").keys()) {
720
- // Get available chains for this data source
721
- const availableChains = __classPrivateFieldGet(this, _AssetsController_dataSources, "f").get(sourceId);
722
- if (!availableChains || availableChains.size === 0) {
723
- continue;
724
- }
725
- const chainsForThisSource = [];
726
- for (const chainId of remainingChains) {
727
- // Check if this chain is available on this source
728
- if (availableChains.has(chainId)) {
729
- chainsForThisSource.push(chainId);
730
- remainingChains.delete(chainId);
731
- }
732
- }
733
- if (chainsForThisSource.length > 0) {
734
- assignment.set(sourceId, chainsForThisSource);
735
- log('Assigned chains to data source', {
736
- sourceId,
737
- chains: chainsForThisSource,
738
- });
739
- }
740
- }
741
- return assignment;
742
678
  }, _AssetsController_updateState =
743
679
  // ============================================================================
744
680
  // STATE MANAGEMENT
@@ -879,6 +815,10 @@ async function _AssetsController_updateState(response) {
879
815
  continue;
880
816
  }
881
817
  const assetChainId = extractChainId(typedAssetId);
818
+ // Skip native tokens on Tempo networks
819
+ if (__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_shouldHideNativeToken).call(this, assetChainId, typedAssetId, metadata)) {
820
+ continue;
821
+ }
882
822
  if (!chainIdSet.has(assetChainId)) {
883
823
  continue;
884
824
  }
@@ -912,6 +852,18 @@ async function _AssetsController_updateState(response) {
912
852
  }
913
853
  }
914
854
  return result;
855
+ }, _AssetsController_shouldHideNativeToken = function _AssetsController_shouldHideNativeToken(chainId, assetId, metadata) {
856
+ const TEMPO_CHAIN_IDS = ['eip155:42431', 'eip155:4217']; // Tempo Testnet (42431) and Mainnet (4217)
857
+ // Check if it's a Tempo network
858
+ if (!TEMPO_CHAIN_IDS.includes(chainId)) {
859
+ return false;
860
+ }
861
+ // Check if it's a native token (either by metadata type or assetId format)
862
+ const isNative = metadata.type === 'native' || assetId.includes('/slip44:');
863
+ if (isNative) {
864
+ return true;
865
+ }
866
+ return false;
915
867
  }, _AssetsController_tokenStandardToAssetType = function _AssetsController_tokenStandardToAssetType(tokenStandard) {
916
868
  switch (tokenStandard) {
917
869
  case 'native':
@@ -932,7 +884,7 @@ async function _AssetsController_updateState(response) {
932
884
  selectedAccountCount: __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length,
933
885
  enabledChainCount: __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size,
934
886
  });
935
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToDataSources).call(this);
887
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
936
888
  if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
937
889
  this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
938
890
  chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
@@ -953,77 +905,67 @@ async function _AssetsController_updateState(response) {
953
905
  // Convert to array first to avoid modifying map during iteration
954
906
  const subscriptionKeys = [...__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").keys()];
955
907
  for (const subscriptionKey of subscriptionKeys) {
956
- // Extract sourceId from subscription key (format: "ds:${sourceId}")
957
908
  if (subscriptionKey.startsWith('ds:')) {
958
909
  const sourceId = subscriptionKey.slice(3);
959
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, sourceId);
910
+ const source = __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get).find((ds) => ds.getName() === sourceId);
911
+ if (source) {
912
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
913
+ }
960
914
  }
961
915
  }
962
916
  __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").clear();
963
- }, _AssetsController_subscribeToDataSources = function _AssetsController_subscribeToDataSources() {
917
+ }, _AssetsController_subscribeAssets = function _AssetsController_subscribeAssets() {
964
918
  if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length === 0) {
965
919
  return;
966
920
  }
967
921
  // Subscribe to balance updates (batched by data source)
968
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalance).call(this);
922
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalance).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [
923
+ ...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f"),
924
+ ]);
969
925
  // Subscribe to price updates for all assets held by selected accounts
970
926
  this.subscribeAssetsPrice(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")]);
971
- }, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance() {
972
- // Step 1: Build chain -> accounts mapping based on account scopes and enabled networks
973
- const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), __classPrivateFieldGet(this, _AssetsController_enabledChains, "f"));
974
- // Step 2: Split by data source active chains (ordered by priority)
975
- // Get all chains that need to be subscribed
927
+ }, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance(accounts, chainIds) {
928
+ const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, accounts, new Set(chainIds));
976
929
  const remainingChains = new Set(chainToAccounts.keys());
977
- // Assign chains to data sources based on availability (ordered by priority)
978
- const chainAssignment = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_assignChainsToDataSources).call(this, Array.from(remainingChains));
979
- log('Subscribe - chain assignment', {
980
- totalChains: remainingChains.size,
981
- dataSourceAssignments: Array.from(chainAssignment.entries()).map(([sourceId, chains]) => ({ sourceId, chainCount: chains.length })),
982
- });
983
- // Subscribe to each data source with its assigned chains and relevant accounts
984
- for (const sourceId of __classPrivateFieldGet(this, _AssetsController_dataSources, "f").keys()) {
985
- const assignedChains = chainAssignment.get(sourceId);
986
- if (!assignedChains || assignedChains.length === 0) {
987
- // Unsubscribe from data sources with no assigned chains
988
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, sourceId);
989
- continue;
930
+ for (const source of __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get)) {
931
+ const availableChains = new Set(source.getActiveChainsSync());
932
+ const assignedChains = [];
933
+ for (const chainId of remainingChains) {
934
+ if (availableChains.has(chainId)) {
935
+ assignedChains.push(chainId);
936
+ remainingChains.delete(chainId);
937
+ }
990
938
  }
991
- // Collect unique accounts that need any of the assigned chains
992
- const accountsForSource = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAccountsForChains).call(this, assignedChains, chainToAccounts);
993
- if (accountsForSource.length === 0) {
939
+ if (assignedChains.length === 0) {
940
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
994
941
  continue;
995
942
  }
996
- // Subscribe with ONE call per data source
997
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToDataSource).call(this, sourceId, accountsForSource, assignedChains);
943
+ const seenIds = new Set();
944
+ const accountsForSource = assignedChains
945
+ .flatMap((chainId) => chainToAccounts.get(chainId) ?? [])
946
+ .filter((account) => !seenIds.has(account.id) && (seenIds.add(account.id), true));
947
+ if (accountsForSource.length > 0) {
948
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeDataSource).call(this, source, accountsForSource, assignedChains);
949
+ }
998
950
  }
999
951
  }, _AssetsController_buildChainToAccountsMap = function _AssetsController_buildChainToAccountsMap(accounts, chainsToSubscribe) {
1000
952
  const chainToAccounts = new Map();
1001
953
  for (const account of accounts) {
1002
- const accountChains = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getEnabledChainsForAccount).call(this, account);
1003
- for (const chainId of accountChains) {
954
+ for (const chainId of __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getEnabledChainsForAccount).call(this, account)) {
1004
955
  if (!chainsToSubscribe.has(chainId)) {
1005
956
  continue;
1006
957
  }
1007
- const existingAccounts = chainToAccounts.get(chainId) ?? [];
1008
- existingAccounts.push(account);
1009
- chainToAccounts.set(chainId, existingAccounts);
1010
- }
1011
- }
1012
- return chainToAccounts;
1013
- }, _AssetsController_getAccountsForChains = function _AssetsController_getAccountsForChains(chains, chainToAccounts) {
1014
- const accountIds = new Set();
1015
- const accounts = [];
1016
- for (const chainId of chains) {
1017
- const chainAccounts = chainToAccounts.get(chainId) ?? [];
1018
- for (const account of chainAccounts) {
1019
- if (!accountIds.has(account.id)) {
1020
- accountIds.add(account.id);
1021
- accounts.push(account);
958
+ let list = chainToAccounts.get(chainId);
959
+ if (!list) {
960
+ list = [];
961
+ chainToAccounts.set(chainId, list);
1022
962
  }
963
+ list.push(account);
1023
964
  }
1024
965
  }
1025
- return accounts;
1026
- }, _AssetsController_subscribeToDataSource = function _AssetsController_subscribeToDataSource(sourceId, accounts, chains) {
966
+ return chainToAccounts;
967
+ }, _AssetsController_subscribeDataSource = function _AssetsController_subscribeDataSource(source, accounts, chains) {
968
+ const sourceId = source.getName();
1027
969
  const subscriptionKey = `ds:${sourceId}`;
1028
970
  const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
1029
971
  const isUpdate = existingSubscription !== undefined;
@@ -1045,11 +987,7 @@ async function _AssetsController_updateState(response) {
1045
987
  onAssetsUpdate: (response) => this.handleAssetsUpdate(response, sourceId),
1046
988
  getAssetsState: () => this.state,
1047
989
  };
1048
- const balanceDs = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getBalanceDataSource).call(this, sourceId);
1049
- if (!balanceDs) {
1050
- return;
1051
- }
1052
- balanceDs.subscribe(subscribeReq).catch((error) => {
990
+ source.subscribe(subscribeReq).catch((error) => {
1053
991
  console.error(`[AssetsController] Failed to subscribe to '${sourceId}':`, error);
1054
992
  });
1055
993
  // Track subscription
@@ -1063,14 +1001,11 @@ async function _AssetsController_updateState(response) {
1063
1001
  },
1064
1002
  };
1065
1003
  __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").set(subscriptionKey, subscription);
1066
- }, _AssetsController_unsubscribeDataSource = function _AssetsController_unsubscribeDataSource(sourceId) {
1067
- const subscriptionKey = `ds:${sourceId}`;
1004
+ }, _AssetsController_unsubscribeDataSource = function _AssetsController_unsubscribeDataSource(source) {
1005
+ const subscriptionKey = `ds:${source.getName()}`;
1068
1006
  const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
1069
1007
  if (existingSubscription) {
1070
- const balanceDs = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getBalanceDataSource).call(this, sourceId);
1071
- if (balanceDs) {
1072
- balanceDs.unsubscribe(subscriptionKey).catch(() => undefined);
1073
- }
1008
+ source.unsubscribe(subscriptionKey).catch(() => undefined);
1074
1009
  existingSubscription.unsubscribe();
1075
1010
  }
1076
1011
  }, _AssetsController_buildDataRequest = function _AssetsController_buildDataRequest(accounts, chainIds, partial = {}) {
@@ -1118,7 +1053,7 @@ async function _AssetsController_handleAccountGroupChanged() {
1118
1053
  accountIds: accounts.map((a) => a.id),
1119
1054
  });
1120
1055
  // Subscribe and fetch for the new account group
1121
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToDataSources).call(this);
1056
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
1122
1057
  if (accounts.length > 0) {
1123
1058
  await this.getAssets(accounts, {
1124
1059
  chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
@@ -1152,7 +1087,7 @@ async function _AssetsController_handleAccountGroupChanged() {
1152
1087
  // Users may want to see historical balances even if the network is currently disabled.
1153
1088
  // The data will simply not be updated until the network is re-enabled.
1154
1089
  // Refresh subscriptions for new chain set
1155
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToDataSources).call(this);
1090
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
1156
1091
  // Do one-time fetch for newly enabled chains
1157
1092
  if (addedChains.length > 0 && __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
1158
1093
  await this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {