@metamask-previews/assets-controller 14.0.3-preview-fe4b3be11 → 14.0.3-preview-8bfa290fb

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 (74) hide show
  1. package/CHANGELOG.md +6 -4
  2. package/dist/AssetsController.cjs +273 -592
  3. package/dist/AssetsController.cjs.map +1 -1
  4. package/dist/AssetsController.d.cts +10 -7
  5. package/dist/AssetsController.d.cts.map +1 -1
  6. package/dist/AssetsController.d.mts +10 -7
  7. package/dist/AssetsController.d.mts.map +1 -1
  8. package/dist/AssetsController.mjs +273 -592
  9. package/dist/AssetsController.mjs.map +1 -1
  10. package/dist/data-sources/AbstractDataSource.cjs +0 -23
  11. package/dist/data-sources/AbstractDataSource.cjs.map +1 -1
  12. package/dist/data-sources/AbstractDataSource.d.cts +1 -13
  13. package/dist/data-sources/AbstractDataSource.d.cts.map +1 -1
  14. package/dist/data-sources/AbstractDataSource.d.mts +1 -13
  15. package/dist/data-sources/AbstractDataSource.d.mts.map +1 -1
  16. package/dist/data-sources/AbstractDataSource.mjs +0 -23
  17. package/dist/data-sources/AbstractDataSource.mjs.map +1 -1
  18. package/dist/data-sources/AccountActivityDataSource.cjs +0 -2
  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 +0 -2
  23. package/dist/data-sources/AccountActivityDataSource.mjs.map +1 -1
  24. package/dist/data-sources/AccountsApiDataSource.cjs +31 -144
  25. package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
  26. package/dist/data-sources/AccountsApiDataSource.d.cts +2 -18
  27. package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
  28. package/dist/data-sources/AccountsApiDataSource.d.mts +2 -18
  29. package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
  30. package/dist/data-sources/AccountsApiDataSource.mjs +32 -145
  31. package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
  32. package/dist/data-sources/RpcDataSource.cjs +24 -163
  33. package/dist/data-sources/RpcDataSource.cjs.map +1 -1
  34. package/dist/data-sources/RpcDataSource.d.cts +0 -17
  35. package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
  36. package/dist/data-sources/RpcDataSource.d.mts +0 -17
  37. package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
  38. package/dist/data-sources/RpcDataSource.mjs +25 -164
  39. package/dist/data-sources/RpcDataSource.mjs.map +1 -1
  40. package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs +12 -21
  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 +2 -7
  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 +2 -7
  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 +12 -21
  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 +2 -3
  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 +2 -3
  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 +0 -9
  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 +0 -9
  59. package/dist/middlewares/ParallelMiddleware.mjs.map +1 -1
  60. package/dist/middlewares/RpcFallbackMiddleware.cjs +128 -158
  61. package/dist/middlewares/RpcFallbackMiddleware.cjs.map +1 -1
  62. package/dist/middlewares/RpcFallbackMiddleware.d.cts +14 -10
  63. package/dist/middlewares/RpcFallbackMiddleware.d.cts.map +1 -1
  64. package/dist/middlewares/RpcFallbackMiddleware.d.mts +14 -10
  65. package/dist/middlewares/RpcFallbackMiddleware.d.mts.map +1 -1
  66. package/dist/middlewares/RpcFallbackMiddleware.mjs +128 -158
  67. package/dist/middlewares/RpcFallbackMiddleware.mjs.map +1 -1
  68. package/dist/types.cjs.map +1 -1
  69. package/dist/types.d.cts +26 -28
  70. package/dist/types.d.cts.map +1 -1
  71. package/dist/types.d.mts +26 -28
  72. package/dist/types.d.mts.map +1 -1
  73. package/dist/types.mjs.map +1 -1
  74. package/package.json +2 -2
@@ -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_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;
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;
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,10 +208,6 @@ 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
- }
215
211
  return normalized;
