@metamask-previews/assets-controller 2.0.2-preview-32ed9958c → 2.0.2-preview-d1f62d044
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 +6 -0
- package/dist/AssetsController.cjs +81 -27
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +6 -3
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +6 -3
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +81 -27
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.cjs +1 -0
- package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.mjs +1 -0
- package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.cjs +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.mjs +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -1
- package/dist/data-sources/PriceDataSource.cjs +4 -1
- package/dist/data-sources/PriceDataSource.cjs.map +1 -1
- package/dist/data-sources/PriceDataSource.d.cts.map +1 -1
- package/dist/data-sources/PriceDataSource.d.mts.map +1 -1
- package/dist/data-sources/PriceDataSource.mjs +4 -1
- package/dist/data-sources/PriceDataSource.mjs.map +1 -1
- package/dist/data-sources/RpcDataSource.cjs +2 -0
- 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 +2 -0
- package/dist/data-sources/RpcDataSource.mjs.map +1 -1
- package/dist/data-sources/SnapDataSource.cjs +3 -2
- package/dist/data-sources/SnapDataSource.cjs.map +1 -1
- package/dist/data-sources/SnapDataSource.d.cts.map +1 -1
- package/dist/data-sources/SnapDataSource.d.mts.map +1 -1
- package/dist/data-sources/SnapDataSource.mjs +3 -2
- package/dist/data-sources/SnapDataSource.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/middlewares/ParallelMiddleware.cjs +216 -0
- package/dist/middlewares/ParallelMiddleware.cjs.map +1 -0
- package/dist/middlewares/ParallelMiddleware.d.cts +45 -0
- package/dist/middlewares/ParallelMiddleware.d.cts.map +1 -0
- package/dist/middlewares/ParallelMiddleware.d.mts +45 -0
- package/dist/middlewares/ParallelMiddleware.d.mts.map +1 -0
- package/dist/middlewares/ParallelMiddleware.mjs +214 -0
- package/dist/middlewares/ParallelMiddleware.mjs.map +1 -0
- package/dist/middlewares/index.cjs +5 -1
- package/dist/middlewares/index.cjs.map +1 -1
- package/dist/middlewares/index.d.cts +2 -0
- package/dist/middlewares/index.d.cts.map +1 -1
- package/dist/middlewares/index.d.mts +2 -0
- package/dist/middlewares/index.d.mts.map +1 -1
- package/dist/middlewares/index.mjs +1 -0
- package/dist/middlewares/index.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +14 -0
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +14 -0
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +4 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Add parallel middlewares in `ParallelMiddleware.ts`: `createParallelBalanceMiddleware` runs balance data sources (Accounts API, Snap, RPC) in parallel with chain partitioning and a fallback round for failed chains; `createParallelMiddleware` runs TokenDataSource and PriceDataSource in parallel (same request, merged response). Both use `mergeDataResponses` and limited concurrency via `p-limit` ([#7950](https://github.com/MetaMask/core/pull/7950))
|
|
13
|
+
- Add `@metamask/client-controller` dependency and subscribe to `ClientController:stateChange`. Asset tracking runs only when the UI is open (ClientController) and the keyring is unlocked (KeyringController), and stops when either the UI closes or the keyring locks (Client + Keyring lifecycle) ([#7950](https://github.com/MetaMask/core/pull/7950))
|
|
14
|
+
- Add full and merge update modes: `DataResponse.updateMode` and type `AssetsUpdateMode` (`'full'` | `'merge'`). Fetch uses `'full'` (response is authoritative for scope; custom assets not in response are preserved). Subscriptions could use `'merge'` or `'full'` depending on data sources. Default is `'merge'` when omitted ([#7950](https://github.com/MetaMask/core/pull/7950))
|
|
15
|
+
|
|
10
16
|
### Changed
|
|
11
17
|
|
|
12
18
|
- Bump `@metamask/transaction-controller` from `^62.17.1` to `^62.18.0` ([#8005](https://github.com/MetaMask/core/pull/8005))
|
|
@@ -13,10 +13,11 @@ 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_trackMetaMetricsEvent, _AssetsController_firstInitFetchReported, _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_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_registerActionHandlers, _AssetsController_executeMiddlewares, _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;
|
|
16
|
+
var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_trackMetaMetricsEvent, _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_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_updateActive, _AssetsController_registerActionHandlers, _AssetsController_executeMiddlewares, _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");
|
|
20
|
+
const client_controller_1 = require("@metamask/client-controller");
|
|
20
21
|
const utils_1 = require("@metamask/utils");
|
|
21
22
|
const async_mutex_1 = require("async-mutex");
|
|
22
23
|
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
@@ -30,6 +31,7 @@ const StakedBalanceDataSource_1 = require("./data-sources/StakedBalanceDataSourc
|
|
|
30
31
|
const TokenDataSource_1 = require("./data-sources/TokenDataSource.cjs");
|
|
31
32
|
const logger_1 = require("./logger.cjs");
|
|
32
33
|
const DetectionMiddleware_1 = require("./middlewares/DetectionMiddleware.cjs");
|
|
34
|
+
const ParallelMiddleware_1 = require("./middlewares/ParallelMiddleware.cjs");
|
|
33
35
|
const utils_2 = require("./utils.cjs");
|
|
34
36
|
// ============================================================================
|
|
35
37
|
// CONTROLLER CONSTANTS
|
|
@@ -152,6 +154,9 @@ function normalizeResponse(response) {
|
|
|
152
154
|
if (response.errors) {
|
|
153
155
|
normalized.errors = { ...response.errors };
|
|
154
156
|
}
|
|
157
|
+
if (response.updateMode) {
|
|
158
|
+
normalized.updateMode = response.updateMode;
|
|
159
|
+
}
|
|
155
160
|
return normalized;
|
|
156
161
|
}
|
|
157
162
|
// ============================================================================
|
|
@@ -173,8 +178,10 @@ function normalizeResponse(response) {
|
|
|
173
178
|
* based on which chains they support. When active chains change, the controller
|
|
174
179
|
* dynamically adjusts subscriptions.
|
|
175
180
|
*
|
|
176
|
-
* 4. **Keyring Lifecycle**:
|
|
177
|
-
*
|
|
181
|
+
* 4. **Client + Keyring Lifecycle**: Starts subscriptions only when both the UI is
|
|
182
|
+
* open (ClientController) and the wallet is unlocked (KeyringController).
|
|
183
|
+
* Stops when either the UI closes or the keyring locks. See client-controller
|
|
184
|
+
* README for the combined pattern.
|
|
178
185
|
*
|
|
179
186
|
* ## Architecture
|
|
180
187
|
*
|
|
@@ -204,6 +211,10 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
204
211
|
_AssetsController_trackMetaMetricsEvent.set(this, void 0);
|
|
205
212
|
/** Whether we have already reported first init fetch for this session (reset on #stop). */
|
|
206
213
|
_AssetsController_firstInitFetchReported.set(this, false);
|
|
214
|
+
/** Whether the client (UI) is open. Combined with #keyringUnlocked for #updateActive. */
|
|
215
|
+
_AssetsController_uiOpen.set(this, false);
|
|
216
|
+
/** Whether the keyring is unlocked. Combined with #uiOpen for #updateActive. */
|
|
217
|
+
_AssetsController_keyringUnlocked.set(this, false);
|
|
207
218
|
_AssetsController_controllerMutex.set(this, new async_mutex_1.Mutex());
|
|
208
219
|
/**
|
|
209
220
|
* Active balance subscriptions keyed by account ID.
|
|
@@ -273,7 +284,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
273
284
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_initializeState).call(this);
|
|
274
285
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToEvents).call(this);
|
|
275
286
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_registerActionHandlers).call(this);
|
|
276
|
-
// Subscriptions start only
|
|
287
|
+
// Subscriptions start only when both UI is open and keyring unlocked -> #updateActive().
|
|
277
288
|
// Subscribe to basic-functionality changes after construction so a synchronous
|
|
278
289
|
// onChange during subscribe cannot run before data sources are initialized.
|
|
279
290
|
if (subscribeToBasicFunctionalityChange) {
|
|
@@ -337,6 +348,9 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
337
348
|
const chainIds = options?.chainIds ?? [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")];
|
|
338
349
|
const assetTypes = options?.assetTypes ?? ['fungible'];
|
|
339
350
|
const dataTypes = options?.dataTypes ?? ['balance', 'metadata', 'price'];
|
|
351
|
+
if (accounts.length === 0 || chainIds.length === 0) {
|
|
352
|
+
return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
|
|
353
|
+
}
|
|
340
354
|
// Collect custom assets for all requested accounts
|
|
341
355
|
const customAssets = [];
|
|
342
356
|
for (const account of accounts) {
|
|
@@ -353,13 +367,17 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
353
367
|
});
|
|
354
368
|
const sources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
355
369
|
? [
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
370
|
+
(0, ParallelMiddleware_1.createParallelBalanceMiddleware)([
|
|
371
|
+
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
|
|
372
|
+
__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"),
|
|
373
|
+
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
|
|
374
|
+
__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
|
|
375
|
+
]),
|
|
360
376
|
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
361
|
-
|
|
362
|
-
|
|
377
|
+
(0, ParallelMiddleware_1.createParallelMiddleware)([
|
|
378
|
+
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
379
|
+
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
380
|
+
]),
|
|
363
381
|
]
|
|
364
382
|
: [
|
|
365
383
|
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
|
|
@@ -367,7 +385,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
367
385
|
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
368
386
|
];
|
|
369
387
|
const { response, durationByDataSource } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, sources, request);
|
|
370
|
-
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, response);
|
|
388
|
+
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...response, updateMode: 'full' });
|
|
371
389
|
if (__classPrivateFieldGet(this, _AssetsController_trackMetaMetricsEvent, "f") && !__classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")) {
|
|
372
390
|
__classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, true, "f");
|
|
373
391
|
const durationMs = Date.now() - startTime;
|
|
@@ -607,9 +625,15 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
607
625
|
hasBalance: Boolean(response.assetsBalance),
|
|
608
626
|
hasPrice: Boolean(response.assetsPrice),
|
|
609
627
|
});
|
|
610
|
-
// Run through enrichment middlewares (
|
|
628
|
+
// Run through enrichment middlewares (Detection, then Token + Price in parallel)
|
|
611
629
|
// Include 'metadata' in dataTypes so TokenDataSource runs to enrich detected assets
|
|
612
|
-
const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [
|
|
630
|
+
const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [
|
|
631
|
+
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
632
|
+
(0, ParallelMiddleware_1.createParallelMiddleware)([
|
|
633
|
+
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
634
|
+
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
635
|
+
]),
|
|
636
|
+
], request ?? {
|
|
613
637
|
accountsWithSupportedChains: [],
|
|
614
638
|
chainIds: [],
|
|
615
639
|
dataTypes: ['balance', 'metadata', 'price'],
|
|
@@ -649,7 +673,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
649
673
|
}
|
|
650
674
|
}
|
|
651
675
|
exports.AssetsController = AssetsController;
|
|
652
|
-
_AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctionality = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_trackMetaMetricsEvent = new WeakMap(), _AssetsController_firstInitFetchReported = 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_instances = new WeakSet(), _AssetsController_selectedAccounts_get = function _AssetsController_selectedAccounts_get() {
|
|
676
|
+
_AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctionality = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_trackMetaMetricsEvent = 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_instances = new WeakSet(), _AssetsController_selectedAccounts_get = function _AssetsController_selectedAccounts_get() {
|
|
653
677
|
return this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
|
|
654
678
|
}, _AssetsController_allBalanceDataSources_get = function _AssetsController_allBalanceDataSources_get() {
|
|
655
679
|
return [
|
|
@@ -699,9 +723,27 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
|
|
|
699
723
|
this.messenger.subscribe('NetworkEnablementController:stateChange', ({ enabledNetworkMap }) => {
|
|
700
724
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleEnabledNetworksChanged).call(this, enabledNetworkMap).catch(console.error);
|
|
701
725
|
});
|
|
702
|
-
// Keyring lifecycle:
|
|
703
|
-
this.messenger.subscribe('
|
|
704
|
-
|
|
726
|
+
// Client + Keyring lifecycle: only run when UI is open AND keyring is unlocked
|
|
727
|
+
this.messenger.subscribe('ClientController:stateChange', (isUiOpen) => {
|
|
728
|
+
__classPrivateFieldSet(this, _AssetsController_uiOpen, isUiOpen, "f");
|
|
729
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
|
|
730
|
+
}, client_controller_1.clientControllerSelectors.selectIsUiOpen);
|
|
731
|
+
this.messenger.subscribe('KeyringController:unlock', () => {
|
|
732
|
+
__classPrivateFieldSet(this, _AssetsController_keyringUnlocked, true, "f");
|
|
733
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
|
|
734
|
+
});
|
|
735
|
+
this.messenger.subscribe('KeyringController:lock', () => {
|
|
736
|
+
__classPrivateFieldSet(this, _AssetsController_keyringUnlocked, false, "f");
|
|
737
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
|
|
738
|
+
});
|
|
739
|
+
}, _AssetsController_updateActive = function _AssetsController_updateActive() {
|
|
740
|
+
const shouldRun = __classPrivateFieldGet(this, _AssetsController_uiOpen, "f") && __classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f");
|
|
741
|
+
if (shouldRun) {
|
|
742
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_start).call(this);
|
|
743
|
+
}
|
|
744
|
+
else {
|
|
745
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
|
|
746
|
+
}
|
|
705
747
|
}, _AssetsController_registerActionHandlers = function _AssetsController_registerActionHandlers() {
|
|
706
748
|
this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
|
|
707
749
|
}, _AssetsController_executeMiddlewares =
|
|
@@ -759,8 +801,8 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
759
801
|
// STATE MANAGEMENT
|
|
760
802
|
// ============================================================================
|
|
761
803
|
async function _AssetsController_updateState(response) {
|
|
762
|
-
// Normalize asset IDs (checksum EVM addresses) before storing in state
|
|
763
804
|
const normalizedResponse = normalizeResponse(response);
|
|
805
|
+
const mode = normalizedResponse.updateMode ?? 'merge';
|
|
764
806
|
const releaseLock = await __classPrivateFieldGet(this, _AssetsController_controllerMutex, "f").acquire();
|
|
765
807
|
try {
|
|
766
808
|
const previousState = this.state;
|
|
@@ -786,15 +828,27 @@ async function _AssetsController_updateState(response) {
|
|
|
786
828
|
if (normalizedResponse.assetsBalance) {
|
|
787
829
|
for (const [accountId, accountBalances] of Object.entries(normalizedResponse.assetsBalance)) {
|
|
788
830
|
const previousBalances = previousState.assetsBalance[accountId] ?? {};
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
831
|
+
const customAssetIds = state.customAssets[accountId] ?? [];
|
|
832
|
+
// Full: response is authoritative; preserve custom assets not in response. Merge: response overlays previous.
|
|
833
|
+
const effective = mode === 'full'
|
|
834
|
+
? (() => {
|
|
835
|
+
const next = {
|
|
836
|
+
...accountBalances,
|
|
837
|
+
};
|
|
838
|
+
for (const customId of customAssetIds) {
|
|
839
|
+
if (!(customId in next)) {
|
|
840
|
+
const prev = previousBalances[customId];
|
|
841
|
+
next[customId] =
|
|
842
|
+
prev ?? { amount: '0' };
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
return next;
|
|
846
|
+
})()
|
|
847
|
+
: { ...previousBalances, ...accountBalances };
|
|
848
|
+
for (const [assetId, balance] of Object.entries(effective)) {
|
|
793
849
|
const previousBalance = previousBalances[assetId];
|
|
794
|
-
const
|
|
795
|
-
const newAmount = balanceData.amount;
|
|
850
|
+
const newAmount = balance.amount;
|
|
796
851
|
const oldAmount = previousBalance?.amount;
|
|
797
|
-
// Track if balance actually changed
|
|
798
852
|
if (oldAmount !== newAmount) {
|
|
799
853
|
changedBalances.push({
|
|
800
854
|
accountId,
|
|
@@ -804,7 +858,7 @@ async function _AssetsController_updateState(response) {
|
|
|
804
858
|
});
|
|
805
859
|
}
|
|
806
860
|
}
|
|
807
|
-
|
|
861
|
+
balances[accountId] = effective;
|
|
808
862
|
}
|
|
809
863
|
}
|
|
810
864
|
// Update prices in state
|
|
@@ -982,7 +1036,7 @@ async function _AssetsController_updateState(response) {
|
|
|
982
1036
|
}
|
|
983
1037
|
__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").clear();
|
|
984
1038
|
}, _AssetsController_subscribeAssets = function _AssetsController_subscribeAssets() {
|
|
985
|
-
if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length === 0) {
|
|
1039
|
+
if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length === 0 || __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size === 0) {
|
|
986
1040
|
return;
|
|
987
1041
|
}
|
|
988
1042
|
// Subscribe to balance updates (batched by data source)
|