@metamask-previews/assets-controller 11.2.1-preview-2dc3d26a4 → 11.2.1-preview-aa202ec10

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 (54) hide show
  1. package/CHANGELOG.md +5 -6
  2. package/dist/AssetsController.cjs +51 -23
  3. package/dist/AssetsController.cjs.map +1 -1
  4. package/dist/AssetsController.d.cts +3 -3
  5. package/dist/AssetsController.d.cts.map +1 -1
  6. package/dist/AssetsController.d.mts +3 -3
  7. package/dist/AssetsController.d.mts.map +1 -1
  8. package/dist/AssetsController.mjs +51 -23
  9. package/dist/AssetsController.mjs.map +1 -1
  10. package/dist/data-sources/BackendWebsocketDataSource.cjs +597 -0
  11. package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -0
  12. package/dist/data-sources/BackendWebsocketDataSource.d.cts +65 -0
  13. package/dist/data-sources/BackendWebsocketDataSource.d.cts.map +1 -0
  14. package/dist/data-sources/BackendWebsocketDataSource.d.mts +65 -0
  15. package/dist/data-sources/BackendWebsocketDataSource.d.mts.map +1 -0
  16. package/dist/data-sources/BackendWebsocketDataSource.mjs +592 -0
  17. package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -0
  18. package/dist/data-sources/index.cjs +4 -4
  19. package/dist/data-sources/index.cjs.map +1 -1
  20. package/dist/data-sources/index.d.cts +1 -1
  21. package/dist/data-sources/index.d.cts.map +1 -1
  22. package/dist/data-sources/index.d.mts +1 -1
  23. package/dist/data-sources/index.d.mts.map +1 -1
  24. package/dist/data-sources/index.mjs +1 -1
  25. package/dist/data-sources/index.mjs.map +1 -1
  26. package/dist/index.cjs +26 -22
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.d.cts +2 -0
  29. package/dist/index.d.cts.map +1 -1
  30. package/dist/index.d.mts +2 -0
  31. package/dist/index.d.mts.map +1 -1
  32. package/dist/index.mjs +2 -0
  33. package/dist/index.mjs.map +1 -1
  34. package/dist/middlewares/CustomAssetGraduationMiddleware.cjs +1 -1
  35. package/dist/middlewares/CustomAssetGraduationMiddleware.cjs.map +1 -1
  36. package/dist/middlewares/CustomAssetGraduationMiddleware.mjs +1 -1
  37. package/dist/middlewares/CustomAssetGraduationMiddleware.mjs.map +1 -1
  38. package/dist/utils/processAccountActivityBalanceUpdates.cjs +54 -0
  39. package/dist/utils/processAccountActivityBalanceUpdates.cjs.map +1 -0
  40. package/dist/utils/processAccountActivityBalanceUpdates.d.cts +13 -0
  41. package/dist/utils/processAccountActivityBalanceUpdates.d.cts.map +1 -0
  42. package/dist/utils/processAccountActivityBalanceUpdates.d.mts +13 -0
  43. package/dist/utils/processAccountActivityBalanceUpdates.d.mts.map +1 -0
  44. package/dist/utils/processAccountActivityBalanceUpdates.mjs +47 -0
  45. package/dist/utils/processAccountActivityBalanceUpdates.mjs.map +1 -0
  46. package/package.json +1 -1
  47. package/dist/data-sources/AccountActivityDataSource.cjs +0 -262
  48. package/dist/data-sources/AccountActivityDataSource.cjs.map +0 -1
  49. package/dist/data-sources/AccountActivityDataSource.d.cts +0 -80
  50. package/dist/data-sources/AccountActivityDataSource.d.cts.map +0 -1
  51. package/dist/data-sources/AccountActivityDataSource.d.mts +0 -80
  52. package/dist/data-sources/AccountActivityDataSource.d.mts.map +0 -1
  53. package/dist/data-sources/AccountActivityDataSource.mjs +0 -254
  54. package/dist/data-sources/AccountActivityDataSource.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -16,12 +16,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
