@metamask-previews/assets-controller 2.0.2-preview-188601e97 → 2.0.2-preview-980f677
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 +8 -0
- package/dist/AssetsController.cjs +118 -27
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +16 -4
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +16 -4
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +118 -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 +20 -14
- package/dist/data-sources/PriceDataSource.cjs.map +1 -1
- package/dist/data-sources/PriceDataSource.d.cts +2 -2
- package/dist/data-sources/PriceDataSource.d.cts.map +1 -1
- package/dist/data-sources/PriceDataSource.d.mts +2 -2
- package/dist/data-sources/PriceDataSource.d.mts.map +1 -1
- package/dist/data-sources/PriceDataSource.mjs +20 -14
- 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 +16 -0
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +16 -0
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +4 -3
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,14 @@ 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 `currentCurrency` state (ISO 4217 code, default `'usd'`) and `setCurrentCurrency(currentCurrency)` to `AssetsController`. Changing the currency updates state and triggers a one-off price refetch so displayed prices use the new currency ([#7991](https://github.com/MetaMask/core/pull/7991))
|
|
13
|
+
- Add support for forcibly updating prices ([#7991](https://github.com/MetaMask/core/pull/7991))
|
|
14
|
+
- 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))
|
|
15
|
+
- 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))
|
|
16
|
+
- 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))
|
|
17
|
+
|
|
10
18
|
### Changed
|
|
11
19
|
|
|
12
20
|
- 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
|
|
@@ -62,6 +64,7 @@ function getDefaultAssetsControllerState() {
|
|
|
62
64
|
assetsPrice: {},
|
|
63
65
|
customAssets: {},
|
|
64
66
|
assetPreferences: {},
|
|
67
|
+
selectedCurrency: 'usd',
|
|
65
68
|
};
|
|
66
69
|
}
|
|
67
70
|
exports.getDefaultAssetsControllerState = getDefaultAssetsControllerState;
|
|
@@ -99,6 +102,12 @@ const stateMetadata = {
|
|
|
99
102
|
includeInDebugSnapshot: false,
|
|
100
103
|
usedInUi: true,
|
|
101
104
|
},
|
|
105
|
+
selectedCurrency: {
|
|
106
|
+
persist: true,
|
|
107
|
+
includeInStateLogs: false,
|
|
108
|
+
includeInDebugSnapshot: false,
|
|
109
|
+
usedInUi: true,
|
|
110
|
+
},
|
|
102
111
|
};
|
|
103
112
|
// ============================================================================
|
|
104
113
|
// HELPER FUNCTIONS
|
|
@@ -152,6 +161,9 @@ function normalizeResponse(response) {
|
|
|
152
161
|
if (response.errors) {
|
|
153
162
|
normalized.errors = { ...response.errors };
|
|
154
163
|
}
|
|
164
|
+
if (response.updateMode) {
|
|
165
|
+
normalized.updateMode = response.updateMode;
|
|
166
|
+
}
|
|
155
167
|
return normalized;
|
|
156
168
|
}
|
|
157
169
|
// ============================================================================
|
|
@@ -173,8 +185,10 @@ function normalizeResponse(response) {
|
|
|
173
185
|
* based on which chains they support. When active chains change, the controller
|
|
174
186
|
* dynamically adjusts subscriptions.
|
|
175
187
|
*
|
|
176
|
-
* 4. **Keyring Lifecycle**:
|
|
177
|
-
*
|
|
188
|
+
* 4. **Client + Keyring Lifecycle**: Starts subscriptions only when both the UI is
|
|
189
|
+
* open (ClientController) and the wallet is unlocked (KeyringController).
|
|
190
|
+
* Stops when either the UI closes or the keyring locks. See client-controller
|
|
191
|
+
* README for the combined pattern.
|
|
178
192
|
*
|
|
179
193
|
* ## Architecture
|
|
180
194
|
*
|
|
@@ -204,6 +218,10 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
204
218
|
_AssetsController_trackMetaMetricsEvent.set(this, void 0);
|
|
205
219
|
/** Whether we have already reported first init fetch for this session (reset on #stop). */
|
|
206
220
|
_AssetsController_firstInitFetchReported.set(this, false);
|
|
221
|
+
/** Whether the client (UI) is open. Combined with #keyringUnlocked for #updateActive. */
|
|
222
|
+
_AssetsController_uiOpen.set(this, false);
|
|
223
|
+
/** Whether the keyring is unlocked. Combined with #uiOpen for #updateActive. */
|
|
224
|
+
_AssetsController_keyringUnlocked.set(this, false);
|
|
207
225
|
_AssetsController_controllerMutex.set(this, new async_mutex_1.Mutex());
|
|
208
226
|
/**
|
|
209
227
|
* Active balance subscriptions keyed by account ID.
|
|
@@ -260,6 +278,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
260
278
|
}), "f");
|
|
261
279
|
__classPrivateFieldSet(this, _AssetsController_priceDataSource, new PriceDataSource_1.PriceDataSource({
|
|
262
280
|
queryApiClient,
|
|
281
|
+
getSelectedCurrency: () => this.state.selectedCurrency,
|
|
263
282
|
...priceDataSourceConfig,
|
|
264
283
|
}), "f");
|
|
265
284
|
__classPrivateFieldSet(this, _AssetsController_detectionMiddleware, new DetectionMiddleware_1.DetectionMiddleware(), "f");
|
|
@@ -273,7 +292,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
273
292
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_initializeState).call(this);
|
|
274
293
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToEvents).call(this);
|
|
275
294
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_registerActionHandlers).call(this);
|
|
276
|
-
// Subscriptions start only
|
|
295
|
+
// Subscriptions start only when both UI is open and keyring unlocked -> #updateActive().
|
|
277
296
|
// Subscribe to basic-functionality changes after construction so a synchronous
|
|
278
297
|
// onChange during subscribe cannot run before data sources are initialized.
|
|
279
298
|
if (subscribeToBasicFunctionalityChange) {
|
|
@@ -337,6 +356,9 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
337
356
|
const chainIds = options?.chainIds ?? [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")];
|
|
338
357
|
const assetTypes = options?.assetTypes ?? ['fungible'];
|
|
339
358
|
const dataTypes = options?.dataTypes ?? ['balance', 'metadata', 'price'];
|
|
359
|
+
if (accounts.length === 0 || chainIds.length === 0) {
|
|
360
|
+
return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
|
|
361
|
+
}
|
|
340
362
|
// Collect custom assets for all requested accounts
|
|
341
363
|
const customAssets = [];
|
|
342
364
|
for (const account of accounts) {
|
|
@@ -350,16 +372,21 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
350
372
|
dataTypes,
|
|
351
373
|
customAssets: customAssets.length > 0 ? customAssets : undefined,
|
|
352
374
|
forceUpdate: true,
|
|
375
|
+
assetsForPriceUpdate: options?.assetsForPriceUpdate,
|
|
353
376
|
});
|
|
354
377
|
const sources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
355
378
|
? [
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
379
|
+
(0, ParallelMiddleware_1.createParallelBalanceMiddleware)([
|
|
380
|
+
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
|
|
381
|
+
__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"),
|
|
382
|
+
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
|
|
383
|
+
__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
|
|
384
|
+
]),
|
|
360
385
|
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
361
|
-
|
|
362
|
-
|
|
386
|
+
(0, ParallelMiddleware_1.createParallelMiddleware)([
|
|
387
|
+
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
388
|
+
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
389
|
+
]),
|
|
363
390
|
]
|
|
364
391
|
: [
|
|
365
392
|
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
|
|
@@ -367,7 +394,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
367
394
|
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
368
395
|
];
|
|
369
396
|
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);
|
|
397
|
+
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...response, updateMode: 'full' });
|
|
371
398
|
if (__classPrivateFieldGet(this, _AssetsController_trackMetaMetricsEvent, "f") && !__classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")) {
|
|
372
399
|
__classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, true, "f");
|
|
373
400
|
const durationMs = Date.now() - startTime;
|
|
@@ -530,6 +557,34 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
530
557
|
});
|
|
531
558
|
}
|
|
532
559
|
// ============================================================================
|
|
560
|
+
// CURRENT CURRENCY MANAGEMENT
|
|
561
|
+
// ============================================================================
|
|
562
|
+
/**
|
|
563
|
+
* Set the current currency.
|
|
564
|
+
*
|
|
565
|
+
* @param selectedCurrency - The ISO 4217 currency code to set.
|
|
566
|
+
*/
|
|
567
|
+
setSelectedCurrency(selectedCurrency) {
|
|
568
|
+
const previousCurrency = this.state.selectedCurrency;
|
|
569
|
+
if (previousCurrency === selectedCurrency) {
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
this.update((state) => {
|
|
573
|
+
state.selectedCurrency = selectedCurrency;
|
|
574
|
+
});
|
|
575
|
+
log('Current currency changed', {
|
|
576
|
+
previousCurrency,
|
|
577
|
+
selectedCurrency,
|
|
578
|
+
});
|
|
579
|
+
this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
|
|
580
|
+
forceUpdate: true,
|
|
581
|
+
dataTypes: ['price'],
|
|
582
|
+
assetsForPriceUpdate: Object.values(this.state.assetsBalance).flatMap((balances) => Object.keys(balances)),
|
|
583
|
+
}).catch((error) => {
|
|
584
|
+
log('Failed to fetch asset prices after current currency change', error);
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
// ============================================================================
|
|
533
588
|
// SUBSCRIPTIONS
|
|
534
589
|
// ============================================================================
|
|
535
590
|
/**
|
|
@@ -607,9 +662,15 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
607
662
|
hasBalance: Boolean(response.assetsBalance),
|
|
608
663
|
hasPrice: Boolean(response.assetsPrice),
|
|
609
664
|
});
|
|
610
|
-
// Run through enrichment middlewares (
|
|
665
|
+
// Run through enrichment middlewares (Detection, then Token + Price in parallel)
|
|
611
666
|
// 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, [
|
|
667
|
+
const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [
|
|
668
|
+
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
669
|
+
(0, ParallelMiddleware_1.createParallelMiddleware)([
|
|
670
|
+
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
671
|
+
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
672
|
+
]),
|
|
673
|
+
], request ?? {
|
|
613
674
|
accountsWithSupportedChains: [],
|
|
614
675
|
chainIds: [],
|
|
615
676
|
dataTypes: ['balance', 'metadata', 'price'],
|
|
@@ -649,7 +710,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
649
710
|
}
|
|
650
711
|
}
|
|
651
712
|
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() {
|
|
713
|
+
_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
714
|
return this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
|
|
654
715
|
}, _AssetsController_allBalanceDataSources_get = function _AssetsController_allBalanceDataSources_get() {
|
|
655
716
|
return [
|
|
@@ -699,9 +760,27 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
|
|
|
699
760
|
this.messenger.subscribe('NetworkEnablementController:stateChange', ({ enabledNetworkMap }) => {
|
|
700
761
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleEnabledNetworksChanged).call(this, enabledNetworkMap).catch(console.error);
|
|
701
762
|
});
|
|
702
|
-
// Keyring lifecycle:
|
|
703
|
-
this.messenger.subscribe('
|
|
704
|
-
|
|
763
|
+
// Client + Keyring lifecycle: only run when UI is open AND keyring is unlocked
|
|
764
|
+
this.messenger.subscribe('ClientController:stateChange', (isUiOpen) => {
|
|
765
|
+
__classPrivateFieldSet(this, _AssetsController_uiOpen, isUiOpen, "f");
|
|
766
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
|
|
767
|
+
}, client_controller_1.clientControllerSelectors.selectIsUiOpen);
|
|
768
|
+
this.messenger.subscribe('KeyringController:unlock', () => {
|
|
769
|
+
__classPrivateFieldSet(this, _AssetsController_keyringUnlocked, true, "f");
|
|
770
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
|
|
771
|
+
});
|
|
772
|
+
this.messenger.subscribe('KeyringController:lock', () => {
|
|
773
|
+
__classPrivateFieldSet(this, _AssetsController_keyringUnlocked, false, "f");
|
|
774
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
|
|
775
|
+
});
|
|
776
|
+
}, _AssetsController_updateActive = function _AssetsController_updateActive() {
|
|
777
|
+
const shouldRun = __classPrivateFieldGet(this, _AssetsController_uiOpen, "f") && __classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f");
|
|
778
|
+
if (shouldRun) {
|
|
779
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_start).call(this);
|
|
780
|
+
}
|
|
781
|
+
else {
|
|
782
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
|
|
783
|
+
}
|
|
705
784
|
}, _AssetsController_registerActionHandlers = function _AssetsController_registerActionHandlers() {
|
|
706
785
|
this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
|
|
707
786
|
}, _AssetsController_executeMiddlewares =
|
|
@@ -759,8 +838,8 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
759
838
|
// STATE MANAGEMENT
|
|
760
839
|
// ============================================================================
|
|
761
840
|
async function _AssetsController_updateState(response) {
|
|
762
|
-
// Normalize asset IDs (checksum EVM addresses) before storing in state
|
|
763
841
|
const normalizedResponse = normalizeResponse(response);
|
|
842
|
+
const mode = normalizedResponse.updateMode ?? 'merge';
|
|
764
843
|
const releaseLock = await __classPrivateFieldGet(this, _AssetsController_controllerMutex, "f").acquire();
|
|
765
844
|
try {
|
|
766
845
|
const previousState = this.state;
|
|
@@ -786,15 +865,27 @@ async function _AssetsController_updateState(response) {
|
|
|
786
865
|
if (normalizedResponse.assetsBalance) {
|
|
787
866
|
for (const [accountId, accountBalances] of Object.entries(normalizedResponse.assetsBalance)) {
|
|
788
867
|
const previousBalances = previousState.assetsBalance[accountId] ?? {};
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
868
|
+
const customAssetIds = state.customAssets[accountId] ?? [];
|
|
869
|
+
// Full: response is authoritative; preserve custom assets not in response. Merge: response overlays previous.
|
|
870
|
+
const effective = mode === 'full'
|
|
871
|
+
? (() => {
|
|
872
|
+
const next = {
|
|
873
|
+
...accountBalances,
|
|
874
|
+
};
|
|
875
|
+
for (const customId of customAssetIds) {
|
|
876
|
+
if (!(customId in next)) {
|
|
877
|
+
const prev = previousBalances[customId];
|
|
878
|
+
next[customId] =
|
|
879
|
+
prev ?? { amount: '0' };
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
return next;
|
|
883
|
+
})()
|
|
884
|
+
: { ...previousBalances, ...accountBalances };
|
|
885
|
+
for (const [assetId, balance] of Object.entries(effective)) {
|
|
793
886
|
const previousBalance = previousBalances[assetId];
|
|
794
|
-
const
|
|
795
|
-
const newAmount = balanceData.amount;
|
|
887
|
+
const newAmount = balance.amount;
|
|
796
888
|
const oldAmount = previousBalance?.amount;
|
|
797
|
-
// Track if balance actually changed
|
|
798
889
|
if (oldAmount !== newAmount) {
|
|
799
890
|
changedBalances.push({
|
|
800
891
|
accountId,
|
|
@@ -804,7 +895,7 @@ async function _AssetsController_updateState(response) {
|
|
|
804
895
|
});
|
|
805
896
|
}
|
|
806
897
|
}
|
|
807
|
-
|
|
898
|
+
balances[accountId] = effective;
|
|
808
899
|
}
|
|
809
900
|
}
|
|
810
901
|
// Update prices in state
|
|
@@ -982,7 +1073,7 @@ async function _AssetsController_updateState(response) {
|
|
|
982
1073
|
}
|
|
983
1074
|
__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").clear();
|
|
984
1075
|
}, _AssetsController_subscribeAssets = function _AssetsController_subscribeAssets() {
|
|
985
|
-
if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length === 0) {
|
|
1076
|
+
if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length === 0 || __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size === 0) {
|
|
986
1077
|
return;
|
|
987
1078
|
}
|
|
988
1079
|
// Subscribe to balance updates (batched by data source)
|