@metamask/assets-controller 2.4.0 → 3.0.0

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 (44) hide show
  1. package/CHANGELOG.md +17 -1
  2. package/dist/AssetsController.cjs +30 -12
  3. package/dist/AssetsController.cjs.map +1 -1
  4. package/dist/AssetsController.d.cts +6 -20
  5. package/dist/AssetsController.d.cts.map +1 -1
  6. package/dist/AssetsController.d.mts +6 -20
  7. package/dist/AssetsController.d.mts.map +1 -1
  8. package/dist/AssetsController.mjs +30 -12
  9. package/dist/AssetsController.mjs.map +1 -1
  10. package/dist/data-sources/TokenDataSource.cjs +52 -22
  11. package/dist/data-sources/TokenDataSource.cjs.map +1 -1
  12. package/dist/data-sources/TokenDataSource.d.cts +2 -0
  13. package/dist/data-sources/TokenDataSource.d.cts.map +1 -1
  14. package/dist/data-sources/TokenDataSource.d.mts +2 -0
  15. package/dist/data-sources/TokenDataSource.d.mts.map +1 -1
  16. package/dist/data-sources/TokenDataSource.mjs +52 -22
  17. package/dist/data-sources/TokenDataSource.mjs.map +1 -1
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.cts +2 -2
  20. package/dist/index.d.cts.map +1 -1
  21. package/dist/index.d.mts +2 -2
  22. package/dist/index.d.mts.map +1 -1
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/middlewares/ParallelMiddleware.cjs +56 -16
  25. package/dist/middlewares/ParallelMiddleware.cjs.map +1 -1
  26. package/dist/middlewares/ParallelMiddleware.d.cts +3 -7
  27. package/dist/middlewares/ParallelMiddleware.d.cts.map +1 -1
  28. package/dist/middlewares/ParallelMiddleware.d.mts +3 -7
  29. package/dist/middlewares/ParallelMiddleware.d.mts.map +1 -1
  30. package/dist/middlewares/ParallelMiddleware.mjs +56 -16
  31. package/dist/middlewares/ParallelMiddleware.mjs.map +1 -1
  32. package/dist/middlewares/index.cjs.map +1 -1
  33. package/dist/middlewares/index.d.cts +2 -1
  34. package/dist/middlewares/index.d.cts.map +1 -1
  35. package/dist/middlewares/index.d.mts +2 -1
  36. package/dist/middlewares/index.d.mts.map +1 -1
  37. package/dist/middlewares/index.mjs.map +1 -1
  38. package/dist/types.cjs.map +1 -1
  39. package/dist/types.d.cts +15 -0
  40. package/dist/types.d.cts.map +1 -1
  41. package/dist/types.d.mts +15 -0
  42. package/dist/types.d.mts.map +1 -1
  43. package/dist/types.mjs.map +1 -1
  44. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [3.0.0]