216
212
  }
217
213
  /**
@@ -219,13 +215,12 @@ function normalizeResponse(response) {
219
215
  *
220
216
  * @param previousBalances - Balances already in state for this account.
221
217
  * @param accountBalances - Balances from the incoming response.
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.
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).
226
221
  * @returns The merged balance map for the account.
227
222
  */
228
- function mergeAccountBalancesV5(previousBalances, accountBalances, customAssetIds = [], replaceCoveredChains = false) {
223
+ function mergeAccountBalances(previousBalances, accountBalances, customAssetIds, replaceCoveredChains) {
229
224
  if (!replaceCoveredChains) {
230
225
  return { ...previousBalances, ...accountBalances };
231
226
  }
@@ -239,8 +234,8 @@ function mergeAccountBalancesV5(previousBalances, accountBalances, customAssetId
239
234
  Object.assign(next, accountBalances);
240
235
  for (const customId of customAssetIds) {
241
236
  if (!Object.prototype.hasOwnProperty.call(next, customId)) {
242
- const previous = previousBalances[customId];
243
- next[customId] = previous ?? { amount: '0' };
237
+ const prev = previousBalances[customId];
238
+ next[customId] = prev ?? { amount: '0' };
244
239
  }
245
240
  }
246
241
  // Staked vault balances are owned by StakedBalanceDataSource. When an
@@ -254,38 +249,6 @@ function mergeAccountBalancesV5(previousBalances, accountBalances, customAssetId
254
249
  }
255
250
  return next;
256
251
  }
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
- }
289
252
  // ============================================================================
290
253
  // CONTROLLER IMPLEMENTATION
291
254
  // ============================================================================
@@ -406,7 +369,6 @@ class AssetsController extends base_controller_1.BaseController {
406
369
  queryApiClient,
407
370
  onActiveChainsUpdated: __classPrivateFieldGet(this, _AssetsController_onActiveChainsUpdated, "f"),
408
371
  ...accountsApiDataSourceConfig,
409
- isBalanceV6Enabled: () => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isBalanceV6Enabled).call(this),
410
372
  }), "f");
411
373
  __classPrivateFieldSet(this, _AssetsController_snapDataSource, new SnapDataSource_js_1.SnapDataSource({
412
374
  messenger: this.messenger,
@@ -426,7 +388,6 @@ class AssetsController extends base_controller_1.BaseController {
426
388
  ...rpcConfig,
427
389
  isOnboarded: rpcConfig.isOnboarded ?? isOnboarded,
428
390
  getAssetType: (assetId) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetType).call(this, assetId),
429
- isBalanceV6Enabled: () => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isBalanceV6Enabled).call(this),
430
391
  }), "f");
431
392
  __classPrivateFieldSet(this, _AssetsController_stakedBalanceDataSource, new StakedBalanceDataSource_js_1.StakedBalanceDataSource({
432
393
  messenger: this.messenger,
@@ -459,7 +420,6 @@ class AssetsController extends base_controller_1.BaseController {
459
420
  }), "f");
460
421
  __classPrivateFieldSet(this, _AssetsController_rpcFallbackMiddleware, new RpcFallbackMiddleware_js_1.RpcFallbackMiddleware({
461
422
  rpcDataSource: __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
462
- isBalanceV6Enabled: () => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_isBalanceV6Enabled).call(this),
463
423
  }), "f");
