@metamask-previews/assets-controller 14.0.3-preview-e12b5ece6 → 14.0.3-preview-fe4b3be11

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 (80) hide show
  1. package/CHANGELOG.md +5 -10
  2. package/dist/AssetsController.cjs +592 -273
  3. package/dist/AssetsController.cjs.map +1 -1
  4. package/dist/AssetsController.d.cts +7 -10
  5. package/dist/AssetsController.d.cts.map +1 -1
  6. package/dist/AssetsController.d.mts +7 -10
  7. package/dist/AssetsController.d.mts.map +1 -1
  8. package/dist/AssetsController.mjs +592 -273
  9. package/dist/AssetsController.mjs.map +1 -1
  10. package/dist/data-sources/AbstractDataSource.cjs +23 -0
  11. package/dist/data-sources/AbstractDataSource.cjs.map +1 -1
  12. package/dist/data-sources/AbstractDataSource.d.cts +13 -1
  13. package/dist/data-sources/AbstractDataSource.d.cts.map +1 -1
  14. package/dist/data-sources/AbstractDataSource.d.mts +13 -1
  15. package/dist/data-sources/AbstractDataSource.d.mts.map +1 -1
  16. package/dist/data-sources/AbstractDataSource.mjs +23 -0
  17. package/dist/data-sources/AbstractDataSource.mjs.map +1 -1
  18. package/dist/data-sources/AccountActivityDataSource.cjs +2 -0
  19. package/dist/data-sources/AccountActivityDataSource.cjs.map +1 -1
  20. package/dist/data-sources/AccountActivityDataSource.d.cts.map +1 -1
  21. package/dist/data-sources/AccountActivityDataSource.d.mts.map +1 -1
  22. package/dist/data-sources/AccountActivityDataSource.mjs +2 -0
  23. package/dist/data-sources/AccountActivityDataSource.mjs.map +1 -1
  24. package/dist/data-sources/AccountsApiDataSource.cjs +144 -31
  25. package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
  26. package/dist/data-sources/AccountsApiDataSource.d.cts +18 -2
  27. package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
  28. package/dist/data-sources/AccountsApiDataSource.d.mts +18 -2
  29. package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
  30. package/dist/data-sources/AccountsApiDataSource.mjs +145 -32
  31. package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
  32. package/dist/data-sources/RpcDataSource.cjs +163 -24
  33. package/dist/data-sources/RpcDataSource.cjs.map +1 -1
  34. package/dist/data-sources/RpcDataSource.d.cts +17 -0
  35. package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
  36. package/dist/data-sources/RpcDataSource.d.mts +17 -0
  37. package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
  38. package/dist/data-sources/RpcDataSource.mjs +164 -25
  39. package/dist/data-sources/RpcDataSource.mjs.map +1 -1
  40. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs +21 -12
  41. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs.map +1 -1
  42. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts +7 -2
  43. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts.map +1 -1
  44. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts +7 -2
  45. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts.map +1 -1
  46. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs +21 -12
  47. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs.map +1 -1
  48. package/dist/data-sources/evm-rpc-services/types/state.cjs.map +1 -1
  49. package/dist/data-sources/evm-rpc-services/types/state.d.cts +3 -2
  50. package/dist/data-sources/evm-rpc-services/types/state.d.cts.map +1 -1
  51. package/dist/data-sources/evm-rpc-services/types/state.d.mts +3 -2
  52. package/dist/data-sources/evm-rpc-services/types/state.d.mts.map +1 -1
  53. package/dist/data-sources/evm-rpc-services/types/state.mjs.map +1 -1
  54. package/dist/middlewares/ParallelMiddleware.cjs +9 -0
  55. package/dist/middlewares/ParallelMiddleware.cjs.map +1 -1
  56. package/dist/middlewares/ParallelMiddleware.d.cts.map +1 -1
  57. package/dist/middlewares/ParallelMiddleware.d.mts.map +1 -1
  58. package/dist/middlewares/ParallelMiddleware.mjs +9 -0
  59. package/dist/middlewares/ParallelMiddleware.mjs.map +1 -1
  60. package/dist/middlewares/RpcFallbackMiddleware.cjs +158 -128
  61. package/dist/middlewares/RpcFallbackMiddleware.cjs.map +1 -1
  62. package/dist/middlewares/RpcFallbackMiddleware.d.cts +10 -14
  63. package/dist/middlewares/RpcFallbackMiddleware.d.cts.map +1 -1
  64. package/dist/middlewares/RpcFallbackMiddleware.d.mts +10 -14
  65. package/dist/middlewares/RpcFallbackMiddleware.d.mts.map +1 -1
  66. package/dist/middlewares/RpcFallbackMiddleware.mjs +158 -128
  67. package/dist/middlewares/RpcFallbackMiddleware.mjs.map +1 -1
  68. package/dist/selectors/balance.cjs +4 -9
  69. package/dist/selectors/balance.cjs.map +1 -1
  70. package/dist/selectors/balance.d.cts.map +1 -1
  71. package/dist/selectors/balance.d.mts.map +1 -1
  72. package/dist/selectors/balance.mjs +4 -9
  73. package/dist/selectors/balance.mjs.map +1 -1
  74. package/dist/types.cjs.map +1 -1
  75. package/dist/types.d.cts +28 -26
  76. package/dist/types.d.cts.map +1 -1
  77. package/dist/types.d.mts +28 -26
  78. package/dist/types.d.mts.map +1 -1
  79. package/dist/types.mjs.map +1 -1
  80. package/package.json +4 -4
@@ -13,7 +13,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
13
13
  var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  return (mod && mod.__esModule) ? mod : { "default": mod };
15
15
  };
