@metamask/assets-controller 1.0.0 → 2.0.1

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 (166) hide show
  1. package/CHANGELOG.md +36 -1
  2. package/dist/AssetsController.cjs +175 -64
  3. package/dist/AssetsController.cjs.map +1 -1
  4. package/dist/AssetsController.d.cts +68 -9
  5. package/dist/AssetsController.d.cts.map +1 -1
  6. package/dist/AssetsController.d.mts +68 -9
  7. package/dist/AssetsController.d.mts.map +1 -1
  8. package/dist/AssetsController.mjs +176 -65
  9. package/dist/AssetsController.mjs.map +1 -1
  10. package/dist/data-sources/AccountsApiDataSource.cjs +70 -15
  11. package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
  12. package/dist/data-sources/AccountsApiDataSource.d.cts +22 -3
  13. package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
  14. package/dist/data-sources/AccountsApiDataSource.d.mts +22 -3
  15. package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
  16. package/dist/data-sources/AccountsApiDataSource.mjs +66 -12
  17. package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
  18. package/dist/data-sources/BackendWebsocketDataSource.cjs +7 -5
  19. package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -1
  20. package/dist/data-sources/BackendWebsocketDataSource.d.cts.map +1 -1
  21. package/dist/data-sources/BackendWebsocketDataSource.d.mts.map +1 -1
  22. package/dist/data-sources/BackendWebsocketDataSource.mjs +7 -5
  23. package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -1
  24. package/dist/data-sources/PriceDataSource.cjs +17 -4
  25. package/dist/data-sources/PriceDataSource.cjs.map +1 -1
  26. package/dist/data-sources/PriceDataSource.d.cts +8 -4
  27. package/dist/data-sources/PriceDataSource.d.cts.map +1 -1
  28. package/dist/data-sources/PriceDataSource.d.mts +8 -4
  29. package/dist/data-sources/PriceDataSource.d.mts.map +1 -1
  30. package/dist/data-sources/PriceDataSource.mjs +17 -4
  31. package/dist/data-sources/PriceDataSource.mjs.map +1 -1
  32. package/dist/data-sources/RpcDataSource.cjs +123 -44
  33. package/dist/data-sources/RpcDataSource.cjs.map +1 -1
  34. package/dist/data-sources/RpcDataSource.d.cts +16 -62
  35. package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
  36. package/dist/data-sources/RpcDataSource.d.mts +16 -62
  37. package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
  38. package/dist/data-sources/RpcDataSource.mjs +124 -45
  39. package/dist/data-sources/RpcDataSource.mjs.map +1 -1
  40. package/dist/data-sources/SnapDataSource.cjs +22 -10
  41. package/dist/data-sources/SnapDataSource.cjs.map +1 -1
  42. package/dist/data-sources/SnapDataSource.d.cts +2 -1
  43. package/dist/data-sources/SnapDataSource.d.cts.map +1 -1
  44. package/dist/data-sources/SnapDataSource.d.mts +2 -1
  45. package/dist/data-sources/SnapDataSource.d.mts.map +1 -1
  46. package/dist/data-sources/SnapDataSource.mjs +22 -10
  47. package/dist/data-sources/SnapDataSource.mjs.map +1 -1
  48. package/dist/data-sources/StakedBalanceDataSource.cjs +597 -0
  49. package/dist/data-sources/StakedBalanceDataSource.cjs.map +1 -0
  50. package/dist/data-sources/StakedBalanceDataSource.d.cts +72 -0
  51. package/dist/data-sources/StakedBalanceDataSource.d.cts.map +1 -0
  52. package/dist/data-sources/StakedBalanceDataSource.d.mts +72 -0
  53. package/dist/data-sources/StakedBalanceDataSource.d.mts.map +1 -0
  54. package/dist/data-sources/StakedBalanceDataSource.mjs +593 -0
  55. package/dist/data-sources/StakedBalanceDataSource.mjs.map +1 -0
  56. package/dist/data-sources/TokenDataSource.cjs +12 -5
  57. package/dist/data-sources/TokenDataSource.cjs.map +1 -1
  58. package/dist/data-sources/TokenDataSource.d.cts +1 -0
  59. package/dist/data-sources/TokenDataSource.d.cts.map +1 -1
  60. package/dist/data-sources/TokenDataSource.d.mts +1 -0
  61. package/dist/data-sources/TokenDataSource.d.mts.map +1 -1
  62. package/dist/data-sources/TokenDataSource.mjs +12 -5
  63. package/dist/data-sources/TokenDataSource.mjs.map +1 -1
  64. package/dist/data-sources/evm-rpc-services/index.cjs +5 -1
  65. package/dist/data-sources/evm-rpc-services/index.cjs.map +1 -1
  66. package/dist/data-sources/evm-rpc-services/index.d.cts +1 -1
  67. package/dist/data-sources/evm-rpc-services/index.d.cts.map +1 -1
  68. package/dist/data-sources/evm-rpc-services/index.d.mts +1 -1
  69. package/dist/data-sources/evm-rpc-services/index.d.mts.map +1 -1
  70. package/dist/data-sources/evm-rpc-services/index.mjs +1 -1
  71. package/dist/data-sources/evm-rpc-services/index.mjs.map +1 -1
  72. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs +132 -0
  73. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs.map +1 -0
  74. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts +80 -0
  75. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts.map +1 -0
  76. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts +80 -0
  77. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts.map +1 -0
  78. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.mjs +126 -0
  79. package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.mjs.map +1 -0
  80. package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs +16 -0
  81. package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs.map +1 -1
  82. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts +5 -1
  83. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts.map +1 -1
  84. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts +5 -1
  85. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts.map +1 -1
  86. package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs +16 -0
  87. package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs.map +1 -1
  88. package/dist/data-sources/evm-rpc-services/services/index.cjs +6 -1
  89. package/dist/data-sources/evm-rpc-services/services/index.cjs.map +1 -1
  90. package/dist/data-sources/evm-rpc-services/services/index.d.cts +1 -0
  91. package/dist/data-sources/evm-rpc-services/services/index.d.cts.map +1 -1
  92. package/dist/data-sources/evm-rpc-services/services/index.d.mts +1 -0
  93. package/dist/data-sources/evm-rpc-services/services/index.d.mts.map +1 -1
  94. package/dist/data-sources/evm-rpc-services/services/index.mjs +1 -0
  95. package/dist/data-sources/evm-rpc-services/services/index.mjs.map +1 -1
  96. package/dist/data-sources/evm-rpc-services/types/services.cjs.map +1 -1
  97. package/dist/data-sources/evm-rpc-services/types/services.d.cts +4 -0
  98. package/dist/data-sources/evm-rpc-services/types/services.d.cts.map +1 -1
  99. package/dist/data-sources/evm-rpc-services/types/services.d.mts +4 -0
  100. package/dist/data-sources/evm-rpc-services/types/services.d.mts.map +1 -1
  101. package/dist/data-sources/evm-rpc-services/types/services.mjs.map +1 -1
  102. package/dist/data-sources/evm-rpc-services/types/state.cjs.map +1 -1
  103. package/dist/data-sources/evm-rpc-services/types/state.d.cts +3 -3
  104. package/dist/data-sources/evm-rpc-services/types/state.d.cts.map +1 -1
  105. package/dist/data-sources/evm-rpc-services/types/state.d.mts +3 -3
  106. package/dist/data-sources/evm-rpc-services/types/state.d.mts.map +1 -1
  107. package/dist/data-sources/evm-rpc-services/types/state.mjs.map +1 -1
  108. package/dist/data-sources/evm-rpc-services/utils/index.cjs +9 -1
  109. package/dist/data-sources/evm-rpc-services/utils/index.cjs.map +1 -1
  110. package/dist/data-sources/evm-rpc-services/utils/index.d.cts +2 -0
  111. package/dist/data-sources/evm-rpc-services/utils/index.d.cts.map +1 -1
  112. package/dist/data-sources/evm-rpc-services/utils/index.d.mts +2 -0
  113. package/dist/data-sources/evm-rpc-services/utils/index.d.mts.map +1 -1
  114. package/dist/data-sources/evm-rpc-services/utils/index.mjs +2 -0
  115. package/dist/data-sources/evm-rpc-services/utils/index.mjs.map +1 -1
  116. package/dist/data-sources/evm-rpc-services/utils/parsing.cjs +47 -0
  117. package/dist/data-sources/evm-rpc-services/utils/parsing.cjs.map +1 -0
  118. package/dist/data-sources/evm-rpc-services/utils/parsing.d.cts +25 -0
  119. package/dist/data-sources/evm-rpc-services/utils/parsing.d.cts.map +1 -0
  120. package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts +25 -0
  121. package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts.map +1 -0
  122. package/dist/data-sources/evm-rpc-services/utils/parsing.mjs +39 -0
  123. package/dist/data-sources/evm-rpc-services/utils/parsing.mjs.map +1 -0
  124. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs +68 -0
  125. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs.map +1 -0
  126. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.cts +25 -0
  127. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.cts.map +1 -0
  128. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts +25 -0
  129. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts.map +1 -0
  130. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.mjs +62 -0
  131. package/dist/data-sources/evm-rpc-services/utils/staking-contracts.mjs.map +1 -0
  132. package/dist/data-sources/index.cjs +3 -1
  133. package/dist/data-sources/index.cjs.map +1 -1
  134. package/dist/data-sources/index.d.cts +3 -2
  135. package/dist/data-sources/index.d.cts.map +1 -1
  136. package/dist/data-sources/index.d.mts +3 -2
  137. package/dist/data-sources/index.d.mts.map +1 -1
  138. package/dist/data-sources/index.mjs +1 -0
  139. package/dist/data-sources/index.mjs.map +1 -1
  140. package/dist/index.cjs.map +1 -1
  141. package/dist/index.d.cts +3 -3
  142. package/dist/index.d.cts.map +1 -1
  143. package/dist/index.d.mts +3 -3
  144. package/dist/index.d.mts.map +1 -1
  145. package/dist/index.mjs.map +1 -1
  146. package/dist/middlewares/DetectionMiddleware.cjs +4 -1
  147. package/dist/middlewares/DetectionMiddleware.cjs.map +1 -1
  148. package/dist/middlewares/DetectionMiddleware.d.cts +1 -0
  149. package/dist/middlewares/DetectionMiddleware.d.cts.map +1 -1
  150. package/dist/middlewares/DetectionMiddleware.d.mts +1 -0
  151. package/dist/middlewares/DetectionMiddleware.d.mts.map +1 -1
  152. package/dist/middlewares/DetectionMiddleware.mjs +4 -1
  153. package/dist/middlewares/DetectionMiddleware.mjs.map +1 -1
  154. package/dist/selectors/balance.cjs +2 -2
  155. package/dist/selectors/balance.cjs.map +1 -1
  156. package/dist/selectors/balance.d.cts.map +1 -1
  157. package/dist/selectors/balance.d.mts.map +1 -1
  158. package/dist/selectors/balance.mjs +2 -2
  159. package/dist/selectors/balance.mjs.map +1 -1
  160. package/dist/types.cjs.map +1 -1
  161. package/dist/types.d.cts +3 -3
  162. package/dist/types.d.cts.map +1 -1
  163. package/dist/types.d.mts +3 -3
  164. package/dist/types.d.mts.map +1 -1
  165. package/dist/types.mjs.map +1 -1
  166. package/package.json +17 -12