464
424
  log('Initializing AssetsController', {
465
425
  defaultUpdateInterval: __classPrivateFieldGet(this, _AssetsController_defaultUpdateInterval, "f"),
@@ -496,34 +456,147 @@ class AssetsController extends base_controller_1.BaseController {
496
456
  if (accounts.length === 0 || chainIds.length === 0) {
497
457
  return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
498
458
  }
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
+ }
499
465
  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.
500
468
  const pipelineTrace = __classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")
501
469
  ? undefined
502
470
  : __classPrivateFieldGet(this, _AssetsController_trace, "f");
503
- const requestOptions = {
471
+ const request = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildDataRequest).call(this, accounts, chainIds, {
504
472
  assetTypes,
505
473
  dataTypes,
474
+ customAssets: customAssets.length > 0 ? customAssets : undefined,
506
475
  forceUpdate: true,
476
+ bypassServerCache: options?.bypassServerCache,
507
477
  assetsForPriceUpdate: options?.assetsForPriceUpdate,
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
- });
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 }));
527
600
  }
528
601
  }
529
602
  const result = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
@@ -770,28 +843,20 @@ class AssetsController extends base_controller_1.BaseController {
770
843
  balances[accountId] ?? (balances[accountId] = {});
771
844
  (_a = balances[accountId])[normalizedAssetId] ?? (_a[normalizedAssetId] = { amount: '0' });
772
845
  });
846
+ // Fetch data for the newly added custom asset (merge to preserve other chains)
773
847
  const account = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).find((a) => a.id === accountId);
774
848
  if (account) {
775
849
  const chainId = extractChainId(normalizedAssetId);
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
- }
850
+ await this.getAssets([account], {
851
+ chainIds: [chainId],
852
+ dataTypes: ['balance', 'metadata', 'price'],
853
+ assetTypes: ['fungible'],
854
+ forceUpdate: true,
855
+ updateMode: 'merge',
856
+ });
793
857
  }
794
- // Re-evaluate subscriptions so polls pick up the new pin.
858
+ // Re-evaluate subscriptions so the supplemental RPC poll picks up the
859
+ // new customAsset on chains another data source already owns.
795
860
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
796
861
  }
