@metamask-previews/assets-controller 10.0.2-preview-4c12f04 → 10.1.0-preview-d52465c2b

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,12 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- ## [10.0.2]
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))
11
15
 
12
16
  ### Changed
13
17
 
14
- - Bump `@metamask/network-enablement-controller` from `^5.4.1` to `^5.4.2` ([#9383](https://github.com/MetaMask/core/pull/9383))
15
- - Bump `@metamask/assets-controllers` from `^109.3.0` to `^109.3.1` ([#9383](https://github.com/MetaMask/core/pull/9383))
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))
16
23
 
17
24
  ## [10.0.1]
18
25
 
@@ -690,8 +697,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
690
697
  - Refactor `RpcDataSource` to delegate polling to `BalanceFetcher` and `TokenDetector` services ([#7709](https://github.com/MetaMask/core/pull/7709))
691
698
  - Refactor `BalanceFetcher` and `TokenDetector` to extend `StaticIntervalPollingControllerOnly` for independent polling management ([#7709](https://github.com/MetaMask/core/pull/7709))
692
699
 
693
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@10.0.2...HEAD
694
- [10.0.2]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@10.0.1...@metamask/assets-controller@10.0.2
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
695
702
  [10.0.1]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@10.0.0...@metamask/assets-controller@10.0.1
696
703
  [10.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@9.1.0...@metamask/assets-controller@10.0.0
697
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);
@@ -2090,19 +2107,25 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
2090
2107
  // EVENT HANDLERS
2091
2108
  // ============================================================================
2092
2109
  async function _AssetsController_handleAccountGroupChanged() {
2110
+ const gutoStart = Date.now();
2111
+ console.log('[GUTO PERFORMANCE LOG] AssetsController.#handleAccountGroupChanged START');
2093
2112
  const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
2094
2113
  log('Account group changed', {
2095
2114
  accountCount: accounts.length,
2096
2115
  accountIds: accounts.map((a) => a.id),
2097
2116
  });
2098
2117
  __classPrivateFieldSet(this, _AssetsController_lastKnownAccountIds, new Set(accounts.map((a) => a.id)), "f");
2118
+ const gutoMutexStart = Date.now();
2099
2119
  const releaseLock = await __classPrivateFieldGet(this, _AssetsController_accountRefreshMutex, "f").acquire();
2120
+ console.log(`[GUTO PERFORMANCE LOG] AssetsController accountRefreshMutex wait took ${Date.now() - gutoMutexStart}ms`);
2100
2121
  try {
2101
2122
  if (accounts.length > 0) {
2123
+ const gutoGetAssetsStart = Date.now();
2102
2124
  await this.getAssets(accounts, {
2103
2125
  chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
2104
2126
  forceUpdate: true,
2105
2127
  });
2128
+ console.log(`[GUTO PERFORMANCE LOG] AssetsController.getAssets (accounts=${accounts.length}, chains=${__classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size}) took ${Date.now() - gutoGetAssetsStart}ms`);
2106
2129
  }
2107
2130
  // Subscribe after fetch so WS notifications can recover state
2108
2131
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
@@ -2112,6 +2135,7 @@ async function _AssetsController_handleAccountGroupChanged() {
2112
2135
  finally {
2113
2136
  releaseLock();
2114
2137
  }
2138
+ console.log(`[GUTO PERFORMANCE LOG] AssetsController.#handleAccountGroupChanged END (total) took ${Date.now() - gutoStart}ms`);
2115
2139
  }, _AssetsController_handleEnabledNetworksChanged = async function _AssetsController_handleEnabledNetworksChanged(enabledNetworkMap) {
2116
2140
  const previousChains = __classPrivateFieldGet(this, _AssetsController_enabledChains, "f");
2117
2141
  __classPrivateFieldSet(this, _AssetsController_enabledChains, __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_extractEnabledChains).call(this, enabledNetworkMap), "f");
@@ -2141,8 +2165,9 @@ async function _AssetsController_handleAccountGroupChanged() {
2141
2165
  // Refresh subscriptions for new chain set
2142
2166
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
2143
2167
  // 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), {
2168
+ const accounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this);
2169
+ if (addedChains.length > 0 && accounts.length > 0) {
2170
+ await this.getAssets(accounts, {
2146
2171
  chainIds: addedChains,
2147
2172
  forceUpdate: true,
2148
2173
  updateMode: 'merge',