@metamask/assets-controller 1.0.0 → 2.0.1
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 +36 -1
- package/dist/AssetsController.cjs +175 -64
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +68 -9
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +68 -9
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +176 -65
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.cjs +70 -15
- package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.cts +22 -3
- package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.mts +22 -3
- package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.mjs +66 -12
- package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.cjs +7 -5
- package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.d.cts.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.d.mts.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.mjs +7 -5
- package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -1
- package/dist/data-sources/PriceDataSource.cjs +17 -4
- package/dist/data-sources/PriceDataSource.cjs.map +1 -1
- package/dist/data-sources/PriceDataSource.d.cts +8 -4
- package/dist/data-sources/PriceDataSource.d.cts.map +1 -1
- package/dist/data-sources/PriceDataSource.d.mts +8 -4
- package/dist/data-sources/PriceDataSource.d.mts.map +1 -1
- package/dist/data-sources/PriceDataSource.mjs +17 -4
- package/dist/data-sources/PriceDataSource.mjs.map +1 -1
- package/dist/data-sources/RpcDataSource.cjs +123 -44
- package/dist/data-sources/RpcDataSource.cjs.map +1 -1
- package/dist/data-sources/RpcDataSource.d.cts +16 -62
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
- package/dist/data-sources/RpcDataSource.d.mts +16 -62
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
- package/dist/data-sources/RpcDataSource.mjs +124 -45
- package/dist/data-sources/RpcDataSource.mjs.map +1 -1
- package/dist/data-sources/SnapDataSource.cjs +22 -10
- package/dist/data-sources/SnapDataSource.cjs.map +1 -1
- package/dist/data-sources/SnapDataSource.d.cts +2 -1
- package/dist/data-sources/SnapDataSource.d.cts.map +1 -1
- package/dist/data-sources/SnapDataSource.d.mts +2 -1
- package/dist/data-sources/SnapDataSource.d.mts.map +1 -1
- package/dist/data-sources/SnapDataSource.mjs +22 -10
- package/dist/data-sources/SnapDataSource.mjs.map +1 -1
- package/dist/data-sources/StakedBalanceDataSource.cjs +597 -0
- package/dist/data-sources/StakedBalanceDataSource.cjs.map +1 -0
- package/dist/data-sources/StakedBalanceDataSource.d.cts +72 -0
- package/dist/data-sources/StakedBalanceDataSource.d.cts.map +1 -0
- package/dist/data-sources/StakedBalanceDataSource.d.mts +72 -0
- package/dist/data-sources/StakedBalanceDataSource.d.mts.map +1 -0
- package/dist/data-sources/StakedBalanceDataSource.mjs +593 -0
- package/dist/data-sources/StakedBalanceDataSource.mjs.map +1 -0
- package/dist/data-sources/TokenDataSource.cjs +12 -5
- package/dist/data-sources/TokenDataSource.cjs.map +1 -1
- package/dist/data-sources/TokenDataSource.d.cts +1 -0
- package/dist/data-sources/TokenDataSource.d.cts.map +1 -1
- package/dist/data-sources/TokenDataSource.d.mts +1 -0
- package/dist/data-sources/TokenDataSource.d.mts.map +1 -1
- package/dist/data-sources/TokenDataSource.mjs +12 -5
- package/dist/data-sources/TokenDataSource.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/index.cjs +5 -1
- package/dist/data-sources/evm-rpc-services/index.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/index.d.cts +1 -1
- package/dist/data-sources/evm-rpc-services/index.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/index.d.mts +1 -1
- package/dist/data-sources/evm-rpc-services/index.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/index.mjs +1 -1
- package/dist/data-sources/evm-rpc-services/index.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs +132 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts +80 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts +80 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.mjs +126 -0
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs +16 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts +5 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts +5 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs +16 -0
- package/dist/data-sources/evm-rpc-services/services/TokenDetector.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/index.cjs +6 -1
- package/dist/data-sources/evm-rpc-services/services/index.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/index.d.cts +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/index.d.mts +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/index.mjs +1 -0
- package/dist/data-sources/evm-rpc-services/services/index.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/services.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/services.d.cts +4 -0
- package/dist/data-sources/evm-rpc-services/types/services.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/services.d.mts +4 -0
- package/dist/data-sources/evm-rpc-services/types/services.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/services.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/state.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/state.d.cts +3 -3
- package/dist/data-sources/evm-rpc-services/types/state.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/state.d.mts +3 -3
- package/dist/data-sources/evm-rpc-services/types/state.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/types/state.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/utils/index.cjs +9 -1
- package/dist/data-sources/evm-rpc-services/utils/index.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/utils/index.d.cts +2 -0
- package/dist/data-sources/evm-rpc-services/utils/index.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/utils/index.d.mts +2 -0
- package/dist/data-sources/evm-rpc-services/utils/index.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/utils/index.mjs +2 -0
- package/dist/data-sources/evm-rpc-services/utils/index.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/utils/parsing.cjs +47 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.cts +25 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts +25 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.mjs +39 -0
- package/dist/data-sources/evm-rpc-services/utils/parsing.mjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs +68 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.cts +25 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.cts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts +25 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts.map +1 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.mjs +62 -0
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.mjs.map +1 -0
- package/dist/data-sources/index.cjs +3 -1
- package/dist/data-sources/index.cjs.map +1 -1
- package/dist/data-sources/index.d.cts +3 -2
- package/dist/data-sources/index.d.cts.map +1 -1
- package/dist/data-sources/index.d.mts +3 -2
- package/dist/data-sources/index.d.mts.map +1 -1
- package/dist/data-sources/index.mjs +1 -0
- package/dist/data-sources/index.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/middlewares/DetectionMiddleware.cjs +4 -1
- package/dist/middlewares/DetectionMiddleware.cjs.map +1 -1
- package/dist/middlewares/DetectionMiddleware.d.cts +1 -0
- package/dist/middlewares/DetectionMiddleware.d.cts.map +1 -1
- package/dist/middlewares/DetectionMiddleware.d.mts +1 -0
- package/dist/middlewares/DetectionMiddleware.d.mts.map +1 -1
- package/dist/middlewares/DetectionMiddleware.mjs +4 -1
- package/dist/middlewares/DetectionMiddleware.mjs.map +1 -1
- package/dist/selectors/balance.cjs +2 -2
- package/dist/selectors/balance.cjs.map +1 -1
- package/dist/selectors/balance.d.cts.map +1 -1
- package/dist/selectors/balance.d.mts.map +1 -1
- package/dist/selectors/balance.mjs +2 -2
- package/dist/selectors/balance.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +3 -3
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +3 -3
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +17 -12
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.0.1]
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- Refactor data source tests to use shared `MockAssetControllerMessenger` fixture ([#7958](https://github.com/MetaMask/core/pull/7958))
|
|
15
|
+
- Export `STAKING_INTERFACE` from the staked balance fetcher for use with the staking contract ABI.
|
|
16
|
+
- `StakedBalanceDataSource` teardown now uses the messenger's `clearEventSubscriptions`; custom messenger implementations must support it for correct cleanup.
|
|
17
|
+
- Bump `@metamask/network-enablement-controller` from `^4.1.0` to `^4.1.1` ([#7984](https://github.com/MetaMask/core/pull/7984))
|
|
18
|
+
- Bump `@metamask/core-backend` from `^5.1.1` to `^6.0.0` ([#7993](https://github.com/MetaMask/core/pull/7993))
|
|
19
|
+
- Bump `@metamask/assets-controllers` from `^99.4.0` to `^100.0.0` ([#7995](https://github.com/MetaMask/core/pull/7995))
|
|
20
|
+
- Bump `@metamask/controller-utils` from `^11.18.0` to `^11.19.0` ([#7995](https://github.com/MetaMask/core/pull/7995))
|
|
21
|
+
|
|
22
|
+
## [2.0.0]
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- Add `StakedBalanceDataSource` that polls supported staking contracts on enabled chains and merges staked balances into `assetsBalance`. Configurable via `stakedBalanceDataSourceConfig` (`enabled`, `pollInterval`); the controller subscribes to it when enabled and cleans up on destroy ([#7936](https://github.com/MetaMask/core/pull/7936))
|
|
27
|
+
- Add optional `trackMetaMetricsEvent` callback to measure and report first init/fetch historical time (duration in ms) to MetaMetrics when the initial asset fetch completes after unlock or app open ([#7871](https://github.com/MetaMask/core/pull/7871))
|
|
28
|
+
- Add `AccountsApiDataSourceConfig` and `PriceDataSourceConfig` types; add `accountsApiDataSourceConfig` and `priceDataSourceConfig` options to `AssetsControllerOptions` for per-data-source configuration (pollInterval, tokenDetectionEnabled, etc.). When `tokenDetectionEnabled` is false, `AccountsApiDataSource` only returns balances for tokens already in state and does not add new tokens ([#7926](https://github.com/MetaMask/core/pull/7926))
|
|
29
|
+
- Add `useExternalService` option to `TokenDetector`, `TokenDetectionOptions`, `RpcDataSourceConfig`, and `RpcDataSourceOptions`. Token detection runs only when both `tokenDetectionEnabled` and `useExternalService` are true and stops when either is false ([#7924](https://github.com/MetaMask/core/pull/7924))
|
|
30
|
+
- Add basic functionality toggle: `isBasicFunctionality` (getter `() => boolean`); no value is stored in the controller. When the getter returns true (matches UI "Basic functionality" ON), token and price APIs are used; when false, only RPC is used. Optional `subscribeToBasicFunctionalityChange(onChange)` lets the consumer register for toggle changes (e.g. extension subscribes to PreferencesController:stateChange, mobile uses its own mechanism); may return an unsubscribe function for controller destroy ([#7904](https://github.com/MetaMask/core/pull/7904))
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
|
|
34
|
+
- Refactor `AssetsControllerMessenger` type safety: remove `as unknown as` casts, import types instead of locally defining them, and add missing allowed actions/events ([#7952](https://github.com/MetaMask/core/pull/7952))
|
|
35
|
+
- **BREAKING:** `AccountsApiDataSourceConfig.tokenDetectionEnabled` is now a getter `() => boolean` (was `boolean`) so the Accounts API data source reacts when the user toggles token detection at runtime, consistent with `RpcDataSourceConfig.tokenDetectionEnabled`. Pass a function, e.g. `tokenDetectionEnabled: () => preferenceController.state.useTokenDetection`.
|
|
36
|
+
- **BREAKING:** Rename state and `DataResponse` property from `assetsMetadata` to `assetsInfo`. Update consumers that read `state.assetsMetadata` or set `response.assetsMetadata` to use `assetsInfo` instead ([#7902](https://github.com/MetaMask/core/pull/7902))
|
|
37
|
+
- Bump `@metamask/keyring-api` from `^21.0.0` to `^21.5.0` ([#7857](https://github.com/MetaMask/core/pull/7857))
|
|
38
|
+
- Bump `@metamask/keyring-internal-api` from `^9.0.0` to `^10.0.0` ([#7857](https://github.com/MetaMask/core/pull/7857))
|
|
39
|
+
- Bump `@metamask/keyring-snap-client` from `^8.0.0` to `^8.2.0` ([#7857](https://github.com/MetaMask/core/pull/7857))
|
|
40
|
+
- Bump `@metamask/account-tree-controller` from `4.1.0` to `4.1.1` ([#7897](https://github.com/MetaMask/core/pull/7897))
|
|
41
|
+
- Bump `@metamask/core-backend` from `5.1.0` to `5.1.1` ([#7897](https://github.com/MetaMask/core/pull/7897))
|
|
42
|
+
|
|
10
43
|
## [1.0.0]
|
|
11
44
|
|
|
12
45
|
### Added
|
|
@@ -59,7 +92,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
59
92
|
- Refactor `RpcDataSource` to delegate polling to `BalanceFetcher` and `TokenDetector` services ([#7709](https://github.com/MetaMask/core/pull/7709))
|
|
60
93
|
- Refactor `BalanceFetcher` and `TokenDetector` to extend `StaticIntervalPollingControllerOnly` for independent polling management ([#7709](https://github.com/MetaMask/core/pull/7709))
|
|
61
94
|
|
|
62
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@
|
|
95
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@2.0.1...HEAD
|
|
96
|
+
[2.0.1]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@2.0.0...@metamask/assets-controller@2.0.1
|
|
97
|
+
[2.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@1.0.0...@metamask/assets-controller@2.0.0
|
|
63
98
|
[1.0.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@0.2.0...@metamask/assets-controller@1.0.0
|
|
64
99
|
[0.2.0]: https://github.com/MetaMask/core/compare/@metamask/assets-controller@0.1.0...@metamask/assets-controller@0.2.0
|
|
65
100
|
[0.1.0]: https://github.com/MetaMask/core/releases/tag/@metamask/assets-controller@0.1.0
|
|
@@ -13,7 +13,7 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
13
13
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
14
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
15
|
};
|
|
16
|
-
var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_defaultUpdateInterval, _AssetsController_controllerMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_selectedAccounts_get, _AssetsController_backendWebsocketDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource,
|
|
16
|
+
var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_trackMetaMetricsEvent, _AssetsController_firstInitFetchReported, _AssetsController_controllerMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_selectedAccounts_get, _AssetsController_backendWebsocketDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_stakedBalanceDataSource, _AssetsController_allBalanceDataSources_get, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_tokenDataSource, _AssetsController_unsubscribeBasicFunctionality, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_registerActionHandlers, _AssetsController_executeMiddlewares, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeAssets, _AssetsController_subscribeAssetsBalance, _AssetsController_subscribeStakedBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_subscribeDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged;
|
|
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");
|
|
@@ -26,6 +26,7 @@ const BackendWebsocketDataSource_1 = require("./data-sources/BackendWebsocketDat
|
|
|
26
26
|
const PriceDataSource_1 = require("./data-sources/PriceDataSource.cjs");
|
|
27
27
|
const RpcDataSource_1 = require("./data-sources/RpcDataSource.cjs");
|
|
28
28
|
const SnapDataSource_1 = require("./data-sources/SnapDataSource.cjs");
|
|
29
|
+
const StakedBalanceDataSource_1 = require("./data-sources/StakedBalanceDataSource.cjs");
|
|
29
30
|
const TokenDataSource_1 = require("./data-sources/TokenDataSource.cjs");
|
|
30
31
|
const logger_1 = require("./logger.cjs");
|
|
31
32
|
const DetectionMiddleware_1 = require("./middlewares/DetectionMiddleware.cjs");
|
|
@@ -56,7 +57,7 @@ const log = (0, logger_1.createModuleLogger)(logger_1.projectLogger, CONTROLLER_
|
|
|
56
57
|
*/
|
|
57
58
|
function getDefaultAssetsControllerState() {
|
|
58
59
|
return {
|
|
59
|
-
|
|
60
|
+
assetsInfo: {},
|
|
60
61
|
assetsBalance: {},
|
|
61
62
|
assetsPrice: {},
|
|
62
63
|
customAssets: {},
|
|
@@ -68,7 +69,7 @@ exports.getDefaultAssetsControllerState = getDefaultAssetsControllerState;
|
|
|
68
69
|
// STATE METADATA
|
|
69
70
|
// ============================================================================
|
|
70
71
|
const stateMetadata = {
|
|
71
|
-
|
|
72
|
+
assetsInfo: {
|
|
72
73
|
persist: true,
|
|
73
74
|
includeInStateLogs: false,
|
|
74
75
|
includeInDebugSnapshot: false,
|
|
@@ -116,11 +117,11 @@ function extractChainId(assetId) {
|
|
|
116
117
|
*/
|
|
117
118
|
function normalizeResponse(response) {
|
|
118
119
|
const normalized = {};
|
|
119
|
-
if (response.
|
|
120
|
-
normalized.
|
|
121
|
-
for (const [assetId, metadata] of Object.entries(response.
|
|
120
|
+
if (response.assetsInfo) {
|
|
121
|
+
normalized.assetsInfo = {};
|
|
122
|
+
for (const [assetId, metadata] of Object.entries(response.assetsInfo)) {
|
|
122
123
|
const normalizedId = (0, utils_2.normalizeAssetId)(assetId);
|
|
123
|
-
normalized.
|
|
124
|
+
normalized.assetsInfo[normalizedId] = metadata;
|
|
124
125
|
}
|
|
125
126
|
}
|
|
126
127
|
if (response.assetsPrice) {
|
|
@@ -182,7 +183,7 @@ function normalizeResponse(response) {
|
|
|
182
183
|
* - The controller does NOT manage polling - it simply receives pushed updates
|
|
183
184
|
*/
|
|
184
185
|
class AssetsController extends base_controller_1.BaseController {
|
|
185
|
-
constructor({ messenger, state = {}, defaultUpdateInterval = DEFAULT_POLLING_INTERVAL_MS, isEnabled = () => true, queryApiClient, rpcDataSourceConfig, }) {
|
|
186
|
+
constructor({ messenger, state = {}, defaultUpdateInterval = DEFAULT_POLLING_INTERVAL_MS, isEnabled = () => true, isBasicFunctionality, subscribeToBasicFunctionalityChange, queryApiClient, rpcDataSourceConfig, trackMetaMetricsEvent, accountsApiDataSourceConfig, priceDataSourceConfig, stakedBalanceDataSourceConfig, }) {
|
|
186
187
|
super({
|
|
187
188
|
name: CONTROLLER_NAME,
|
|
188
189
|
messenger,
|
|
@@ -195,8 +196,14 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
195
196
|
_AssetsController_instances.add(this);
|
|
196
197
|
/** Whether the controller is enabled */
|
|
197
198
|
_AssetsController_isEnabled.set(this, void 0);
|
|
199
|
+
/** Getter for basic functionality (only balance fetch/subscribe use RPC; token/price API not used). No attribute stored. */
|
|
200
|
+
_AssetsController_isBasicFunctionality.set(this, void 0);
|
|
198
201
|
/** Default update interval hint passed to data sources */
|
|
199
202
|
_AssetsController_defaultUpdateInterval.set(this, void 0);
|
|
203
|
+
/** Optional callback for first init/fetch MetaMetrics (duration). */
|
|
204
|
+
_AssetsController_trackMetaMetricsEvent.set(this, void 0);
|
|
205
|
+
/** Whether we have already reported first init fetch for this session (reset on #stop). */
|
|
206
|
+
_AssetsController_firstInitFetchReported.set(this, false);
|
|
200
207
|
_AssetsController_controllerMutex.set(this, new async_mutex_1.Mutex());
|
|
201
208
|
/**
|
|
202
209
|
* Active balance subscriptions keyed by account ID.
|
|
@@ -211,13 +218,19 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
211
218
|
_AssetsController_accountsApiDataSource.set(this, void 0);
|
|
212
219
|
_AssetsController_snapDataSource.set(this, void 0);
|
|
213
220
|
_AssetsController_rpcDataSource.set(this, void 0);
|
|
221
|
+
_AssetsController_stakedBalanceDataSource.set(this, void 0);
|
|
214
222
|
_AssetsController_priceDataSource.set(this, void 0);
|
|
215
223
|
_AssetsController_detectionMiddleware.set(this, void 0);
|
|
216
224
|
_AssetsController_tokenDataSource.set(this, void 0);
|
|
225
|
+
_AssetsController_unsubscribeBasicFunctionality.set(this, null);
|
|
217
226
|
__classPrivateFieldSet(this, _AssetsController_isEnabled, isEnabled(), "f");
|
|
227
|
+
__classPrivateFieldSet(this, _AssetsController_isBasicFunctionality, isBasicFunctionality ?? (() => true), "f");
|
|
218
228
|
__classPrivateFieldSet(this, _AssetsController_defaultUpdateInterval, defaultUpdateInterval, "f");
|
|
229
|
+
__classPrivateFieldSet(this, _AssetsController_trackMetaMetricsEvent, trackMetaMetricsEvent, "f");
|
|
219
230
|
const rpcConfig = rpcDataSourceConfig ?? {};
|
|
220
|
-
const onActiveChainsUpdated = (dataSourceName, chains, previousChains) =>
|
|
231
|
+
const onActiveChainsUpdated = (dataSourceName, chains, previousChains) => {
|
|
232
|
+
this.handleActiveChainsUpdate(dataSourceName, chains, previousChains);
|
|
233
|
+
};
|
|
221
234
|
__classPrivateFieldSet(this, _AssetsController_backendWebsocketDataSource, new BackendWebsocketDataSource_1.BackendWebsocketDataSource({
|
|
222
235
|
messenger: this.messenger,
|
|
223
236
|
queryApiClient,
|
|
@@ -226,6 +239,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
226
239
|
__classPrivateFieldSet(this, _AssetsController_accountsApiDataSource, new AccountsApiDataSource_1.AccountsApiDataSource({
|
|
227
240
|
queryApiClient,
|
|
228
241
|
onActiveChainsUpdated,
|
|
242
|
+
...accountsApiDataSourceConfig,
|
|
229
243
|
}), "f");
|
|
230
244
|
__classPrivateFieldSet(this, _AssetsController_snapDataSource, new SnapDataSource_1.SnapDataSource({
|
|
231
245
|
messenger: this.messenger,
|
|
@@ -236,11 +250,17 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
236
250
|
onActiveChainsUpdated,
|
|
237
251
|
...rpcConfig,
|
|
238
252
|
}), "f");
|
|
253
|
+
__classPrivateFieldSet(this, _AssetsController_stakedBalanceDataSource, new StakedBalanceDataSource_1.StakedBalanceDataSource({
|
|
254
|
+
messenger: this.messenger,
|
|
255
|
+
onActiveChainsUpdated,
|
|
256
|
+
...stakedBalanceDataSourceConfig,
|
|
257
|
+
}), "f");
|
|
239
258
|
__classPrivateFieldSet(this, _AssetsController_tokenDataSource, new TokenDataSource_1.TokenDataSource({
|
|
240
259
|
queryApiClient,
|
|
241
260
|
}), "f");
|
|
242
261
|
__classPrivateFieldSet(this, _AssetsController_priceDataSource, new PriceDataSource_1.PriceDataSource({
|
|
243
262
|
queryApiClient,
|
|
263
|
+
...priceDataSourceConfig,
|
|
244
264
|
}), "f");
|
|
245
265
|
__classPrivateFieldSet(this, _AssetsController_detectionMiddleware, new DetectionMiddleware_1.DetectionMiddleware(), "f");
|
|
246
266
|
if (!__classPrivateFieldGet(this, _AssetsController_isEnabled, "f")) {
|
|
@@ -253,6 +273,15 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
253
273
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_initializeState).call(this);
|
|
254
274
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToEvents).call(this);
|
|
255
275
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_registerActionHandlers).call(this);
|
|
276
|
+
// Subscriptions start only on KeyringController:unlock -> #start(), not here.
|
|
277
|
+
// Subscribe to basic-functionality changes after construction so a synchronous
|
|
278
|
+
// onChange during subscribe cannot run before data sources are initialized.
|
|
279
|
+
if (subscribeToBasicFunctionalityChange) {
|
|
280
|
+
const unsubscribe = subscribeToBasicFunctionalityChange((isBasic) => this.handleBasicFunctionalityChange(isBasic));
|
|
281
|
+
if (typeof unsubscribe === 'function') {
|
|
282
|
+
__classPrivateFieldSet(this, _AssetsController_unsubscribeBasicFunctionality, unsubscribe, "f");
|
|
283
|
+
}
|
|
284
|
+
}
|
|
256
285
|
}
|
|
257
286
|
// ============================================================================
|
|
258
287
|
// DATA SOURCE CHAIN MANAGEMENT
|
|
@@ -271,6 +300,9 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
271
300
|
* @param previousChains - Previous chains; used to compute added/removed.
|
|
272
301
|
*/
|
|
273
302
|
handleActiveChainsUpdate(dataSourceId, activeChains, previousChains) {
|
|
303
|
+
if (!__classPrivateFieldGet(this, _AssetsController_isEnabled, "f")) {
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
274
306
|
log('Data source active chains changed', {
|
|
275
307
|
dataSourceId,
|
|
276
308
|
chainCount: activeChains.length,
|
|
@@ -312,21 +344,39 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
312
344
|
customAssets.push(...accountCustomAssets);
|
|
313
345
|
}
|
|
314
346
|
if (options?.forceUpdate) {
|
|
347
|
+
const startTime = Date.now();
|
|
315
348
|
const request = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildDataRequest).call(this, accounts, chainIds, {
|
|
316
349
|
assetTypes,
|
|
317
350
|
dataTypes,
|
|
318
351
|
customAssets: customAssets.length > 0 ? customAssets : undefined,
|
|
319
352
|
forceUpdate: true,
|
|
320
353
|
});
|
|
321
|
-
const
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
354
|
+
const sources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
355
|
+
? [
|
|
356
|
+
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
|
|
357
|
+
__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"),
|
|
358
|
+
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
|
|
359
|
+
__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
|
|
360
|
+
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
361
|
+
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
362
|
+
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
363
|
+
]
|
|
364
|
+
: [
|
|
365
|
+
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
|
|
366
|
+
__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
|
|
367
|
+
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
368
|
+
];
|
|
369
|
+
const { response, durationByDataSource } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, sources, request);
|
|
329
370
|
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, response);
|
|
371
|
+
if (__classPrivateFieldGet(this, _AssetsController_trackMetaMetricsEvent, "f") && !__classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")) {
|
|
372
|
+
__classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, true, "f");
|
|
373
|
+
const durationMs = Date.now() - startTime;
|
|
374
|
+
__classPrivateFieldGet(this, _AssetsController_trackMetaMetricsEvent, "f").call(this, {
|
|
375
|
+
durationMs,
|
|
376
|
+
chainIds,
|
|
377
|
+
durationByDataSource,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
330
380
|
}
|
|
331
381
|
return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
|
|
332
382
|
}
|
|
@@ -351,7 +401,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
351
401
|
return result;
|
|
352
402
|
}
|
|
353
403
|
getAssetMetadata(assetId) {
|
|
354
|
-
return this.state.
|
|
404
|
+
return this.state.assetsInfo[assetId];
|
|
355
405
|
}
|
|
356
406
|
async getAssetsPrice(accounts, options) {
|
|
357
407
|
const assets = await this.getAssets(accounts, {
|
|
@@ -488,18 +538,17 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
488
538
|
*
|
|
489
539
|
* @param accounts - Accounts to subscribe price updates for.
|
|
490
540
|
* @param chainIds - Chain IDs to filter prices for.
|
|
491
|
-
* @param options - Subscription options.
|
|
492
|
-
* @param options.updateInterval - Polling interval in ms.
|
|
493
541
|
*/
|
|
494
|
-
subscribeAssetsPrice(accounts, chainIds
|
|
495
|
-
|
|
542
|
+
subscribeAssetsPrice(accounts, chainIds) {
|
|
543
|
+
if (!__classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)) {
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
496
546
|
const subscriptionKey = 'ds:PriceDataSource';
|
|
497
547
|
const existingSubscription = __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").get(subscriptionKey);
|
|
498
548
|
const isUpdate = existingSubscription !== undefined;
|
|
499
549
|
const subscribeReq = {
|
|
500
550
|
request: __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildDataRequest).call(this, accounts, chainIds, {
|
|
501
551
|
dataTypes: ['price'],
|
|
502
|
-
updateInterval,
|
|
503
552
|
}),
|
|
504
553
|
subscriptionId: subscriptionKey,
|
|
505
554
|
isUpdate,
|
|
@@ -531,6 +580,18 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
531
580
|
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f").unsubscribe(subscriptionKey).catch(console.error);
|
|
532
581
|
existingSubscription.unsubscribe();
|
|
533
582
|
}
|
|
583
|
+
/**
|
|
584
|
+
* Handle basic functionality toggle change. Call this from the consumer (extension or mobile)
|
|
585
|
+
* when the user changes the "Basic functionality" setting. Refreshes subscriptions so the
|
|
586
|
+
* current {@link AssetsControllerOptions.isBasicFunctionality} getter is used (true = APIs on,
|
|
587
|
+
* false = RPC only).
|
|
588
|
+
*
|
|
589
|
+
* @param _isBasic - The new value (for call-site clarity; the getter is the source of truth).
|
|
590
|
+
*/
|
|
591
|
+
handleBasicFunctionalityChange(_isBasic) {
|
|
592
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
|
|
593
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
594
|
+
}
|
|
534
595
|
/**
|
|
535
596
|
* Handle assets updated from a data source.
|
|
536
597
|
* Called via the onAssetsUpdate callback passed in SubscriptionRequest when the controller subscribes to a data source.
|
|
@@ -548,11 +609,7 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
548
609
|
});
|
|
549
610
|
// Run through enrichment middlewares (Event Stack: Detection → Token → Price)
|
|
550
611
|
// Include 'metadata' in dataTypes so TokenDataSource runs to enrich detected assets
|
|
551
|
-
const enrichedResponse = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [
|
|
552
|
-
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f").assetsMiddleware,
|
|
553
|
-
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f").assetsMiddleware,
|
|
554
|
-
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f").assetsMiddleware,
|
|
555
|
-
], request ?? {
|
|
612
|
+
const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"), __classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"), __classPrivateFieldGet(this, _AssetsController_priceDataSource, "f")], request ?? {
|
|
556
613
|
accountsWithSupportedChains: [],
|
|
557
614
|
chainIds: [],
|
|
558
615
|
dataTypes: ['balance', 'metadata', 'price'],
|
|
@@ -564,21 +621,21 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
564
621
|
// ============================================================================
|
|
565
622
|
destroy() {
|
|
566
623
|
log('Destroying AssetsController', {
|
|
567
|
-
dataSourceCount: __classPrivateFieldGet(this, _AssetsController_instances, "a",
|
|
624
|
+
dataSourceCount: __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get).length,
|
|
568
625
|
subscriptionCount: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").size,
|
|
569
626
|
});
|
|
570
627
|
// Destroy instantiated data sources
|
|
571
628
|
__classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f")?.destroy?.();
|
|
572
629
|
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f")?.destroy?.();
|
|
573
630
|
__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f")?.destroy?.();
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
typeof __classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f").destroy ===
|
|
577
|
-
'function') {
|
|
578
|
-
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f").destroy();
|
|
579
|
-
}
|
|
631
|
+
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")?.destroy?.();
|
|
632
|
+
__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f")?.destroy?.();
|
|
580
633
|
// Stop all active subscriptions
|
|
581
634
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
|
|
635
|
+
if (__classPrivateFieldGet(this, _AssetsController_unsubscribeBasicFunctionality, "f")) {
|
|
636
|
+
__classPrivateFieldGet(this, _AssetsController_unsubscribeBasicFunctionality, "f").call(this);
|
|
637
|
+
__classPrivateFieldSet(this, _AssetsController_unsubscribeBasicFunctionality, null, "f");
|
|
638
|
+
}
|
|
582
639
|
// Unregister action handlers
|
|
583
640
|
this.messenger.unregisterActionHandler('AssetsController:getAssets');
|
|
584
641
|
this.messenger.unregisterActionHandler('AssetsController:getAssetsBalance');
|
|
@@ -592,9 +649,9 @@ class AssetsController extends base_controller_1.BaseController {
|
|
|
592
649
|
}
|
|
593
650
|
}
|
|
594
651
|
exports.AssetsController = AssetsController;
|
|
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() {
|
|
652
|
+
_AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctionality = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_trackMetaMetricsEvent = new WeakMap(), _AssetsController_firstInitFetchReported = new WeakMap(), _AssetsController_controllerMutex = new WeakMap(), _AssetsController_activeSubscriptions = new WeakMap(), _AssetsController_enabledChains = new WeakMap(), _AssetsController_backendWebsocketDataSource = new WeakMap(), _AssetsController_accountsApiDataSource = new WeakMap(), _AssetsController_snapDataSource = new WeakMap(), _AssetsController_rpcDataSource = new WeakMap(), _AssetsController_stakedBalanceDataSource = new WeakMap(), _AssetsController_priceDataSource = new WeakMap(), _AssetsController_detectionMiddleware = new WeakMap(), _AssetsController_tokenDataSource = new WeakMap(), _AssetsController_unsubscribeBasicFunctionality = new WeakMap(), _AssetsController_instances = new WeakSet(), _AssetsController_selectedAccounts_get = function _AssetsController_selectedAccounts_get() {
|
|
596
653
|
return this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
|
|
597
|
-
},
|
|
654
|
+
}, _AssetsController_allBalanceDataSources_get = function _AssetsController_allBalanceDataSources_get() {
|
|
598
655
|
return [
|
|
599
656
|
__classPrivateFieldGet(this, _AssetsController_backendWebsocketDataSource, "f"),
|
|
600
657
|
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
|
|
@@ -628,7 +685,7 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_defaultUpdateInte
|
|
|
628
685
|
}
|
|
629
686
|
return chains;
|
|
630
687
|
}, _AssetsController_normalizeChainReference = function _AssetsController_normalizeChainReference(namespace, reference) {
|
|
631
|
-
if (namespace === 'eip155' &&
|
|
688
|
+
if (namespace === 'eip155' && (0, utils_1.isStrictHexString)(reference)) {
|
|
632
689
|
// Convert hex to decimal for EIP155 chains
|
|
633
690
|
return parseInt(reference, 16).toString();
|
|
634
691
|
}
|
|
@@ -653,14 +710,27 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_defaultUpdateInte
|
|
|
653
710
|
// ============================================================================
|
|
654
711
|
/**
|
|
655
712
|
* Execute middlewares with request/response context.
|
|
713
|
+
* Returns response and exclusive duration per source (sum ≈ wall time).
|
|
656
714
|
*
|
|
657
|
-
* @param
|
|
715
|
+
* @param sources - Data sources or middlewares with getName() and assetsMiddleware (executed in order).
|
|
658
716
|
* @param request - The data request.
|
|
659
717
|
* @param initialResponse - Optional initial response (for enriching existing data).
|
|
660
|
-
* @returns
|
|
718
|
+
* @returns Response and durationByDataSource (exclusive ms per source name).
|
|
661
719
|
*/
|
|
662
|
-
async function _AssetsController_executeMiddlewares(
|
|
663
|
-
const
|
|
720
|
+
async function _AssetsController_executeMiddlewares(sources, request, initialResponse = {}) {
|
|
721
|
+
const names = sources.map((source) => source.getName());
|
|
722
|
+
const middlewares = sources.map((source) => source.assetsMiddleware);
|
|
723
|
+
const inclusive = [];
|
|
724
|
+
const wrapped = middlewares.map((middleware, i) => (async (ctx, next) => {
|
|
725
|
+
const start = Date.now();
|
|
726
|
+
try {
|
|
727
|
+
return await middleware(ctx, next);
|
|
728
|
+
}
|
|
729
|
+
finally {
|
|
730
|
+
inclusive[i] = Date.now() - start;
|
|
731
|
+
}
|
|
732
|
+
}));
|
|
733
|
+
const chain = wrapped.reduceRight((next, middleware) => async (ctx) => {
|
|
664
734
|
try {
|
|
665
735
|
return await middleware(ctx, next);
|
|
666
736
|
}
|
|
@@ -674,7 +744,16 @@ async function _AssetsController_executeMiddlewares(middlewares, request, initia
|
|
|
674
744
|
response: initialResponse,
|
|
675
745
|
getAssetsState: () => this.state,
|
|
676
746
|
});
|
|
677
|
-
|
|
747
|
+
const durationByDataSource = {};
|
|
748
|
+
for (let i = 0; i < inclusive.length; i++) {
|
|
749
|
+
const nextInc = i + 1 < inclusive.length ? (inclusive[i + 1] ?? 0) : 0;
|
|
750
|
+
const exclusive = Math.max(0, (inclusive[i] ?? 0) - nextInc);
|
|
751
|
+
const name = names[i];
|
|
752
|
+
if (name !== undefined) {
|
|
753
|
+
durationByDataSource[name] = exclusive;
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
return { response: result.response, durationByDataSource };
|
|
678
757
|
}, _AssetsController_updateState =
|
|
679
758
|
// ============================================================================
|
|
680
759
|
// STATE MANAGEMENT
|
|
@@ -693,12 +772,12 @@ async function _AssetsController_updateState(response) {
|
|
|
693
772
|
const changedMetadata = [];
|
|
694
773
|
this.update((state) => {
|
|
695
774
|
// Use type assertions to avoid deep type instantiation issues with Immer Draft types
|
|
696
|
-
const metadata = state.
|
|
775
|
+
const metadata = state.assetsInfo;
|
|
697
776
|
const balances = state.assetsBalance;
|
|
698
777
|
const prices = state.assetsPrice;
|
|
699
|
-
if (normalizedResponse.
|
|
700
|
-
for (const [key, value] of Object.entries(normalizedResponse.
|
|
701
|
-
if (!(0, lodash_1.isEqual)(previousState.
|
|
778
|
+
if (normalizedResponse.assetsInfo) {
|
|
779
|
+
for (const [key, value] of Object.entries(normalizedResponse.assetsInfo)) {
|
|
780
|
+
if (!(0, lodash_1.isEqual)(previousState.assetsInfo[key], value)) {
|
|
702
781
|
changedMetadata.push(key);
|
|
703
782
|
}
|
|
704
783
|
metadata[key] = value;
|
|
@@ -803,7 +882,7 @@ async function _AssetsController_updateState(response) {
|
|
|
803
882
|
const accountBalances = this.state.assetsBalance[account.id] ?? {};
|
|
804
883
|
for (const [assetId, balance] of Object.entries(accountBalances)) {
|
|
805
884
|
const typedAssetId = assetId;
|
|
806
|
-
const metadataRaw = this.state.
|
|
885
|
+
const metadataRaw = this.state.assetsInfo[typedAssetId];
|
|
807
886
|
// Skip assets without metadata
|
|
808
887
|
if (!metadataRaw) {
|
|
809
888
|
continue;
|
|
@@ -869,29 +948,33 @@ async function _AssetsController_updateState(response) {
|
|
|
869
948
|
enabledChainCount: __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size,
|
|
870
949
|
});
|
|
871
950
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssets).call(this);
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
});
|
|
879
|
-
}
|
|
951
|
+
this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
|
|
952
|
+
chainIds: [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")],
|
|
953
|
+
forceUpdate: true,
|
|
954
|
+
}).catch((error) => {
|
|
955
|
+
log('Failed to fetch assets', error);
|
|
956
|
+
});
|
|
880
957
|
}, _AssetsController_stop = function _AssetsController_stop() {
|
|
881
958
|
log('Stopping asset tracking', {
|
|
882
959
|
activeSubscriptionCount: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").size,
|
|
883
960
|
hasPriceSubscription: __classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").has('ds:PriceDataSource'),
|
|
884
961
|
});
|
|
962
|
+
__classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, false, "f");
|
|
885
963
|
// Stop price subscription first (uses direct messenger call)
|
|
886
964
|
this.unsubscribeAssetsPrice();
|
|
887
965
|
// Stop balance subscriptions by properly notifying data sources via messenger
|
|
888
|
-
// This ensures data sources stop their polling timers
|
|
889
|
-
//
|
|
966
|
+
// This ensures data sources stop their polling timers.
|
|
967
|
+
// Use #allBalanceDataSources + staked balance source so we unsubscribe from
|
|
968
|
+
// every source that may have been subscribed.
|
|
969
|
+
const allSources = [
|
|
970
|
+
...__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get),
|
|
971
|
+
__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
|
|
972
|
+
];
|
|
890
973
|
const subscriptionKeys = [...__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").keys()];
|
|
891
974
|
for (const subscriptionKey of subscriptionKeys) {
|
|
892
975
|
if (subscriptionKey.startsWith('ds:')) {
|
|
893
976
|
const sourceId = subscriptionKey.slice(3);
|
|
894
|
-
const source =
|
|
977
|
+
const source = allSources.find((ds) => ds.getName() === sourceId);
|
|
895
978
|
if (source) {
|
|
896
979
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
|
|
897
980
|
}
|
|
@@ -906,12 +989,20 @@ async function _AssetsController_updateState(response) {
|
|
|
906
989
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeAssetsBalance).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [
|
|
907
990
|
...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f"),
|
|
908
991
|
]);
|
|
992
|
+
// Subscribe to staked balance updates (separate from regular balance chain-claiming)
|
|
993
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeStakedBalance).call(this, __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [
|
|
994
|
+
...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f"),
|
|
995
|
+
]);
|
|
909
996
|
// Subscribe to price updates for all assets held by selected accounts
|
|
910
997
|
this.subscribeAssetsPrice(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")]);
|
|
911
998
|
}, _AssetsController_subscribeAssetsBalance = function _AssetsController_subscribeAssetsBalance(accounts, chainIds) {
|
|
912
999
|
const chainToAccounts = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_buildChainToAccountsMap).call(this, accounts, new Set(chainIds));
|
|
913
1000
|
const remainingChains = new Set(chainToAccounts.keys());
|
|
914
|
-
|
|
1001
|
+
// When basic functionality is on (getter true), use all balance data sources; when off (getter false), RPC only.
|
|
1002
|
+
const balanceDataSources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
1003
|
+
? __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_allBalanceDataSources_get)
|
|
1004
|
+
: [__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f")];
|
|
1005
|
+
for (const source of balanceDataSources) {
|
|
915
1006
|
const availableChains = new Set(source.getActiveChainsSync());
|
|
916
1007
|
const assignedChains = [];
|
|
917
1008
|
for (const chainId of remainingChains) {
|
|
@@ -932,6 +1023,18 @@ async function _AssetsController_updateState(response) {
|
|
|
932
1023
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeDataSource).call(this, source, accountsForSource, assignedChains);
|
|
933
1024
|
}
|
|
934
1025
|
}
|
|
1026
|
+
}, _AssetsController_subscribeStakedBalance = function _AssetsController_subscribeStakedBalance(accounts, chainIds) {
|
|
1027
|
+
const source = __classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f");
|
|
1028
|
+
if (!source) {
|
|
1029
|
+
return;
|
|
1030
|
+
}
|
|
1031
|
+
const availableChains = new Set(source.getActiveChainsSync());
|
|
1032
|
+
const assignedChains = chainIds.filter((chainId) => availableChains.has(chainId));
|
|
1033
|
+
if (assignedChains.length === 0) {
|
|
1034
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_unsubscribeDataSource).call(this, source);
|
|
1035
|
+
return;
|
|
1036
|
+
}
|
|
1037
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeDataSource).call(this, source, accounts, assignedChains);
|
|
935
1038
|
}, _AssetsController_buildChainToAccountsMap = function _AssetsController_buildChainToAccountsMap(accounts, chainsToSubscribe) {
|
|
936
1039
|
const chainToAccounts = new Map();
|
|
937
1040
|
for (const account of accounts) {
|
|
@@ -1008,16 +1111,24 @@ async function _AssetsController_updateState(response) {
|
|
|
1008
1111
|
const scopes = account.scopes ?? [];
|
|
1009
1112
|
const result = [];
|
|
1010
1113
|
for (const scope of scopes) {
|
|
1011
|
-
const
|
|
1114
|
+
const scopeStr = scope;
|
|
1115
|
+
if (!(0, utils_1.isCaipChainId)(scopeStr)) {
|
|
1116
|
+
result.push(scope);
|
|
1117
|
+
continue;
|
|
1118
|
+
}
|
|
1119
|
+
const { namespace, reference } = (0, utils_1.parseCaipChainId)(scopeStr);
|
|
1012
1120
|
// Wildcard scope (e.g., "eip155:0" means all enabled chains in that namespace)
|
|
1013
1121
|
if (reference === '0') {
|
|
1014
1122
|
for (const chain of __classPrivateFieldGet(this, _AssetsController_enabledChains, "f")) {
|
|
1015
|
-
if (
|
|
1016
|
-
|
|
1123
|
+
if ((0, utils_1.isCaipChainId)(chain)) {
|
|
1124
|
+
const chainParsed = (0, utils_1.parseCaipChainId)(chain);
|
|
1125
|
+
if (chainParsed.namespace === namespace) {
|
|
1126
|
+
result.push(chain);
|
|
1127
|
+
}
|
|
1017
1128
|
}
|
|
1018
1129
|
}
|
|
1019
1130
|
}
|
|
1020
|
-
else if (namespace === 'eip155' &&
|
|
1131
|
+
else if (namespace === 'eip155' && (0, utils_1.isStrictHexString)(reference)) {
|
|
1021
1132
|
// Normalize hex to decimal for EIP155
|
|
1022
1133
|
result.push(`eip155:${parseInt(reference, 16)}`);
|
|
1023
1134
|
}
|