16
- var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_trace, _AssetsController_captureException, _AssetsController_firstInitFetchReported, _AssetsController_stateSizeReported, _AssetsController_emitStateSizeTrace, _AssetsController_controllerMutex, _AssetsController_accountRefreshMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_getSelectedAccounts, _AssetsController_isAccountTreeInitialized, _AssetsController_isUiOpen, _AssetsController_isKeyringUnlocked, _AssetsController_accountActivityDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_stakedBalanceDataSource, _AssetsController_allBalanceDataSources_get, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_customAssetGraduationMiddleware, _AssetsController_rpcFallbackMiddleware, _AssetsController_tokenDataSource, _AssetsController_unsubscribeBasicFunctionality, _AssetsController_queryApiClient, _AssetsController_onActiveChainsUpdated, _AssetsController_initializeNativeAssetsMap, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_refreshAssetsForTransaction, _AssetsController_runSpamCleanup, _AssetsController_updateActive, _AssetsController_runStartupRefresh, _AssetsController_registerActionHandlers, _AssetsController_handleActiveChainsUpdate, _AssetsController_executeMiddlewares, _AssetsController_assertNonEmptyAccountId, _AssetsController_normalizeAssetIdOrThrow, _AssetsController_fetchMissingPricesWithoutCache, _AssetsController_getNativeAssetMap, _AssetsController_isNativeAsset, _AssetsController_getAssetType, _AssetsController_resolveNativeAssetIds, _AssetsController_getNativeAssetIdsForEnabledChains, _AssetsController_getNativeAssetIdsForAccount, _AssetsController_getSlowPipelineChainIds, _AssetsController_ensureNativeBalancesDefaultZero, _AssetsController_ensureDefaultTrackedAssetsSeeded, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_getAssetFromState, _AssetsController_shouldHideNativeToken, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeAssets, _AssetsController_subscribeAssetsBalance, _AssetsController_subscribeRpcCustomAssetsSupplement, _AssetsController_unsubscribeBySubscriptionKey, _AssetsController_subscribeStakedBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_subscribeDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged, _AssetsController_handleNetworkAdded, _AssetsController_refreshActiveChainsOnNetworkSwitch, _AssetsController_getSelectedEvmChainIdFromNetworkState, _AssetsController_handleNetworkDidChange, _AssetsController_refreshAssetsAfterNetworkChange, _AssetsController_refreshAssetsAfterNetworkAdded;
16
+ var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_trace, _AssetsController_captureException, _AssetsController_firstInitFetchReported, _AssetsController_stateSizeReported, _AssetsController_emitStateSizeTrace, _AssetsController_controllerMutex, _AssetsController_accountRefreshMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_getSelectedAccounts, _AssetsController_isAccountTreeInitialized, _AssetsController_isUiOpen, _AssetsController_isKeyringUnlocked, _AssetsController_accountActivityDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_stakedBalanceDataSource, _AssetsController_allBalanceDataSources_get, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_customAssetGraduationMiddleware, _AssetsController_rpcFallbackMiddleware, _AssetsController_tokenDataSource, _AssetsController_unsubscribeBasicFunctionality, _AssetsController_queryApiClient, _AssetsController_onActiveChainsUpdated, _AssetsController_initializeNativeAssetsMap, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_refreshAssetsForTransaction, _AssetsController_runSpamCleanup, _AssetsController_updateActive, _AssetsController_runStartupRefresh, _AssetsController_registerActionHandlers, _AssetsController_handleActiveChainsUpdate, _AssetsController_executeMiddlewares, _AssetsController_buildForceUpdateRequestV5, _AssetsController_buildForceUpdateRequestV6, _AssetsController_forceUpdateAssetsV5, _AssetsController_forceUpdateAssetsV6, _AssetsController_runFastFetchV5, _AssetsController_runFastFetchV6, _AssetsController_runBackgroundFetch, _AssetsController_emitFastFetchTraces, _AssetsController_assertNonEmptyAccountId, _AssetsController_normalizeAssetIdOrThrow, _AssetsController_getHiddenAssetIds, _AssetsController_isBalanceV6Enabled, _AssetsController_fetchMissingPricesWithoutCache, _AssetsController_getNativeAssetMap, _AssetsController_isNativeAsset, _AssetsController_getAssetType, _AssetsController_resolveNativeAssetIds, _AssetsController_getNativeAssetIdsForEnabledChains, _AssetsController_getNativeAssetIdsForAccount, _AssetsController_getSlowPipelineChainIds, _AssetsController_ensureNativeBalancesDefaultZero, _AssetsController_ensureDefaultTrackedAssetsSeeded, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_getAssetFromState, _AssetsController_shouldHideNativeToken, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeAssets, _AssetsController_subscribeAssetsBalance, _AssetsController_subscribeAssetsBalanceV5, _AssetsController_subscribeAssetsBalanceV6, _AssetsController_subscribeRpcCustomAssetsSupplement, _AssetsController_unsubscribeBySubscriptionKey, _AssetsController_subscribeStakedBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_subscribeDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged, _AssetsController_handleNetworkAdded, _AssetsController_refreshActiveChainsOnNetworkSwitch, _AssetsController_getSelectedEvmChainIdFromNetworkState, _AssetsController_handleNetworkDidChange, _AssetsController_refreshAssetsAfterNetworkChange, _AssetsController_refreshAssetsAfterNetworkAdded, _AssetsController_handleAssetsUpdateV5, _AssetsController_handleAssetsUpdateV6, _AssetsController_getUpdatePipelineRequest, _AssetsController_getUpdateTraceData, _AssetsController_emitUpdateTrace;
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");
@@ -208,6 +208,10 @@ function normalizeResponse(response) {
208
208
  if (response.replaceCoveredChainBalances) {
209
209
  normalized.replaceCoveredChainBalances = true;
210
210
  }
211
+ if (response.unprocessedCustomAssets &&
212
+ response.unprocessedCustomAssets.length > 0) {
213
+ normalized.unprocessedCustomAssets = response.unprocessedCustomAssets.map((assetId) => (0, index_js_2.normalizeAssetId)(assetId));
214
+ }
211
215
  return normalized;
212
216
  }
213
217
  /**
@@ -215,12 +219,13 @@ function normalizeResponse(response) {
215
219
  *
216
220
  * @param previousBalances - Balances already in state for this account.
217
221
  * @param accountBalances - Balances from the incoming response.
218
- * @param customAssetIds - Custom assets to preserve when replacing covered chains.
219
- * @param replaceCoveredChains - When true, drop prior balances on chains present
220
- * in the response before applying it (authoritative chain slice).
222
+ * @param customAssetIds - Custom assets to preserve when replacing covered chains
223
+ * on the Accounts API v5 path (`replaceCoveredChainBalances`).
224
+ * @param replaceCoveredChains - When true (v5 force refresh), drop prior balances
225
+ * on chains present in the response before applying it, then restore custom assets.
221
226
  * @returns The merged balance map for the account.
222
227
  */
223
- function mergeAccountBalances(previousBalances, accountBalances, customAssetIds, replaceCoveredChains) {
228
+ function mergeAccountBalancesV5(previousBalances, accountBalances, customAssetIds = [], replaceCoveredChains = false) {
224
229
  if (!replaceCoveredChains) {
225
230
  return { ...previousBalances, ...accountBalances };
226
231
  }
@@ -234,8 +239,8 @@ function mergeAccountBalances(previousBalances, accountBalances, customAssetIds,
234
239
  Object.assign(next, accountBalances);
235
240
  for (const customId of customAssetIds) {
236
241
  if (!Object.prototype.hasOwnProperty.call(next, customId)) {
237
- const prev = previousBalances[customId];
238
- next[customId] = prev ?? { amount: '0' };
242
+ const previous = previousBalances[customId];
243
+ next[customId] = previous ?? { amount: '0' };
239
244
  }
240
245
  }
241
246
  // Staked vault balances are owned by StakedBalanceDataSource. When an
@@ -249,6 +254,38 @@ function mergeAccountBalances(previousBalances, accountBalances, customAssetIds,
249
254
  }
250
255
  return next;
251
256
  }
257
+ /**
258
+ * Apply an Accounts API v6 authoritative chain snapshot.
259
+ *
260
+ * @param previousBalances - Balances already in state for this account.
261
+ * @param accountBalances - Balances from the incoming response.
262
+ * @param unprocessedCustomAssets - Pins that v6 and RPC could not resolve.
263
+ * @returns The merged balance map for the account.
264
+ */
265
+ function mergeAccountBalancesV6(previousBalances, accountBalances, unprocessedCustomAssets = []) {
266
+ const coveredChains = new Set(Object.keys(accountBalances).map((assetId) => assetId.split('/')[0]));
267
+ const next = {};
268
+ for (const [assetId, balance] of Object.entries(previousBalances)) {
269
+ if (!coveredChains.has(assetId.split('/')[0])) {
270
+ next[assetId] = balance;
271
+ }
272
+ }
273
+ Object.assign(next, accountBalances);
274
+ const unprocessedSet = new Set(unprocessedCustomAssets.map((assetId) => (0, index_js_2.normalizeAssetId)(assetId)));
275
+ for (const [assetId, balance] of Object.entries(previousBalances)) {
276
+ if (unprocessedSet.has((0, index_js_2.normalizeAssetId)(assetId)) &&
277
+ !Object.prototype.hasOwnProperty.call(next, assetId)) {
278
+ next[assetId] = balance;
279
+ }
280
+ }
281
+ for (const [assetId, balance] of Object.entries(previousBalances)) {
282
+ if ((0, index_js_1.isStakingContractAssetId)(assetId) &&
283
+ !Object.prototype.hasOwnProperty.call(next, assetId)) {
284
+ next[assetId] = balance;
285
+ }
286
+ }
287
+ return next;
288
+ }
252
289
  // ============================================================================
253
290
  // CONTROLLER IMPLEMENTATION
254
291
  // ============================================================================
@@ -369,6 +406,7 @@ class AssetsController extends base_controller_1.BaseController {
369
406
  queryApiClient,
370
407
  onActiveChainsUpdated: __classPrivateFieldGet(this, _AssetsController_onActiveChainsUpdated, "f"),
371
408
  ...accountsApiDataSourceConfig,
409
+ isBalanceV6Enabled: () => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isBalanceV6Enabled).call(this),
372
410
  }), "f");