11
+
12
+ ### Added
13
+
14
+ - Per-data-source latency inside parallel middlewares: `durationByDataSource` now includes entries such as `ParallelMiddleware.TokenDataSource`, `ParallelMiddleware.PriceDataSource`, and `ParallelBalanceMiddleware.<SourceName>` (ms), so traces can see which internal sources contributed to `ParallelMiddleware` and `ParallelBalanceMiddleware` timings. ([#8147](https://github.com/MetaMask/core/pull/8147))
15
+
16
+ ### Changed
17
+
18
+ - **BREAKING:** First-init-fetch measurement moved from MetaMetrics to Sentry. Option `trackMetaMetricsEvent` is replaced by `trace: TraceCallback`. Type `AssetsControllerFirstInitFetchMetaMetricsPayload` is removed; trace request data is not typed in this package. ([#8147](https://github.com/MetaMask/core/pull/8147))
19
+ - `TokenDataSource` now always includes native token asset IDs (from `NetworkEnablementController.nativeAssetIdentifiers`) in metadata fetch calls, ensuring native tokens always have up-to-date metadata ([#8227](https://github.com/MetaMask/core/pull/8227))
20
+ - `TokenDataSource` now filters out non-native tokens with fewer than 3 occurrences from metadata responses, and also removes their balances and detected asset entries, to prevent spam tokens from being stored in state ([#8227](https://github.com/MetaMask/core/pull/8227))
21
+ - `TokenDataSource` now requests `includeOccurrences` when fetching v3 asset metadata ([#8227](https://github.com/MetaMask/core/pull/8227))
22
+ - Bump `@metamask/assets-controllers` from `^101.0.0` to `^101.0.1` ([#8232](https://github.com/MetaMask/core/pull/8232))
23
+ - Bump `@metamask/core-backend` from `^6.1.1` to `^6.2.0` ([#8232](https://github.com/MetaMask/core/pull/8232))
24
+
10
25
  ## [2.4.0]
11
26
 
12
27
  ### Changed
@@ -175,7 +190,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
175
190
  - Refactor `RpcDataSource` to delegate polling to `BalanceFetcher` and `TokenDetector` services ([#7709](https://github.com/MetaMask/core/pull/7709))
176
191
  - Refactor `BalanceFetcher` and `TokenDetector` to extend `StaticIntervalPollingControllerOnly` for independent polling management ([#7709](https://github.com/MetaMask/core/pull/7709))
177
192
 
178
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@2.4.0...HEAD
193
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@3.0.0...HEAD
194
+ [3.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@2.4.0...@metamask/assets-controller@3.0.0
179
195
  [2.4.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@2.3.0...@metamask/assets-controller@2.4.0
180
196
  [2.3.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@2.2.0...@metamask/assets-controller@2.3.0
181
197
  [2.2.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@2.1.0...@metamask/assets-controller@2.2.0
@@ -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_trackMetaMetricsEvent, _AssetsController_firstInitFetchReported, _AssetsController_uiOpen, _AssetsController_keyringUnlocked, _AssetsController_controllerMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_selectedAccounts_get, _AssetsController_backendWebsocketDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_stakedBalanceDataSource, _AssetsController_allBalanceDataSources_get, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_tokenDataSource, _AssetsController_unsubscribeBasicFunctionality, _AssetsController_onActiveChainsUpdated, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_updateActive, _AssetsController_registerActionHandlers, _AssetsController_handleActiveChainsUpdate, _AssetsController_executeMiddlewares, _AssetsController_resolveNativeAssetIds, _AssetsController_getNativeAssetIdsForEnabledChains, _AssetsController_getNativeAssetIdsForAccount, _AssetsController_ensureNativeBalancesDefaultZero, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeAssets, _AssetsController_subscribeAssetsBalance, _AssetsController_subscribeStakedBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_subscribeDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged;
16
+ var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_trace, _AssetsController_firstInitFetchReported, _AssetsController_uiOpen, _AssetsController_keyringUnlocked, _AssetsController_controllerMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_selectedAccounts_get, _AssetsController_backendWebsocketDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_stakedBalanceDataSource, _AssetsController_allBalanceDataSources_get, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_tokenDataSource, _AssetsController_unsubscribeBasicFunctionality, _AssetsController_onActiveChainsUpdated, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_updateActive, _AssetsController_registerActionHandlers, _AssetsController_handleActiveChainsUpdate, _AssetsController_executeMiddlewares, _AssetsController_resolveNativeAssetIds, _AssetsController_getNativeAssetIdsForEnabledChains, _AssetsController_getNativeAssetIdsForAccount, _AssetsController_ensureNativeBalancesDefaultZero, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeAssets, _AssetsController_subscribeAssetsBalance, _AssetsController_subscribeStakedBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_subscribeDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged;
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");
@@ -199,7 +199,7 @@ function normalizeResponse(response) {
199
199
  * - The controller does NOT manage polling - it simply receives pushed updates
200
200
  */
201
201
  class AssetsController extends base_controller_1.BaseController {
202
- constructor({ messenger, state = {}, defaultUpdateInterval = DEFAULT_POLLING_INTERVAL_MS, isEnabled = () => true, isBasicFunctionality, subscribeToBasicFunctionalityChange, queryApiClient, rpcDataSourceConfig, trackMetaMetricsEvent, accountsApiDataSourceConfig, priceDataSourceConfig, stakedBalanceDataSourceConfig, }) {
202
+ constructor({ messenger, state = {}, defaultUpdateInterval = DEFAULT_POLLING_INTERVAL_MS, isEnabled = () => true, isBasicFunctionality, subscribeToBasicFunctionalityChange, queryApiClient, rpcDataSourceConfig, trace, accountsApiDataSourceConfig, priceDataSourceConfig, stakedBalanceDataSourceConfig, }) {
203
203
  super({
204
204
  name: CONTROLLER_NAME,
205
205
  messenger,
@@ -216,8 +216,8 @@ class AssetsController extends base_controller_1.BaseController {
216
216
  _AssetsController_isBasicFunctionality.set(this, void 0);
217
217
  /** Default update interval hint passed to data sources */
218
218
  _AssetsController_defaultUpdateInterval.set(this, void 0);
219
- /** Optional callback for first init/fetch MetaMetrics (duration). */
220
- _AssetsController_trackMetaMetricsEvent.set(this, void 0);
219
+ /** Optional trace callback for first init/fetch measurement (duration). */
220
+ _AssetsController_trace.set(this, void 0);
221
221
  /** Whether we have already reported first init fetch for this session (reset on #stop). */
222
222
  _AssetsController_firstInitFetchReported.set(this, false);
223
223
  /** Whether the client (UI) is open. Combined with #keyringUnlocked for #updateActive. */
@@ -247,7 +247,7 @@ class AssetsController extends base_controller_1.BaseController {
247
247
  __classPrivateFieldSet(this, _AssetsController_isEnabled, isEnabled(), "f");
248
248
  __classPrivateFieldSet(this, _AssetsController_isBasicFunctionality, isBasicFunctionality ?? (() => true), "f");
249
249
  __classPrivateFieldSet(this, _AssetsController_defaultUpdateInterval, defaultUpdateInterval, "f");
250
- __classPrivateFieldSet(this, _AssetsController_trackMetaMetricsEvent, trackMetaMetricsEvent, "f");
250
+ __classPrivateFieldSet(this, _AssetsController_trace, trace, "f");
251
251
  const rpcConfig = rpcDataSourceConfig ?? {};
252
252
  __classPrivateFieldSet(this, _AssetsController_onActiveChainsUpdated, (dataSourceName, chains, previousChains) => {
253
253
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleActiveChainsUpdate).call(this, dataSourceName, chains, previousChains);
@@ -278,6 +278,10 @@ class AssetsController extends base_controller_1.BaseController {
278
278
  }), "f");
279
279
  __classPrivateFieldSet(this, _AssetsController_tokenDataSource, new TokenDataSource_1.TokenDataSource({
280
280
  queryApiClient,
281
+ getNativeAssetIds: () => {
282
+ const { nativeAssetIdentifiers } = this.messenger.call('NetworkEnablementController:getState');
283
+ return Object.values(nativeAssetIdentifiers);
284
+ },
281
285
  }), "f");
282
286
  __classPrivateFieldSet(this, _AssetsController_priceDataSource, new PriceDataSource_1.PriceDataSource({
283
287
  queryApiClient,
@@ -365,14 +369,23 @@ class AssetsController extends base_controller_1.BaseController {
365
369
  options.chainIds.length < __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size;
366
370
  const updateMode = options?.updateMode ?? (isPartialChainFetch ? 'merge' : 'full');
367
371
  await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...response, updateMode });
368
- if (__classPrivateFieldGet(this, _AssetsController_trackMetaMetricsEvent, "f") && !__classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")) {
372
+ if (__classPrivateFieldGet(this, _AssetsController_trace, "f") && !__classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")) {
369
373
  __classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, true, "f");
370
374
  const durationMs = Date.now() - startTime;
371
- __classPrivateFieldGet(this, _AssetsController_trackMetaMetricsEvent, "f").call(this, {
372
- durationMs,
373
- chainIds,
374
- durationByDataSource,
375
- });
375
+ try {
376
+ await __classPrivateFieldGet(this, _AssetsController_trace, "f").call(this, {
377
+ name: 'AssetsController First Init Fetch',
378
+ data: {
379
+ duration_ms: durationMs,
380
+ chain_ids: JSON.stringify(chainIds),
381
+ ...durationByDataSource,
382
+ },
383
+ tags: { controller: 'AssetsController' },
384
+ }, () => undefined);
385
+ }
386
+ catch {
387
+ // Telemetry failure must not break.
388
+ }
376
389
  }
377
390
  }
378
391
  const result = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
@@ -753,7 +766,7 @@ class AssetsController extends base_controller_1.BaseController {
753
766
  }
754
767
  }
755
768
  exports.AssetsController = AssetsController;
756
- _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctionality = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_trackMetaMetricsEvent = new WeakMap(), _AssetsController_firstInitFetchReported = new WeakMap(), _AssetsController_uiOpen = new WeakMap(), _AssetsController_keyringUnlocked = new WeakMap(), _AssetsController_controllerMutex = new WeakMap(), _AssetsController_activeSubscriptions = new WeakMap(), _AssetsController_enabledChains = new WeakMap(), _AssetsController_backendWebsocketDataSource = new WeakMap(), _AssetsController_accountsApiDataSource = new WeakMap(), _AssetsController_snapDataSource = new WeakMap(), _AssetsController_rpcDataSource = new WeakMap(), _AssetsController_stakedBalanceDataSource = new WeakMap(), _AssetsController_priceDataSource = new WeakMap(), _AssetsController_detectionMiddleware = new WeakMap(), _AssetsController_tokenDataSource = new WeakMap(), _AssetsController_unsubscribeBasicFunctionality = new WeakMap(), _AssetsController_onActiveChainsUpdated = new WeakMap(), _AssetsController_instances = new WeakSet(), _AssetsController_selectedAccounts_get = function _AssetsController_selectedAccounts_get() {
769
+ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctionality = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_trace = new WeakMap(), _AssetsController_firstInitFetchReported = new WeakMap(), _AssetsController_uiOpen = new WeakMap(), _AssetsController_keyringUnlocked = new WeakMap(), _AssetsController_controllerMutex = new WeakMap(), _AssetsController_activeSubscriptions = new WeakMap(), _AssetsController_enabledChains = new WeakMap(), _AssetsController_backendWebsocketDataSource = new WeakMap(), _AssetsController_accountsApiDataSource = new WeakMap(), _AssetsController_snapDataSource = new WeakMap(), _AssetsController_rpcDataSource = new WeakMap(), _AssetsController_stakedBalanceDataSource = new WeakMap(), _AssetsController_priceDataSource = new WeakMap(), _AssetsController_detectionMiddleware = new WeakMap(), _AssetsController_tokenDataSource = new WeakMap(), _AssetsController_unsubscribeBasicFunctionality = new WeakMap(), _AssetsController_onActiveChainsUpdated = new WeakMap(), _AssetsController_instances = new WeakSet(), _AssetsController_selectedAccounts_get = function _AssetsController_selectedAccounts_get() {
757
770
  return this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
758
771
  }, _AssetsController_allBalanceDataSources_get = function _AssetsController_allBalanceDataSources_get() {
759
772
  return [
@@ -906,6 +919,11 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
906
919
  durationByDataSource[name] = exclusive;
907
920
  }
908
921
  }
922
+ if (result.durationByDataSource) {
923
+ for (const [key, ms] of Object.entries(result.durationByDataSource)) {
924
+ durationByDataSource[key] = ms;
925
+ }
926
+ }
909
927
  return { response: result.response, durationByDataSource };
910
928
  }, _AssetsController_resolveNativeAssetIds = function _AssetsController_resolveNativeAssetIds(chains) {
911
929
  const { nativeAssetIdentifiers } = this.messenger.call('NetworkEnablementController:getState');