@metamask-previews/assets-controller 8.3.2-preview-cf351fcd3 → 8.3.3-preview-35bdba6

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 (56) hide show
  1. package/CHANGELOG.md +12 -6
  2. package/dist/AssetsController.cjs +26 -51
  3. package/dist/AssetsController.cjs.map +1 -1
  4. package/dist/AssetsController.d.cts +2 -2
  5. package/dist/AssetsController.d.cts.map +1 -1
  6. package/dist/AssetsController.d.mts +2 -2
  7. package/dist/AssetsController.d.mts.map +1 -1
  8. package/dist/AssetsController.mjs +26 -51
  9. package/dist/AssetsController.mjs.map +1 -1
  10. package/dist/data-sources/AccountsApiDataSource.cjs +2 -6
  11. package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
  12. package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
  13. package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
  14. package/dist/data-sources/AccountsApiDataSource.mjs +2 -6
  15. package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
  16. package/dist/data-sources/BackendWebsocketDataSource.cjs +1 -1
  17. package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -1
  18. package/dist/data-sources/BackendWebsocketDataSource.mjs +1 -1
  19. package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -1
  20. package/dist/data-sources/PriceDataSource.cjs +1 -1
  21. package/dist/data-sources/PriceDataSource.cjs.map +1 -1
  22. package/dist/data-sources/PriceDataSource.mjs +1 -1
  23. package/dist/data-sources/PriceDataSource.mjs.map +1 -1
  24. package/dist/data-sources/RpcDataSource.cjs +4 -17
  25. package/dist/data-sources/RpcDataSource.cjs.map +1 -1
  26. package/dist/data-sources/RpcDataSource.d.cts +2 -2
  27. package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
  28. package/dist/data-sources/RpcDataSource.d.mts +2 -2
  29. package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
  30. package/dist/data-sources/RpcDataSource.mjs +4 -17
  31. package/dist/data-sources/RpcDataSource.mjs.map +1 -1
  32. package/dist/data-sources/SnapDataSource.cjs +3 -10
  33. package/dist/data-sources/SnapDataSource.cjs.map +1 -1
  34. package/dist/data-sources/SnapDataSource.d.cts.map +1 -1
  35. package/dist/data-sources/SnapDataSource.d.mts.map +1 -1
  36. package/dist/data-sources/SnapDataSource.mjs +3 -10
  37. package/dist/data-sources/SnapDataSource.mjs.map +1 -1
  38. package/dist/data-sources/StakedBalanceDataSource.cjs +3 -29
  39. package/dist/data-sources/StakedBalanceDataSource.cjs.map +1 -1
  40. package/dist/data-sources/StakedBalanceDataSource.d.cts.map +1 -1
  41. package/dist/data-sources/StakedBalanceDataSource.d.mts.map +1 -1
  42. package/dist/data-sources/StakedBalanceDataSource.mjs +3 -29
  43. package/dist/data-sources/StakedBalanceDataSource.mjs.map +1 -1
  44. package/dist/middlewares/ParallelMiddleware.cjs +3 -11
  45. package/dist/middlewares/ParallelMiddleware.cjs.map +1 -1
  46. package/dist/middlewares/ParallelMiddleware.d.cts.map +1 -1
  47. package/dist/middlewares/ParallelMiddleware.d.mts.map +1 -1
  48. package/dist/middlewares/ParallelMiddleware.mjs +3 -11
  49. package/dist/middlewares/ParallelMiddleware.mjs.map +1 -1
  50. package/dist/types.cjs.map +1 -1
  51. package/dist/types.d.cts +8 -20
  52. package/dist/types.d.cts.map +1 -1
  53. package/dist/types.d.mts +8 -20
  54. package/dist/types.d.mts.map +1 -1
  55. package/dist/types.mjs.map +1 -1
  56. package/package.json +7 -7
package/CHANGELOG.md CHANGED
@@ -7,17 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [8.3.3]
11
+
10
12
  ### Changed
11
13
 