@@ -9,9 +9,9 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
10
10
  return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
11
11
  };
12
- var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_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_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeAssets, _AssetsController_subscribeAssetsBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_subscribeDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged;
12
+ var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_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;
13
13
  import { BaseController } from "@metamask/base-controller";
14
- import { parseCaipAssetType } from "@metamask/utils";
14
+ import { isCaipChainId, isStrictHexString, parseCaipAssetType, parseCaipChainId } from "@metamask/utils";
15
15
  import { Mutex } from "async-mutex";
16
16
  import BigNumberJS from "bignumber.js";
17
17
  import $lodash from "lodash";
@@ -21,6 +21,7 @@ import { BackendWebsocketDataSource } from "./data-sources/BackendWebsocketDataS
21
21
  import { PriceDataSource } from "./data-sources/PriceDataSource.mjs";
22
22
  import { RpcDataSource } from "./data-sources/RpcDataSource.mjs";
23
23
  import { SnapDataSource } from "./data-sources/SnapDataSource.mjs";
24
+ import { StakedBalanceDataSource } from "./data-sources/StakedBalanceDataSource.mjs";
24
25
  import { TokenDataSource } from "./data-sources/TokenDataSource.mjs";
25
26
  import { projectLogger, createModuleLogger } from "./logger.mjs";
