@metamask-previews/assets-controller 0.2.0-preview-d01b2f93d → 1.0.0-preview-cbcea9611
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 +20 -1
- package/dist/AssetsController.cjs +96 -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 +96 -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_shouldHideNativeToken, _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
|
-
*
|
|
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.
|
|
257
|
+
*
|
|
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).
|
|
287
260
|
*
|
|
288
|
-
*
|
|
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
|
|
@@ -872,6 +808,10 @@ async function _AssetsController_updateState(response) {
|
|
|
872
808
|
continue;
|
|
873
809
|
}
|
|
874
810
|
const assetChainId = extractChainId(typedAssetId);
|
|
811
|
+
// Skip native tokens on Tempo networks
|
|
812
|
+
if (__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_shouldHideNativeToken).call(this, assetChainId, typedAssetId, metadata)) {
|
|
813
|
+
continue;
|
|
814
|
+
}
|
|
875
815
|
if (!chainIdSet.has(assetChainId)) {
|
|
876
816
|
continue;
|
|
877
817
|
}
|
|
@@ -905,6 +845,18 @@ async function _AssetsController_updateState(response) {
|
|
|
905
845
|
}
|
|
906
846
|
}
|
|
907
847
|
return result;
|
|
848
|
+
}, _AssetsController_shouldHideNativeToken = function _AssetsController_shouldHideNativeToken(chainId, assetId, metadata) {
|
|
849
|
+
const TEMPO_CHAIN_IDS = ['eip155:42431', 'eip155:4217']; // Tempo Testnet (42431) and Mainnet (4217)
|
|
850
|
+
// Check if it's a Tempo network
|
|
851
|
+
if (!TEMPO_CHAIN_IDS.includes(chainId)) {
|
|
852
|
+
return false;
|
|
853
|
+
}
|
|
854
|
+
// Check if it's a native token (either by metadata type or assetId format)
|
|
855
|
+
const isNative = metadata.type === 'native' || assetId.includes('/slip44:');
|
|
856
|
+
if (isNative) {
|
|
857
|
+
return true;
|
|
858
|
+
}
|
|
859
|
+
return false;
|
|
908
860
|
}, _AssetsController_tokenStandardToAssetType = function _AssetsController_tokenStandardToAssetType(tokenStandard) {
|
|
909
861
|
switch (tokenStandard) {
|
|
910
862
|
case 'native':
|
|
@@ -925,7 +877,7 @@ async function _AssetsController_updateState(response) {
|
|
|
925
877
|
selectedAccountCount: __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length,
|
|
926
878
|
enabledChainCount: __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size,
|
|
927
879
|
});
|
|
928
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m",
|
|
880
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
929
881
|
if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
|
|
930
882
|
this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
|
|
931
883
|
chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
|
|
@@ -946,77 +898,67 @@ async function _AssetsController_updateState(response) {
|
|
|
946
898
|
// Convert to array first to avoid modifying map during iteration
|
|
947
899
|
const subscriptionKeys = [...__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").keys()];
|
|
948
900
|
for (const subscriptionKey of subscriptionKeys) {
|
|
949
|
-
// Extract sourceId from subscription key (format: "ds:${sourceId}")
|
|
950
901
|
if (subscriptionKey.startsWith('ds:')) {
|
|
951
902
|
const sourceId = subscriptionKey.slice(3);
|
|
952
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "
|
|
903
|
+
const source = __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get).find((ds) => ds.getName() === sourceId);
|
|
904
|
+
if (source) {
|
|
905
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
|
|
906
|
+
}
|
|
953
907
|
}
|
|
954
908
|
}
|
|
955
909
|
__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").clear();
|
|
956
|
-
},
|
|
910
|
+
}, _AssetsController_subscribeAssets = function _AssetsController_subscribeAssets() {
|
|
957
911
|
if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length === 0) {
|
|
958
912
|
return;
|
|
959
913
|
}
|
|
960
914
|
// Subscribe to balance updates (batched by data source)
|
|
961
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalance).call(this)
|
|
915
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalance).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [
|
|
916
|
+
...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f"),
|
|
917
|
+
]);
|
|
962
918
|
// Subscribe to price updates for all assets held by selected accounts
|
|
963
919
|
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
|
|
920
|
+
}, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance(accounts, chainIds) {
|
|
921
|
+
const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, accounts, new Set(chainIds));
|
|
969
922
|
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;
|
|
923
|
+
for (const source of __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get)) {
|
|
924
|
+
const availableChains = new Set(source.getActiveChainsSync());
|
|
925
|
+
const assignedChains = [];
|
|
926
|
+
for (const chainId of remainingChains) {
|
|
927
|
+
if (availableChains.has(chainId)) {
|
|
928
|
+
assignedChains.push(chainId);
|
|
929
|
+
remainingChains.delete(chainId);
|
|
930
|
+
}
|
|
983
931
|
}
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
if (accountsForSource.length === 0) {
|
|
932
|
+
if (assignedChains.length === 0) {
|
|
933
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
|
|
987
934
|
continue;
|
|
988
935
|
}
|
|
989
|
-
|
|
990
|
-
|
|
936
|
+
const seenIds = new Set();
|
|
937
|
+
const accountsForSource = assignedChains
|
|
938
|
+
.flatMap((chainId) => chainToAccounts.get(chainId) ?? [])
|
|
939
|
+
.filter((account) => !seenIds.has(account.id) && (seenIds.add(account.id), true));
|
|
940
|
+
if (accountsForSource.length > 0) {
|
|
941
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeDataSource).call(this, source, accountsForSource, assignedChains);
|
|
942
|
+
}
|
|
991
943
|
}
|
|
992
944
|
}, _AssetsController_buildChainToAccountsMap = function _AssetsController_buildChainToAccountsMap(accounts, chainsToSubscribe) {
|
|
993
945
|
const chainToAccounts = new Map();
|
|
994
946
|
for (const account of accounts) {
|
|
995
|
-
const
|
|
996
|
-
for (const chainId of accountChains) {
|
|
947
|
+
for (const chainId of __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getEnabledChainsForAccount).call(this, account)) {
|
|
997
948
|
if (!chainsToSubscribe.has(chainId)) {
|
|
998
949
|
continue;
|
|
999
950
|
}
|
|
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);
|
|
951
|
+
let list = chainToAccounts.get(chainId);
|
|
952
|
+
if (!list) {
|
|
953
|
+
list = [];
|
|
954
|
+
chainToAccounts.set(chainId, list);
|
|
1015
955
|
}
|
|
956
|
+
list.push(account);
|
|
1016
957
|
}
|
|
1017
958
|
}
|
|
1018
|
-
return
|
|
1019
|
-
},
|
|
959
|
+
return chainToAccounts;
|
|
960
|
+
}, _AssetsController_subscribeDataSource = function _AssetsController_subscribeDataSource(source, accounts, chains) {
|
|
961
|
+
const sourceId = source.getName();
|
|
1020
962
|
const subscriptionKey = `ds:${sourceId}`;
|
|
1021
963
|
const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
|
|
1022
964
|
const isUpdate = existingSubscription !== undefined;
|
|
@@ -1038,11 +980,7 @@ async function _AssetsController_updateState(response) {
|
|
|
1038
980
|
onAssetsUpdate: (response) => this.handleAssetsUpdate(response, sourceId),
|
|
1039
981
|
getAssetsState: () => this.state,
|
|
1040
982
|
};
|
|
1041
|
-
|
|
1042
|
-
if (!balanceDs) {
|
|
1043
|
-
return;
|
|
1044
|
-
}
|
|
1045
|
-
balanceDs.subscribe(subscribeReq).catch((error) => {
|
|
983
|
+
source.subscribe(subscribeReq).catch((error) => {
|
|
1046
984
|
console.error(`[AssetsController] Failed to subscribe to '${sourceId}':`, error);
|
|
1047
985
|
});
|
|
1048
986
|
// Track subscription
|
|
@@ -1056,14 +994,11 @@ async function _AssetsController_updateState(response) {
|
|
|
1056
994
|
},
|
|
1057
995
|
};
|
|
1058
996
|
__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").set(subscriptionKey, subscription);
|
|
1059
|
-
}, _AssetsController_unsubscribeDataSource = function _AssetsController_unsubscribeDataSource(
|
|
1060
|
-
const subscriptionKey = `ds:${
|
|
997
|
+
}, _AssetsController_unsubscribeDataSource = function _AssetsController_unsubscribeDataSource(source) {
|
|
998
|
+
const subscriptionKey = `ds:${source.getName()}`;
|
|
1061
999
|
const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
|
|
1062
1000
|
if (existingSubscription) {
|
|
1063
|
-
|
|
1064
|
-
if (balanceDs) {
|
|
1065
|
-
balanceDs.unsubscribe(subscriptionKey).catch(() => undefined);
|
|
1066
|
-
}
|
|
1001
|
+
source.unsubscribe(subscriptionKey).catch(() => undefined);
|
|
1067
1002
|
existingSubscription.unsubscribe();
|
|
1068
1003
|
}
|
|
1069
1004
|
}, _AssetsController_buildDataRequest = function _AssetsController_buildDataRequest(accounts, chainIds, partial = {}) {
|
|
@@ -1111,7 +1046,7 @@ async function _AssetsController_handleAccountGroupChanged() {
|
|
|
1111
1046
|
accountIds: accounts.map((a) => a.id),
|
|
1112
1047
|
});
|
|
1113
1048
|
// Subscribe and fetch for the new account group
|
|
1114
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m",
|
|
1049
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
1115
1050
|
if (accounts.length > 0) {
|
|
1116
1051
|
await this.getAssets(accounts, {
|
|
1117
1052
|
chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
|
|
@@ -1145,7 +1080,7 @@ async function _AssetsController_handleAccountGroupChanged() {
|
|
|
1145
1080
|
// Users may want to see historical balances even if the network is currently disabled.
|
|
1146
1081
|
// The data will simply not be updated until the network is re-enabled.
|
|
1147
1082
|
// Refresh subscriptions for new chain set
|
|
1148
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m",
|
|
1083
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
1149
1084
|
// Do one-time fetch for newly enabled chains
|
|
1150
1085
|
if (addedChains.length > 0 && __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
|
|
1151
1086
|
await this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
|