@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
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- Hide native tokens on Tempo networks (testnet and mainnet) in `getAssets` method ([#7882](https://github.com/MetaMask/core/pull/7882))
|
|
13
|
+
- Bump `@metamask/keyring-api` from `^21.0.0` to `^21.5.0` ([#7857](https://github.com/MetaMask/core/pull/7857))
|
|
14
|
+
- Bump `@metamask/keyring-internal-api` from `^9.0.0` to `^10.0.0` ([#7857](https://github.com/MetaMask/core/pull/7857))
|
|
15
|
+
- Bump `@metamask/keyring-snap-client` from `^8.0.0` to `^8.2.0` ([#7857](https://github.com/MetaMask/core/pull/7857))
|
|
16
|
+
|
|
17
|
+
## [1.0.0]
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- Add balance selectors `getAggregatedBalanceForAccount`, `getGroupIdForAccount`, and `getInternalAccountsForGroup` with types `AggregatedBalanceEntry`, `AggregatedBalanceForAccount`, `EnabledNetworkMap`, and `AccountsById` for aggregated portfolio balance (optionally by account group), fiat total, and portfolio-weighted 1d price change ([#7864](https://github.com/MetaMask/core/pull/7864))
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
- **BREAKING:** Require `previousChains` in `handleActiveChainsUpdate(dataSourceId, activeChains, previousChains)` and in the `onActiveChainsUpdated` callback used by data sources; the third parameter is no longer optional. Callers and data sources must pass the previous chain list for correct added/removed chain diff computation ([#7867](https://github.com/MetaMask/core/pull/7867))
|
|
26
|
+
- Bump `@metamask/account-tree-controller` from `^4.0.0` to `^4.1.0` ([#7869](https://github.com/MetaMask/core/pull/7869))
|
|
27
|
+
|
|
10
28
|
### Removed
|
|
11
29
|
|
|
12
30
|
- **BREAKING:** Remove `initDataSources` and related exports (`InitDataSourcesOptions`, `DataSources`, `DataSourceActions`, `DataSourceEvents`, `DataSourceAllowedActions`, `DataSourceAllowedEvents`, `RootMessenger`). Initialize assets by creating `AssetsController` with `queryApiClient`; the controller instantiates all data sources internally ([#7859](https://github.com/MetaMask/core/pull/7859))
|
|
@@ -48,6 +66,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
48
66
|
- Refactor `RpcDataSource` to delegate polling to `BalanceFetcher` and `TokenDetector` services ([#7709](https://github.com/MetaMask/core/pull/7709))
|
|
49
67
|
- Refactor `BalanceFetcher` and `TokenDetector` to extend `StaticIntervalPollingControllerOnly` for independent polling management ([#7709](https://github.com/MetaMask/core/pull/7709))
|
|
50
68
|
|
|
51
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@0.
|
|
69
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@1.0.0...HEAD
|
|
70
|
+
[1.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@0.2.0...@metamask/assets-controller@1.0.0
|
|
52
71
|
[0.2.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@0.1.0...@metamask/assets-controller@0.2.0
|
|
53
72
|
[0.1.0]: https://github.com/MetaMask/core/releases/tag/@metamask/assets-controller@0.1.0
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
|
+
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");
|
|
5
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
|
+
};
|
|
2
7
|
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
8
|
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
9
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
10
|
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");
|
|
6
11
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
12
|
};
|
|
8
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
-
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");
|
|
11
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
-
};
|
|
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_defaultUpdateInterval, _AssetsController_controllerMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_selectedAccounts_get,
|
|
16
|
+
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;
|
|
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");
|
|
@@ -207,12 +207,6 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
207
207
|
_AssetsController_activeSubscriptions.set(this, new Map());
|
|
208
208
|
/** Currently enabled chains from NetworkEnablementController */
|
|
209
209
|
_AssetsController_enabledChains.set(this, new Set());
|
|
210
|
-
/**
|
|
211
|
-
* Registered data sources with their available chains.
|
|
212
|
-
* Updated continuously and independently from subscription flows.
|
|
213
|
-
* Key: sourceId, Value: Set of currently available chainIds
|
|
214
|
-
*/
|
|
215
|
-
_AssetsController_dataSources.set(this, new Map());
|
|
216
210
|
_AssetsController_backendWebsocketDataSource.set(this, void 0);
|
|
217
211
|
_AssetsController_accountsApiDataSource.set(this, void 0);
|
|
218
212
|
_AssetsController_snapDataSource.set(this, void 0);
|
|
@@ -223,24 +217,23 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
223
217
|
__classPrivateFieldSet(this, _AssetsController_isEnabled, isEnabled(), "f");
|
|
224
218
|
__classPrivateFieldSet(this, _AssetsController_defaultUpdateInterval, defaultUpdateInterval, "f");
|
|
225
219
|
const rpcConfig = rpcDataSourceConfig ?? {};
|
|
220
|
+
const onActiveChainsUpdated = (dataSourceName, chains, previousChains) => this.handleActiveChainsUpdate(dataSourceName, chains, previousChains);
|
|
226
221
|
__classPrivateFieldSet(this, _AssetsController_backendWebsocketDataSource, new BackendWebsocketDataSource_1.BackendWebsocketDataSource({
|
|
227
222
|
messenger: this.messenger,
|
|
228
223
|
queryApiClient,
|
|
229
|
-
onActiveChainsUpdated
|
|
224
|
+
onActiveChainsUpdated,
|
|
230
225
|
}), "f");
|
|
231
226
|
__classPrivateFieldSet(this, _AssetsController_accountsApiDataSource, new AccountsApiDataSource_1.AccountsApiDataSource({
|
|
232
227
|
queryApiClient,
|
|
233
|
-
onActiveChainsUpdated
|
|
234
|
-
this.handleActiveChainsUpdate('AccountsApiDataSource', chains);
|
|
235
|
-
},
|
|
228
|
+
onActiveChainsUpdated,
|
|
236
229
|
}), "f");
|
|
237
230
|
__classPrivateFieldSet(this, _AssetsController_snapDataSource, new SnapDataSource_1.SnapDataSource({
|
|
238
231
|
messenger: this.messenger,
|
|
239
|
-
onActiveChainsUpdated
|
|
232
|
+
onActiveChainsUpdated,
|
|
240
233
|
}), "f");
|
|
241
234
|
__classPrivateFieldSet(this, _AssetsController_rpcDataSource, new RpcDataSource_1.RpcDataSource({
|
|
242
235
|
messenger: this.messenger,
|
|
243
|
-
onActiveChainsUpdated
|
|
236
|
+
onActiveChainsUpdated,
|
|
244
237
|
...rpcConfig,
|
|
245
238
|
}), "f");
|
|
246
239
|
__classPrivateFieldSet(this, _AssetsController_tokenDataSource, new TokenDataSource_1.TokenDataSource({
|
|
@@ -250,10 +243,6 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
250
243
|
queryApiClient,
|
|
251
244
|
}), "f");
|
|
252
245
|
__classPrivateFieldSet(this, _AssetsController_detectionMiddleware, new DetectionMiddleware_1.DetectionMiddleware(), "f");
|
|
253
|
-
__classPrivateFieldGet(this, _AssetsController_dataSources, "f").set('BackendWebsocketDataSource', new Set());
|
|
254
|
-
__classPrivateFieldGet(this, _AssetsController_dataSources, "f").set('AccountsApiDataSource', new Set());
|
|
255
|
-
__classPrivateFieldGet(this, _AssetsController_dataSources, "f").set('SnapDataSource', new Set());
|
|
256
|
-
__classPrivateFieldGet(this, _AssetsController_dataSources, "f").set('RpcDataSource', new Set());
|
|
257
246
|
if (!__classPrivateFieldGet(this, _AssetsController_isEnabled, "f")) {
|
|
258
247
|
log('AssetsController is disabled, skipping initialization');
|
|
259
248
|
return;
|
|
@@ -266,56 +255,34 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
266
255
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_registerActionHandlers).call(this);
|
|
267
256
|
}
|
|
268
257
|
// ============================================================================
|
|
269
|
-
// DATA SOURCE MANAGEMENT
|
|
270
|
-
// ============================================================================
|
|
271
|
-
/**
|
|
272
|
-
* Register data sources with the controller.
|
|
273
|
-
* Order of the array determines subscription order.
|
|
274
|
-
*
|
|
275
|
-
* Data sources report chain changes via the onActiveChainsUpdated callback passed at construction.
|
|
276
|
-
*
|
|
277
|
-
* @param dataSourceIds - Array of data source identifiers to register.
|
|
278
|
-
*/
|
|
279
|
-
registerDataSources(dataSourceIds) {
|
|
280
|
-
for (const id of dataSourceIds) {
|
|
281
|
-
log('Registering data source', { id });
|
|
282
|
-
// Initialize available chains tracking for this source
|
|
283
|
-
__classPrivateFieldGet(this, _AssetsController_dataSources, "f").set(id, new Set());
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
// ============================================================================
|
|
287
258
|
// DATA SOURCE CHAIN MANAGEMENT
|
|
288
259
|
// ============================================================================
|
|
289
260
|
/**
|
|
290
|
-
* Handle when a data source's
|
|
291
|
-
*
|
|
292
|
-
*
|
|
261
|
+
* Handle when a data source's supported chains change.
|
|
262
|
+
* Used to refresh balance subscriptions and run a one-time fetch when a new chain is supported.
|
|
263
|
+
*
|
|
264
|
+
* - On any add/remove: re-subscribes to data sources so chain assignment stays correct.
|
|
265
|
+
* - When chains are added: fetches balances for the new chains (for selected accounts on enabled networks).
|
|
293
266
|
*
|
|
294
|
-
*
|
|
267
|
+
* Controller does not store chains; sources report via this callback. previousChains is required for diff.
|
|
295
268
|
*
|
|
296
269
|
* @param dataSourceId - The identifier of the data source reporting the change.
|
|
297
|
-
* @param activeChains -
|
|
270
|
+
* @param activeChains - Currently active (supported and available) chain IDs for this source.
|
|
271
|
+
* @param previousChains - Previous chains; used to compute added/removed.
|
|
298
272
|
*/
|
|
299
|
-
handleActiveChainsUpdate(dataSourceId, activeChains) {
|
|
273
|
+
handleActiveChainsUpdate(dataSourceId, activeChains, previousChains) {
|
|
300
274
|
log('Data source active chains changed', {
|
|
301
275
|
dataSourceId,
|
|
302
276
|
chainCount: activeChains.length,
|
|
303
277
|
chains: activeChains,
|
|
304
278
|
});
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
const previousChains = __classPrivateFieldGet(this, _AssetsController_dataSources, "f").get(dataSourceId) ?? new Set();
|
|
310
|
-
const newChains = new Set(activeChains);
|
|
311
|
-
// Update centralized available chains tracking
|
|
312
|
-
__classPrivateFieldGet(this, _AssetsController_dataSources, "f").set(dataSourceId, newChains);
|
|
313
|
-
// Check for changes
|
|
314
|
-
const addedChains = activeChains.filter((chain) => !previousChains.has(chain));
|
|
315
|
-
const removedChains = Array.from(previousChains).filter((chain) => !newChains.has(chain));
|
|
279
|
+
const previous = previousChains;
|
|
280
|
+
const previousSet = new Set(previous);
|
|
281
|
+
const addedChains = activeChains.filter((ch) => !previousSet.has(ch));
|
|
282
|
+
const removedChains = previous.filter((ch) => !activeChains.includes(ch));
|
|
316
283
|
if (addedChains.length > 0 || removedChains.length > 0) {
|
|
317
284
|
// Refresh subscriptions to use updated data source availability
|
|
318
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m",
|
|
285
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
319
286
|
}
|
|
320
287
|
// If chains were added and we have selected accounts, do one-time fetch
|
|
321
288
|
if (addedChains.length > 0 && __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
|
|
@@ -512,6 +479,9 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
512
479
|
}
|
|
513
480
|
});
|
|
514
481
|
}
|
|
482
|
+
// ============================================================================
|
|
483
|
+
// SUBSCRIPTIONS
|
|
484
|
+
// ============================================================================
|
|
515
485
|
/**
|
|
516
486
|
* Subscribe to price updates for all assets held by the given accounts.
|
|
517
487
|
* Polls PriceDataSource which fetches prices from balance state.
|
|
@@ -594,7 +564,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
594
564
|
// ============================================================================
|
|
595
565
|
destroy() {
|
|
596
566
|
log('Destroying AssetsController', {
|
|
597
|
-
dataSourceCount: __classPrivateFieldGet(this,
|
|
567
|
+
dataSourceCount: __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get).length,
|
|
598
568
|
subscriptionCount: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").size,
|
|
599
569
|
});
|
|
600
570
|
// Destroy instantiated data sources
|
|
@@ -607,8 +577,6 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
607
577
|
'function') {
|
|
608
578
|
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f").destroy();
|
|
609
579
|
}
|
|
610
|
-
// Clear data sources
|
|
611
|
-
__classPrivateFieldGet(this, _AssetsController_dataSources, "f").clear();
|
|
612
580
|
// Stop all active subscriptions
|
|
613
581
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
|
|
614
582
|
// Unregister action handlers
|
|
@@ -624,21 +592,15 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
624
592
|
}
|
|
625
593
|
}
|
|
626
594
|
exports.AssetsController = AssetsController;
|
|
627
|
-
_AssetsController_isEnabled = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_controllerMutex = new WeakMap(), _AssetsController_activeSubscriptions = new WeakMap(), _AssetsController_enabledChains = new WeakMap(),
|
|
595
|
+
_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() {
|
|
628
596
|
return this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
|
|
629
|
-
},
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
return __classPrivateFieldGet(this, _AssetsController_snapDataSource, "f");
|
|
637
|
-
case 'RpcDataSource':
|
|
638
|
-
return __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f");
|
|
639
|
-
default:
|
|
640
|
-
return undefined;
|
|
641
|
-
}
|
|
597
|
+
}, _AssetsController_subscriptionBalanceDataSources_get = function _AssetsController_subscriptionBalanceDataSources_get() {
|
|
598
|
+
return [
|
|
599
|
+
__classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f"),
|
|
600
|
+
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
|
|
601
|
+
__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"),
|
|
602
|
+
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
|
|
603
|
+
];
|
|
642
604
|
}, _AssetsController_initializeState = function _AssetsController_initializeState() {
|
|
643
605
|
const { enabledNetworkMap } = this.messenger.call('NetworkEnablementController:getState');
|
|
644
606
|
__classPrivateFieldSet(this, _AssetsController_enabledChains, __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_extractEnabledChains).call(this, enabledNetworkMap), "f");
|
|
@@ -713,32 +675,6 @@ async function _AssetsController_executeMiddlewares(middlewares, request, initia
|
|
|
713
675
|
getAssetsState: () => this.state,
|
|
714
676
|
});
|
|
715
677
|
return result.response;
|
|
716
|
-
}, _AssetsController_assignChainsToDataSources = function _AssetsController_assignChainsToDataSources(requestedChains) {
|
|
717
|
-
const assignment = new Map();
|
|
718
|
-
const remainingChains = new Set(requestedChains);
|
|
719
|
-
for (const sourceId of __classPrivateFieldGet(this, _AssetsController_dataSources, "f").keys()) {
|
|
720
|
-
// Get available chains for this data source
|
|
721
|
-
const availableChains = __classPrivateFieldGet(this, _AssetsController_dataSources, "f").get(sourceId);
|
|
722
|
-
if (!availableChains || availableChains.size === 0) {
|
|
723
|
-
continue;
|
|
724
|
-
}
|
|
725
|
-
const chainsForThisSource = [];
|
|
726
|
-
for (const chainId of remainingChains) {
|
|
727
|
-
// Check if this chain is available on this source
|
|
728
|
-
if (availableChains.has(chainId)) {
|
|
729
|
-
chainsForThisSource.push(chainId);
|
|
730
|
-
remainingChains.delete(chainId);
|
|
731
|
-
}
|
|
732
|
-
}
|
|
733
|
-
if (chainsForThisSource.length > 0) {
|
|
734
|
-
assignment.set(sourceId, chainsForThisSource);
|
|
735
|
-
log('Assigned chains to data source', {
|
|
736
|
-
sourceId,
|
|
737
|
-
chains: chainsForThisSource,
|
|
738
|
-
});
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
return assignment;
|
|
742
678
|
}, _AssetsController_updateState =
|
|
743
679
|
// ============================================================================
|
|
744
680
|
// STATE MANAGEMENT
|
|
@@ -879,6 +815,10 @@ async function _AssetsController_updateState(response) {
|
|
|
879
815
|
continue;
|
|
880
816
|
}
|
|
881
817
|
const assetChainId = extractChainId(typedAssetId);
|
|
818
|
+
// Skip native tokens on Tempo networks
|
|
819
|
+
if (__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_shouldHideNativeToken).call(this, assetChainId, typedAssetId, metadata)) {
|
|
820
|
+
continue;
|
|
821
|
+
}
|
|
882
822
|
if (!chainIdSet.has(assetChainId)) {
|
|
883
823
|
continue;
|
|
884
824
|
}
|
|
@@ -912,6 +852,18 @@ async function _AssetsController_updateState(response) {
|
|
|
912
852
|
}
|
|
913
853
|
}
|
|
914
854
|
return result;
|
|
855
|
+
}, _AssetsController_shouldHideNativeToken = function _AssetsController_shouldHideNativeToken(chainId, assetId, metadata) {
|
|
856
|
+
const TEMPO_CHAIN_IDS = ['eip155:42431', 'eip155:4217']; // Tempo Testnet (42431) and Mainnet (4217)
|
|
857
|
+
// Check if it's a Tempo network
|
|
858
|
+
if (!TEMPO_CHAIN_IDS.includes(chainId)) {
|
|
859
|
+
return false;
|
|
860
|
+
}
|
|
861
|
+
// Check if it's a native token (either by metadata type or assetId format)
|
|
862
|
+
const isNative = metadata.type === 'native' || assetId.includes('/slip44:');
|
|
863
|
+
if (isNative) {
|
|
864
|
+
return true;
|
|
865
|
+
}
|
|
866
|
+
return false;
|
|
915
867
|
}, _AssetsController_tokenStandardToAssetType = function _AssetsController_tokenStandardToAssetType(tokenStandard) {
|
|
916
868
|
switch (tokenStandard) {
|
|
917
869
|
case 'native':
|
|
@@ -932,7 +884,7 @@ async function _AssetsController_updateState(response) {
|
|
|
932
884
|
selectedAccountCount: __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length,
|
|
933
885
|
enabledChainCount: __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size,
|
|
934
886
|
});
|
|
935
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m",
|
|
887
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
936
888
|
if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
|
|
937
889
|
this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
|
|
938
890
|
chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
|
|
@@ -953,77 +905,67 @@ async function _AssetsController_updateState(response) {
|
|
|
953
905
|
// Convert to array first to avoid modifying map during iteration
|
|
954
906
|
const subscriptionKeys = [...__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").keys()];
|
|
955
907
|
for (const subscriptionKey of subscriptionKeys) {
|
|
956
|
-
// Extract sourceId from subscription key (format: "ds:${sourceId}")
|
|
957
908
|
if (subscriptionKey.startsWith('ds:')) {
|
|
958
909
|
const sourceId = subscriptionKey.slice(3);
|
|
959
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "
|
|
910
|
+
const source = __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get).find((ds) => ds.getName() === sourceId);
|
|
911
|
+
if (source) {
|
|
912
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
|
|
913
|
+
}
|
|
960
914
|
}
|
|
961
915
|
}
|
|
962
916
|
__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").clear();
|
|
963
|
-
},
|
|
917
|
+
}, _AssetsController_subscribeAssets = function _AssetsController_subscribeAssets() {
|
|
964
918
|
if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length === 0) {
|
|
965
919
|
return;
|
|
966
920
|
}
|
|
967
921
|
// Subscribe to balance updates (batched by data source)
|
|
968
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalance).call(this)
|
|
922
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalance).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [
|
|
923
|
+
...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f"),
|
|
924
|
+
]);
|
|
969
925
|
// Subscribe to price updates for all assets held by selected accounts
|
|
970
926
|
this.subscribeAssetsPrice(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")]);
|
|
971
|
-
}, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance() {
|
|
972
|
-
|
|
973
|
-
const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), __classPrivateFieldGet(this, _AssetsController_enabledChains, "f"));
|
|
974
|
-
// Step 2: Split by data source active chains (ordered by priority)
|
|
975
|
-
// Get all chains that need to be subscribed
|
|
927
|
+
}, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance(accounts, chainIds) {
|
|
928
|
+
const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, accounts, new Set(chainIds));
|
|
976
929
|
const remainingChains = new Set(chainToAccounts.keys());
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
const assignedChains = chainAssignment.get(sourceId);
|
|
986
|
-
if (!assignedChains || assignedChains.length === 0) {
|
|
987
|
-
// Unsubscribe from data sources with no assigned chains
|
|
988
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, sourceId);
|
|
989
|
-
continue;
|
|
930
|
+
for (const source of __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_subscriptionBalanceDataSources_get)) {
|
|
931
|
+
const availableChains = new Set(source.getActiveChainsSync());
|
|
932
|
+
const assignedChains = [];
|
|
933
|
+
for (const chainId of remainingChains) {
|
|
934
|
+
if (availableChains.has(chainId)) {
|
|
935
|
+
assignedChains.push(chainId);
|
|
936
|
+
remainingChains.delete(chainId);
|
|
937
|
+
}
|
|
990
938
|
}
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
if (accountsForSource.length === 0) {
|
|
939
|
+
if (assignedChains.length === 0) {
|
|
940
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
|
|
994
941
|
continue;
|
|
995
942
|
}
|
|
996
|
-
|
|
997
|
-
|
|
943
|
+
const seenIds = new Set();
|
|
944
|
+
const accountsForSource = assignedChains
|
|
945
|
+
.flatMap((chainId) => chainToAccounts.get(chainId) ?? [])
|
|
946
|
+
.filter((account) => !seenIds.has(account.id) && (seenIds.add(account.id), true));
|
|
947
|
+
if (accountsForSource.length > 0) {
|
|
948
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeDataSource).call(this, source, accountsForSource, assignedChains);
|
|
949
|
+
}
|
|
998
950
|
}
|
|
999
951
|
}, _AssetsController_buildChainToAccountsMap = function _AssetsController_buildChainToAccountsMap(accounts, chainsToSubscribe) {
|
|
1000
952
|
const chainToAccounts = new Map();
|
|
1001
953
|
for (const account of accounts) {
|
|
1002
|
-
const
|
|
1003
|
-
for (const chainId of accountChains) {
|
|
954
|
+
for (const chainId of __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getEnabledChainsForAccount).call(this, account)) {
|
|
1004
955
|
if (!chainsToSubscribe.has(chainId)) {
|
|
1005
956
|
continue;
|
|
1006
957
|
}
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
}
|
|
1012
|
-
return chainToAccounts;
|
|
1013
|
-
}, _AssetsController_getAccountsForChains = function _AssetsController_getAccountsForChains(chains, chainToAccounts) {
|
|
1014
|
-
const accountIds = new Set();
|
|
1015
|
-
const accounts = [];
|
|
1016
|
-
for (const chainId of chains) {
|
|
1017
|
-
const chainAccounts = chainToAccounts.get(chainId) ?? [];
|
|
1018
|
-
for (const account of chainAccounts) {
|
|
1019
|
-
if (!accountIds.has(account.id)) {
|
|
1020
|
-
accountIds.add(account.id);
|
|
1021
|
-
accounts.push(account);
|
|
958
|
+
let list = chainToAccounts.get(chainId);
|
|
959
|
+
if (!list) {
|
|
960
|
+
list = [];
|
|
961
|
+
chainToAccounts.set(chainId, list);
|
|
1022
962
|
}
|
|
963
|
+
list.push(account);
|
|
1023
964
|
}
|
|
1024
965
|
}
|
|
1025
|
-
return
|
|
1026
|
-
},
|
|
966
|
+
return chainToAccounts;
|
|
967
|
+
}, _AssetsController_subscribeDataSource = function _AssetsController_subscribeDataSource(source, accounts, chains) {
|
|
968
|
+
const sourceId = source.getName();
|
|
1027
969
|
const subscriptionKey = `ds:${sourceId}`;
|
|
1028
970
|
const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
|
|
1029
971
|
const isUpdate = existingSubscription !== undefined;
|
|
@@ -1045,11 +987,7 @@ async function _AssetsController_updateState(response) {
|
|
|
1045
987
|
onAssetsUpdate: (response) => this.handleAssetsUpdate(response, sourceId),
|
|
1046
988
|
getAssetsState: () => this.state,
|
|
1047
989
|
};
|
|
1048
|
-
|
|
1049
|
-
if (!balanceDs) {
|
|
1050
|
-
return;
|
|
1051
|
-
}
|
|
1052
|
-
balanceDs.subscribe(subscribeReq).catch((error) => {
|
|
990
|
+
source.subscribe(subscribeReq).catch((error) => {
|
|
1053
991
|
console.error(`[AssetsController] Failed to subscribe to '${sourceId}':`, error);
|
|
1054
992
|
});
|
|
1055
993
|
// Track subscription
|
|
@@ -1063,14 +1001,11 @@ async function _AssetsController_updateState(response) {
|
|
|
1063
1001
|
},
|
|
1064
1002
|
};
|
|
1065
1003
|
__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").set(subscriptionKey, subscription);
|
|
1066
|
-
}, _AssetsController_unsubscribeDataSource = function _AssetsController_unsubscribeDataSource(
|
|
1067
|
-
const subscriptionKey = `ds:${
|
|
1004
|
+
}, _AssetsController_unsubscribeDataSource = function _AssetsController_unsubscribeDataSource(source) {
|
|
1005
|
+
const subscriptionKey = `ds:${source.getName()}`;
|
|
1068
1006
|
const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
|
|
1069
1007
|
if (existingSubscription) {
|
|
1070
|
-
|
|
1071
|
-
if (balanceDs) {
|
|
1072
|
-
balanceDs.unsubscribe(subscriptionKey).catch(() => undefined);
|
|
1073
|
-
}
|
|
1008
|
+
source.unsubscribe(subscriptionKey).catch(() => undefined);
|
|
1074
1009
|
existingSubscription.unsubscribe();
|
|
1075
1010
|
}
|
|
1076
1011
|
}, _AssetsController_buildDataRequest = function _AssetsController_buildDataRequest(accounts, chainIds, partial = {}) {
|
|
@@ -1118,7 +1053,7 @@ async function _AssetsController_handleAccountGroupChanged() {
|
|
|
1118
1053
|
accountIds: accounts.map((a) => a.id),
|
|
1119
1054
|
});
|
|
1120
1055
|
// Subscribe and fetch for the new account group
|
|
1121
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m",
|
|
1056
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
1122
1057
|
if (accounts.length > 0) {
|
|
1123
1058
|
await this.getAssets(accounts, {
|
|
1124
1059
|
chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
|
|
@@ -1152,7 +1087,7 @@ async function _AssetsController_handleAccountGroupChanged() {
|
|
|
1152
1087
|
// Users may want to see historical balances even if the network is currently disabled.
|
|
1153
1088
|
// The data will simply not be updated until the network is re-enabled.
|
|
1154
1089
|
// Refresh subscriptions for new chain set
|
|
1155
|
-
__classPrivateFieldGet(this, _AssetsController_instances, "m",
|
|
1090
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
1156
1091
|
// Do one-time fetch for newly enabled chains
|
|
1157
1092
|
if (addedChains.length > 0 && __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length > 0) {
|
|
1158
1093
|
await this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
|