@metamask-previews/assets-controller 4.0.0-preview-c5f25f9 → 4.0.0-preview-3f6f27f

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 (62) hide show
  1. package/CHANGELOG.md +3 -5
  2. package/dist/AssetsController.cjs +42 -23
  3. package/dist/AssetsController.cjs.map +1 -1
  4. package/dist/AssetsController.d.cts +4 -2
  5. package/dist/AssetsController.d.cts.map +1 -1
  6. package/dist/AssetsController.d.mts +4 -2
  7. package/dist/AssetsController.d.mts.map +1 -1
  8. package/dist/AssetsController.mjs +42 -23
  9. package/dist/AssetsController.mjs.map +1 -1
  10. package/dist/data-sources/RpcDataSource.cjs +63 -8
  11. package/dist/data-sources/RpcDataSource.cjs.map +1 -1
  12. package/dist/data-sources/RpcDataSource.d.cts +2 -1
  13. package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
  14. package/dist/data-sources/RpcDataSource.d.mts +2 -1
  15. package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
  16. package/dist/data-sources/RpcDataSource.mjs +65 -10
  17. package/dist/data-sources/RpcDataSource.mjs.map +1 -1
  18. package/dist/data-sources/TokenDataSource.cjs +1 -1
  19. package/dist/data-sources/TokenDataSource.cjs.map +1 -1
  20. package/dist/data-sources/TokenDataSource.d.cts.map +1 -1
  21. package/dist/data-sources/TokenDataSource.d.mts.map +1 -1
  22. package/dist/data-sources/TokenDataSource.mjs +1 -1
  23. package/dist/data-sources/TokenDataSource.mjs.map +1 -1
  24. package/dist/data-sources/evm-rpc-services/clients/index.cjs +1 -3
  25. package/dist/data-sources/evm-rpc-services/clients/index.cjs.map +1 -1
  26. package/dist/data-sources/evm-rpc-services/clients/index.d.cts +0 -1
  27. package/dist/data-sources/evm-rpc-services/clients/index.d.cts.map +1 -1
  28. package/dist/data-sources/evm-rpc-services/clients/index.d.mts +0 -1
  29. package/dist/data-sources/evm-rpc-services/clients/index.d.mts.map +1 -1
  30. package/dist/data-sources/evm-rpc-services/clients/index.mjs +0 -1
  31. package/dist/data-sources/evm-rpc-services/clients/index.mjs.map +1 -1
  32. package/dist/data-sources/evm-rpc-services/index.cjs +1 -2
  33. package/dist/data-sources/evm-rpc-services/index.cjs.map +1 -1
  34. package/dist/data-sources/evm-rpc-services/index.d.cts +1 -1
  35. package/dist/data-sources/evm-rpc-services/index.d.cts.map +1 -1
  36. package/dist/data-sources/evm-rpc-services/index.d.mts +1 -1
  37. package/dist/data-sources/evm-rpc-services/index.d.mts.map +1 -1
  38. package/dist/data-sources/evm-rpc-services/index.mjs +1 -1
  39. package/dist/data-sources/evm-rpc-services/index.mjs.map +1 -1
  40. package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs +48 -27
  41. package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs.map +1 -1
  42. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts +9 -12
  43. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts.map +1 -1
  44. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts +9 -12
  45. package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts.map +1 -1
  46. package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs +48 -27
  47. package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs.map +1 -1
  48. package/dist/data-sources/evm-rpc-services/services/index.cjs.map +1 -1
  49. package/dist/data-sources/evm-rpc-services/services/index.d.cts +1 -1
  50. package/dist/data-sources/evm-rpc-services/services/index.d.cts.map +1 -1
  51. package/dist/data-sources/evm-rpc-services/services/index.d.mts +1 -1
  52. package/dist/data-sources/evm-rpc-services/services/index.d.mts.map +1 -1
  53. package/dist/data-sources/evm-rpc-services/services/index.mjs.map +1 -1
  54. package/package.json +1 -1
  55. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.cjs +0 -67
  56. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.cjs.map +0 -1
  57. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.d.cts +0 -23
  58. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.d.cts.map +0 -1
  59. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.d.mts +0 -23
  60. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.d.mts.map +0 -1
  61. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.mjs +0 -63
  62. package/dist/data-sources/evm-rpc-services/clients/TokensApiClient.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -9,13 +9,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  ### Changed
