@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
@@ -1,15 +1,15 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ 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");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
1
6
  var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
7
  if (kind === "m") throw new TypeError("Private method is not writable");
3
8
  if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
10
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
11
  };
7
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
- 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");
10
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
- };
12
- 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;
12
+ 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;
13
13
  import { BaseController } from "@metamask/base-controller";
14
14
  import { parseCaipAssetType } from "@metamask/utils";
15
15
  import { Mutex } from "async-mutex";
@@ -201,12 +201,6 @@ export class AssetsController extends BaseController {
201
201
  _AssetsController_activeSubscriptions.set(this, new Map());
202
202
  /** Currently enabled chains from NetworkEnablementController */
203
203
  _AssetsController_enabledChains.set(this, new Set());
204
- /**
205
- * Registered data sources with their available chains.
206
- * Updated continuously and independently from subscription flows.
207
- * Key: sourceId, Value: Set of currently available chainIds
208
- */
209
- _AssetsController_dataSources.set(this, new Map());
210
204
  _AssetsController_backendWebsocketDataSource.set(this, void 0);
211
205
  _AssetsController_accountsApiDataSource.set(this, void 0);
212
206
  _AssetsController_snapDataSource.set(this, void 0);
@@ -217,24 +211,23 @@ export class AssetsController extends BaseController {
217
211
  __classPrivateFieldSet(this, _AssetsController_isEnabled, isEnabled(), "f");
218
212
  __classPrivateFieldSet(this, _AssetsController_defaultUpdateInterval, defaultUpdateInterval, "f");
219
213
  const rpcConfig = rpcDataSourceConfig ?? {};
214
+ const onActiveChainsUpdated = (dataSourceName, chains, previousChains) => this.handleActiveChainsUpdate(dataSourceName, chains, previousChains);
220
215
  __classPrivateFieldSet(this, _AssetsController_backendWebsocketDataSource, new BackendWebsocketDataSource({
221
216
  messenger: this.messenger,
222
217
  queryApiClient,
223
- onActiveChainsUpdated: (chains) => this.handleActiveChainsUpdate('BackendWebsocketDataSource', chains),
218
+ onActiveChainsUpdated,
224
219
  }), "f");
225
220
  __classPrivateFieldSet(this, _AssetsController_accountsApiDataSource, new AccountsApiDataSource({
226
221
  queryApiClient,
227
- onActiveChainsUpdated: (chains) => {
228
- this.handleActiveChainsUpdate('AccountsApiDataSource', chains);
229
- },
222
+ onActiveChainsUpdated,
230
223
  }), "f");
231
224
  __classPrivateFieldSet(this, _AssetsController_snapDataSource, new SnapDataSource({
232
225
  messenger: this.messenger,
233
- onActiveChainsUpdated: (chains) => this.handleActiveChainsUpdate('SnapDataSource', chains),
226
+ onActiveChainsUpdated,
234
227
  }), "f");
235
228
  __classPrivateFieldSet(this, _AssetsController_rpcDataSource, new RpcDataSource({
236
229
  messenger: this.messenger,
237
- onActiveChainsUpdated: (chains) => this.handleActiveChainsUpdate('RpcDataSource', chains),
230
+ onActiveChainsUpdated,
238
231
  ...rpcConfig,
239
232
  }), "f");
240
233
  __classPrivateFieldSet(this, _AssetsController_tokenDataSource, new TokenDataSource({
@@ -244,10 +237,6 @@ export class AssetsController extends BaseController {
244
237
  queryApiClient,
245
238
  }), "f");
246
239
  __classPrivateFieldSet(this, _AssetsController_detectionMiddleware, new DetectionMiddleware(), "f");
247
- __classPrivateFieldGet(this, _AssetsController_dataSources, "f").set('BackendWebsocketDataSource', new Set());
248
- __classPrivateFieldGet(this, _AssetsController_dataSources, "f").set('AccountsApiDataSource', new Set());
249
- __classPrivateFieldGet(this, _AssetsController_dataSources, "f").set('SnapDataSource', new Set());
250
- __classPrivateFieldGet(this, _AssetsController_dataSources, "f").set('RpcDataSource', new Set());
251
240
  if (!__classPrivateFieldGet(this, _AssetsController_isEnabled, "f")) {
252
241
  log('AssetsController is disabled, skipping initialization');
253
242
  return;
@@ -260,56 +249,34 @@ export class AssetsController extends BaseController {
260
249
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_registerActionHandlers).call(this);
261
250
  }
262
251
  // ============================================================================
263
- // DATA SOURCE MANAGEMENT
264
- // ============================================================================
265
- /**
266
- * Register data sources with the controller.
267
- * Order of the array determines subscription order.
268
- *
269
- * Data sources report chain changes via the onActiveChainsUpdated callback passed at construction.
270
- *
271
- * @param dataSourceIds - Array of data source identifiers to register.
272
- */
273
- registerDataSources(dataSourceIds) {
274
- for (const id of dataSourceIds) {
275
- log('Registering data source', { id });
276
- // Initialize available chains tracking for this source
277
- __classPrivateFieldGet(this, _AssetsController_dataSources, "f").set(id, new Set());
278
- }
279
- }
280
- // ============================================================================
281
252
  // DATA SOURCE CHAIN MANAGEMENT
282
253
  // ============================================================================
283
254
  /**
284
- * Handle when a data source's active chains change.
285
- * Active chains are chains that are both supported AND available.
286
- * Updates centralized chain tracking and triggers re-selection if needed.
255
+ * Handle when a data source's supported chains change.
256
+ * Used to refresh balance subscriptions and run a one-time fetch when a new chain is supported.
257
+ *
258
+ * - On any add/remove: re-subscribes to data sources so chain assignment stays correct.
259
+ * - When chains are added: fetches balances for the new chains (for selected accounts on enabled networks).
287
260
  *
288
- * Called from the onActiveChainsUpdated callbacks passed to data sources at construction.
261
+ * Controller does not store chains; sources report via this callback. previousChains is required for diff.
289
262
  *
290
263
  * @param dataSourceId - The identifier of the data source reporting the change.
291
- * @param activeChains - Array of currently active chain IDs for this source.
264
+ * @param activeChains - Currently active (supported and available) chain IDs for this source.
265
+ * @param previousChains - Previous chains; used to compute added/removed.
292
266
  */
293
- handleActiveChainsUpdate(dataSourceId, activeChains) {
267
+ handleActiveChainsUpdate(dataSourceId, activeChains, previousChains) {
294
268
  log('Data source active chains changed', {
295
269
  dataSourceId,
296
270
  chainCount: activeChains.length,
297
271
  chains: activeChains,
298
272
  });
299
- // When BackendWebsocketDataSource is updated via AccountsApiDataSource callback, sync its state
300
- if (dataSourceId === 'BackendWebsocketDataSource') {
301
- __classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f").setActiveChainsFromAccountsApi(activeChains);
302
- }
303
- const previousChains = __classPrivateFieldGet(this, _AssetsController_dataSources, "f").get(dataSourceId) ?? new Set();
304
- const newChains = new Set(activeChains);
305
- // Update centralized available chains tracking
306
- __classPrivateFieldGet(this, _AssetsController_dataSources, "f").set(dataSourceId, newChains);
307
- // Check for changes
308
- const addedChains = activeChains.filter((chain) => !previousChains.has(chain));
309
- const removedChains = Array.from(previousChains).filter((chain) => !newChains.has(chain));
273
+ const previous = previousChains;
274
+ const previousSet = new Set(previous);
275
+ const addedChains = activeChains.filter((ch) => !previousSet.has(ch));
276
+ const removedChains = previous.filter((ch) => !activeChains.includes(ch));
310
277
  if (addedChains.length > 0 || removedChains.length > 0) {
311
278
  // Refresh subscriptions to use updated data source availability
312
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToDataSources).call(this);
279
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
313
280
  }
314
281
  // If chains were added and we have selected accounts, do one-time fetch
315
282
  if (addedChains.length > 0 && __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
@@ -506,6 +473,9 @@ export class AssetsController extends BaseController {
506
473
  }
507
474
  });
508
475
  }
476
+ // ============================================================================
477
+ // SUBSCRIPTIONS
478
+ // ============================================================================
509
479
  /**
510
480
  * Subscribe to price updates for all assets held by the given accounts.
511
481
  * Polls PriceDataSource which fetches prices from balance state.
@@ -588,7 +558,7 @@ export class AssetsController extends BaseController {
588
558
  // ============================================================================
589
559
  destroy() {
590
560
  log('Destroying AssetsController', {
591
- dataSourceCount: __classPrivateFieldGet(this, _AssetsController_dataSources, "f").size,
561
+ dataSourceCount: __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get).length,
592
562
  subscriptionCount: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").size,
593
563
  });
594
564
  // Destroy instantiated data sources
@@ -601,8 +571,6 @@ export class AssetsController extends BaseController {
601
571
  'function') {
602
572
  __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f").destroy();
603
573
  }
604
- // Clear data sources
605
- __classPrivateFieldGet(this, _AssetsController_dataSources, "f").clear();
606
574
  // Stop all active subscriptions
607
575
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
608
576
  // Unregister action handlers
@@ -617,21 +585,15 @@ export class AssetsController extends BaseController {
617
585
  this.messenger.unregisterActionHandler('AssetsController:unhideAsset');
618
586
  }
619
587
  }
620
- _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() {
588
+ _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() {
621
589
  return this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
622
- }, _AssetsController_getBalanceDataSource = function _AssetsController_getBalanceDataSource(sourceId) {
623
- switch (sourceId) {
624
- case 'BackendWebsocketDataSource':
625
- return __classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f");
626
- case 'AccountsApiDataSource':
627
- return __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f");
628
- case 'SnapDataSource':
629
- return __classPrivateFieldGet(this, _AssetsController_snapDataSource, "f");
630
- case 'RpcDataSource':
631
- return __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f");
632
- default:
633
- return undefined;
634
- }
590
+ }, _AssetsController_subscriptionBalanceDataSources_get = function _AssetsController_subscriptionBalanceDataSources_get() {
591
+ return [
592
+ __classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f"),
593
+ __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
594
+ __classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"),
595
+ __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
596
+ ];
635
597
  }, _AssetsController_initializeState = function _AssetsController_initializeState() {
636
598
  const { enabledNetworkMap } = this.messenger.call('NetworkEnablementController:getState');
637
599
  __classPrivateFieldSet(this, _AssetsController_enabledChains, __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_extractEnabledChains).call(this, enabledNetworkMap), "f");
@@ -706,32 +668,6 @@ async function _AssetsController_executeMiddlewares(middlewares, request, initia
706
668
  getAssetsState: () => this.state,
707
669
  });
708
670
  return result.response;
709
- }, _AssetsController_assignChainsToDataSources = function _AssetsController_assignChainsToDataSources(requestedChains) {
710
- const assignment = new Map();
711
- const remainingChains = new Set(requestedChains);
712
- for (const sourceId of __classPrivateFieldGet(this, _AssetsController_dataSources, "f").keys()) {
713
- // Get available chains for this data source
714
- const availableChains = __classPrivateFieldGet(this, _AssetsController_dataSources, "f").get(sourceId);
715
- if (!availableChains || availableChains.size === 0) {
716
- continue;
717
- }
718
- const chainsForThisSource = [];
719
- for (const chainId of remainingChains) {
720
- // Check if this chain is available on this source
721
- if (availableChains.has(chainId)) {
722
- chainsForThisSource.push(chainId);
723
- remainingChains.delete(chainId);
724
- }
725
- }
726
- if (chainsForThisSource.length > 0) {
727
- assignment.set(sourceId, chainsForThisSource);
728
- log('Assigned chains to data source', {
729
- sourceId,
730
- chains: chainsForThisSource,
731
- });
732
- }
733
- }
734
- return assignment;
735
671
  }, _AssetsController_updateState =
736
672
  // ============================================================================
737
673
  // STATE MANAGEMENT
@@ -872,6 +808,10 @@ async function _AssetsController_updateState(response) {
872
808
  continue;
873
809
  }
874
810
  const assetChainId = extractChainId(typedAssetId);
811
+ // Skip native tokens on Tempo networks
812
+ if (__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_shouldHideNativeToken).call(this, assetChainId, typedAssetId, metadata)) {
813
+ continue;
814
+ }
875
815
  if (!chainIdSet.has(assetChainId)) {
876
816
  continue;
877
817
  }
@@ -905,6 +845,18 @@ async function _AssetsController_updateState(response) {
905
845
  }
906
846
  }
907
847
  return result;
848
+ }, _AssetsController_shouldHideNativeToken = function _AssetsController_shouldHideNativeToken(chainId, assetId, metadata) {
849
+ const TEMPO_CHAIN_IDS = ['eip155:42431', 'eip155:4217']; // Tempo Testnet (42431) and Mainnet (4217)
850
+ // Check if it's a Tempo network
851
+ if (!TEMPO_CHAIN_IDS.includes(chainId)) {
852
+ return false;
853
+ }
854
+ // Check if it's a native token (either by metadata type or assetId format)
855
+ const isNative = metadata.type === 'native' || assetId.includes('/slip44:');
856
+ if (isNative) {
857
+ return true;
858
+ }
859
+ return false;
908
860
  }, _AssetsController_tokenStandardToAssetType = function _AssetsController_tokenStandardToAssetType(tokenStandard) {
909
861
  switch (tokenStandard) {
910
862
  case 'native':
@@ -925,7 +877,7 @@ async function _AssetsController_updateState(response) {
925
877
  selectedAccountCount: __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length,
926
878
  enabledChainCount: __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size,
927
879
  });
928
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToDataSources).call(this);
880
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
929
881
  if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
930
882
  this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
931
883
  chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
@@ -946,77 +898,67 @@ async function _AssetsController_updateState(response) {
946
898
  // Convert to array first to avoid modifying map during iteration
947
899
  const subscriptionKeys = [...__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").keys()];
948
900
  for (const subscriptionKey of subscriptionKeys) {
949
- // Extract sourceId from subscription key (format: "ds:${sourceId}")
950
901
  if (subscriptionKey.startsWith('ds:')) {
951
902
  const sourceId = subscriptionKey.slice(3);
952
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, sourceId);
903
+ const source = __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get).find((ds) => ds.getName() === sourceId);
904
+ if (source) {
905
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
906
+ }
953
907
  }
954
908
  }
955
909
  __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").clear();
956
- }, _AssetsController_subscribeToDataSources = function _AssetsController_subscribeToDataSources() {
910
+ }, _AssetsController_subscribeAssets = function _AssetsController_subscribeAssets() {
957
911
  if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length === 0) {
958
912
  return;
959
913
  }
960
914
  // Subscribe to balance updates (batched by data source)
961
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalance).call(this);
915
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalance).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [
916
+ ...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f"),
917
+ ]);
962
918
  // Subscribe to price updates for all assets held by selected accounts
963
919
  this.subscribeAssetsPrice(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")]);
964
- }, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance() {
965
- // Step 1: Build chain -> accounts mapping based on account scopes and enabled networks
966
- const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), __classPrivateFieldGet(this, _AssetsController_enabledChains, "f"));
967
- // Step 2: Split by data source active chains (ordered by priority)
968
- // Get all chains that need to be subscribed
920
+ }, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance(accounts, chainIds) {
921
+ const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, accounts, new Set(chainIds));
969
922
  const remainingChains = new Set(chainToAccounts.keys());
970
- // Assign chains to data sources based on availability (ordered by priority)
971
- const chainAssignment = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_assignChainsToDataSources).call(this, Array.from(remainingChains));
972
- log('Subscribe - chain assignment', {
973
- totalChains: remainingChains.size,
974
- dataSourceAssignments: Array.from(chainAssignment.entries()).map(([sourceId, chains]) => ({ sourceId, chainCount: chains.length })),
975
- });
976
- // Subscribe to each data source with its assigned chains and relevant accounts
977
- for (const sourceId of __classPrivateFieldGet(this, _AssetsController_dataSources, "f").keys()) {
978
- const assignedChains = chainAssignment.get(sourceId);
979
- if (!assignedChains || assignedChains.length === 0) {
980
- // Unsubscribe from data sources with no assigned chains
981
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, sourceId);
982
- continue;
923
+ for (const source of __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get)) {
924
+ const availableChains = new Set(source.getActiveChainsSync());
925
+ const assignedChains = [];
926
+ for (const chainId of remainingChains) {
927
+ if (availableChains.has(chainId)) {
928
+ assignedChains.push(chainId);
929
+ remainingChains.delete(chainId);
930
+ }
983
931
  }
984
- // Collect unique accounts that need any of the assigned chains
985
- const accountsForSource = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAccountsForChains).call(this, assignedChains, chainToAccounts);
986
- if (accountsForSource.length === 0) {
932
+ if (assignedChains.length === 0) {
933
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
987
934
  continue;
988
935
  }
989
- // Subscribe with ONE call per data source
990
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToDataSource).call(this, sourceId, accountsForSource, assignedChains);
936
+ const seenIds = new Set();
937
+ const accountsForSource = assignedChains
938
+ .flatMap((chainId) => chainToAccounts.get(chainId) ?? [])
939
+ .filter((account) => !seenIds.has(account.id) && (seenIds.add(account.id), true));
940
+ if (accountsForSource.length > 0) {
941
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeDataSource).call(this, source, accountsForSource, assignedChains);
942
+ }
991
943
  }
992
944
  }, _AssetsController_buildChainToAccountsMap = function _AssetsController_buildChainToAccountsMap(accounts, chainsToSubscribe) {
993
945
  const chainToAccounts = new Map();
994
946
  for (const account of accounts) {
995
- const accountChains = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getEnabledChainsForAccount).call(this, account);
996
- for (const chainId of accountChains) {
947
+ for (const chainId of __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getEnabledChainsForAccount).call(this, account)) {
997
948
  if (!chainsToSubscribe.has(chainId)) {
998
949
  continue;
999
950
  }
1000
- const existingAccounts = chainToAccounts.get(chainId) ?? [];
1001
- existingAccounts.push(account);
1002
- chainToAccounts.set(chainId, existingAccounts);
1003
- }
1004
- }
1005
- return chainToAccounts;
1006
- }, _AssetsController_getAccountsForChains = function _AssetsController_getAccountsForChains(chains, chainToAccounts) {
1007
- const accountIds = new Set();
1008
- const accounts = [];
1009
- for (const chainId of chains) {
1010
- const chainAccounts = chainToAccounts.get(chainId) ?? [];
1011
- for (const account of chainAccounts) {
1012
- if (!accountIds.has(account.id)) {
1013
- accountIds.add(account.id);
1014
- accounts.push(account);
951
+ let list = chainToAccounts.get(chainId);
952
+ if (!list) {
953
+ list = [];
954
+ chainToAccounts.set(chainId, list);
1015
955
  }
956
+ list.push(account);
1016
957
  }
1017
958
  }
1018
- return accounts;
1019
- }, _AssetsController_subscribeToDataSource = function _AssetsController_subscribeToDataSource(sourceId, accounts, chains) {
959
+ return chainToAccounts;
960
+ }, _AssetsController_subscribeDataSource = function _AssetsController_subscribeDataSource(source, accounts, chains) {
961
+ const sourceId = source.getName();
1020
962
  const subscriptionKey = `ds:${sourceId}`;
1021
963
  const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
1022
964
  const isUpdate = existingSubscription !== undefined;
@@ -1038,11 +980,7 @@ async function _AssetsController_updateState(response) {
1038
980
  onAssetsUpdate: (response) => this.handleAssetsUpdate(response, sourceId),
1039
981
  getAssetsState: () => this.state,
1040
982
  };
1041
- const balanceDs = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getBalanceDataSource).call(this, sourceId);
1042
- if (!balanceDs) {
1043
- return;
1044
- }
1045
- balanceDs.subscribe(subscribeReq).catch((error) => {
983
+ source.subscribe(subscribeReq).catch((error) => {
1046
984
  console.error(`[AssetsController] Failed to subscribe to '${sourceId}':`, error);
1047
985
  });
1048
986
  // Track subscription
@@ -1056,14 +994,11 @@ async function _AssetsController_updateState(response) {
1056
994
  },
1057
995
  };
1058
996
  __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").set(subscriptionKey, subscription);
1059
- }, _AssetsController_unsubscribeDataSource = function _AssetsController_unsubscribeDataSource(sourceId) {
1060
- const subscriptionKey = `ds:${sourceId}`;
997
+ }, _AssetsController_unsubscribeDataSource = function _AssetsController_unsubscribeDataSource(source) {
998
+ const subscriptionKey = `ds:${source.getName()}`;
1061
999
  const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
1062
1000
  if (existingSubscription) {
1063
- const balanceDs = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getBalanceDataSource).call(this, sourceId);
1064
- if (balanceDs) {
1065
- balanceDs.unsubscribe(subscriptionKey).catch(() => undefined);
1066
- }
1001
+ source.unsubscribe(subscriptionKey).catch(() => undefined);
1067
1002
  existingSubscription.unsubscribe();
1068
1003
  }
1069
1004
  }, _AssetsController_buildDataRequest = function _AssetsController_buildDataRequest(accounts, chainIds, partial = {}) {
@@ -1111,7 +1046,7 @@ async function _AssetsController_handleAccountGroupChanged() {
1111
1046
  accountIds: accounts.map((a) => a.id),
1112
1047
  });
1113
1048
  // Subscribe and fetch for the new account group
1114
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToDataSources).call(this);
1049
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
1115
1050
  if (accounts.length > 0) {
1116
1051
  await this.getAssets(accounts, {
1117
1052
  chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
@@ -1145,7 +1080,7 @@ async function _AssetsController_handleAccountGroupChanged() {
1145
1080
  // Users may want to see historical balances even if the network is currently disabled.
1146
1081
  // The data will simply not be updated until the network is re-enabled.
1147
1082
  // Refresh subscriptions for new chain set
1148
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToDataSources).call(this);
1083
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
1149
1084
  // Do one-time fetch for newly enabled chains
1150
1085
  if (addedChains.length > 0 && __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
1151
1086
  await this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {