@metamask-previews/assets-controller 0.2.0-preview-429bf064c → 1.0.0-preview-7aeef9dd1
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 +18 -1
- package/dist/AssetsController.cjs +80 -161
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +9 -15
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +9 -15
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +80 -161
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/AbstractDataSource.cjs +8 -0
- package/dist/data-sources/AbstractDataSource.cjs.map +1 -1
- package/dist/data-sources/AbstractDataSource.d.cts +6 -0
- package/dist/data-sources/AbstractDataSource.d.cts.map +1 -1
- package/dist/data-sources/AbstractDataSource.d.mts +6 -0
- package/dist/data-sources/AbstractDataSource.d.mts.map +1 -1
- package/dist/data-sources/AbstractDataSource.mjs +8 -0
- package/dist/data-sources/AbstractDataSource.mjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.cjs +4 -2
- package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.cts +2 -2
- package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.mts +2 -2
- package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.mjs +4 -2
- package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.cjs +6 -3
- package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.d.cts +2 -2
- package/dist/data-sources/BackendWebsocketDataSource.d.cts.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.d.mts +2 -2
- package/dist/data-sources/BackendWebsocketDataSource.d.mts.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.mjs +6 -3
- package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -1
- package/dist/data-sources/RpcDataSource.cjs +9 -6
- package/dist/data-sources/RpcDataSource.cjs.map +1 -1
- package/dist/data-sources/RpcDataSource.d.cts +2 -2
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
- package/dist/data-sources/RpcDataSource.d.mts +2 -2
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
- package/dist/data-sources/RpcDataSource.mjs +9 -6
- package/dist/data-sources/RpcDataSource.mjs.map +1 -1
- package/dist/data-sources/SnapDataSource.cjs +4 -2
- package/dist/data-sources/SnapDataSource.cjs.map +1 -1
- package/dist/data-sources/SnapDataSource.d.cts +2 -2
- package/dist/data-sources/SnapDataSource.d.cts.map +1 -1
- package/dist/data-sources/SnapDataSource.d.mts +2 -2
- package/dist/data-sources/SnapDataSource.d.mts.map +1 -1
- package/dist/data-sources/SnapDataSource.mjs +4 -2
- package/dist/data-sources/SnapDataSource.mjs.map +1 -1
- package/dist/index.cjs +6 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -0
- package/dist/index.mjs.map +1 -1
- package/dist/selectors/balance.cjs +306 -0
- package/dist/selectors/balance.cjs.map +1 -0
- package/dist/selectors/balance.d.cts +22 -0
- package/dist/selectors/balance.d.cts.map +1 -0
- package/dist/selectors/balance.d.mts +22 -0
- package/dist/selectors/balance.d.mts.map +1 -0
- package/dist/selectors/balance.mjs +297 -0
- package/dist/selectors/balance.mjs.map +1 -0
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +1 -15
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +1 -15
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +5 -5
|
@@ -1,15 +1,15 @@
|
|
|
1
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
2
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
3
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
4
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
5
|
+
};
|
|
1
6
|
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
7
|
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
8
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
10
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
11
|
};
|
|
7
|
-
var
|
|
8
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
-
};
|
|
12
|
-
var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_defaultUpdateInterval, _AssetsController_controllerMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_selectedAccounts_get, _AssetsController_dataSources, _AssetsController_backendWebsocketDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_tokenDataSource, _AssetsController_getBalanceDataSource, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_registerActionHandlers, _AssetsController_executeMiddlewares, _AssetsController_assignChainsToDataSources, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeToDataSources, _AssetsController_subscribeAssetsBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_getAccountsForChains, _AssetsController_subscribeToDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged;
|
|
12
|
+
var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_defaultUpdateInterval, _AssetsController_controllerMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_selectedAccounts_get, _AssetsController_backendWebsocketDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_subscriptionBalanceDataSources_get, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_tokenDataSource, _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_buildChainToAccountsMap, _AssetsController_subscribeDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged;
|
|
13
13
|
import { BaseController } from "@metamask/base-controller";
|
|
14
14
|
import { parseCaipAssetType } from "@metamask/utils";
|
|
15
15
|
import { Mutex } from "async-mutex";
|
|
@@ -201,12 +201,6 @@ export class AssetsController extends BaseController {
|
|
|
201
201
|
_AssetsController_activeSubscriptions.set(this, new Map());
|
|
202
202
|
/** Currently enabled chains from NetworkEnablementController */
|
|
203
203
|
_AssetsController_enabledChains.set(this, new Set());
|
|
204
|
-
/**
|
|
205
|
-
* Registered data sources with their available chains.
|
|
206
|
-
* Updated continuously and independently from subscription flows.
|
|
207
|
-
* Key: sourceId, Value: Set of currently available chainIds
|
|
208
|
-
*/
|
|
209
|
-
_AssetsController_dataSources.set(this, new Map());
|
|
210
204
|
_AssetsController_backendWebsocketDataSource.set(this, void 0);
|
|
211
205
|
_AssetsController_accountsApiDataSource.set(this, void 0);
|
|
212
206
|
_AssetsController_snapDataSource.set(this, void 0);
|
|
@@ -217,24 +211,23 @@ export class AssetsController extends BaseController {
|
|
|
217
211
|
__classPrivateFieldSet(this, _AssetsController_isEnabled, isEnabled(), "f");
|
|
218
212
|
__classPrivateFieldSet(this, _AssetsController_defaultUpdateInterval, defaultUpdateInterval, "f");
|
|
219
213
|
const rpcConfig = rpcDataSourceConfig ?? {};
|
|
214
|
+
const onActiveChainsUpdated = (dataSourceName, chains, previousChains) => this.handleActiveChainsUpdate(dataSourceName, chains, previousChains);
|
|
220
215
|
__classPrivateFieldSet(this, _AssetsController_backendWebsocketDataSource, new BackendWebsocketDataSource({
|
|
221
216
|
messenger: this.messenger,
|
|
222
217
|
queryApiClient,
|
|
223
|
-
onActiveChainsUpdated
|
|
218
|
+
onActiveChainsUpdated,
|
|
224
219
|
}), "f");
|
|
225
220
|
__classPrivateFieldSet(this, _AssetsController_accountsApiDataSource, new AccountsApiDataSource({
|
|
226
221
|
queryApiClient,
|
|
227
|
-
onActiveChainsUpdated
|
|
228
|
-
this.handleActiveChainsUpdate('AccountsApiDataSource', chains);
|
|
229
|
-
},
|
|
222
|
+
onActiveChainsUpdated,
|
|
230
223
|
}), "f");
|
|
231
224
|
__classPrivateFieldSet(this, _AssetsController_snapDataSource, new SnapDataSource({
|
|
232
225
|
messenger: this.messenger,
|
|
233
|
-
onActiveChainsUpdated
|
|
226
|
+
onActiveChainsUpdated,
|
|
234
227
|
}), "f");
|
|
235
228
|
__classPrivateFieldSet(this, _AssetsController_rpcDataSource, new RpcDataSource({
|
|
236
229
|
messenger: this.messenger,
|
|
237
|
-
onActiveChainsUpdated
|
|
230
|
+
onActiveChainsUpdated,
|
|
238
231
|
...rpcConfig,
|
|
239
232
|
}), "f");
|
|
240
233
|
__classPrivateFieldSet(this, _AssetsController_tokenDataSource, new TokenDataSource({
|
|
@@ -244,10 +237,6 @@ export class AssetsController extends BaseController {
|
|
|
244
237
|
queryApiClient,
|
|
245
238
|
}), "f");
|
|
246
239
|
__classPrivateFieldSet(this, _AssetsController_detectionMiddleware, new DetectionMiddleware(), "f");
|
|
247
|
-
__classPrivateFieldGet(this, _AssetsController_dataSources, "f").set('BackendWebsocketDataSource', new Set());
|
|
248
|
-
__classPrivateFieldGet(this, _AssetsController_dataSources, "f").set('AccountsApiDataSource', new Set());
|
|
249
|
-
__classPrivateFieldGet(this, _AssetsController_dataSources, "f").set('SnapDataSource', new Set());
|
|
250
|
-
__classPrivateFieldGet(this, _AssetsController_dataSources, "f").set('RpcDataSource', new Set());
|
|
251
240
|
if (!__classPrivateFieldGet(this, _AssetsController_isEnabled, "f")) {
|
|
252
241
|
log('AssetsController is disabled, skipping initialization');
|
|
253
242
|
return;
|
|
@@ -260,56 +249,34 @@ export class AssetsController extends BaseController {
|
|
|
260
249
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_registerActionHandlers).call(this);
|
|
261
250
|
}
|
|
262
251
|
// ============================================================================
|
|
263
|
-
// DATA SOURCE MANAGEMENT
|
|
264
|
-
// ============================================================================
|
|
265
|
-
/**
|
|
266
|
-
* Register data sources with the controller.
|
|
267
|
-
* Order of the array determines subscription order.
|
|
268
|
-
*
|
|
269
|
-
* Data sources report chain changes via the onActiveChainsUpdated callback passed at construction.
|
|
270
|
-
*
|
|
271
|
-
* @param dataSourceIds - Array of data source identifiers to register.
|
|
272
|
-
*/
|
|
273
|
-
registerDataSources(dataSourceIds) {
|
|
274
|
-
for (const id of dataSourceIds) {
|
|
275
|
-
log('Registering data source', { id });
|
|
276
|
-
// Initialize available chains tracking for this source
|
|
277
|
-
__classPrivateFieldGet(this, _AssetsController_dataSources, "f").set(id, new Set());
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
// ============================================================================
|
|
281
252
|
// DATA SOURCE CHAIN MANAGEMENT
|
|
282
253
|
// ============================================================================
|
|
283
254
|
/**
|
|
284
|
-
* Handle when a data source's
|
|
285
|
-
*
|
|
286
|
-
* Updates centralized chain tracking and triggers re-selection if needed.
|
|
255
|
+
* Handle when a data source's supported chains change.
|
|
256
|
+
* Used to refresh balance subscriptions and run a one-time fetch when a new chain is supported.
|
|
287
257
|
*
|
|
288
|
-
*
|
|
258
|
+
* - On any add/remove: re-subscribes to data sources so chain assignment stays correct.
|
|
259
|
+
* - When chains are added: fetches balances for the new chains (for selected accounts on enabled networks).
|
|
260
|
+
*
|
|
261
|
+
* Controller does not store chains; sources report via this callback. previousChains is required for diff.
|
|
289
262
|
*
|
|
290
263
|
* @param dataSourceId - The identifier of the data source reporting the change.
|
|
291
|
-
* @param activeChains -
|
|
264
|
+
* @param activeChains - Currently active (supported and available) chain IDs for this source.
|
|
265
|
+
* @param previousChains - Previous chains; used to compute added/removed.
|
|
292
266
|
*/
|
|
293
|
-
handleActiveChainsUpdate(dataSourceId, activeChains) {
|
|
267
|
+
handleActiveChainsUpdate(dataSourceId, activeChains, previousChains) {
|
|
294
268
|
log('Data source active chains changed', {
|
|
295
269
|
dataSourceId,
|
|
296
270
|
chainCount: activeChains.length,
|
|
297
271
|
chains: activeChains,
|
|
298
272
|
});
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
const previousChains = __classPrivateFieldGet(this, _AssetsController_dataSources, "f").get(dataSourceId) ?? new Set();
|
|
304
|
-
const newChains = new Set(activeChains);
|
|
305
|
-
// Update centralized available chains tracking
|
|
306
|
-
__classPrivateFieldGet(this, _AssetsController_dataSources, "f").set(dataSourceId, newChains);
|
|
307
|
-
// Check for changes
|
|
308
|
-
const addedChains = activeChains.filter((chain) => !previousChains.has(chain));
|
|
309
|
-
const removedChains = Array.from(previousChains).filter((chain) => !newChains.has(chain));
|
|
273
|
+
const previous = previousChains;
|
|
274
|
+
const previousSet = new Set(previous);
|
|
275
|
+
const addedChains = activeChains.filter((ch) => !previousSet.has(ch));
|
|
276
|
+
const removedChains = previous.filter((ch) => !activeChains.includes(ch));
|
|
310
277
|
if (addedChains.length > 0 || removedChains.length > 0) {
|
|
311
278
|
// Refresh subscriptions to use updated data source availability
|
|
312
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m",
|
|
279
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
313
280
|
}
|
|
314
281
|
// If chains were added and we have selected accounts, do one-time fetch
|
|
315
282
|
if (addedChains.length > 0 && __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
|
|
@@ -506,6 +473,9 @@ export class AssetsController extends BaseController {
|
|
|
506
473
|
}
|
|
507
474
|
});
|
|
508
475
|
}
|
|
476
|
+
// ============================================================================
|
|
477
|
+
// SUBSCRIPTIONS
|
|
478
|
+
// ============================================================================
|
|
509
479
|
/**
|
|
510
480
|
* Subscribe to price updates for all assets held by the given accounts.
|
|
511
481
|
* Polls PriceDataSource which fetches prices from balance state.
|
|
@@ -588,7 +558,7 @@ export class AssetsController extends BaseController {
|
|
|
588
558
|
// ============================================================================
|
|
589
559
|
destroy() {
|
|
590
560
|
log('Destroying AssetsController', {
|
|
591
|
-
dataSourceCount: __classPrivateFieldGet(this,
|
|
561
|
+
dataSourceCount: __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get).length,
|
|
592
562
|
subscriptionCount: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").size,
|
|
593
563
|
});
|
|
594
564
|
// Destroy instantiated data sources
|
|
@@ -601,8 +571,6 @@ export class AssetsController extends BaseController {
|
|
|
601
571
|
'function') {
|
|
602
572
|
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f").destroy();
|
|
603
573
|
}
|
|
604
|
-
// Clear data sources
|
|
605
|
-
__classPrivateFieldGet(this, _AssetsController_dataSources, "f").clear();
|
|
606
574
|
// Stop all active subscriptions
|
|
607
575
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
|
|
608
576
|
// Unregister action handlers
|
|
@@ -617,21 +585,15 @@ export class AssetsController extends BaseController {
|
|
|
617
585
|
this.messenger.unregisterActionHandler('AssetsController:unhideAsset');
|
|
618
586
|
}
|
|
619
587
|
}
|
|
620
|
-
_AssetsController_isEnabled = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_controllerMutex = new WeakMap(), _AssetsController_activeSubscriptions = new WeakMap(), _AssetsController_enabledChains = new WeakMap(),
|
|
588
|
+
_AssetsController_isEnabled = new WeakMap(), _AssetsController_defaultUpdateInterval = 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_priceDataSource = new WeakMap(), _AssetsController_detectionMiddleware = new WeakMap(), _AssetsController_tokenDataSource = new WeakMap(), _AssetsController_instances = new WeakSet(), _AssetsController_selectedAccounts_get = function _AssetsController_selectedAccounts_get() {
|
|
621
589
|
return this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
|
|
622
|
-
},
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
return __classPrivateFieldGet(this, _AssetsController_snapDataSource, "f");
|
|
630
|
-
case 'RpcDataSource':
|
|
631
|
-
return __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f");
|
|
632
|
-
default:
|
|
633
|
-
return undefined;
|
|
634
|
-
}
|
|
590
|
+
}, _AssetsController_subscriptionBalanceDataSources_get = function _AssetsController_subscriptionBalanceDataSources_get() {
|
|
591
|
+
return [
|
|
592
|
+
__classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f"),
|
|
593
|
+
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
|
|
594
|
+
__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"),
|
|
595
|
+
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
|
|
596
|
+
];
|
|
635
597
|
}, _AssetsController_initializeState = function _AssetsController_initializeState() {
|
|
636
598
|
const { enabledNetworkMap } = this.messenger.call('NetworkEnablementController:getState');
|
|
637
599
|
__classPrivateFieldSet(this, _AssetsController_enabledChains, __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_extractEnabledChains).call(this, enabledNetworkMap), "f");
|
|
@@ -706,32 +668,6 @@ async function _AssetsController_executeMiddlewares(middlewares, request, initia
|
|
|
706
668
|
getAssetsState: () => this.state,
|
|
707
669
|
});
|
|
708
670
|
return result.response;
|
|
709
|
-
}, _AssetsController_assignChainsToDataSources = function _AssetsController_assignChainsToDataSources(requestedChains) {
|
|
710
|
-
const assignment = new Map();
|
|
711
|
-
const remainingChains = new Set(requestedChains);
|
|
712
|
-
for (const sourceId of __classPrivateFieldGet(this, _AssetsController_dataSources, "f").keys()) {
|
|
713
|
-
// Get available chains for this data source
|
|
714
|
-
const availableChains = __classPrivateFieldGet(this, _AssetsController_dataSources, "f").get(sourceId);
|
|
715
|
-
if (!availableChains || availableChains.size === 0) {
|
|
716
|
-
continue;
|
|
717
|
-
}
|
|
718
|
-
const chainsForThisSource = [];
|
|
719
|
-
for (const chainId of remainingChains) {
|
|
720
|
-
// Check if this chain is available on this source
|
|
721
|
-
if (availableChains.has(chainId)) {
|
|
722
|
-
chainsForThisSource.push(chainId);
|
|
723
|
-
remainingChains.delete(chainId);
|
|
724
|
-
}
|
|
725
|
-
}
|
|
726
|
-
if (chainsForThisSource.length > 0) {
|
|
727
|
-
assignment.set(sourceId, chainsForThisSource);
|
|
728
|
-
log('Assigned chains to data source', {
|
|
729
|
-
sourceId,
|
|
730
|
-
chains: chainsForThisSource,
|
|
731
|
-
});
|
|
732
|
-
}
|
|
733
|
-
}
|
|
734
|
-
return assignment;
|
|
735
671
|
}, _AssetsController_updateState =
|
|
736
672
|
// ============================================================================
|
|
737
673
|
// STATE MANAGEMENT
|
|
@@ -925,7 +861,7 @@ async function _AssetsController_updateState(response) {
|
|
|
925
861
|
selectedAccountCount: __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length,
|
|
926
862
|
enabledChainCount: __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size,
|
|
927
863
|
});
|
|
928
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m",
|
|
864
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
929
865
|
if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
|
|
930
866
|
this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
|
|
931
867
|
chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
|
|
@@ -946,77 +882,67 @@ async function _AssetsController_updateState(response) {
|
|
|
946
882
|
// Convert to array first to avoid modifying map during iteration
|
|
947
883
|
const subscriptionKeys = [...__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").keys()];
|
|
948
884
|
for (const subscriptionKey of subscriptionKeys) {
|
|
949
|
-
// Extract sourceId from subscription key (format: "ds:${sourceId}")
|
|
950
885
|
if (subscriptionKey.startsWith('ds:')) {
|
|
951
886
|
const sourceId = subscriptionKey.slice(3);
|
|
952
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "
|
|
887
|
+
const source = __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get).find((ds) => ds.getName() === sourceId);
|
|
888
|
+
if (source) {
|
|
889
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
|
|
890
|
+
}
|
|
953
891
|
}
|
|
954
892
|
}
|
|
955
893
|
__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").clear();
|
|
956
|
-
},
|
|
894
|
+
}, _AssetsController_subscribeAssets = function _AssetsController_subscribeAssets() {
|
|
957
895
|
if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length === 0) {
|
|
958
896
|
return;
|
|
959
897
|
}
|
|
960
898
|
// Subscribe to balance updates (batched by data source)
|
|
961
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalance).call(this)
|
|
899
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalance).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [
|
|
900
|
+
...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f"),
|
|
901
|
+
]);
|
|
962
902
|
// Subscribe to price updates for all assets held by selected accounts
|
|
963
903
|
this.subscribeAssetsPrice(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")]);
|
|
964
|
-
}, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance() {
|
|
965
|
-
|
|
966
|
-
const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), __classPrivateFieldGet(this, _AssetsController_enabledChains, "f"));
|
|
967
|
-
// Step 2: Split by data source active chains (ordered by priority)
|
|
968
|
-
// Get all chains that need to be subscribed
|
|
904
|
+
}, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance(accounts, chainIds) {
|
|
905
|
+
const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, accounts, new Set(chainIds));
|
|
969
906
|
const remainingChains = new Set(chainToAccounts.keys());
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
const assignedChains = chainAssignment.get(sourceId);
|
|
979
|
-
if (!assignedChains || assignedChains.length === 0) {
|
|
980
|
-
// Unsubscribe from data sources with no assigned chains
|
|
981
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, sourceId);
|
|
982
|
-
continue;
|
|
907
|
+
for (const source of __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get)) {
|
|
908
|
+
const availableChains = new Set(source.getActiveChainsSync());
|
|
909
|
+
const assignedChains = [];
|
|
910
|
+
for (const chainId of remainingChains) {
|
|
911
|
+
if (availableChains.has(chainId)) {
|
|
912
|
+
assignedChains.push(chainId);
|
|
913
|
+
remainingChains.delete(chainId);
|
|
914
|
+
}
|
|
983
915
|
}
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
if (accountsForSource.length === 0) {
|
|
916
|
+
if (assignedChains.length === 0) {
|
|
917
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
|
|
987
918
|
continue;
|
|
988
919
|
}
|
|
989
|
-
|
|
990
|
-
|
|
920
|
+
const seenIds = new Set();
|
|
921
|
+
const accountsForSource = assignedChains
|
|
922
|
+
.flatMap((chainId) => chainToAccounts.get(chainId) ?? [])
|
|
923
|
+
.filter((account) => !seenIds.has(account.id) && (seenIds.add(account.id), true));
|
|
924
|
+
if (accountsForSource.length > 0) {
|
|
925
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeDataSource).call(this, source, accountsForSource, assignedChains);
|
|
926
|
+
}
|
|
991
927
|
}
|
|
992
928
|
}, _AssetsController_buildChainToAccountsMap = function _AssetsController_buildChainToAccountsMap(accounts, chainsToSubscribe) {
|
|
993
929
|
const chainToAccounts = new Map();
|
|
994
930
|
for (const account of accounts) {
|
|
995
|
-
const
|
|
996
|
-
for (const chainId of accountChains) {
|
|
931
|
+
for (const chainId of __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getEnabledChainsForAccount).call(this, account)) {
|
|
997
932
|
if (!chainsToSubscribe.has(chainId)) {
|
|
998
933
|
continue;
|
|
999
934
|
}
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
}
|
|
1005
|
-
return chainToAccounts;
|
|
1006
|
-
}, _AssetsController_getAccountsForChains = function _AssetsController_getAccountsForChains(chains, chainToAccounts) {
|
|
1007
|
-
const accountIds = new Set();
|
|
1008
|
-
const accounts = [];
|
|
1009
|
-
for (const chainId of chains) {
|
|
1010
|
-
const chainAccounts = chainToAccounts.get(chainId) ?? [];
|
|
1011
|
-
for (const account of chainAccounts) {
|
|
1012
|
-
if (!accountIds.has(account.id)) {
|
|
1013
|
-
accountIds.add(account.id);
|
|
1014
|
-
accounts.push(account);
|
|
935
|
+
let list = chainToAccounts.get(chainId);
|
|
936
|
+
if (!list) {
|
|
937
|
+
list = [];
|
|
938
|
+
chainToAccounts.set(chainId, list);
|
|
1015
939
|
}
|
|
940
|
+
list.push(account);
|
|
1016
941
|
}
|
|
1017
942
|
}
|
|
1018
|
-
return
|
|
1019
|
-
},
|
|
943
|
+
return chainToAccounts;
|
|
944
|
+
}, _AssetsController_subscribeDataSource = function _AssetsController_subscribeDataSource(source, accounts, chains) {
|
|
945
|
+
const sourceId = source.getName();
|
|
1020
946
|
const subscriptionKey = `ds:${sourceId}`;
|
|
1021
947
|
const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
|
|
1022
948
|
const isUpdate = existingSubscription !== undefined;
|
|
@@ -1038,11 +964,7 @@ async function _AssetsController_updateState(response) {
|
|
|
1038
964
|
onAssetsUpdate: (response) => this.handleAssetsUpdate(response, sourceId),
|
|
1039
965
|
getAssetsState: () => this.state,
|
|
1040
966
|
};
|
|
1041
|
-
|
|
1042
|
-
if (!balanceDs) {
|
|
1043
|
-
return;
|
|
1044
|
-
}
|
|
1045
|
-
balanceDs.subscribe(subscribeReq).catch((error) => {
|
|
967
|
+
source.subscribe(subscribeReq).catch((error) => {
|
|
1046
968
|
console.error(`[AssetsController] Failed to subscribe to '${sourceId}':`, error);
|
|
1047
969
|
});
|
|
1048
970
|
// Track subscription
|
|
@@ -1056,14 +978,11 @@ async function _AssetsController_updateState(response) {
|
|
|
1056
978
|
},
|
|
1057
979
|
};
|
|
1058
980
|
__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").set(subscriptionKey, subscription);
|
|
1059
|
-
}, _AssetsController_unsubscribeDataSource = function _AssetsController_unsubscribeDataSource(
|
|
1060
|
-
const subscriptionKey = `ds:${
|
|
981
|
+
}, _AssetsController_unsubscribeDataSource = function _AssetsController_unsubscribeDataSource(source) {
|
|
982
|
+
const subscriptionKey = `ds:${source.getName()}`;
|
|
1061
983
|
const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
|
|
1062
984
|
if (existingSubscription) {
|
|
1063
|
-
|
|
1064
|
-
if (balanceDs) {
|
|
1065
|
-
balanceDs.unsubscribe(subscriptionKey).catch(() => undefined);
|
|
1066
|
-
}
|
|
985
|
+
source.unsubscribe(subscriptionKey).catch(() => undefined);
|
|
1067
986
|
existingSubscription.unsubscribe();
|
|
1068
987
|
}
|
|
1069
988
|
}, _AssetsController_buildDataRequest = function _AssetsController_buildDataRequest(accounts, chainIds, partial = {}) {
|
|
@@ -1111,7 +1030,7 @@ async function _AssetsController_handleAccountGroupChanged() {
|
|
|
1111
1030
|
accountIds: accounts.map((a) => a.id),
|
|
1112
1031
|
});
|
|
1113
1032
|
// Subscribe and fetch for the new account group
|
|
1114
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m",
|
|
1033
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
1115
1034
|
if (accounts.length > 0) {
|
|
1116
1035
|
await this.getAssets(accounts, {
|
|
1117
1036
|
chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
|
|
@@ -1145,7 +1064,7 @@ async function _AssetsController_handleAccountGroupChanged() {
|
|
|
1145
1064
|
// Users may want to see historical balances even if the network is currently disabled.
|
|
1146
1065
|
// The data will simply not be updated until the network is re-enabled.
|
|
1147
1066
|
// Refresh subscriptions for new chain set
|
|
1148
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m",
|
|
1067
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
1149
1068
|
// Do one-time fetch for newly enabled chains
|
|
1150
1069
|
if (addedChains.length > 0 && __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
|
|
1151
1070
|
await this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
|