373
411
  __classPrivateFieldSet(this, _AssetsController_snapDataSource, new SnapDataSource_js_1.SnapDataSource({
374
412
  messenger: this.messenger,
@@ -388,6 +426,7 @@ class AssetsController extends base_controller_1.BaseController {
388
426
  ...rpcConfig,
389
427
  isOnboarded: rpcConfig.isOnboarded ?? isOnboarded,
390
428
  getAssetType: (assetId) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetType).call(this, assetId),
429
+ isBalanceV6Enabled: () => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isBalanceV6Enabled).call(this),
391
430
  }), "f");
392
431
  __classPrivateFieldSet(this, _AssetsController_stakedBalanceDataSource, new StakedBalanceDataSource_js_1.StakedBalanceDataSource({
393
432
  messenger: this.messenger,
@@ -420,6 +459,7 @@ class AssetsController extends base_controller_1.BaseController {
420
459
  }), "f");
421
460
  __classPrivateFieldSet(this, _AssetsController_rpcFallbackMiddleware, new RpcFallbackMiddleware_js_1.RpcFallbackMiddleware({
422
461
  rpcDataSource: __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
462
+ isBalanceV6Enabled: () => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isBalanceV6Enabled).call(this),
423
463
  }), "f");
424
464
  log('Initializing AssetsController', {
425
465
  defaultUpdateInterval: __classPrivateFieldGet(this, _AssetsController_defaultUpdateInterval, "f"),
@@ -456,147 +496,34 @@ class AssetsController extends base_controller_1.BaseController {
456
496
  if (accounts.length === 0 || chainIds.length === 0) {
457
497
  return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
458
498
  }
459
- // Collect custom assets for all requested accounts
460
- const customAssets = [];
461
- for (const account of accounts) {
462
- const accountCustomAssets = this.getCustomAssets(account.id);
463
- customAssets.push(...accountCustomAssets);
464
- }
465
499
  if (options?.forceUpdate) {
466
- // Pipeline spans only on unlock/first-init fetch; later forceUpdates pass
467
- // `undefined` so `emitTrace` / `withTrace` no-op without call-site if/else.
468
500
  const pipelineTrace = __classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")
469
501
  ? undefined
470
502
  : __classPrivateFieldGet(this, _AssetsController_trace, "f");
471
- const request = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildDataRequest).call(this, accounts, chainIds, {
503
+ const requestOptions = {
472
504
  assetTypes,
473
505
  dataTypes,
474
- customAssets: customAssets.length > 0 ? customAssets : undefined,
475
506
  forceUpdate: true,
476
- bypassServerCache: options?.bypassServerCache,
477
507
  assetsForPriceUpdate: options?.assetsForPriceUpdate,
478
- });
479
- // Fast pipeline: accountsApi + stakedBalance → detection → token + price.
480
- // Snap and RPC are excluded here due to their latency (snap triggers account
481
- // creation, RPC is slow on many chains). Results are committed to state
482
- // immediately so the UI can display balances without waiting for them.
483
- //
484
- // Fast/slow pipelines use merge so partial API snapshots cannot wipe
485
- // tokens missing from the response (e.g. USDC when only native balance
486
- // is returned). Balances present in the response are still refreshed.
487
- const fastSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
488
- ? [
489
- (0, ParallelMiddleware_js_1.createParallelBalanceMiddleware)([
490
- __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
491
- __classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
492
- ]),
493
- // Graduation must run BEFORE the RPC fallback so it only sees
494
- // AccountsApi/Websocket balances. RPC intentionally carries
495
- // custom assets and must never trigger graduation.
496
- __classPrivateFieldGet(this, _AssetsController_customAssetGraduationMiddleware, "f"),
497
- __classPrivateFieldGet(this, _AssetsController_rpcFallbackMiddleware, "f"),
498
- __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
499
- (0, ParallelMiddleware_js_1.createParallelMiddleware)([
500
- __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
501
- __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
502
- ]),
503
- ]
504
- : [__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f")];
505
- const { response } = await (0, trace_js_1.withTrace)({
506
- name: TRACE_FETCH_PIPELINE,
507
- trace: pipelineTrace,
508
- data: {
509
- chain_count: chainIds.length,
510
- account_count: accounts.length,
511
- basic_functionality: __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this),
512
- },
513
- fn: async (parentContext) => {
514
- const startTime = performance.now();
515
- const result = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, {
516
- sources: fastSources,
517
- request,
518
- parentContext,
519
- trace: pipelineTrace,
520
- });
521
- await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, {
522
- ...result.response,
523
- updateMode: 'merge',
524
- replaceCoveredChainBalances: true,
525
- });
526
- const durationMs = performance.now() - startTime;
527
- // Summary fields for Assets Health (nested under the parent span).
528
- (0, trace_js_1.emitTrace)({
529
- name: TRACE_FULL_FETCH,
530
- trace: pipelineTrace,
531
- data: {
532
- duration_ms: durationMs,
533
- chain_count: chainIds.length,
534
- account_count: accounts.length,
535
- basic_functionality: __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this),
536
- asset_count: result.response.assetsBalance
537
- ? Object.values(result.response.assetsBalance).reduce((sum, acct) => sum + Object.keys(acct).length, 0)
538
- : 0,
539
- price_count: result.response.assetsPrice
540
- ? Object.keys(result.response.assetsPrice).length
541
- : 0,
542
- ...result.durationByDataSource,
543
- },
544
- parentContext,
545
- });
546
- (0, trace_js_1.emitTrace)({
547
- name: TRACE_FIRST_INIT_FETCH,
548
- trace: pipelineTrace,
549
- data: {
550
- duration_ms: durationMs,
551
- chain_ids: JSON.stringify(chainIds),
552
- ...result.durationByDataSource,
553
- },
554
- parentContext,
555
- });
556
- return result;
557
- },
558
- });
559
- // Mark after the unlock/first forceUpdate so later polls skip pipeline spans.
560
- __classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, true, "f");
561
- // Background (slow) lane — flattened sibling of the fast lane (not nested
562
- // inside its withTrace callback). Still fire-and-forget so UI is not blocked.
563
- const slowPipelineChainIds = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSlowPipelineChainIds).call(this, chainIds, response);
564
- if (slowPipelineChainIds.length > 0) {
565
- const slowSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
566
- ? [__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")]
567
- : [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
568
- const slowRequest = { ...request, chainIds: slowPipelineChainIds };
569
- (0, trace_js_1.withTrace)({
570
- name: TRACE_BACKGROUND_FETCH,
571
- trace: pipelineTrace,
572
- data: {
573
- chain_count: slowPipelineChainIds.length,
574
- account_count: accounts.length,
575
- },
576
- fn: async (slowParentContext) => {
577
- const { response: slowResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, {
578
- sources: [
579
- (0, ParallelMiddleware_js_1.createParallelBalanceMiddleware)(slowSources),
580
- __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
581
- ...(__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
582
- ? [
583
- (0, ParallelMiddleware_js_1.createParallelMiddleware)([
584
- __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
585
- __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
586
- ]),
587
- ]
588
- : []),
589
- ],
590
- request: slowRequest,
591
- parentContext: slowParentContext,
592
- trace: pipelineTrace,
593
- });
594
- await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, {
595
- ...slowResponse,
596
- updateMode: 'merge',
597
- });
598
- },
599
- }).catch((error) => log('Background pipeline failed', { error }));
508
+ };
509
+ if (__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isBalanceV6Enabled).call(this)) {
510
+ await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_forceUpdateAssetsV6).call(this, {
511
+ accounts,
512
+ chainIds,
513
+ request: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildForceUpdateRequestV6).call(this, accounts, chainIds, {
514
+ ...requestOptions,
515
+ customAssetsOverride: options?.customAssets,
516
+ }),
517
+ pipelineTrace,
518
+ });
519
+ }
520
+ else {
521
+ await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_forceUpdateAssetsV5).call(this, {
522
+ accounts,
523
+ chainIds,
524
+ request: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildForceUpdateRequestV5).call(this, accounts, chainIds, requestOptions),
525
+ pipelineTrace,
526
+ });
600
527
  }
