@metamask/assets-controller 10.0.1 → 10.1.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 CHANGED
@@ -7,6 +7,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [10.1.0]
11
+
12
+ ### Added
13
+
14
+ - Add temporary `tempMigrateAssetsInfoMetadataAssets3346` constructor option that heals `assetsInfo` metadata (and custom-asset tracking) wiped by a prior defect for tokens on niche EVM chains, using legacy `TokensController` state provided by the host ([#9393](https://github.com/MetaMask/core/pull/9393))
15
+
16
+ ### Changed
17
+
18
+ - Bump `@metamask/messenger` from `^1.2.0` to `^2.0.0` ([#9392](https://github.com/MetaMask/core/pull/9392))
19
+
20
+ ### Fixed
21
+
22
+ - Fetch balances when switching account groups, enabling RPC-only networks, or after a new account is added to the account tree ([#9388](https://github.com/MetaMask/core/pull/9388))
23
+
10
24
  ## [10.0.1]
11
25
 
12
26
  ### Changed
@@ -683,7 +697,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
683
697
  - Refactor `RpcDataSource` to delegate polling to `BalanceFetcher` and `TokenDetector` services ([#7709](https://github.com/MetaMask/core/pull/7709))
684
698
  - Refactor `BalanceFetcher` and `TokenDetector` to extend `StaticIntervalPollingControllerOnly` for independent polling management ([#7709](https://github.com/MetaMask/core/pull/7709))
685
699
 
686
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@10.0.1...HEAD
700
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@10.1.0...HEAD
701
+ [10.1.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@10.0.1...@metamask/assets-controller@10.1.0
687
702
  [10.0.1]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@10.0.0...@metamask/assets-controller@10.0.1
688
703
  [10.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@9.1.0...@metamask/assets-controller@10.0.0
689
704
  [9.1.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@9.0.2...@metamask/assets-controller@9.1.0
@@ -37,6 +37,7 @@ const CustomAssetGraduationMiddleware_1 = require("./middlewares/CustomAssetGrad
37
37
  const DetectionMiddleware_1 = require("./middlewares/DetectionMiddleware.cjs");
38
38
  const ParallelMiddleware_1 = require("./middlewares/ParallelMiddleware.cjs");
39
39
  const RpcFallbackMiddleware_1 = require("./middlewares/RpcFallbackMiddleware.cjs");
40
+ const healAssetsInfoMetadata_1 = require("./migrations/healAssetsInfoMetadata.cjs");
40
41
  const utils_2 = require("./utils/index.cjs");
41
42
  const constants_1 = require("./utils/constants.cjs");
42
43
  const customAssetsRpcSupplement_1 = require("./utils/customAssetsRpcSupplement.cjs");
@@ -259,7 +260,7 @@ function mergeAccountBalances(previousBalances, accountBalances, customAssetIds,
259
260
  * - The controller does NOT manage polling - it simply receives pushed updates
260
261
  */
261
262
  class AssetsController extends base_controller_1.BaseController {
262
- constructor({ messenger, state = {}, defaultUpdateInterval = DEFAULT_POLLING_INTERVAL_MS, isEnabled = () => true, isBasicFunctionality, subscribeToBasicFunctionalityChange, queryApiClient, rpcDataSourceConfig, trace, captureException, accountsApiDataSourceConfig, priceDataSourceConfig, stakedBalanceDataSourceConfig, isOnboarded, }) {
263
+ constructor({ messenger, state = {}, defaultUpdateInterval = DEFAULT_POLLING_INTERVAL_MS, isEnabled = () => true, isBasicFunctionality, subscribeToBasicFunctionalityChange, queryApiClient, rpcDataSourceConfig, trace, captureException, accountsApiDataSourceConfig, priceDataSourceConfig, stakedBalanceDataSourceConfig, isOnboarded, tempMigrateAssetsInfoMetadataAssets3346, }) {
263
264
  super({
264
265
  name: CONTROLLER_NAME,
265
266
  messenger,
@@ -326,6 +327,15 @@ class AssetsController extends base_controller_1.BaseController {
326
327
  __classPrivateFieldSet(this, _AssetsController_captureException, captureException, "f");
327
328
  __classPrivateFieldSet(this, _AssetsController_queryApiClient, queryApiClient, "f");
328
329
  const rpcConfig = rpcDataSourceConfig ?? {};
330
+ // TEMPORARY: heal assetsInfo metadata wiped by a prior defect
331
+ // (see extension migration #215 / ASSETS-3346). Remove in a future release.
332
+ if (tempMigrateAssetsInfoMetadataAssets3346) {
333
+ this.update(() => (0, healAssetsInfoMetadata_1.tempHealAssetsInfoMetadata)({
334
+ state: this.state,
335
+ getMigrationState: tempMigrateAssetsInfoMetadataAssets3346,
336
+ captureException,
337
+ }));
338
+ }
329
339
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_initializeNativeAssetsMap).call(this, queryApiClient);
330
340
  __classPrivateFieldSet(this, _AssetsController_onActiveChainsUpdated, (dataSourceName, chains, previousChains) => {
331
341
  try {
@@ -1237,17 +1247,18 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1237
1247
  previousCount: __classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").size,
1238
1248
  currentCount: currentIds.size,
1239
1249
  });
1250
+ const newAccounts = accounts.filter((account) => !__classPrivateFieldGet(this, _AssetsController_lastKnownAccountIds, "f").has(account.id));
1240
1251
  __classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, currentIds, "f");
1241
1252
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);
1242
1253
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureDefaultTrackedAssetsSeeded).call(this);
1243
- __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runAccountTreeRefresh).call(this, accounts).catch((error) => {
1254
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_runAccountTreeRefresh).call(this, accounts, newAccounts).catch((error) => {
1244
1255
  log('Failed to refresh assets after tree change', error);
1245
1256
  });
1246
1257
  }
1247
1258
  else {
1248
1259
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_start).call(this);
1249
1260
  }
1250
- }, _AssetsController_runAccountTreeRefresh = async function _AssetsController_runAccountTreeRefresh(accounts) {
1261
+ }, _AssetsController_runAccountTreeRefresh = async function _AssetsController_runAccountTreeRefresh(accounts, newAccounts = []) {
1251
1262
  const releaseLock = await __classPrivateFieldGet(this, _AssetsController_accountRefreshMutex, "f").acquire();
1252
1263
  try {
1253
1264
  await this.getAssets(accounts, {
@@ -1255,6 +1266,12 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1255
1266
  forceUpdate: true,
1256
1267
  });
1257
1268
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
1269
+ if (newAccounts.length > 0) {
1270
+ await this.getAssets(newAccounts, {
1271
+ chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
1272
+ forceUpdate: true,
1273
+ });
1274
+ }
1258
1275
  }
1259
1276
  catch (error) {
1260
1277
  log('Failed to fetch assets after tree change', error);
@@ -2141,8 +2158,9 @@ async function _AssetsController_handleAccountGroupChanged() {
2141
2158
  // Refresh subscriptions for new chain set
2142
2159
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
2143
2160
  // Do one-time fetch for newly enabled chains; merge so we keep existing chain balances
2144
- if (addedChains.length > 0 && __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).length > 0) {
2145
- await this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this), {
2161
+ const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
2162
+ if (addedChains.length > 0 && accounts.length > 0) {
2163
+ await this.getAssets(accounts, {
2146
2164
  chainIds: addedChains,
2147
2165
  forceUpdate: true,
2148
2166
  updateMode: 'merge',