16
16
  - Bump `@metamask/keyring-api` from `^23.5.0` to `^23.7.0` ([#9676](https://github.com/MetaMask/core/pull/9676))
17
17
  - Bump `@metamask/keyring-internal-api` from `^11.0.1` to `^11.0.2` ([#9676](https://github.com/MetaMask/core/pull/9676))
18
18
  - Bump `@metamask/keyring-snap-client` from `^9.2.0` to `^9.2.1` ([#9676](https://github.com/MetaMask/core/pull/9676))
19
- - `AccountActivityDataSource` is now the highest-priority balance data source and participates in chain-claiming: chains it reports as "up" (from `AccountActivityService:statusChanged`) are claimed first so the polling data sources (`AccountsApiDataSource`/`RpcDataSource`) do not also poll them ([#9517](https://github.com/MetaMask/core/pull/9517))
20
- - `AssetsController` no longer references `BackendWebSocketService` actions/events; real-time balances and chain status are consumed exclusively from `AccountActivityService`
21
-
22
- ### Removed
23
-
24
- - **BREAKING:** Remove `BackendWebsocketDataSource` and its factory/types (`BackendWebsocketDataSource`, `createBackendWebsocketDataSource`, `BackendWebsocketDataSourceOptions`, `BackendWebsocketDataSourceState`). Real-time balance updates and per-chain status are now consumed from `AccountActivityService` via `AccountActivityDataSource`, which manages the WebSocket connection and subscriptions. Consumers no longer need to delegate `BackendWebSocketService` actions/events to the `AssetsController` messenger ([#9517](https://github.com/MetaMask/core/pull/9517))
25
19
 
26
20
  ### Fixed
27
21
 
@@ -75,6 +69,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
75
69
  - `TokensApiClient` (used by `RpcDataSource` / `TokenDetector`) now sets the token-list `occurrenceFloor` query param from the same Token API `GET /v1/suggestedOccurrenceFloors` endpoint (cached 1h), replacing the hardcoded Linea/MegaETH/Tempo special cases. Missing chains or failed fetches fall back to 3 ([#9537](https://github.com/MetaMask/core/pull/9537))
76
70
  - Bump `@metamask/network-enablement-controller` from `^5.5.0` to `^5.6.0` ([#9520](https://github.com/MetaMask/core/pull/9520))
77
71
  - Bump `@metamask/phishing-controller` from `^17.2.1` to `^17.3.0` ([#9532](https://github.com/MetaMask/core/pull/9532))
72
+ - Bump `@metamask/transaction-controller` from `^69.0.0` to `^69.1.0` ([#9568](https://github.com/MetaMask/core/pull/9568))
73
+
74
+ ### Fixed
75
+
76
+ - `TokenDataSource` now also fetches token metadata for assets present in `assetsBalance` that are missing `assetsInfo` (previously only detected assets without metadata were enriched) ([#9547](https://github.com/MetaMask/core/pull/9547))
78
77
 
79
78
  ## [11.0.0]
80
79
 
@@ -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_accountRefreshMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_lastKnownAccountIds, _AssetsController_getSelectedAccounts, _AssetsController_accountActivityDataSource, _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_onTransactionConfirmed, _AssetsController_updateActive, _AssetsController_handleAccountTreeStateChange, _AssetsController_runAccountTreeRefresh, _AssetsController_runStartupRefresh, _AssetsController_registerActionHandlers, _AssetsController_handleActiveChainsUpdate, _AssetsController_executeMiddlewares, _AssetsController_fetchMissingPricesWithoutCache, _AssetsController_getNativeAssetMap, _AssetsController_isNativeAsset, _AssetsController_getAssetType, _AssetsController_resolveNativeAssetIds, _AssetsController_getNativeAssetIdsForEnabledChains, _AssetsController_getNativeAssetIdsForAccount, _AssetsController_getSlowPipelineChainIds, _AssetsController_ensureNativeBalancesDefaultZero, _AssetsController_ensureDefaultTrackedAssetsSeeded, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_getAssetFromState, _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_refreshActiveChainsOnNetworkSwitch, _AssetsController_getSelectedEvmChainIdFromNetworkState, _AssetsController_handleNetworkDidChange, _AssetsController_refreshAssetsAfterNetworkChange, _AssetsController_refreshAssetsAfterNetworkAdded;
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_accountRefreshMutex, _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_onTransactionConfirmed, _AssetsController_onAccountActivityBalanceUpdated, _AssetsController_updateActive, _AssetsController_handleAccountTreeStateChange, _AssetsController_runAccountTreeRefresh, _AssetsController_runStartupRefresh, _AssetsController_registerActionHandlers, _AssetsController_handleActiveChainsUpdate, _AssetsController_executeMiddlewares, _AssetsController_fetchMissingPricesWithoutCache, _AssetsController_getNativeAssetMap, _AssetsController_isNativeAsset, _AssetsController_getAssetType, _AssetsController_resolveNativeAssetIds, _AssetsController_getNativeAssetIdsForEnabledChains, _AssetsController_getNativeAssetIdsForAccount, _AssetsController_getSlowPipelineChainIds, _AssetsController_ensureNativeBalancesDefaultZero, _AssetsController_ensureDefaultTrackedAssetsSeeded, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_getAssetFromState, _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_refreshActiveChainsOnNetworkSwitch, _AssetsController_getSelectedEvmChainIdFromNetworkState, _AssetsController_handleNetworkDidChange, _AssetsController_refreshAssetsAfterNetworkChange, _AssetsController_refreshAssetsAfterNetworkAdded;
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");
@@ -22,8 +22,8 @@ const utils_1 = require("@metamask/utils");
22
22
  const async_mutex_1 = require("async-mutex");
23
23
  const bignumber_js_1 = __importDefault(require("bignumber.js"));
24
24
  const lodash_1 = require("lodash");
25
- const AccountActivityDataSource_js_1 = require("./data-sources/AccountActivityDataSource.cjs");
26
25
  const AccountsApiDataSource_js_1 = require("./data-sources/AccountsApiDataSource.cjs");
26
+ const BackendWebsocketDataSource_js_1 = require("./data-sources/BackendWebsocketDataSource.cjs");
27
27
  const assets_js_1 = require("./data-sources/evm-rpc-services/utils/assets.cjs");
28
28
  const PriceDataSource_js_1 = require("./data-sources/PriceDataSource.cjs");
29
29
  const RpcDataSource_js_1 = require("./data-sources/RpcDataSource.cjs");
@@ -41,6 +41,7 @@ const healAssetsInfoMetadata_js_1 = require("./migrations/healAssetsInfoMetadata
41
41
  const constants_js_1 = require("./utils/constants.cjs");
42
42
  const customAssetsRpcSupplement_js_1 = require("./utils/customAssetsRpcSupplement.cjs");
43
43
  const index_js_1 = require("./utils/index.cjs");
44
+ const processAccountActivityBalanceUpdates_js_1 = require("./utils/processAccountActivityBalanceUpdates.cjs");
44
45
  const NATIVE_ASSETS_QUERY_KEY = ['nativeAssets'];
45
46
  /** Stable empty map so memoized formatters are not busted by `?? {}` identity churn. */
46
47
  const EMPTY_NATIVE_ASSET_MAP = {};
@@ -309,7 +310,7 @@ class AssetsController extends base_controller_1.BaseController {
309
310
  * re-subscriptions when the account set hasn't actually changed.
310
311
  */
311
312
  _AssetsController_lastKnownAccountIds.set(this, new Set());
312
- _AssetsController_accountActivityDataSource.set(this, void 0);
313
+ _AssetsController_backendWebsocketDataSource.set(this, void 0);
313
314
  _AssetsController_accountsApiDataSource.set(this, void 0);
314
315
  _AssetsController_snapDataSource.set(this, void 0);
315
316
  _AssetsController_rpcDataSource.set(this, void 0);
@@ -350,11 +351,11 @@ class AssetsController extends base_controller_1.BaseController {
350
351
  });
351
352
  }
352
353
  }, "f");
353
- __classPrivateFieldSet(this, _AssetsController_accountActivityDataSource, new AccountActivityDataSource_js_1.AccountActivityDataSource({
354
+ __classPrivateFieldSet(this, _AssetsController_backendWebsocketDataSource, new BackendWebsocketDataSource_js_1.BackendWebsocketDataSource({
354
355
  messenger: this.messenger,
356
+ queryApiClient,
355
357
  onActiveChainsUpdated: __classPrivateFieldGet(this, _AssetsController_onActiveChainsUpdated, "f"),
356
358
  getAssetType: (assetId) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetType).call(this, assetId),
357
- onAssetsUpdate: (response, request) => this.handleAssetsUpdate(response, __classPrivateFieldGet(this, _AssetsController_accountActivityDataSource, "f").getName(), request),
358
359
  }), "f");
359
360
  __classPrivateFieldSet(this, _AssetsController_accountsApiDataSource, new AccountsApiDataSource_js_1.AccountsApiDataSource({
360
361
  messenger: this.messenger,
@@ -940,12 +941,12 @@ class AssetsController extends base_controller_1.BaseController {
940
941
  ...resolvedRequest,
941
942
  dataTypes: resolvedRequest.dataTypes.filter((dt) => dt !== 'metadata' && dt !== 'price'),
942
943
  };
943
- // Graduate custom assets only when AccountsAPI / AccountActivity reports
944
- // them. RPC already fetches custom assets on purpose, and Snap handles
945
- // non-EVM chains the rule does not apply to, so skip the middleware for
946
- // those.
944
+ // Graduate custom assets only when AccountsAPI / Websocket reports them.
945
+ // RPC already fetches custom assets on purpose, and Snap handles non-EVM
946
+ // chains the rule does not apply to, so skip the middleware for those.
947
947
  const shouldGraduateCustomAssets = sourceId === 'AccountsApiDataSource' ||
948
- sourceId === 'AccountActivityDataSource';
948
+ sourceId === 'BackendWebsocketDataSource' ||
949
+ sourceId === 'AccountActivityService';
949
950
  const enrichmentSources = [
950
951
  ...(shouldGraduateCustomAssets
951
952
  ? [__classPrivateFieldGet(this, _AssetsController_customAssetGraduationMiddleware, "f")]
@@ -983,7 +984,7 @@ class AssetsController extends base_controller_1.BaseController {
983
984
  subscriptionCount: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").size,
984
985
  });
985
986
  // Destroy instantiated data sources
986
- __classPrivateFieldGet(this, _AssetsController_accountActivityDataSource, "f")?.destroy?.();
987
+ __classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f")?.destroy?.();
987
988
  __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f")?.destroy?.();
988
989
  __classPrivateFieldGet(this, _AssetsController_snapDataSource, "f")?.destroy?.();
989
990
  __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")?.destroy?.();
@@ -1011,7 +1012,7 @@ class AssetsController extends base_controller_1.BaseController {
1011
1012
  }
1012
1013
  }
1013
1014
  exports.AssetsController = AssetsController;
1014
- _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctionality = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_trace = new WeakMap(), _AssetsController_captureException = new WeakMap(), _AssetsController_firstInitFetchReported = new WeakMap(), _AssetsController_stateSizeReported = new WeakMap(), _AssetsController_uiOpen = new WeakMap(), _AssetsController_keyringUnlocked = new WeakMap(), _AssetsController_controllerMutex = new WeakMap(), _AssetsController_accountRefreshMutex = new WeakMap(), _AssetsController_activeSubscriptions = new WeakMap(), _AssetsController_enabledChains = new WeakMap(), _AssetsController_lastKnownAccountIds = new WeakMap(), _AssetsController_accountActivityDataSource = 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_customAssetGraduationMiddleware = new WeakMap(), _AssetsController_rpcFallbackMiddleware = new WeakMap(), _AssetsController_tokenDataSource = new WeakMap(), _AssetsController_unsubscribeBasicFunctionality = new WeakMap(), _AssetsController_queryApiClient = new WeakMap(), _AssetsController_onActiveChainsUpdated = new WeakMap(), _AssetsController_instances = new WeakSet(), _AssetsController_emitTrace = function _AssetsController_emitTrace(name, data, tags = {
1015
+ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctionality = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_trace = new WeakMap(), _AssetsController_captureException = new WeakMap(), _AssetsController_firstInitFetchReported = new WeakMap(), _AssetsController_stateSizeReported = new WeakMap(), _AssetsController_uiOpen = new WeakMap(), _AssetsController_keyringUnlocked = new WeakMap(), _AssetsController_controllerMutex = new WeakMap(), _AssetsController_accountRefreshMutex = new WeakMap(), _AssetsController_activeSubscriptions = new WeakMap(), _AssetsController_enabledChains = new WeakMap(), _AssetsController_lastKnownAccountIds = 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_customAssetGraduationMiddleware = new WeakMap(), _AssetsController_rpcFallbackMiddleware = new WeakMap(), _AssetsController_tokenDataSource = new WeakMap(), _AssetsController_unsubscribeBasicFunctionality = new WeakMap(), _AssetsController_queryApiClient = new WeakMap(), _AssetsController_onActiveChainsUpdated = new WeakMap(), _AssetsController_instances = new WeakSet(), _AssetsController_emitTrace = function _AssetsController_emitTrace(name, data, tags = {
1015
1016
  controller: 'AssetsController',
1016
1017
  }) {
1017
1018
  if (!__classPrivateFieldGet(this, _AssetsController_trace, "f")) {
@@ -1069,7 +1070,7 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1069
1070
  return [];
1070
1071
  }, _AssetsController_allBalanceDataSources_get = function _AssetsController_allBalanceDataSources_get() {
1071
1072
  return [
1072
- __classPrivateFieldGet(this, _AssetsController_accountActivityDataSource, "f"),
1073
+ __classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f"),
1073
1074
  __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
1074
1075
  __classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"),
1075
1076
  __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
@@ -1188,6 +1189,12 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1188
1189
  this.messenger.subscribe('TransactionController:transactionConfirmed', (transactionMeta) => {
1189
1190
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_onTransactionConfirmed).call(this, transactionMeta);
1190
1191
  });
1192
+ // Real-time post-tx balances from AccountActivityService (same WS payload as
1193
+ // TokenBalancesController; BackendWebsocketDataSource may not receive the
1194
+ // callback when AccountActivityService owns the server subscription).
1195
+ this.messenger.subscribe('AccountActivityService:balanceUpdated', (event) => {
1196
+ __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_onAccountActivityBalanceUpdated).call(this, event);
1197
+ });
1191
1198
  }, _AssetsController_onUnapprovedTransactionAdded = function _AssetsController_onUnapprovedTransactionAdded(transactionMeta) {
1192
1199
  const hexChainId = transactionMeta.chainId;
1193
1200
  if (!hexChainId) {
@@ -1230,6 +1237,26 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
1230
1237
  }).catch((error) => {
1231
1238
  log('Failed to refresh assets after transaction confirmed', { error });
1232
1239
  });
1240
+ }, _AssetsController_onAccountActivityBalanceUpdated = function _AssetsController_onAccountActivityBalanceUpdated({ address, chain, updates, }) {
1241
+ const account = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getSelectedAccounts).call(this).find((a) => a.address.startsWith('0x')
1242
+ ? a.address.toLowerCase() === address.toLowerCase()
1243
+ : a.address === address);
1244
+ if (!account) {
1245
+ return;
1246
+ }
1247
+ const chainId = chain;
1248
+ const response = (0, processAccountActivityBalanceUpdates_js_1.processAccountActivityBalanceUpdates)(updates, account.id, (assetId) => __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetType).call(this, assetId));
1249
+ if (!response.assetsBalance) {
1250
+ return;
1251
+ }
1252
+ const request = {
1253
+ accountsWithSupportedChains: [{ account, supportedChains: [chainId] }],
1254
+ chainIds: [chainId],
1255
+ dataTypes: ['balance', 'metadata'],
1256
+ };
1257
+ this.handleAssetsUpdate(response, 'AccountActivityService', request).catch((error) => {
1258
+ log('Failed to apply AccountActivityService balance update', { error });
1259
+ });
1233
1260
  }, _AssetsController_updateActive = function _AssetsController_updateActive() {
1234
1261
  const shouldRun = __classPrivateFieldGet(this, _AssetsController_uiOpen, "f") && __classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f");
1235
1262
  if (shouldRun) {
@@ -1339,11 +1366,11 @@ async function _AssetsController_runStartupRefresh(accounts) {
1339
1366
  const previousSet = new Set(previous);
1340
1367
  const addedChains = activeChains.filter((ch) => !previousSet.has(ch));
1341
1368
  const removedChains = previous.filter((ch) => !activeChains.includes(ch));
1342
- // Refresh subscriptions to use updated data source availability.
1343
- // No one-time fetch needed here — #handleEnabledNetworksChanged
1344
- // handles fetches when the user enables a network, and
1345
- // #subscribeAssets re-subscribes with the correct chain assignment.
1346
1369
  if (addedChains.length > 0 || removedChains.length > 0) {
1370
+ // Refresh subscriptions to use updated data source availability.
1371
+ // No one-time fetch needed here — #handleEnabledNetworksChanged
1372
+ // handles fetches when the user enables a network, and
1373
+ // #subscribeAssets re-subscribes with the correct chain assignment.
1347
1374
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
1348
1375
  }
1349
1376
  }, _AssetsController_executeMiddlewares =
@@ -1927,10 +1954,8 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
1927
1954
  }, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance(accounts, chainIds) {
1928
1955
  const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, accounts, new Set(chainIds));
1929
1956
  const remainingChains = new Set(chainToAccounts.keys());
1930
- // When basic functionality is on, use all balance data sources; when off,
1931
- // RPC only.
1932
- const isBasicFunctionality = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this);
1933
- const balanceDataSources = isBasicFunctionality
1957
+ // When basic functionality is on, use all balance data sources; when off, RPC only.
1958
+ const balanceDataSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
1934
1959
  ? __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get)
1935
1960
  : [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
1936
1961
  let rpcAssignedChains = new Set();
@@ -2228,11 +2253,14 @@ async function _AssetsController_handleAccountGroupChanged() {
2228
2253
  __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_fetchMissingPricesWithoutCache).call(this, accounts, [caipChainId]);
2229
2254
  }, _AssetsController_refreshActiveChainsOnNetworkSwitch =
2230
2255
  /**
2231
- * Refresh data-source `activeChains` after an EVM network switch so API/Rpc
2256
+ * Refresh data-source `activeChains` after an EVM network switch so API/WS/Rpc
2232
2257
  * chain claiming is not stuck on an empty or stale init-time list.
2233
2258
  */
2234
2259
  async function _AssetsController_refreshActiveChainsOnNetworkSwitch() {
2235
- await __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f").refreshActiveChains();
2260
+ await Promise.all([
2261
+ __classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f").refreshActiveChains(),
2262
+ __classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f").refreshActiveChains(),
2263
+ ]);
2236
2264
  __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f").refreshActiveChainsFromNetworkState();
2237
2265
  }, _AssetsController_getSelectedEvmChainIdFromNetworkState = function _AssetsController_getSelectedEvmChainIdFromNetworkState(networkState) {
2238
2266
  try {