601
528
  }
602
529
  const result = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
@@ -843,20 +770,28 @@ class AssetsController extends base_controller_1.BaseController {
843
770
  balances[accountId] ?? (balances[accountId] = {});
844
771
  (_a = balances[accountId])[normalizedAssetId] ?? (_a[normalizedAssetId] = { amount: '0' });
845
772
  });
846
- // Fetch data for the newly added custom asset (merge to preserve other chains)
847
773
  const account = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).find((a) => a.id === accountId);
848
774
  if (account) {
849
775
  const chainId = extractChainId(normalizedAssetId);
850
- await this.getAssets([account], {
851
- chainIds: [chainId],
852
- dataTypes: ['balance', 'metadata', 'price'],
853
- assetTypes: ['fungible'],
854
- forceUpdate: true,
855
- updateMode: 'merge',
856
- });
776
+ if (__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isBalanceV6Enabled).call(this)) {
777
+ await this.getAssets([account], {
778
+ chainIds: [chainId],
779
+ dataTypes: ['balance', 'metadata', 'price'],
780
+ assetTypes: ['fungible'],
781
+ forceUpdate: true,
782
+ customAssets: [normalizedAssetId],
783
+ });
784
+ }
785
+ else {
786
+ await this.getAssets([account], {
787
+ chainIds: [chainId],
788
+ dataTypes: ['balance', 'metadata', 'price'],
789
+ assetTypes: ['fungible'],
790
+ forceUpdate: true,
791
+ });
792
+ }
857
793
  }
858
- // Re-evaluate subscriptions so the supplemental RPC poll picks up the
859
- // new customAsset on chains another data source already owns.
794
+ // Re-evaluate subscriptions so polls pick up the new pin.
860
795
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
861
796
  }