26
27
  import { DetectionMiddleware } from "./middlewares/DetectionMiddleware.mjs";
@@ -51,7 +52,7 @@ const log = createModuleLogger(projectLogger, CONTROLLER_NAME);
51
52
  */
52
53
  export function getDefaultAssetsControllerState() {
53
54
  return {
54
- assetsMetadata: {},
55
+ assetsInfo: {},
55
56
  assetsBalance: {},
56
57
  assetsPrice: {},
57
58
  customAssets: {},
@@ -62,7 +63,7 @@ export function getDefaultAssetsControllerState() {
62
63
  // STATE METADATA
63
64
  // ============================================================================
64
65
  const stateMetadata = {
65
- assetsMetadata: {
66
+ assetsInfo: {
66
67
  persist: true,
67
68
  includeInStateLogs: false,
68
69
  includeInDebugSnapshot: false,
@@ -110,11 +111,11 @@ function extractChainId(assetId) {
110
111
  */
111
112
  function normalizeResponse(response) {
112
113
  const normalized = {};
113
- if (response.assetsMetadata) {
114
- normalized.assetsMetadata = {};
115
- for (const [assetId, metadata] of Object.entries(response.assetsMetadata)) {
114
+ if (response.assetsInfo) {
115
+ normalized.assetsInfo = {};
116
+ for (const [assetId, metadata] of Object.entries(response.assetsInfo)) {
116
117
  const normalizedId = normalizeAssetId(assetId);
117
- normalized.assetsMetadata[normalizedId] = metadata;
118
+ normalized.assetsInfo[normalizedId] = metadata;
118
119
  }
119
120
  }
120
121
  if (response.assetsPrice) {
@@ -176,7 +177,7 @@ function normalizeResponse(response) {
176
177
  * - The controller does NOT manage polling - it simply receives pushed updates
177
178
  */
178
179
  export class AssetsController extends BaseController {
179
- constructor({ messenger, state = {}, defaultUpdateInterval = DEFAULT_POLLING_INTERVAL_MS, isEnabled = () => true, queryApiClient, rpcDataSourceConfig, }) {
180
+ constructor({ messenger, state = {}, defaultUpdateInterval = DEFAULT_POLLING_INTERVAL_MS, isEnabled = () => true, isBasicFunctionality, subscribeToBasicFunctionalityChange, queryApiClient, rpcDataSourceConfig, trackMetaMetricsEvent, accountsApiDataSourceConfig, priceDataSourceConfig, stakedBalanceDataSourceConfig, }) {
180
181
  super({
181
182
  name: CONTROLLER_NAME,
182
183
  messenger,
@@ -189,8 +190,14 @@ export class AssetsController extends BaseController {
189
190
  _AssetsController_instances.add(this);
190
191
  /** Whether the controller is enabled */
191
192
  _AssetsController_isEnabled.set(this, void 0);
193
+ /** Getter for basic functionality (only balance fetch/subscribe use RPC; token/price API not used). No attribute stored. */
194
+ _AssetsController_isBasicFunctionality.set(this, void 0);
192
195
  /** Default update interval hint passed to data sources */
193
196
  _AssetsController_defaultUpdateInterval.set(this, void 0);
197
+ /** Optional callback for first init/fetch MetaMetrics (duration). */
198
+ _AssetsController_trackMetaMetricsEvent.set(this, void 0);
199
+ /** Whether we have already reported first init fetch for this session (reset on #stop). */
200
+ _AssetsController_firstInitFetchReported.set(this, false);
194
201
  _AssetsController_controllerMutex.set(this, new Mutex());
195
202
  /**
196
203
  * Active balance subscriptions keyed by account ID.
@@ -205,13 +212,19 @@ export class AssetsController extends BaseController {
205
212
  _AssetsController_accountsApiDataSource.set(this, void 0);
206
213
  _AssetsController_snapDataSource.set(this, void 0);
207
214
  _AssetsController_rpcDataSource.set(this, void 0);
215
+ _AssetsController_stakedBalanceDataSource.set(this, void 0);
208
216
  _AssetsController_priceDataSource.set(this, void 0);
209
217
  _AssetsController_detectionMiddleware.set(this, void 0);
210
218
  _AssetsController_tokenDataSource.set(this, void 0);
219
+ _AssetsController_unsubscribeBasicFunctionality.set(this, null);
211
220
  __classPrivateFieldSet(this, _AssetsController_isEnabled, isEnabled(), "f");
221
+ __classPrivateFieldSet(this, _AssetsController_isBasicFunctionality, isBasicFunctionality ?? (() => true), "f");
212
222
  __classPrivateFieldSet(this, _AssetsController_defaultUpdateInterval, defaultUpdateInterval, "f");
223
+ __classPrivateFieldSet(this, _AssetsController_trackMetaMetricsEvent, trackMetaMetricsEvent, "f");
213
224
  const rpcConfig = rpcDataSourceConfig ?? {};
214
- const onActiveChainsUpdated = (dataSourceName, chains, previousChains) => this.handleActiveChainsUpdate(dataSourceName, chains, previousChains);
225
+ const onActiveChainsUpdated = (dataSourceName, chains, previousChains) => {
226
+ this.handleActiveChainsUpdate(dataSourceName, chains, previousChains);
227
+ };
215
228
  __classPrivateFieldSet(this, _AssetsController_backendWebsocketDataSource, new BackendWebsocketDataSource({
216
229
  messenger: this.messenger,
217
230
  queryApiClient,
@@ -220,6 +233,7 @@ export class AssetsController extends BaseController {
220
233
  __classPrivateFieldSet(this, _AssetsController_accountsApiDataSource, new AccountsApiDataSource({
221
234
  queryApiClient,
222
235
  onActiveChainsUpdated,
236
+ ...accountsApiDataSourceConfig,
223
237
  }), "f");
224
238
  __classPrivateFieldSet(this, _AssetsController_snapDataSource, new SnapDataSource({
225
239
  messenger: this.messenger,
@@ -230,11 +244,17 @@ export class AssetsController extends BaseController {
230
244
  onActiveChainsUpdated,
231
245
  ...rpcConfig,
232
246
  }), "f");
247
+ __classPrivateFieldSet(this, _AssetsController_stakedBalanceDataSource, new StakedBalanceDataSource({
248
+ messenger: this.messenger,
249
+ onActiveChainsUpdated,
250
+ ...stakedBalanceDataSourceConfig,
251
+ }), "f");
233
252
  __classPrivateFieldSet(this, _AssetsController_tokenDataSource, new TokenDataSource({
234
253
  queryApiClient,
235
254
  }), "f");
236
255
  __classPrivateFieldSet(this, _AssetsController_priceDataSource, new PriceDataSource({
237
256
  queryApiClient,
257
+ ...priceDataSourceConfig,
238
258
  }), "f");
239
259
  __classPrivateFieldSet(this, _AssetsController_detectionMiddleware, new DetectionMiddleware(), "f");
240
260
  if (!__classPrivateFieldGet(this, _AssetsController_isEnabled, "f")) {
@@ -247,6 +267,15 @@ export class AssetsController extends BaseController {
247
267
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_initializeState).call(this);
248
268
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToEvents).call(this);
249
269
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_registerActionHandlers).call(this);
270
+ // Subscriptions start only on KeyringController:unlock -> #start(), not here.
271
+ // Subscribe to basic-functionality changes after construction so a synchronous
272
+ // onChange during subscribe cannot run before data sources are initialized.
273
+ if (subscribeToBasicFunctionalityChange) {
274
+ const unsubscribe = subscribeToBasicFunctionalityChange((isBasic) => this.handleBasicFunctionalityChange(isBasic));
275
+ if (typeof unsubscribe === 'function') {
276
+ __classPrivateFieldSet(this, _AssetsController_unsubscribeBasicFunctionality, unsubscribe, "f");
277
+ }
278
+ }
250
279
  }
251
280
  // ============================================================================
252
281
  // DATA SOURCE CHAIN MANAGEMENT
@@ -265,6 +294,9 @@ export class AssetsController extends BaseController {
265
294
  * @param previousChains - Previous chains; used to compute added/removed.
266
295
  */
267
296
  handleActiveChainsUpdate(dataSourceId, activeChains, previousChains) {
297
+ if (!__classPrivateFieldGet(this, _AssetsController_isEnabled, "f")) {
298
+ return;
299
+ }
268
300
  log('Data source active chains changed', {
269
301
  dataSourceId,
270
302
  chainCount: activeChains.length,
@@ -306,21 +338,39 @@ export class AssetsController extends BaseController {
306
338
  customAssets.push(...accountCustomAssets);
307
339
  }
308
340
  if (options?.forceUpdate) {
341
+ const startTime = Date.now();
309
342
  const request = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildDataRequest).call(this, accounts, chainIds, {
310
343
  assetTypes,
311
344
  dataTypes,
312
345
  customAssets: customAssets.length > 0 ? customAssets : undefined,
313
346
  forceUpdate: true,
314
347
  });
315
- const response = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [
316
- __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f").assetsMiddleware,
317
- __classPrivateFieldGet(this, _AssetsController_snapDataSource, "f").assetsMiddleware,
318
- __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f").assetsMiddleware,
319
- __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f").assetsMiddleware,
320
- __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f").assetsMiddleware,
321
- __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f").assetsMiddleware,
322
- ], request);
348
+ const sources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
349
+ ? [
350
+ __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
351
+ __classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"),
352
+ __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
353
+ __classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
354
+ __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
355
+ __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
356
+ __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
357
+ ]
358
+ : [
359
+ __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
360
+ __classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
361
+ __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
362
+ ];
363
+ const { response, durationByDataSource } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, sources, request);
323
364
  await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, response);
365
+ if (__classPrivateFieldGet(this, _AssetsController_trackMetaMetricsEvent, "f") && !__classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")) {
366
+ __classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, true, "f");
367
+ const durationMs = Date.now() - startTime;
368
+ __classPrivateFieldGet(this, _AssetsController_trackMetaMetricsEvent, "f").call(this, {
369
+ durationMs,
370
+ chainIds,
371
+ durationByDataSource,
372
+ });
373
+ }
324
374
  }
325
375
  return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
326
376
  }
@@ -345,7 +395,7 @@ export class AssetsController extends BaseController {
345
395
  return result;
346
396
  }
347
397
  getAssetMetadata(assetId) {
348
- return this.state.assetsMetadata[assetId];
398
+ return this.state.assetsInfo[assetId];
349
399
  }
350
400
  async getAssetsPrice(accounts, options) {
351
401
  const assets = await this.getAssets(accounts, {
@@ -482,18 +532,17 @@ export class AssetsController extends BaseController {
482
532
  *
483
533
  * @param accounts - Accounts to subscribe price updates for.
484
534
  * @param chainIds - Chain IDs to filter prices for.
485
- * @param options - Subscription options.
486
- * @param options.updateInterval - Polling interval in ms.
487
535
  */
488
- subscribeAssetsPrice(accounts, chainIds, options = {}) {
489
- const { updateInterval = __classPrivateFieldGet(this, _AssetsController_defaultUpdateInterval, "f") } = options;
536
+ subscribeAssetsPrice(accounts, chainIds) {
537
+ if (!__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
538
+ return;
539
+ }
490
540
  const subscriptionKey = 'ds:PriceDataSource';
491
541
  const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
492
542
  const isUpdate = existingSubscription !== undefined;
493
543
  const subscribeReq = {
494
544
  request: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildDataRequest).call(this, accounts, chainIds, {
495
545
  dataTypes: ['price'],
496
- updateInterval,
497
546
  }),
498
547
  subscriptionId: subscriptionKey,
499
548
  isUpdate,
@@ -525,6 +574,18 @@ export class AssetsController extends BaseController {
525
574
  __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f").unsubscribe(subscriptionKey).catch(console.error);
526
575
  existingSubscription.unsubscribe();
527
576
  }
577
+ /**
578
+ * Handle basic functionality toggle change. Call this from the consumer (extension or mobile)
579
+ * when the user changes the "Basic functionality" setting. Refreshes subscriptions so the
580
+ * current {@link AssetsControllerOptions.isBasicFunctionality} getter is used (true = APIs on,
581
+ * false = RPC only).
582
+ *
583
+ * @param _isBasic - The new value (for call-site clarity; the getter is the source of truth).
584
+ */
585
+ handleBasicFunctionalityChange(_isBasic) {
586
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
587
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
588
+ }
528
589
  /**
529
590
  * Handle assets updated from a data source.
530
591
  * Called via the onAssetsUpdate callback passed in SubscriptionRequest when the controller subscribes to a data source.
@@ -542,11 +603,7 @@ export class AssetsController extends BaseController {
542
603
  });
543
604
  // Run through enrichment middlewares (Event Stack: Detection → Token → Price)
544
605
  // Include 'metadata' in dataTypes so TokenDataSource runs to enrich detected assets
545
- const enrichedResponse = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [
546
- __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f").assetsMiddleware,
547
- __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f").assetsMiddleware,
548
- __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f").assetsMiddleware,
549
- ], request ?? {
606
+ 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 ?? {
550
607
  accountsWithSupportedChains: [],
551
608
  chainIds: [],
552
609
  dataTypes: ['balance', 'metadata', 'price'],
@@ -558,21 +615,21 @@ export class AssetsController extends BaseController {
558
615
  // ============================================================================
559
616
  destroy() {
560
617
  log('Destroying AssetsController', {
561
- dataSourceCount: __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get).length,
618
+ dataSourceCount: __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get).length,
562
619
  subscriptionCount: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").size,
563
620
  });
564
621
  // Destroy instantiated data sources
565
622
  __classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f")?.destroy?.();
566
623
  __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f")?.destroy?.();
567
624
  __classPrivateFieldGet(this, _AssetsController_snapDataSource, "f")?.destroy?.();
568
- if (__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f") &&
569
- 'destroy' in __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f") &&
570
- typeof __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f").destroy ===
571
- 'function') {
572
- __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f").destroy();
573
- }
625
+ __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")?.destroy?.();
626
+ __classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f")?.destroy?.();
574
627
  // Stop all active subscriptions
575
628
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
629
+ if (__classPrivateFieldGet(this, _AssetsController_unsubscribeBasicFunctionality, "f")) {
630
+ __classPrivateFieldGet(this, _AssetsController_unsubscribeBasicFunctionality, "f").call(this);
631
+ __classPrivateFieldSet(this, _AssetsController_unsubscribeBasicFunctionality, null, "f");
632
+ }
576
633
  // Unregister action handlers
577
634
  this.messenger.unregisterActionHandler('AssetsController:getAssets');
578
635
  this.messenger.unregisterActionHandler('AssetsController:getAssetsBalance');
@@ -585,9 +642,9 @@ export class AssetsController extends BaseController {
585
642
  this.messenger.unregisterActionHandler('AssetsController:unhideAsset');
586
643
  }
587
644
  }
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() {
645
+ _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() {
589
646
  return this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
590
- }, _AssetsController_subscriptionBalanceDataSources_get = function _AssetsController_subscriptionBalanceDataSources_get() {
647
+ }, _AssetsController_allBalanceDataSources_get = function _AssetsController_allBalanceDataSources_get() {
591
648
  return [
592
649
  __classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f"),
593
650
  __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
@@ -621,7 +678,7 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_defaultUpdateInte
621
678
  }
622
679
  return chains;
623
680
  }, _AssetsController_normalizeChainReference = function _AssetsController_normalizeChainReference(namespace, reference) {
624
- if (namespace === 'eip155' && reference.startsWith('0x')) {
681
+ if (namespace === 'eip155' && isStrictHexString(reference)) {
625
682
  // Convert hex to decimal for EIP155 chains
626
683
  return parseInt(reference, 16).toString();
627
684
  }
@@ -646,14 +703,27 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_defaultUpdateInte
646
703
  // ============================================================================
647
704
  /**
648
705
  * Execute middlewares with request/response context.
706
+ * Returns response and exclusive duration per source (sum ≈ wall time).
649
707
  *
650
- * @param middlewares - Middlewares to execute in order.
708
+ * @param sources - Data sources or middlewares with getName() and assetsMiddleware (executed in order).
651
709
  * @param request - The data request.
652
710
  * @param initialResponse - Optional initial response (for enriching existing data).
653
- * @returns The final DataResponse after all middlewares have processed.
711
+ * @returns Response and durationByDataSource (exclusive ms per source name).
654
712
  */
655
- async function _AssetsController_executeMiddlewares(middlewares, request, initialResponse = {}) {
656
- const chain = middlewares.reduceRight((next, middleware) => async (ctx) => {
713
+ async function _AssetsController_executeMiddlewares(sources, request, initialResponse = {}) {
714
+ const names = sources.map((source) => source.getName());
715
+ const middlewares = sources.map((source) => source.assetsMiddleware);
716
+ const inclusive = [];
717
+ const wrapped = middlewares.map((middleware, i) => (async (ctx, next) => {
718
+ const start = Date.now();
719
+ try {
720
+ return await middleware(ctx, next);
721
+ }
722
+ finally {
723
+ inclusive[i] = Date.now() - start;
724
+ }
725
+ }));
726
+ const chain = wrapped.reduceRight((next, middleware) => async (ctx) => {
657
727
  try {
658
728
  return await middleware(ctx, next);
659
729
  }
@@ -667,7 +737,16 @@ async function _AssetsController_executeMiddlewares(middlewares, request, initia
667
737
  response: initialResponse,
668
738
  getAssetsState: () => this.state,
669
739
  });
670
- return result.response;
740
+ const durationByDataSource = {};
741
+ for (let i = 0; i < inclusive.length; i++) {
742
+ const nextInc = i + 1 < inclusive.length ? (inclusive[i + 1] ?? 0) : 0;
743
+ const exclusive = Math.max(0, (inclusive[i] ?? 0) - nextInc);
744
+ const name = names[i];
745
+ if (name !== undefined) {
746
+ durationByDataSource[name] = exclusive;
747
+ }
748
+ }
749
+ return { response: result.response, durationByDataSource };
671
750
  }, _AssetsController_updateState =
672
751
  // ============================================================================
673
752
  // STATE MANAGEMENT
@@ -686,12 +765,12 @@ async function _AssetsController_updateState(response) {
686
765
  const changedMetadata = [];
687
766
  this.update((state) => {
688
767
  // Use type assertions to avoid deep type instantiation issues with Immer Draft types
689
- const metadata = state.assetsMetadata;
768
+ const metadata = state.assetsInfo;
690
769
  const balances = state.assetsBalance;
691
770
  const prices = state.assetsPrice;
692
- if (normalizedResponse.assetsMetadata) {
693
- for (const [key, value] of Object.entries(normalizedResponse.assetsMetadata)) {
694
- if (!isEqual(previousState.assetsMetadata[key], value)) {
771
+ if (normalizedResponse.assetsInfo) {
772
+ for (const [key, value] of Object.entries(normalizedResponse.assetsInfo)) {
773
+ if (!isEqual(previousState.assetsInfo[key], value)) {
695
774
  changedMetadata.push(key);
696
775
  }
697
776
  metadata[key] = value;
@@ -796,7 +875,7 @@ async function _AssetsController_updateState(response) {
796
875
  const accountBalances = this.state.assetsBalance[account.id] ?? {};
797
876
  for (const [assetId, balance] of Object.entries(accountBalances)) {
798
877
  const typedAssetId = assetId;
799
- const metadataRaw = this.state.assetsMetadata[typedAssetId];
878
+ const metadataRaw = this.state.assetsInfo[typedAssetId];
800
879
  // Skip assets without metadata
801
880
  if (!metadataRaw) {
802
881
  continue;
@@ -862,29 +941,33 @@ async function _AssetsController_updateState(response) {
862
941
  enabledChainCount: __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size,
863
942
  });
864
943
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
865
- if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
866
- this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
867
- chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
868
- forceUpdate: true,
869
- }).catch((error) => {
870
- log('Failed to fetch assets', error);
871
- });
872
- }
944
+ this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
945
+ chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
946
+ forceUpdate: true,
947
+ }).catch((error) => {
948
+ log('Failed to fetch assets', error);
949
+ });
873
950
  }, _AssetsController_stop = function _AssetsController_stop() {
874
951
  log('Stopping asset tracking', {
875
952
  activeSubscriptionCount: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").size,
876
953
  hasPriceSubscription: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").has('ds:PriceDataSource'),
877
954
  });
955
+ __classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, false, "f");
878
956
  // Stop price subscription first (uses direct messenger call)
879
957
  this.unsubscribeAssetsPrice();
880
958
  // Stop balance subscriptions by properly notifying data sources via messenger
881
- // This ensures data sources stop their polling timers
882
- // Convert to array first to avoid modifying map during iteration
959
+ // This ensures data sources stop their polling timers.
960
+ // Use #allBalanceDataSources + staked balance source so we unsubscribe from
961
+ // every source that may have been subscribed.
962
+ const allSources = [
963
+ ...__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get),
964
+ __classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
965
+ ];
883
966
  const subscriptionKeys = [...__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").keys()];
884
967
  for (const subscriptionKey of subscriptionKeys) {
885
968
  if (subscriptionKey.startsWith('ds:')) {
886
969
  const sourceId = subscriptionKey.slice(3);
887
- const source = __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get).find((ds) => ds.getName() === sourceId);
970
+ const source = allSources.find((ds) => ds.getName() === sourceId);
888
971
  if (source) {
889
972
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
890
973
  }
@@ -899,12 +982,20 @@ async function _AssetsController_updateState(response) {
899
982
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalance).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [
900
983
  ...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f"),
901
984
  ]);
985
+ // Subscribe to staked balance updates (separate from regular balance chain-claiming)
986
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeStakedBalance).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [
987
+ ...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f"),
988
+ ]);
902
989
  // Subscribe to price updates for all assets held by selected accounts
903
990
  this.subscribeAssetsPrice(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")]);
904
991
  }, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance(accounts, chainIds) {
905
992
  const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, accounts, new Set(chainIds));
906
993
  const remainingChains = new Set(chainToAccounts.keys());
907
- for (const source of __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get)) {
994
+ // When basic functionality is on (getter true), use all balance data sources; when off (getter false), RPC only.
995
+ const balanceDataSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
996
+ ? __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get)
997
+ : [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
998
+ for (const source of balanceDataSources) {
908
999
  const availableChains = new Set(source.getActiveChainsSync());
909
1000
  const assignedChains = [];
910
1001
  for (const chainId of remainingChains) {
@@ -925,6 +1016,18 @@ async function _AssetsController_updateState(response) {
925
1016
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeDataSource).call(this, source, accountsForSource, assignedChains);
926
1017
  }
927
1018
  }
1019
+ }, _AssetsController_subscribeStakedBalance = function _AssetsController_subscribeStakedBalance(accounts, chainIds) {
1020
+ const source = __classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f");
1021
+ if (!source) {
1022
+ return;
1023
+ }
1024
+ const availableChains = new Set(source.getActiveChainsSync());
1025
+ const assignedChains = chainIds.filter((chainId) => availableChains.has(chainId));
1026
+ if (assignedChains.length === 0) {
1027
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
1028
+ return;
1029
+ }
1030
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeDataSource).call(this, source, accounts, assignedChains);
928
1031
  }, _AssetsController_buildChainToAccountsMap = function _AssetsController_buildChainToAccountsMap(accounts, chainsToSubscribe) {
929
1032
  const chainToAccounts = new Map();
930
1033
  for (const account of accounts) {
@@ -1001,16 +1104,24 @@ async function _AssetsController_updateState(response) {
1001
1104
  const scopes = account.scopes ?? [];
1002
1105
  const result = [];
1003
1106
  for (const scope of scopes) {
1004
- const [namespace, reference] = scope.split(':');
1107
+ const scopeStr = scope;
1108
+ if (!isCaipChainId(scopeStr)) {
1109
+ result.push(scope);
1110
+ continue;
1111
+ }
1112
+ const { namespace, reference } = parseCaipChainId(scopeStr);
1005
1113
  // Wildcard scope (e.g., "eip155:0" means all enabled chains in that namespace)
1006
1114
  if (reference === '0') {
1007
1115
  for (const chain of __classPrivateFieldGet(this, _AssetsController_enabledChains, "f")) {
1008
- if (chain.startsWith(`${namespace}:`)) {
1009
- result.push(chain);
1116
+ if (isCaipChainId(chain)) {
1117
+ const chainParsed = parseCaipChainId(chain);
1118
+ if (chainParsed.namespace === namespace) {
1119
+ result.push(chain);
1120
+ }
1010
1121
  }
1011
1122
  }
1012
1123
  }
1013
- else if (namespace === 'eip155' && reference?.startsWith('0x')) {
1124
+ else if (namespace === 'eip155' && isStrictHexString(reference)) {
1014
1125
  // Normalize hex to decimal for EIP155
1015
1126
  result.push(`eip155:${parseInt(reference, 16)}`);
1016
1127
  }