797
862
  /**
@@ -812,7 +877,8 @@ class AssetsController extends base_controller_1.BaseController {
812
877
  }
813
878
  }
814
879
  });
815
- // Re-evaluate subscriptions so polls drop the removed pin.
880
+ // Re-evaluate subscriptions so the supplemental RPC poll for that chain
881
+ // is torn down when no more customAssets remain there.
816
882
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
817
883
  }
818
884
  /**
@@ -843,8 +909,6 @@ class AssetsController extends base_controller_1.BaseController {
843
909
  }
844
910
  state.assetPreferences[normalizedAssetId].hidden = true;
845
911
  });
846
- // Re-evaluate subscriptions so polls exclude the newly hidden asset.
847
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
848
912
  }
849
913
  /**
850
914
  * Unhide an asset globally.
@@ -863,8 +927,6 @@ class AssetsController extends base_controller_1.BaseController {
863
927
  }
864
928
  }
865
929
  });
866
- // Re-evaluate subscriptions so polls stop excluding the asset.
867
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
868
930
  }
869
931
  // ============================================================================
870
932
  // CURRENT CURRENCY MANAGEMENT
@@ -976,14 +1038,101 @@ class AssetsController extends base_controller_1.BaseController {
976
1038
  async handleAssetsUpdate(response, sourceId, request) {
977
1039
  log('Assets updated from data source', {
978
1040
  sourceId,
979
- assetsBalance: response.assetsBalance,
980
- assetsPrice: response.assetsPrice,
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
+ },
981
1135
  });
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);
987
1136
  }
988
1137
  // ============================================================================
989
1138
  // CLEANUP
@@ -1226,6 +1375,7 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1226
1375
  this.getAssets([matchedAccount], {
1227
1376
  chainIds: [caipChainId],
1228
1377
  forceUpdate: true,
1378
+ bypassServerCache: true,
1229
1379
  }).catch((error) => {
1230
1380
  log('Failed to refresh assets after transaction event', { error });
1231
1381
  });
@@ -1434,236 +1584,6 @@ async function _AssetsController_executeMiddlewares(params) {
1434
1584
  });
1435
1585
  }
1436
1586
  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
- });
1667
1587
  }, _AssetsController_assertNonEmptyAccountId = function _AssetsController_assertNonEmptyAccountId(accountId, methodName) {
1668
1588
  if (typeof accountId !== 'string' || accountId.length === 0) {
1669
1589
  throw new Error(`AssetsController.${methodName}: accountId must be a non-empty string`);
@@ -1675,25 +1595,6 @@ async function _AssetsController_executeMiddlewares(params) {
1675
1595
  catch {
1676
1596
  throw new Error(`AssetsController.${methodName}: invalid CAIP-19 assetId "${assetId}"`);
1677
1597
  }
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
- }
1697
1598
  }, _AssetsController_fetchMissingPricesWithoutCache = function _AssetsController_fetchMissingPricesWithoutCache(accounts, chainIds) {
1698
1599
  if (!__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this) || accounts.length === 0) {
1699
1600
  return;
@@ -1775,16 +1676,10 @@ async function _AssetsController_executeMiddlewares(params) {
1775
1676
  return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_resolveNativeAssetIds).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getEnabledChainsForAccount).call(this, account));
1776
1677
  }, _AssetsController_getSlowPipelineChainIds = function _AssetsController_getSlowPipelineChainIds(chainIds, fastResponse) {
1777
1678
  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]));
1781
1679
  return chainIds.filter((chainId) => {
1782
1680
  if (fastResponse.errors?.[chainId]) {
1783
1681
  return true;
1784
1682
  }
1785
- if (unprocessedCustomAssetChains.has(chainId)) {
1786
- return true;
1787
- }
1788
1683
  if (!accountsApiChains.has(chainId)) {
1789
1684
  return true;
1790
1685
  }
@@ -1924,9 +1819,9 @@ async function _AssetsController_executeMiddlewares(params) {
1924
1819
  for (const [accountId, accountBalances] of Object.entries(normalizedResponse.assetsBalance)) {
1925
1820
  const previousBalances = previousState.assetsBalance[accountId] ?? {};
1926
1821
  const customAssetIds = state.customAssets[accountId] ?? [];
1927
- const effective = mode === 'full'
1928
- ? mergeAccountBalancesV6(previousBalances, accountBalances, normalizedResponse.unprocessedCustomAssets ?? [])
1929
- : mergeAccountBalancesV5(previousBalances, accountBalances, customAssetIds, normalizedResponse.replaceCoveredChainBalances === true);
1822
+ const replaceCoveredChains = mode === 'full' ||
1823
+ normalizedResponse.replaceCoveredChainBalances === true;
1824
+ const effective = mergeAccountBalances(previousBalances, accountBalances, customAssetIds, replaceCoveredChains);
1930
1825
  // Ensure native tokens have an entry (0 if missing) for chains this account supports
1931
1826
  const account = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).find((a) => a.id === accountId);
1932
1827
  const nativeAssetIdsForAccount = account
@@ -1983,8 +1878,10 @@ async function _AssetsController_executeMiddlewares(params) {
1983
1878
  changedPriceAssets.length > 0) {
1984
1879
  log('State updated', {
1985
1880
  changedBalances: changedBalances.length > 0 ? changedBalances : undefined,
1986
- changedMetadata: changedMetadata.length > 0 ? changedMetadata : undefined,
1987
- changedPrices: changedPriceAssets.length > 0 ? changedPriceAssets : undefined,
1881
+ changedMetadataCount: changedMetadata.length > 0 ? changedMetadata.length : undefined,
1882
+ changedPricesCount: changedPriceAssets.length > 0
1883
+ ? changedPriceAssets.length
1884
+ : undefined,
1988
1885
  newAssets: Object.keys(detectedAssets).length > 0
1989
1886
  ? Object.entries(detectedAssets).map(([accountId, assets]) => ({
1990
1887
  accountId,
@@ -2157,10 +2054,16 @@ async function _AssetsController_executeMiddlewares(params) {
2157
2054
  if (!subscriptionKey.startsWith('ds:')) {
2158
2055
  continue;
2159
2056
  }
2160
- // Subscription keys take the form `ds:<SourceName>`.
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.
2161
2061
  const [, sourceId] = subscriptionKey.split(':');
2162
2062
  const source = allSources.find((ds) => ds.getName() === sourceId);
2163
2063
  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.
2164
2067
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeBySubscriptionKey).call(this, source, subscriptionKey);
2165
2068
  }
2166
2069
  }
@@ -2178,15 +2081,12 @@ async function _AssetsController_executeMiddlewares(params) {
2178
2081
  // Subscribe to price updates for all assets held by selected accounts
2179
2082
  this.subscribeAssetsPrice(accounts, enabledChains);
2180
2083
  }, _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) {
2187
2084
  const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, accounts, new Set(chainIds));
2188
2085
  const remainingChains = new Set(chainToAccounts.keys());
2189
- const balanceDataSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
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
2190
2090
  ? __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get)
2191
2091
  : [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
2192
2092
  let rpcAssignedChains = new Set();
@@ -2225,81 +2125,13 @@ async function _AssetsController_executeMiddlewares(params) {
2225
2125
  });
2226
2126
  }
2227
2127
  }
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.
2228
2134
  __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
- }
2303
2135
  }, _AssetsController_subscribeRpcCustomAssetsSupplement = function _AssetsController_subscribeRpcCustomAssetsSupplement(accounts, chainToAccounts, rpcAssignedChains) {
2304
2136
  const rpc = __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f");
2305
2137
  const supplementalKey = `ds:${rpc.getName()}:custom`;
@@ -2362,14 +2194,12 @@ async function _AssetsController_executeMiddlewares(params) {
2362
2194
  const subscriptionKey = options.subscriptionKey ?? `ds:${sourceId}`;
2363
2195
  const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
2364
2196
  const isUpdate = existingSubscription !== undefined;
2365
- const customAssets = options.customAssets ?? [];
2366
2197
  log('Subscribe to data source', {
2367
2198
  sourceId,
2368
2199
  subscriptionKey,
2369
2200
  isUpdate,
2370
2201
  accountCount: accounts.length,
2371
2202
  chainCount: chains.length,
2372
- customAssetCount: customAssets.length,
2373
2203
  customAssetsOnly: options.customAssetsOnly === true,
2374
2204
  skipInitialFetch: options.skipInitialFetch === true,
2375
2205
  });
@@ -2378,10 +2208,6 @@ async function _AssetsController_executeMiddlewares(params) {
2378
2208
  assetTypes: ['fungible'],
2379
2209
  dataTypes: ['balance'],
2380
2210
  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,
2385
2211
  ...(options.customAssetsOnly === true
2386
2212
  ? { customAssetsOnly: true }
2387
2213
  : {}),
@@ -2545,13 +2371,13 @@ async function _AssetsController_handleAccountGroupChanged(groupId, previousGrou
2545
2371
  // The data will simply not be updated until the network is re-enabled.
2546
2372
  // Refresh subscriptions for new chain set
2547
2373
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
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.
2374
+ // Do one-time fetch for newly enabled chains; merge so we keep existing chain balances
2550
2375
  const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
2551
2376
  if (addedChains.length > 0 && accounts.length > 0) {
2552
2377
  await this.getAssets(accounts, {
2553
2378
  chainIds: addedChains,
2554
2379
  forceUpdate: true,
2380
+ updateMode: 'merge',
2555
2381
  });
2556
2382
  }
2557
2383
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
@@ -2674,150 +2500,5 @@ async function _AssetsController_refreshAssetsAfterNetworkAdded(hexChainId) {
2674
2500
  });
2675
2501
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
2676
2502
  __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
- });
2822
2503
  };
2823
2504
  //# sourceMappingURL=AssetsController.cjs.map