862
797
  /**
@@ -877,8 +812,7 @@ class AssetsController extends base_controller_1.BaseController {
877
812
  }
878
813
  }
879
814
  });
880
- // Re-evaluate subscriptions so the supplemental RPC poll for that chain
881
- // is torn down when no more customAssets remain there.
815
+ // Re-evaluate subscriptions so polls drop the removed pin.
882
816
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
883
817
  }
884
818
  /**
@@ -909,6 +843,8 @@ class AssetsController extends base_controller_1.BaseController {
909
843
  }
910
844
  state.assetPreferences[normalizedAssetId].hidden = true;
911
845
  });
846
+ // Re-evaluate subscriptions so polls exclude the newly hidden asset.
847
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
912
848
  }
913
849
  /**
914
850
  * Unhide an asset globally.
@@ -927,6 +863,8 @@ class AssetsController extends base_controller_1.BaseController {
927
863
  }
928
864
  }
929
865
  });
866
+ // Re-evaluate subscriptions so polls stop excluding the asset.
867
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
930
868
  }
931
869
  // ============================================================================
932
870
  // CURRENT CURRENCY MANAGEMENT
@@ -1038,101 +976,14 @@ class AssetsController extends base_controller_1.BaseController {
1038
976
  async handleAssetsUpdate(response, sourceId, request) {
1039
977
  log('Assets updated from data source', {
1040
978
  sourceId,
1041
- hasBalance: Boolean(response.assetsBalance),
1042
- hasPrice: Boolean(response.assetsPrice),
1043
- });
1044
- // Enrichment spans only before unlock/first-init fetch completes.
1045
- const pipelineTrace = __classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")
1046
- ? undefined
1047
- : __classPrivateFieldGet(this, _AssetsController_trace, "f");
1048
- await (0, trace_js_1.withTrace)({
1049
- name: TRACE_UPDATE_PARENT,
1050
- trace: pipelineTrace,
1051
- data: {
1052
- source: sourceId,
1053
- has_balance: Boolean(response.assetsBalance),
1054
- has_price: Boolean(response.assetsPrice),
1055
- balance_account_count: response.assetsBalance
1056
- ? Object.keys(response.assetsBalance).length
1057
- : 0,
1058
- },
1059
- fn: async (parentContext) => {
1060
- const updateStart = performance.now();
1061
- const resolvedRequest = request ?? {
1062
- accountsWithSupportedChains: [],
1063
- chainIds: [],
1064
- dataTypes: ['balance', 'metadata', 'price'],
1065
- };
1066
- // RPC-only mode (basic functionality off): never run token/price APIs. Strip
1067
- // those data types so downstream middleware cannot treat them as requested.
1068
- const pipelineRequest = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
1069
- ? resolvedRequest
1070
- : {
1071
- ...resolvedRequest,
1072
- dataTypes: resolvedRequest.dataTypes.filter((dt) => dt !== 'metadata' && dt !== 'price'),
1073
- };
1074
- // Graduate custom assets only when AccountsAPI / AccountActivity reports
1075
- // them. RPC already fetches custom assets on purpose, and Snap handles
1076
- // non-EVM chains the rule does not apply to, so skip the middleware for
1077
- // those.
1078
- const shouldGraduateCustomAssets = sourceId === 'AccountsApiDataSource' ||
1079
- sourceId === 'AccountActivityDataSource';
1080
- // Websocket updates can carry brand-new spam airdrops: enrich them
1081
- // with Token API occurrences and drop below-floor tokens BEFORE
1082
- // detection, so spam is never detected, enriched, priced or persisted.
1083
- const shouldFilterOccurrences = sourceId === 'AccountActivityDataSource' &&
1084
- __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this);
1085
- const shouldRunRpcFallback = sourceId === 'AccountsApiDataSource';
1086
- const enrichmentSources = [
1087
- ...(shouldGraduateCustomAssets
1088
- ? [__classPrivateFieldGet(this, _AssetsController_customAssetGraduationMiddleware, "f")]
1089
- : []),
1090
- ...(shouldFilterOccurrences
1091
- ? [
1092
- {
1093
- getName: () => 'OccurrenceFloorFilter',
1094
- assetsMiddleware: __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f").occurrenceFilterMiddleware,
1095
- },
1096
- ]
1097
- : []),
1098
- ...(shouldRunRpcFallback ? [__classPrivateFieldGet(this, _AssetsController_rpcFallbackMiddleware, "f")] : []),
1099
- __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
1100
- ];
1101
- if (__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
1102
- enrichmentSources.push((0, ParallelMiddleware_js_1.createParallelMiddleware)([
1103
- __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
1104
- __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
1105
- ]));
1106
- }
1107
- const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, {
1108
- sources: enrichmentSources,
1109
- request: pipelineRequest,
1110
- initialResponse: response,
1111
- parentContext,
1112
- trace: pipelineTrace,
1113
- });
1114
- await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, {
1115
- ...enrichedResponse,
1116
- replaceCoveredChainBalances: response.replaceCoveredChainBalances,
1117
- });
1118
- // Summary fields for Assets Health (nested under the parent span).
1119
- (0, trace_js_1.emitTrace)({
1120
- name: TRACE_UPDATE_PIPELINE,
1121
- trace: pipelineTrace,
1122
- data: {
1123
- source: sourceId,
1124
- duration_ms: performance.now() - updateStart,
1125
- has_balance: Boolean(response.assetsBalance),
1126
- has_price: Boolean(response.assetsPrice),
1127
- has_metadata: Boolean(enrichedResponse.assetsInfo),
1128
- balance_account_count: response.assetsBalance
1129
- ? Object.keys(response.assetsBalance).length
1130
- : 0,
1131
- },
1132
- parentContext,
1133
- });
1134
- },
979
+ assetsBalance: response.assetsBalance,
980
+ assetsPrice: response.assetsPrice,
1135
981
  });
982
+ if (__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isBalanceV6Enabled).call(this)) {
983
+ await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleAssetsUpdateV6).call(this, response, sourceId, request);
984
+ return;
985
+ }
986
+ await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleAssetsUpdateV5).call(this, response, sourceId, request);
1136
987
  }
1137
988
  // ============================================================================
1138
989
  // CLEANUP
@@ -1375,7 +1226,6 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1375
1226
  this.getAssets([matchedAccount], {
1376
1227
  chainIds: [caipChainId],
1377
1228
  forceUpdate: true,
1378
- bypassServerCache: true,
1379
1229
  }).catch((error) => {
1380
1230
  log('Failed to refresh assets after transaction event', { error });
1381
1231
  });
@@ -1584,6 +1434,236 @@ async function _AssetsController_executeMiddlewares(params) {
1584
1434
  });
1585
1435
  }
1586
1436
  return { response: result.response, durationByDataSource };
1437
+ }, _AssetsController_buildForceUpdateRequestV5 = function _AssetsController_buildForceUpdateRequestV5(accounts, chainIds, requestOptions) {
1438
+ const customAssets = [];
1439
+ for (const account of accounts) {
1440
+ customAssets.push(...this.getCustomAssets(account.id));
1441
+ }
1442
+ return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildDataRequest).call(this, accounts, chainIds, {
1443
+ ...requestOptions,
1444
+ customAssets: customAssets.length > 0 ? customAssets : undefined,
1445
+ });
1446
+ }, _AssetsController_buildForceUpdateRequestV6 = function _AssetsController_buildForceUpdateRequestV6(accounts, chainIds, requestOptions) {
1447
+ const requestedChains = new Set(chainIds);
1448
+ const candidateCustomAssets = requestOptions.customAssetsOverride ??
1449
+ accounts.flatMap((account) => this.getCustomAssets(account.id));
1450
+ const customAssetsSet = new Set();
1451
+ for (const assetId of candidateCustomAssets) {
1452
+ try {
1453
+ const normalizedAssetId = (0, index_js_2.normalizeAssetId)(assetId);
1454
+ if (requestedChains.has((0, utils_1.parseCaipAssetType)(normalizedAssetId).chainId)) {
1455
+ customAssetsSet.add(normalizedAssetId);
1456
+ }
1457
+ }
1458
+ catch {
1459
+ // Skip unparseable asset IDs
1460
+ }
1461
+ }
1462
+ const customAssets = [...customAssetsSet];
1463
+ const hiddenAssets = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getHiddenAssetIds).call(this);
1464
+ return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildDataRequest).call(this, accounts, chainIds, {
1465
+ assetTypes: requestOptions.assetTypes,
1466
+ dataTypes: requestOptions.dataTypes,
1467
+ forceUpdate: requestOptions.forceUpdate,
1468
+ assetsForPriceUpdate: requestOptions.assetsForPriceUpdate,
1469
+ customAssets: customAssets.length > 0 ? customAssets : undefined,
1470
+ excludeAssetIds: hiddenAssets.length > 0 ? hiddenAssets : undefined,
1471
+ });
1472
+ }, _AssetsController_forceUpdateAssetsV5 = async function _AssetsController_forceUpdateAssetsV5({ accounts, chainIds, request, pipelineTrace, }) {
1473
+ const isBasicFunctionality = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this);
1474
+ const fastSources = isBasicFunctionality
1475
+ ? [
1476
+ (0, ParallelMiddleware_js_1.createParallelBalanceMiddleware)([
1477
+ __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
1478
+ __classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
1479
+ ]),
1480
+ __classPrivateFieldGet(this, _AssetsController_customAssetGraduationMiddleware, "f"),
1481
+ __classPrivateFieldGet(this, _AssetsController_rpcFallbackMiddleware, "f"),
1482
+ __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
1483
+ (0, ParallelMiddleware_js_1.createParallelMiddleware)([
1484
+ __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
1485
+ __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
1486
+ ]),
1487
+ ]
1488
+ : [__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f")];
1489
+ const fastResponse = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runFastFetchV5).call(this, {
1490
+ accounts,
1491
+ chainIds,
1492
+ request,
1493
+ pipelineTrace,
1494
+ fastSources,
1495
+ isBasicFunctionality,
1496
+ });
1497
+ __classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, true, "f");
1498
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runBackgroundFetch).call(this, {
1499
+ accounts,
1500
+ request,
1501
+ pipelineTrace,
1502
+ chainIds: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSlowPipelineChainIds).call(this, chainIds, fastResponse),
1503
+ isBasicFunctionality,
1504
+ });
1505
+ }, _AssetsController_forceUpdateAssetsV6 = async function _AssetsController_forceUpdateAssetsV6({ accounts, chainIds, request, pipelineTrace, }) {
1506
+ const isBasicFunctionality = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this);
1507
+ const fastSources = isBasicFunctionality
1508
+ ? [
1509
+ (0, ParallelMiddleware_js_1.createParallelBalanceMiddleware)([
1510
+ __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
1511
+ __classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
1512
+ ]),
1513
+ __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
1514
+ (0, ParallelMiddleware_js_1.createParallelMiddleware)([
1515
+ __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
1516
+ __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
1517
+ ]),
1518
+ ]
1519
+ : [__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f")];
1520
+ const fastResponse = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runFastFetchV6).call(this, {
1521
+ accounts,
1522
+ chainIds,
1523
+ request,
1524
+ pipelineTrace,
1525
+ fastSources,
1526
+ isBasicFunctionality,
1527
+ });
1528
+ __classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, true, "f");
1529
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runBackgroundFetch).call(this, {
1530
+ accounts,
1531
+ request,
1532
+ pipelineTrace,
1533
+ chainIds: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSlowPipelineChainIds).call(this, chainIds, fastResponse),
1534
+ isBasicFunctionality,
1535
+ });
1536
+ }, _AssetsController_runFastFetchV5 = async function _AssetsController_runFastFetchV5({ accounts, chainIds, request, pipelineTrace, fastSources, isBasicFunctionality, }) {
1537
+ const { response } = await (0, trace_js_1.withTrace)({
1538
+ name: TRACE_FETCH_PIPELINE,
1539
+ trace: pipelineTrace,
1540
+ data: {
1541
+ chain_count: chainIds.length,
1542
+ account_count: accounts.length,
1543
+ basic_functionality: isBasicFunctionality,
1544
+ },
1545
+ fn: async (parentContext) => {
1546
+ const startTime = performance.now();
1547
+ const result = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, {
1548
+ sources: fastSources,
1549
+ request,
1550
+ parentContext,
1551
+ trace: pipelineTrace,
1552
+ });
1553
+ await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, {
1554
+ ...result.response,
1555
+ updateMode: 'merge',
1556
+ replaceCoveredChainBalances: true,
1557
+ });
1558
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_emitFastFetchTraces).call(this, {
1559
+ accounts,
1560
+ chainIds,
1561
+ result,
1562
+ durationMs: performance.now() - startTime,
1563
+ isBasicFunctionality,
1564
+ parentContext,
1565
+ pipelineTrace,
1566
+ });
1567
+ return result;
1568
+ },
1569
+ });
1570
+ return response;
1571
+ }, _AssetsController_runFastFetchV6 = async function _AssetsController_runFastFetchV6({ accounts, chainIds, request, pipelineTrace, fastSources, isBasicFunctionality, }) {
1572
+ const { response } = await (0, trace_js_1.withTrace)({
1573
+ name: TRACE_FETCH_PIPELINE,
1574
+ trace: pipelineTrace,
1575
+ data: {
1576
+ chain_count: chainIds.length,
1577
+ account_count: accounts.length,
1578
+ basic_functionality: isBasicFunctionality,
1579
+ },
1580
+ fn: async (parentContext) => {
1581
+ const startTime = performance.now();
1582
+ const result = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, {
1583
+ sources: fastSources,
1584
+ request,
1585
+ parentContext,
1586
+ trace: pipelineTrace,
1587
+ });
1588
+ await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, result.response);
1589
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_emitFastFetchTraces).call(this, {
1590
+ accounts,
1591
+ chainIds,
1592
+ result,
1593
+ durationMs: performance.now() - startTime,
1594
+ isBasicFunctionality,
1595
+ parentContext,
1596
+ pipelineTrace,
1597
+ });
1598
+ return result;
1599
+ },
1600
+ });
1601
+ return response;
1602
+ }, _AssetsController_runBackgroundFetch = function _AssetsController_runBackgroundFetch({ accounts, chainIds, request, pipelineTrace, isBasicFunctionality, }) {
1603
+ if (chainIds.length === 0) {
1604
+ return;
1605
+ }
1606
+ const slowSources = isBasicFunctionality
1607
+ ? [__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")]
1608
+ : [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
1609
+ const slowRequest = { ...request, chainIds };
1610
+ (0, trace_js_1.withTrace)({
1611
+ name: TRACE_BACKGROUND_FETCH,
1612
+ trace: pipelineTrace,
1613
+ data: {
1614
+ chain_count: chainIds.length,
1615
+ account_count: accounts.length,
1616
+ },
1617
+ fn: async (parentContext) => {
1618
+ const { response } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, {
1619
+ sources: [
1620
+ (0, ParallelMiddleware_js_1.createParallelBalanceMiddleware)(slowSources),
1621
+ __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
1622
+ ...(isBasicFunctionality
1623
+ ? [
1624
+ (0, ParallelMiddleware_js_1.createParallelMiddleware)([
1625
+ __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
1626
+ __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
1627
+ ]),
1628
+ ]
1629
+ : []),
1630
+ ],
1631
+ request: slowRequest,
1632
+ parentContext,
1633
+ trace: pipelineTrace,
1634
+ });
1635
+ await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...response, updateMode: 'merge' });
1636
+ },
1637
+ }).catch((error) => log('Background pipeline failed', { error }));
1638
+ }, _AssetsController_emitFastFetchTraces = function _AssetsController_emitFastFetchTraces({ accounts, chainIds, result, durationMs, isBasicFunctionality, parentContext, pipelineTrace, }) {
1639
+ (0, trace_js_1.emitTrace)({
1640
+ name: TRACE_FULL_FETCH,
1641
+ trace: pipelineTrace,
1642
+ data: {
1643
+ duration_ms: durationMs,
1644
+ chain_count: chainIds.length,
1645
+ account_count: accounts.length,
1646
+ basic_functionality: isBasicFunctionality,
1647
+ asset_count: result.response.assetsBalance
1648
+ ? Object.values(result.response.assetsBalance).reduce((sum, account) => sum + Object.keys(account).length, 0)
1649
+ : 0,
1650
+ price_count: result.response.assetsPrice
1651
+ ? Object.keys(result.response.assetsPrice).length
1652
+ : 0,
1653
+ ...result.durationByDataSource,
1654
+ },
1655
+ parentContext,
1656
+ });
1657
+ (0, trace_js_1.emitTrace)({
1658
+ name: TRACE_FIRST_INIT_FETCH,
1659
+ trace: pipelineTrace,
1660
+ data: {
1661
+ duration_ms: durationMs,
1662
+ chain_ids: JSON.stringify(chainIds),
1663
+ ...result.durationByDataSource,
1664
+ },
1665
+ parentContext,
1666
+ });
1587
1667
  }, _AssetsController_assertNonEmptyAccountId = function _AssetsController_assertNonEmptyAccountId(accountId, methodName) {
1588
1668
  if (typeof accountId !== 'string' || accountId.length === 0) {
1589
1669
  throw new Error(`AssetsController.${methodName}: accountId must be a non-empty string`);
@@ -1595,6 +1675,25 @@ async function _AssetsController_executeMiddlewares(params) {
1595
1675
  catch {
1596
1676
  throw new Error(`AssetsController.${methodName}: invalid CAIP-19 assetId "${assetId}"`);
1597
1677
  }
1678
+ }, _AssetsController_getHiddenAssetIds = function _AssetsController_getHiddenAssetIds() {
1679
+ const hidden = [];
1680
+ for (const [assetId, prefs] of Object.entries(this.state.assetPreferences)) {
1681
+ if (prefs.hidden) {
1682
+ hidden.push(assetId);
1683
+ }
1684
+ }
1685
+ return hidden;
1686
+ }, _AssetsController_isBalanceV6Enabled = function _AssetsController_isBalanceV6Enabled() {
1687
+ try {
1688
+ const { remoteFeatureFlags } = this.messenger.call('RemoteFeatureFlagController:getState');
1689
+ const flag = remoteFeatureFlags?.assetsAccountsApiV6;
1690
+ return (typeof flag === 'object' &&
1691
+ flag !== null &&
1692
+ Boolean(flag.value));
1693
+ }
1694
+ catch {
1695
+ return false;
1696
+ }
1598
1697
  }, _AssetsController_fetchMissingPricesWithoutCache = function _AssetsController_fetchMissingPricesWithoutCache(accounts, chainIds) {
1599
1698
  if (!__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this) || accounts.length === 0) {
1600
1699
  return;
@@ -1676,10 +1775,16 @@ async function _AssetsController_executeMiddlewares(params) {
1676
1775
  return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_resolveNativeAssetIds).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getEnabledChainsForAccount).call(this, account));
1677
1776
  }, _AssetsController_getSlowPipelineChainIds = function _AssetsController_getSlowPipelineChainIds(chainIds, fastResponse) {
1678
1777
  const accountsApiChains = new Set(__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f").getActiveChainsSync());
1778
+ // Chains whose pins went unresolved (`unprocessedCustomAssets`): route
1779
+ // them to the slow pipeline so RPC fetches the pins.
1780
+ const unprocessedCustomAssetChains = new Set((fastResponse.unprocessedCustomAssets ?? []).map((assetId) => assetId.split('/')[0]));
1679
1781
  return chainIds.filter((chainId) => {
1680
1782
  if (fastResponse.errors?.[chainId]) {
1681
1783
  return true;
1682
1784
  }
1785
+ if (unprocessedCustomAssetChains.has(chainId)) {
1786
+ return true;
1787
+ }
1683
1788
  if (!accountsApiChains.has(chainId)) {
1684
1789
  return true;
1685
1790
  }
@@ -1819,9 +1924,9 @@ async function _AssetsController_executeMiddlewares(params) {
1819
1924
  for (const [accountId, accountBalances] of Object.entries(normalizedResponse.assetsBalance)) {
1820
1925
  const previousBalances = previousState.assetsBalance[accountId] ?? {};
1821
1926
  const customAssetIds = state.customAssets[accountId] ?? [];
1822
- const replaceCoveredChains = mode === 'full' ||
1823
- normalizedResponse.replaceCoveredChainBalances === true;
1824
- const effective = mergeAccountBalances(previousBalances, accountBalances, customAssetIds, replaceCoveredChains);
1927
+ const effective = mode === 'full'
1928
+ ? mergeAccountBalancesV6(previousBalances, accountBalances, normalizedResponse.unprocessedCustomAssets ?? [])
1929
+ : mergeAccountBalancesV5(previousBalances, accountBalances, customAssetIds, normalizedResponse.replaceCoveredChainBalances === true);
1825
1930
  // Ensure native tokens have an entry (0 if missing) for chains this account supports
1826
1931
  const account = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).find((a) => a.id === accountId);
1827
1932
  const nativeAssetIdsForAccount = account
@@ -1878,10 +1983,8 @@ async function _AssetsController_executeMiddlewares(params) {
1878
1983
  changedPriceAssets.length > 0) {
1879
1984
  log('State updated', {
1880
1985
  changedBalances: changedBalances.length > 0 ? changedBalances : undefined,
1881
- changedMetadataCount: changedMetadata.length > 0 ? changedMetadata.length : undefined,
1882
- changedPricesCount: changedPriceAssets.length > 0
1883
- ? changedPriceAssets.length
1884
- : undefined,
1986
+ changedMetadata: changedMetadata.length > 0 ? changedMetadata : undefined,
1987
+ changedPrices: changedPriceAssets.length > 0 ? changedPriceAssets : undefined,
1885
1988
  newAssets: Object.keys(detectedAssets).length > 0
1886
1989
  ? Object.entries(detectedAssets).map(([accountId, assets]) => ({
1887
1990
  accountId,
@@ -2054,16 +2157,10 @@ async function _AssetsController_executeMiddlewares(params) {
2054
2157
  if (!subscriptionKey.startsWith('ds:')) {
2055
2158
  continue;
2056
2159
  }
2057
- // Subscription keys take the form `ds:<SourceName>` for the regular
2058
- // subscription or `ds:<SourceName>:<suffix>` for supplemental
2059
- // subscriptions (e.g. `ds:RpcDataSource:custom`). Split on `:` and
2060
- // pick the source-name segment so both shapes resolve correctly.
2160
+ // Subscription keys take the form `ds:<SourceName>`.
2061
2161
  const [, sourceId] = subscriptionKey.split(':');
2062
2162
  const source = allSources.find((ds) => ds.getName() === sourceId);
2063
2163
  if (source) {
2064
- // Unsubscribe by the actual key — `#unsubscribeDataSource` only
2065
- // knows the regular `ds:<SourceName>` shape and would miss
2066
- // supplemental subscriptions, leaking their polling timers.
2067
2164
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeBySubscriptionKey).call(this, source, subscriptionKey);
2068
2165
  }
2069
2166
  }
@@ -2081,12 +2178,15 @@ async function _AssetsController_executeMiddlewares(params) {
2081
2178
  // Subscribe to price updates for all assets held by selected accounts
2082
2179
  this.subscribeAssetsPrice(accounts, enabledChains);
2083
2180
  }, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance(accounts, chainIds, options) {
2181
+ if (__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isBalanceV6Enabled).call(this)) {
2182
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalanceV6).call(this, accounts, chainIds, options);
2183
+ return;
2184
+ }
2185
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalanceV5).call(this, accounts, chainIds, options);
2186
+ }, _AssetsController_subscribeAssetsBalanceV5 = function _AssetsController_subscribeAssetsBalanceV5(accounts, chainIds, options) {
2084
2187
  const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, accounts, new Set(chainIds));
2085
2188
  const remainingChains = new Set(chainToAccounts.keys());
2086
- // When basic functionality is on, use all balance data sources; when off,
2087
- // RPC only.
2088
- const isBasicFunctionality = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this);
2089
- const balanceDataSources = isBasicFunctionality
2189
+ const balanceDataSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
2090
2190
  ? __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get)
2091
2191
  : [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
2092
2192
  let rpcAssignedChains = new Set();
@@ -2125,13 +2225,81 @@ async function _AssetsController_executeMiddlewares(params) {
2125
2225
  });
2126
2226
  }
2127
2227
  }
2128
- // Supplemental RPC subscription for customAssets on chains another data
2129
- // source claimed during regular handoff. RPC is the sole balance fetcher
2130
- // for customAssets, so we must always poll them — even when (e.g.)
2131
- // AccountsApi is already covering the chain for normal balances. The
2132
- // supplemental subscription runs in `customAssetsOnly` mode so it does
2133
- // NOT double-poll the regular tracked balances.
2134
2228
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeRpcCustomAssetsSupplement).call(this, accounts, chainToAccounts, rpcAssignedChains);
2229
+ }, _AssetsController_subscribeAssetsBalanceV6 = function _AssetsController_subscribeAssetsBalanceV6(accounts, chainIds, options) {
2230
+ const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, accounts, new Set(chainIds));
2231
+ const remainingChains = new Set(chainToAccounts.keys());
2232
+ const remainingCustomAssets = new Set();
2233
+ for (const account of accounts) {
2234
+ for (const assetId of this.getCustomAssets(account.id)) {
2235
+ try {
2236
+ if (remainingChains.has((0, utils_1.parseCaipAssetType)(assetId).chainId)) {
2237
+ remainingCustomAssets.add(assetId);
2238
+ }
2239
+ }
2240
+ catch {
2241
+ // Skip unparseable asset IDs
2242
+ }
2243
+ }
2244
+ }
2245
+ const balanceDataSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
2246
+ ? __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get)
2247
+ : [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
2248
+ for (const source of balanceDataSources) {
2249
+ const availableChains = new Set(source.getActiveChainsSync());
2250
+ const assignedChains = [];
2251
+ for (const chainId of remainingChains) {
2252
+ if (availableChains.has(chainId)) {
2253
+ assignedChains.push(chainId);
2254
+ remainingChains.delete(chainId);
2255
+ }
2256
+ }
2257
+ const claimedAssets = source.claimCustomAssets([...remainingCustomAssets], assignedChains);
2258
+ for (const assetId of claimedAssets) {
2259
+ remainingCustomAssets.delete(assetId);
2260
+ }
2261
+ if (assignedChains.length === 0 && claimedAssets.length === 0) {
2262
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
2263
+ continue;
2264
+ }
2265
+ const claimedAssetsSet = new Set(claimedAssets);
2266
+ const seenIds = new Set();
2267
+ const accountsForSource = assignedChains
2268
+ .flatMap((chainId) => chainToAccounts.get(chainId) ?? [])
2269
+ .filter((account) => {
2270
+ if (seenIds.has(account.id)) {
2271
+ return false;
2272
+ }
2273
+ seenIds.add(account.id);
2274
+ return true;
2275
+ });
2276
+ for (const account of accounts) {
2277
+ if (!seenIds.has(account.id) &&
2278
+ this.getCustomAssets(account.id).some((assetId) => claimedAssetsSet.has(assetId))) {
2279
+ seenIds.add(account.id);
2280
+ accountsForSource.push(account);
2281
+ }
2282
+ }
2283
+ if (accountsForSource.length > 0) {
2284
+ const hiddenAssets = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getHiddenAssetIds).call(this);
2285
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeDataSource).call(this, source, accountsForSource, assignedChains, {
2286
+ customAssets: claimedAssets,
2287
+ excludeAssetIds: hiddenAssets.length > 0 ? hiddenAssets : undefined,
2288
+ ...(options?.skipInitialFetch &&
2289
+ source === __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f")
2290
+ ? { skipInitialFetch: true }
2291
+ : {}),
2292
+ });
2293
+ }
2294
+ else {
2295
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
2296
+ }
2297
+ }
2298
+ if (remainingCustomAssets.size > 0) {
2299
+ log('Custom assets unclaimed by any data source', {
2300
+ assetIds: [...remainingCustomAssets],
2301
+ });
2302
+ }
2135
2303
  }, _AssetsController_subscribeRpcCustomAssetsSupplement = function _AssetsController_subscribeRpcCustomAssetsSupplement(accounts, chainToAccounts, rpcAssignedChains) {
2136
2304
  const rpc = __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f");
2137
2305
  const supplementalKey = `ds:${rpc.getName()}:custom`;
@@ -2194,12 +2362,14 @@ async function _AssetsController_executeMiddlewares(params) {
2194
2362
  const subscriptionKey = options.subscriptionKey ?? `ds:${sourceId}`;
2195
2363
  const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
2196
2364
  const isUpdate = existingSubscription !== undefined;
2365
+ const customAssets = options.customAssets ?? [];
2197
2366
  log('Subscribe to data source', {
2198
2367
  sourceId,
2199
2368
  subscriptionKey,
2200
2369
  isUpdate,
2201
2370
  accountCount: accounts.length,
2202
2371
  chainCount: chains.length,
2372
+ customAssetCount: customAssets.length,
2203
2373
  customAssetsOnly: options.customAssetsOnly === true,
2204
2374
  skipInitialFetch: options.skipInitialFetch === true,
2205
2375
  });
@@ -2208,6 +2378,10 @@ async function _AssetsController_executeMiddlewares(params) {
2208
2378
  assetTypes: ['fungible'],
2209
2379
  dataTypes: ['balance'],
2210
2380
  updateInterval: __classPrivateFieldGet(this, _AssetsController_defaultUpdateInterval, "f"),
2381
+ customAssets: customAssets.length > 0 ? customAssets : undefined,
2382
+ excludeAssetIds: options.excludeAssetIds && options.excludeAssetIds.length > 0
2383
+ ? options.excludeAssetIds
2384
+ : undefined,
2211
2385
  ...(options.customAssetsOnly === true
2212
2386
  ? { customAssetsOnly: true }
2213
2387
  : {}),
@@ -2371,13 +2545,13 @@ async function _AssetsController_handleAccountGroupChanged(groupId, previousGrou
2371
2545
  // The data will simply not be updated until the network is re-enabled.
2372
2546
  // Refresh subscriptions for new chain set
2373
2547
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
2374
- // Do one-time fetch for newly enabled chains; merge so we keep existing chain balances
2548
+ // One-time fetch for newly enabled chains. v6 `full` replace is scoped to
2549
+ // those chains; existing balances on other chains are left untouched.
2375
2550
  const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
2376
2551
  if (addedChains.length > 0 && accounts.length > 0) {
2377
2552
  await this.getAssets(accounts, {
2378
2553
  chainIds: addedChains,
2379
2554
  forceUpdate: true,
2380
- updateMode: 'merge',
2381
2555
  });
2382
2556
  }
2383
2557
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
@@ -2500,5 +2674,150 @@ async function _AssetsController_refreshAssetsAfterNetworkAdded(hexChainId) {
2500
2674
  });
2501
2675
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
2502
2676
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_fetchMissingPricesWithoutCache).call(this, accounts, [caipChainId]);
2677
+ }, _AssetsController_handleAssetsUpdateV5 = async function _AssetsController_handleAssetsUpdateV5(response, sourceId, request) {
2678
+ const pipelineTrace = __classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")
2679
+ ? undefined
2680
+ : __classPrivateFieldGet(this, _AssetsController_trace, "f");
2681
+ await (0, trace_js_1.withTrace)({
2682
+ name: TRACE_UPDATE_PARENT,
2683
+ trace: pipelineTrace,
2684
+ data: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getUpdateTraceData).call(this, response, sourceId),
2685
+ fn: async (parentContext) => {
2686
+ const updateStart = performance.now();
2687
+ const pipelineRequest = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getUpdatePipelineRequest).call(this, request);
2688
+ const shouldGraduateCustomAssets = sourceId === 'AccountsApiDataSource' ||
2689
+ sourceId === 'AccountActivityDataSource';
2690
+ const shouldFilterOccurrences = sourceId === 'AccountActivityDataSource' &&
2691
+ __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this);
2692
+ const enrichmentSources = [
2693
+ ...(shouldGraduateCustomAssets
2694
+ ? [__classPrivateFieldGet(this, _AssetsController_customAssetGraduationMiddleware, "f")]
2695
+ : []),
2696
+ ...(shouldFilterOccurrences
2697
+ ? [
2698
+ {
2699
+ getName: () => 'OccurrenceFloorFilter',
2700
+ assetsMiddleware: __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f").occurrenceFilterMiddleware,
2701
+ },
2702
+ ]
2703
+ : []),
2704
+ ];
2705
+ enrichmentSources.push(__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"));
2706
+ if (__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
2707
+ enrichmentSources.push((0, ParallelMiddleware_js_1.createParallelMiddleware)([
2708
+ __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
2709
+ __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
2710
+ ]));
2711
+ }
2712
+ const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, {
2713
+ sources: enrichmentSources,
2714
+ request: pipelineRequest,
2715
+ initialResponse: response,
2716
+ parentContext,
2717
+ trace: pipelineTrace,
2718
+ });
2719
+ await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, {
2720
+ ...enrichedResponse,
2721
+ replaceCoveredChainBalances: response.replaceCoveredChainBalances,
2722
+ });
2723
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_emitUpdateTrace).call(this, {
2724
+ response,
2725
+ sourceId,
2726
+ enrichedResponse,
2727
+ updateStart,
2728
+ pipelineTrace,
2729
+ parentContext,
2730
+ });
2731
+ },
2732
+ });
2733
+ }, _AssetsController_handleAssetsUpdateV6 = async function _AssetsController_handleAssetsUpdateV6(response, sourceId, request) {
2734
+ const pipelineTrace = __classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")
2735
+ ? undefined
2736
+ : __classPrivateFieldGet(this, _AssetsController_trace, "f");
2737
+ await (0, trace_js_1.withTrace)({
2738
+ name: TRACE_UPDATE_PARENT,
2739
+ trace: pipelineTrace,
2740
+ data: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getUpdateTraceData).call(this, response, sourceId),
2741
+ fn: async (parentContext) => {
2742
+ const updateStart = performance.now();
2743
+ const pipelineRequest = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getUpdatePipelineRequest).call(this, request);
2744
+ const shouldFilterOccurrences = sourceId === 'AccountActivityDataSource' &&
2745
+ __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this);
2746
+ const enrichmentSources = [
2747
+ ...(shouldFilterOccurrences
2748
+ ? [
2749
+ {
2750
+ getName: () => 'OccurrenceFloorFilter',
2751
+ assetsMiddleware: __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f").occurrenceFilterMiddleware,
2752
+ },
2753
+ ]
2754
+ : []),
2755
+ ];
2756
+ if (__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
2757
+ enrichmentSources.push(__classPrivateFieldGet(this, _AssetsController_rpcFallbackMiddleware, "f"));
2758
+ }
2759
+ enrichmentSources.push(__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"));
2760
+ if (__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
2761
+ enrichmentSources.push((0, ParallelMiddleware_js_1.createParallelMiddleware)([
2762
+ __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
2763
+ __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
2764
+ ]));
2765
+ }
2766
+ const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, {
2767
+ sources: enrichmentSources,
2768
+ request: pipelineRequest,
2769
+ initialResponse: response,
2770
+ parentContext,
2771
+ trace: pipelineTrace,
2772
+ });
2773
+ await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, enrichedResponse);
2774
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_emitUpdateTrace).call(this, {
2775
+ response,
2776
+ sourceId,
2777
+ enrichedResponse,
2778
+ updateStart,
2779
+ pipelineTrace,
2780
+ parentContext,
2781
+ });
2782
+ },
2783
+ });
2784
+ }, _AssetsController_getUpdatePipelineRequest = function _AssetsController_getUpdatePipelineRequest(request) {
2785
+ const resolvedRequest = request ?? {
2786
+ accountsWithSupportedChains: [],
2787
+ chainIds: [],
2788
+ dataTypes: ['balance', 'metadata', 'price'],
2789
+ };
2790
+ if (__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
2791
+ return resolvedRequest;
2792
+ }
2793
+ return {
2794
+ ...resolvedRequest,
2795
+ dataTypes: resolvedRequest.dataTypes.filter((dataType) => dataType !== 'metadata' && dataType !== 'price'),
2796
+ };
2797
+ }, _AssetsController_getUpdateTraceData = function _AssetsController_getUpdateTraceData(response, sourceId) {
2798
+ return {
2799
+ source: sourceId,
2800
+ has_balance: Boolean(response.assetsBalance),
2801
+ has_price: Boolean(response.assetsPrice),
2802
+ balance_account_count: response.assetsBalance
2803
+ ? Object.keys(response.assetsBalance).length
2804
+ : 0,
2805
+ };
2806
+ }, _AssetsController_emitUpdateTrace = function _AssetsController_emitUpdateTrace({ response, sourceId, enrichedResponse, updateStart, pipelineTrace, parentContext, }) {
2807
+ (0, trace_js_1.emitTrace)({
2808
+ name: TRACE_UPDATE_PIPELINE,
2809
+ trace: pipelineTrace,
2810
+ data: {
2811
+ source: sourceId,
2812
+ duration_ms: performance.now() - updateStart,
2813
+ has_balance: Boolean(response.assetsBalance),
2814
+ has_price: Boolean(response.assetsPrice),
2815
+ has_metadata: Boolean(enrichedResponse.assetsInfo),
2816
+ balance_account_count: response.assetsBalance
2817
+ ? Object.keys(response.assetsBalance).length
2818
+ : 0,
2819
+ },
2820
+ parentContext,
2821
+ });
2503
2822
  };
2504
2823
  //# sourceMappingURL=AssetsController.cjs.map