11
11
 
12
- - `TokenDetector` now fetches the token list directly from the Tokens API (`/v3/chains/{chain}/assets`) via a new `TokensApiClient` instead of reading from `TokenListController:getState` ([#8385](https://github.com/MetaMask/core/pull/8385))
13
- - `TokenDetectorMessenger` type has been removed; `TokenDetector` constructor now takes a `TokensApiClient` instance as its second argument
14
- - `RpcDataSource` no longer requires `TokenListController:getState` — `GetTokenListState` has been removed from `RpcDataSourceAllowedActions` and `AssetsControllerAllowedActions`
15
- - Unknown ERC-20 metadata is no longer looked up from the token list as a fallback in `RpcDataSource`; `TokenDataSource` handles enrichment downstream
16
12
  - Split `getAssets` fetch pipeline into a fast awaited path and a parallel fire-and-forget background path to reduce perceived latency on unlock and onboarding ([#8383](https://github.com/MetaMask/core/pull/8383))
17
13
  - Fast pipeline: AccountsApi + StakedBalance → Detection → Token + Price (awaited, committed to state immediately)
18
- - Background pipeline: Snap + RPC run in parallel → Detection → Token + Price (fire-and-forget, merged into state)
14
+ - Background pipeline: Snap + RPC run in parallel → Detection → Token + Price when basic functionality is enabled; when disabled (RPC-only mode), Token + Price are omitted (fire-and-forget merge)
15
+ - `handleAssetsUpdate` skips token/price enrichment and strips `metadata` / `price` from the effective request when basic functionality is disabled (RPC-only mode)
16
+ - `setSelectedCurrency` no longer triggers a price refresh via `getAssets` when basic functionality is disabled
19
17
  - `PriceDataSource` now batches spot-price API requests in chunks of 50 using `reduceInBatchesSerially` to avoid DynamoDB batch-limit errors ([#8383](https://github.com/MetaMask/core/pull/8383))
20
18
  - `TokenDataSource` now batches token metadata API requests in chunks of 50 using `reduceInBatchesSerially` to avoid DynamoDB batch-limit errors ([#8383](https://github.com/MetaMask/core/pull/8383))
21
19
  - `PriceDataSource` filters out all synthetic `slip44:NUMBER-*` staking-position asset IDs before calling the Price API ([#8383](https://github.com/MetaMask/core/pull/8383))
@@ -356,15 +356,14 @@ class AssetsController extends base_controller_1.BaseController {
356
356
  forceUpdate: true,
357
357
  assetsForPriceUpdate: options?.assetsForPriceUpdate,
358
358
  });
359
- // Default to 'merge' when fetching a subset of chains so we don't wipe
360
- // balances from chains that weren't included in this fetch.
361
- const isPartialChainFetch = options?.chainIds !== undefined &&
362
- options.chainIds.length < __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size;
363
- const updateMode = options?.updateMode ?? (isPartialChainFetch ? 'merge' : 'full');
364
359
  // Fast pipeline: accountsApi + stakedBalance → detection → token + price.
365
360
  // Snap and RPC are excluded here due to their latency (snap triggers account
366
361
  // creation, RPC is slow on many chains). Results are committed to state
367
362
  // immediately so the UI can display balances without waiting for them.
363
+ //
364
+ // Both the fast and background pipelines use 'merge' mode because neither
365
+ // alone represents the full set of data sources. Using 'full' in either
366
+ // would wipe balances from the sources handled by the other pipeline.
368
367
  const fastSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
369
368
  ? [
370
369
  (0, ParallelMiddleware_1.createParallelBalanceMiddleware)([
@@ -379,20 +378,28 @@ class AssetsController extends base_controller_1.BaseController {
379
378
  ]
380
379
  : [__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f")];
381
380
  const { response, durationByDataSource } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, fastSources, request);
382
- await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...response, updateMode });
381
+ // The fast pipeline only contains a subset of data sources (AccountsApi +
382
+ // StakedBalance), so it must always merge to avoid wiping Snap/RPC
383
+ // balances that the background pipeline hasn't yet replaced.
384
+ await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...response, updateMode: 'merge' });
383
385
  // Background pipeline: snap and RPC run in parallel after the fast path
384
- // commits to state. Their balances are merged together before detection
385
- // and metadata/price enrichment, then merged into state.
386
+ // commits to state. Their balances are merged together before detection.
387
+ // Token + price enrichment matches the pre-split behavior: only when basic
388
+ // functionality is on (RPC-only mode must not call token/price APIs).
386
389
  const slowSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
387
390
  ? [__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")]
388
391
  : [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
389
392
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [
390
393
  (0, ParallelMiddleware_1.createParallelBalanceMiddleware)(slowSources),
391
394
  __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
392
- (0, ParallelMiddleware_1.createParallelMiddleware)([
393
- __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
394
- __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
395
- ]),
395
+ ...(__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
396
+ ? [
397
+ (0, ParallelMiddleware_1.createParallelMiddleware)([
398
+ __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
399
+ __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
400
+ ]),
401
+ ]
402
+ : []),
396
403
  ], request)
397
404
  .then(({ response: slowResponse }) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...slowResponse, updateMode: 'merge' }))
398
405
  .catch((error) => log('Background pipeline failed', { error }));
@@ -662,6 +669,9 @@ class AssetsController extends base_controller_1.BaseController {
662
669
  previousCurrency,
663
670
  selectedCurrency,
664
671
  });
672
+ if (!__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
673
+ return;
674
+ }
665
675
  this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
666
676
  forceUpdate: true,
667
677
  dataTypes: ['price'],
@@ -736,7 +746,8 @@ class AssetsController extends base_controller_1.BaseController {
736
746
  /**
737
747
  * Handle assets updated from a data source.
738
748
  * Called via the onAssetsUpdate callback passed in SubscriptionRequest when the controller subscribes to a data source.
739
- * Enriches the response with token metadata (via middlewares) before updating state.
749
+ * Runs detection, then (when basic functionality is enabled) token metadata and price enrichment before updating state.
750
+ * When basic functionality is disabled (RPC-only mode), only detection runs; token and price APIs are not used.
740
751
  *
741
752
  * @param response - The data response with updated assets
742
753
  * @param sourceId - The data source ID reporting the update
@@ -749,19 +760,27 @@ class AssetsController extends base_controller_1.BaseController {
749
760
  hasBalance: Boolean(response.assetsBalance),
750
761
  hasPrice: Boolean(response.assetsPrice),
751
762
  });
752
- // Run through enrichment middlewares (Detection, then Token + Price in parallel)
753
- // Include 'metadata' in dataTypes so TokenDataSource runs to enrich detected assets
754
- const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [
755
- __classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
756
- (0, ParallelMiddleware_1.createParallelMiddleware)([
757
- __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
758
- __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
759
- ]),
760
- ], request ?? {
763
+ const resolvedRequest = request ?? {
761
764
  accountsWithSupportedChains: [],
762
765
  chainIds: [],
763
766
  dataTypes: ['balance', 'metadata', 'price'],
764
- }, response);
767
+ };
768
+ // RPC-only mode (basic functionality off): never run token/price APIs. Strip
769
+ // those data types so downstream middleware cannot treat them as requested.
770
+ const pipelineRequest = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
771
+ ? resolvedRequest
772
+ : {
773
+ ...resolvedRequest,
774
+ dataTypes: resolvedRequest.dataTypes.filter((dt) => dt !== 'metadata' && dt !== 'price'),
775
+ };
776
+ const enrichmentSources = [__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f")];
777
+ if (__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
778
+ enrichmentSources.push((0, ParallelMiddleware_1.createParallelMiddleware)([
779
+ __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
780
+ __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
781
+ ]));
782
+ }
783
+ const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, enrichmentSources, pipelineRequest, response);
765
784
  await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, enrichedResponse);
766
785
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_emitTrace).call(this, TRACE_UPDATE_PIPELINE, {
767
786
  source: sourceId,