@metamask/assets-controller 2.3.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.
- package/CHANGELOG.md +35 -1
- package/dist/AssetsController.cjs +50 -13
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +6 -20
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +6 -20
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +50 -13
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/RpcDataSource.cjs +102 -18
- package/dist/data-sources/RpcDataSource.cjs.map +1 -1
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
- package/dist/data-sources/RpcDataSource.mjs +102 -18
- package/dist/data-sources/RpcDataSource.mjs.map +1 -1
- package/dist/data-sources/TokenDataSource.cjs +52 -22
- package/dist/data-sources/TokenDataSource.cjs.map +1 -1
- package/dist/data-sources/TokenDataSource.d.cts +2 -0
- package/dist/data-sources/TokenDataSource.d.cts.map +1 -1
- package/dist/data-sources/TokenDataSource.d.mts +2 -0
- package/dist/data-sources/TokenDataSource.d.mts.map +1 -1
- package/dist/data-sources/TokenDataSource.mjs +52 -22
- package/dist/data-sources/TokenDataSource.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs +1 -1
- package/dist/data-sources/evm-rpc-services/services/BalanceFetcher.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/middlewares/ParallelMiddleware.cjs +56 -16
- package/dist/middlewares/ParallelMiddleware.cjs.map +1 -1
- package/dist/middlewares/ParallelMiddleware.d.cts +3 -7
- package/dist/middlewares/ParallelMiddleware.d.cts.map +1 -1
- package/dist/middlewares/ParallelMiddleware.d.mts +3 -7
- package/dist/middlewares/ParallelMiddleware.d.mts.map +1 -1
- package/dist/middlewares/ParallelMiddleware.mjs +56 -16
- package/dist/middlewares/ParallelMiddleware.mjs.map +1 -1
- package/dist/middlewares/index.cjs.map +1 -1
- package/dist/middlewares/index.d.cts +2 -1
- package/dist/middlewares/index.d.cts.map +1 -1
- package/dist/middlewares/index.d.mts +2 -1
- package/dist/middlewares/index.d.mts.map +1 -1
- package/dist/middlewares/index.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +15 -0
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +15 -0
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/dist/utils/formatExchangeRatesForBridge.cjs +17 -1
- package/dist/utils/formatExchangeRatesForBridge.cjs.map +1 -1
- package/dist/utils/formatExchangeRatesForBridge.d.cts +4 -32
- package/dist/utils/formatExchangeRatesForBridge.d.cts.map +1 -1
- package/dist/utils/formatExchangeRatesForBridge.d.mts +4 -32
- package/dist/utils/formatExchangeRatesForBridge.d.mts.map +1 -1
- package/dist/utils/formatExchangeRatesForBridge.mjs +17 -1
- package/dist/utils/formatExchangeRatesForBridge.mjs.map +1 -1
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.cts +1 -1
- package/dist/utils/index.d.cts.map +1 -1
- package/dist/utils/index.d.mts +1 -1
- package/dist/utils/index.d.mts.map +1 -1
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,38 @@ 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
|
+
|
|
25
|
+
## [2.4.0]
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
|
|
29
|
+
- Bump `@metamask/network-enablement-controller` from `^4.2.0` to `^5.0.0` ([#8225](https://github.com/MetaMask/core/pull/8225))
|
|
30
|
+
- Bump `@metamask/permission-controller` from `^12.2.0` to `^12.2.1` ([#8225](https://github.com/MetaMask/core/pull/8225))
|
|
31
|
+
- `BridgeExchangeRatesFormat` type now uses canonical `@metamask/assets-controllers` state types instead of locally-defined bridge rate entry types ([#8175](https://github.com/MetaMask/core/pull/8175))
|
|
32
|
+
- Bump `@metamask/account-tree-controller` from `^5.0.0` to `^5.0.1` ([#8162](https://github.com/MetaMask/core/pull/8162))
|
|
33
|
+
- Bump `@metamask/assets-controllers` from `^100.2.0` to `^101.0.0` ([#8162](https://github.com/MetaMask/core/pull/8162), [#8225](https://github.com/MetaMask/core/pull/8225))
|
|
34
|
+
- Bump `@metamask/core-backend` from `^6.1.0` to `^6.1.1` ([#8162](https://github.com/MetaMask/core/pull/8162))
|
|
35
|
+
- Bump `@metamask/transaction-controller` from `^62.21.0` to `^63.0.0` ([#8217](https://github.com/MetaMask/core/pull/8217), [#8225](https://github.com/MetaMask/core/pull/8225))
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
|
|
39
|
+
- Preserve custom asset metadata (symbol, name, decimals, image) in `AssetsController` when the API returns an empty response for an unknown token, preventing incorrect balance calculations and display for user-deployed tokens added via `wallet_watchAsset` ([#8202](https://github.com/MetaMask/core/pull/8202))
|
|
40
|
+
- Include custom asset token addresses in `RpcDataSource` balance fetches so that on-chain balances are retrieved immediately after token import via `addCustomAsset` ([#8202](https://github.com/MetaMask/core/pull/8202))
|
|
41
|
+
|
|
10
42
|
## [2.3.0]
|
|
11
43
|
|
|
12
44
|
### Added
|
|
@@ -158,7 +190,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
158
190
|
- Refactor `RpcDataSource` to delegate polling to `BalanceFetcher` and `TokenDetector` services ([#7709](https://github.com/MetaMask/core/pull/7709))
|
|
159
191
|
- Refactor `BalanceFetcher` and `TokenDetector` to extend `StaticIntervalPollingControllerOnly` for independent polling management ([#7709](https://github.com/MetaMask/core/pull/7709))
|
|
160
192
|
|
|
161
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@
|
|
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
|
|
195
|
+
[2.4.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@2.3.0...@metamask/assets-controller@2.4.0
|
|
162
196
|
[2.3.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@2.2.0...@metamask/assets-controller@2.3.0
|
|
163
197
|
[2.2.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@2.1.0...@metamask/assets-controller@2.2.0
|
|
164
198
|
[2.1.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@2.0.2...@metamask/assets-controller@2.1.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,
|
|
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,
|
|
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
|
|
220
|
-
|
|
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,
|
|
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,
|
|
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
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
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(),
|
|
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');
|
|
@@ -966,7 +984,26 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
966
984
|
if (!(0, lodash_1.isEqual)(previousState.assetsInfo[key], value)) {
|
|
967
985
|
changedMetadata.push(key);
|
|
968
986
|
}
|
|
969
|
-
metadata[key]
|
|
987
|
+
const existing = metadata[key];
|
|
988
|
+
const incoming = value;
|
|
989
|
+
// When the API returns no symbol or name for this token, it has no
|
|
990
|
+
// real knowledge of it (e.g. a user-deployed token not indexed by
|
|
991
|
+
// the API). Preserve richer metadata already in state (e.g. from
|
|
992
|
+
// pendingMetadata set by addCustomAsset) so that the correct
|
|
993
|
+
// decimals/symbol/name/image are not overwritten with empty values.
|
|
994
|
+
if (existing && !incoming.symbol && !incoming.name) {
|
|
995
|
+
metadata[key] = {
|
|
996
|
+
...existing,
|
|
997
|
+
...incoming,
|
|
998
|
+
symbol: existing.symbol,
|
|
999
|
+
name: existing.name,
|
|
1000
|
+
decimals: existing.decimals ?? incoming.decimals,
|
|
1001
|
+
image: existing.image ?? incoming.image,
|
|
1002
|
+
};
|
|
1003
|
+
}
|
|
1004
|
+
else {
|
|
1005
|
+
metadata[key] = value;
|
|
1006
|
+
}
|
|
970
1007
|
}
|
|
971
1008
|
}
|
|
972
1009
|
if (normalizedResponse.assetsBalance) {
|