12
- - **BREAKING:** `DataResponse.updateMode` (`AssetsUpdateMode`) changed from `'merge' | 'full'` to `{ type: 'merge' } | { type: 'full'; fullReplaceChainIds: ChainId[] }`. `'full'` now replaces balances only for listed chains. Update all `updateMode` reads/writes to the object form ([#9062](https://github.com/MetaMask/core/pull/9062))
13
- - `mergeDataResponses` preserves `'full'` updates by unioning `fullReplaceChainIds` during merges.
14
14
  - Bump `@metamask/network-enablement-controller` from `^5.2.0` to `^5.3.0` ([#9003](https://github.com/MetaMask/core/pull/9003))
15
15
  - Bump `@metamask/transaction-controller` from `^66.0.1` to `^67.0.0` ([#9021](https://github.com/MetaMask/core/pull/9021))
16
+ - Bump `@metamask/account-tree-controller` from `^7.5.1` to `^7.5.2` ([#9058](https://github.com/MetaMask/core/pull/9058))
17
+ - Bump `@metamask/accounts-controller` from `^39.0.0` to `^39.0.1` ([#9058](https://github.com/MetaMask/core/pull/9058))
18
+ - Bump `@metamask/assets-controllers` from `^108.5.0` to `^108.6.0` ([#9058](https://github.com/MetaMask/core/pull/9058))
19
+ - Bump `@metamask/controller-utils` from `^12.1.0` to `^12.1.1` ([#9058](https://github.com/MetaMask/core/pull/9058))
20
+ - Bump `@metamask/core-backend` from `^6.3.2` to `^6.3.3` ([#9058](https://github.com/MetaMask/core/pull/9058))
21
+ - Bump `@metamask/keyring-controller` from `^26.0.0` to `^27.0.0` ([#9058](https://github.com/MetaMask/core/pull/9058))
16
22
 
17
- ### Fixed
23
+ ### Removed
18
24
 
19
- - `AssetsController` no longer wipes balances on chains a `'full'` update doesn't cover, fixing tokens disappearing on unlock and network switch. Previously a `'full'` response (e.g. from `AccountsApiDataSource` subscription polls) replaced an account's entire balance map across all chains, clearing tokens on chains the source doesn't serve (custom/RPC-only chains) or that came back `unprocessed`. `'full'` replacement is now scoped to `fullReplaceChainIds`, and user custom assets are always preserved ([#9062](https://github.com/MetaMask/core/pull/9062))
20
- - `AccountsApiDataSource` now sets `fullReplaceChainIds` to processed chains (excluding `unprocessedNetworks`) so `'full'` updates never clear balances on unfetched chains
25
+ - **BREAKING:** Remove `TransactionController:incomingTransactionsReceived` from `AssetsController` allowed events and `RpcDataSourceAllowedEvents`; remove associated balance refresh on incoming transactions ([#9012](https://github.com/MetaMask/core/pull/9012))
21
26
 
22
27
  ## [8.3.2]
23
28
 
@@ -583,7 +588,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
583
588
  - Refactor `RpcDataSource` to delegate polling to `BalanceFetcher` and `TokenDetector` services ([#7709](https://github.com/MetaMask/core/pull/7709))
584
589
  - Refactor `BalanceFetcher` and `TokenDetector` to extend `StaticIntervalPollingControllerOnly` for independent polling management ([#7709](https://github.com/MetaMask/core/pull/7709))
585
590
 
586
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@8.3.2...HEAD
591
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@8.3.3...HEAD
592
+ [8.3.3]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@8.3.2...@metamask/assets-controller@8.3.3
587
593
  [8.3.2]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@8.3.1...@metamask/assets-controller@8.3.2
588
594
  [8.3.1]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@8.3.0...@metamask/assets-controller@8.3.1
589
595
  [8.3.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@8.2.0...@metamask/assets-controller@8.3.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_trace, _AssetsController_captureException, _AssetsController_firstInitFetchReported, _AssetsController_stateSizeReported, _AssetsController_emitTrace, _AssetsController_emitStateSizeTrace, _AssetsController_uiOpen, _AssetsController_keyringUnlocked, _AssetsController_controllerMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_lastKnownAccountIds, _AssetsController_getSelectedAccounts, _AssetsController_backendWebsocketDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_stakedBalanceDataSource, _AssetsController_allBalanceDataSources_get, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_customAssetGraduationMiddleware, _AssetsController_rpcFallbackMiddleware, _AssetsController_tokenDataSource, _AssetsController_unsubscribeBasicFunctionality, _AssetsController_queryApiClient, _AssetsController_onActiveChainsUpdated, _AssetsController_initializeNativeAssetsMap, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_onUnapprovedTransactionAdded, _AssetsController_updateActive, _AssetsController_handleAccountTreeStateChange, _AssetsController_registerActionHandlers, _AssetsController_handleActiveChainsUpdate, _AssetsController_executeMiddlewares, _AssetsController_getNativeAssetMap, _AssetsController_isNativeAsset, _AssetsController_resolveNativeAssetIds, _AssetsController_getNativeAssetIdsForEnabledChains, _AssetsController_getNativeAssetIdsForAccount, _AssetsController_ensureNativeBalancesDefaultZero, _AssetsController_ensureDefaultTrackedAssetsSeeded, _AssetsController_buildFullBalances, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_shouldHideNativeToken, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeAssets, _AssetsController_subscribeAssetsBalance, _AssetsController_subscribeRpcCustomAssetsSupplement, _AssetsController_unsubscribeBySubscriptionKey, _AssetsController_subscribeStakedBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_subscribeDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged, _AssetsController_handleNetworkAdded, _AssetsController_refreshAssetsAfterNetworkChange;
16
+ var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_trace, _AssetsController_captureException, _AssetsController_firstInitFetchReported, _AssetsController_stateSizeReported, _AssetsController_emitTrace, _AssetsController_emitStateSizeTrace, _AssetsController_uiOpen, _AssetsController_keyringUnlocked, _AssetsController_controllerMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_lastKnownAccountIds, _AssetsController_getSelectedAccounts, _AssetsController_backendWebsocketDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_stakedBalanceDataSource, _AssetsController_allBalanceDataSources_get, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_customAssetGraduationMiddleware, _AssetsController_rpcFallbackMiddleware, _AssetsController_tokenDataSource, _AssetsController_unsubscribeBasicFunctionality, _AssetsController_queryApiClient, _AssetsController_onActiveChainsUpdated, _AssetsController_initializeNativeAssetsMap, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_onUnapprovedTransactionAdded, _AssetsController_updateActive, _AssetsController_handleAccountTreeStateChange, _AssetsController_registerActionHandlers, _AssetsController_handleActiveChainsUpdate, _AssetsController_executeMiddlewares, _AssetsController_getNativeAssetMap, _AssetsController_isNativeAsset, _AssetsController_resolveNativeAssetIds, _AssetsController_getNativeAssetIdsForEnabledChains, _AssetsController_getNativeAssetIdsForAccount, _AssetsController_ensureNativeBalancesDefaultZero, _AssetsController_ensureDefaultTrackedAssetsSeeded, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_shouldHideNativeToken, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeAssets, _AssetsController_subscribeAssetsBalance, _AssetsController_subscribeRpcCustomAssetsSupplement, _AssetsController_unsubscribeBySubscriptionKey, _AssetsController_subscribeStakedBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_subscribeDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged, _AssetsController_handleNetworkAdded, _AssetsController_refreshAssetsAfterNetworkChange;
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");
@@ -441,7 +441,7 @@ class AssetsController extends base_controller_1.BaseController {
441
441
  // The fast pipeline only contains a subset of data sources (AccountsApi +
442
442
  // StakedBalance), so it must always merge to avoid wiping Snap/RPC
443
443
  // balances that the background pipeline hasn't yet replaced.
444
- await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...response, updateMode: { type: 'merge' } });
444
+ await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...response, updateMode: 'merge' });
445
445
  // Background pipeline: snap and RPC run in parallel after the fast path
446
446
  // commits to state. Their balances are merged together before detection.
447
447
  // Token + price enrichment matches the pre-split behavior: only when basic
@@ -461,7 +461,7 @@ class AssetsController extends base_controller_1.BaseController {
461
461
  ]
462
462
  : []),
463
463
  ], request)
464
- .then(({ response: slowResponse }) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...slowResponse, updateMode: { type: 'merge' } }))
464
+ .then(({ response: slowResponse }) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...slowResponse, updateMode: 'merge' }))
465
465
  .catch((error) => log('Background pipeline failed', { error }));
466
466
  const durationMs = performance.now() - startTime;
467
467
  // Emit trace for every full fetch (Assets Health dashboard)
@@ -647,7 +647,7 @@ class AssetsController extends base_controller_1.BaseController {
647
647
  dataTypes: ['balance', 'metadata', 'price'],
648
648
  assetTypes: ['fungible'],
649
649
  forceUpdate: true,
650
- updateMode: { type: 'merge' },
650
+ updateMode: 'merge',
651
651
  });
652
652
  }
653
653
  // Re-evaluate subscriptions so the supplemental RPC poll picks up the
@@ -1166,7 +1166,7 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1166
1166
  this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this), {
1167
1167
  chainIds: addedEnabledChains,
1168
1168
  forceUpdate: true,
1169
- updateMode: { type: 'merge' },
1169
+ updateMode: 'merge',
1170
1170
  }).catch((error) => {
1171
1171
  log('Failed to fetch balance for added chains', { error });
1172
1172
  });
@@ -1361,31 +1361,9 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
1361
1361
  }
1362
1362
  }
1363
1363
  });
1364
- }, _AssetsController_buildFullBalances = function _AssetsController_buildFullBalances({ previousBalances, accountBalances, customAssetIds, fullReplaceChains, }) {
1365
- const next = { ...previousBalances };
1366
- const customAssetIdSet = new Set(customAssetIds);
1367
- // Drop stale balance entries on the authoritative chains so the response is the
1368
- // source of truth there — but never drop user custom assets.
1369
- for (const assetId of Object.keys(next)) {
1370
- if (customAssetIdSet.has(assetId)) {
1371
- continue;
1372
- }
1373
- if (fullReplaceChains.has(extractChainId(assetId))) {
1374
- delete next[assetId];
1375
- }
1376
- }
1377
- // Apply the response (authoritative on its replaced chains).
1378
- Object.assign(next, accountBalances);
1379
- // Custom assets must survive a full refresh even when the source omits them.
1380
- for (const customId of customAssetIds) {
1381
- next[customId] ?? (next[customId] = previousBalances[customId] ?? { amount: '0' });
1382
- }
1383
- return next;
1384
1364
  }, _AssetsController_updateState = async function _AssetsController_updateState(response) {
1385
1365
  const normalizedResponse = normalizeResponse(response);
1386
- const mode = normalizedResponse.updateMode ?? {
1387
- type: 'merge',
1388
- };
1366
+ const mode = normalizedResponse.updateMode ?? 'merge';
1389
1367
  const releaseLock = await __classPrivateFieldGet(this, _AssetsController_controllerMutex, "f").acquire();
1390
1368
  try {
1391
1369
  const previousState = this.state;
@@ -1431,36 +1409,33 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
1431
1409
  for (const [accountId, accountBalances] of Object.entries(normalizedResponse.assetsBalance)) {
1432
1410
  const previousBalances = previousState.assetsBalance[accountId] ?? {};
1433
1411
  const customAssetIds = state.customAssets[accountId] ?? [];
1434
- /*
1435
-
1436
- const updateMode: AssetsUpdateMode = normalizedResponse.updateMode ?? {
1437
- type: 'merge',
1438
- };
1439
- const fullReplaceChains: Set<ChainId> | null =
1440
- updateMode.type === 'full'
1441
- ? new Set(updateMode.fullReplaceChainIds)
1442
- : null;
1443
-
1444
- */
1445
- // Full: response is authoritative, but only for the chains it declares
1446
- // balances on every other chain are preserved.
1412
+ // Full: response is authoritative; preserve custom assets not in response.
1447
1413
  // Merge: response overlays previous balances.
1448
- // Callers that fetch partial data (e.g. newly added chains) must use { type: 'merge' }.
1449
- const effective = mode.type === 'merge'
1414
+ // Callers that fetch partial data (e.g. newly added chains) must set updateMode: 'merge'.
1415
+ const effective = mode === 'merge'
1450
1416
  ? { ...previousBalances, ...accountBalances }
1451
- : __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildFullBalances).call(this, {
1452
- previousBalances,
1453
- accountBalances,
1454
- customAssetIds,
1455
- fullReplaceChains: new Set(mode.fullReplaceChainIds),
1456
- });
1417
+ : (() => {
1418
+ const next = {
1419
+ ...accountBalances,
1420
+ };
1421
+ for (const customId of customAssetIds) {
1422
+ if (!(customId in next)) {
1423
+ const prev = previousBalances[customId];
1424
+ next[customId] =
1425
+ prev ?? { amount: '0' };
1426
+ }
1427
+ }
1428
+ return next;
1429
+ })();
1457
1430
  // Ensure native tokens have an entry (0 if missing) for chains this account supports
1458
1431
  const account = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).find((a) => a.id === accountId);
1459
1432
  const nativeAssetIdsForAccount = account
1460
1433
  ? __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getNativeAssetIdsForAccount).call(this, account)
1461
1434
  : __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getNativeAssetIdsForEnabledChains).call(this);
1462
1435
  for (const nativeAssetId of nativeAssetIdsForAccount) {
1463
- effective[nativeAssetId] ?? (effective[nativeAssetId] = { amount: '0' });
1436
+ if (!(nativeAssetId in effective)) {
1437
+ effective[nativeAssetId] = { amount: '0' };
1438
+ }
1464
1439
  }
1465
1440
  for (const [assetId, balance] of Object.entries(effective)) {
1466
1441
  const previousBalance = previousBalances[assetId];
@@ -1966,7 +1941,7 @@ async function _AssetsController_handleAccountGroupChanged() {
1966
1941
  await this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this), {
1967
1942
  chainIds: addedChains,
1968
1943
  forceUpdate: true,
1969
- updateMode: { type: 'merge' },
1944
+ updateMode: 'merge',
1970
1945
  });
1971
1946
  }
1972
1947
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_ensureNativeBalancesDefaultZero).call(this);