@metamask-previews/assets-controller 2.0.2-preview-3d4d0d0ef → 2.0.2-preview-0866a6f
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 +17 -1
- package/dist/AssetsController-method-action-types.cjs.map +1 -1
- package/dist/AssetsController-method-action-types.d.cts +5 -0
- package/dist/AssetsController-method-action-types.d.cts.map +1 -1
- package/dist/AssetsController-method-action-types.d.mts +5 -0
- package/dist/AssetsController-method-action-types.d.mts.map +1 -1
- package/dist/AssetsController-method-action-types.mjs.map +1 -1
- package/dist/AssetsController.cjs +148 -29
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +37 -5
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +37 -5
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +148 -29
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.cjs +1 -0
- package/dist/data-sources/AccountsApiDataSource.cjs.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.cts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.d.mts.map +1 -1
- package/dist/data-sources/AccountsApiDataSource.mjs +1 -0
- package/dist/data-sources/AccountsApiDataSource.mjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.cjs +16 -4
- 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 +13 -4
- package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -1
- package/dist/data-sources/PriceDataSource.cjs +20 -14
- package/dist/data-sources/PriceDataSource.cjs.map +1 -1
- package/dist/data-sources/PriceDataSource.d.cts +2 -2
- package/dist/data-sources/PriceDataSource.d.cts.map +1 -1
- package/dist/data-sources/PriceDataSource.d.mts +2 -2
- package/dist/data-sources/PriceDataSource.d.mts.map +1 -1
- package/dist/data-sources/PriceDataSource.mjs +20 -14
- package/dist/data-sources/PriceDataSource.mjs.map +1 -1
- package/dist/data-sources/RpcDataSource.cjs +2 -0
- package/dist/data-sources/RpcDataSource.cjs.map +1 -1
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
- package/dist/data-sources/RpcDataSource.mjs +2 -0
- package/dist/data-sources/RpcDataSource.mjs.map +1 -1
- package/dist/data-sources/SnapDataSource.cjs +3 -2
- package/dist/data-sources/SnapDataSource.cjs.map +1 -1
- package/dist/data-sources/SnapDataSource.d.cts.map +1 -1
- package/dist/data-sources/SnapDataSource.d.mts.map +1 -1
- package/dist/data-sources/SnapDataSource.mjs +3 -2
- package/dist/data-sources/SnapDataSource.mjs.map +1 -1
- package/dist/data-sources/TokenDataSource.cjs +1 -0
- package/dist/data-sources/TokenDataSource.cjs.map +1 -1
- package/dist/data-sources/TokenDataSource.d.cts.map +1 -1
- package/dist/data-sources/TokenDataSource.d.mts.map +1 -1
- package/dist/data-sources/TokenDataSource.mjs +1 -0
- package/dist/data-sources/TokenDataSource.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/middlewares/DetectionMiddleware.cjs +44 -27
- package/dist/middlewares/DetectionMiddleware.cjs.map +1 -1
- package/dist/middlewares/DetectionMiddleware.d.cts +15 -9
- package/dist/middlewares/DetectionMiddleware.d.cts.map +1 -1
- package/dist/middlewares/DetectionMiddleware.d.mts +15 -9
- package/dist/middlewares/DetectionMiddleware.d.mts.map +1 -1
- package/dist/middlewares/DetectionMiddleware.mjs +44 -27
- package/dist/middlewares/DetectionMiddleware.mjs.map +1 -1
- package/dist/middlewares/ParallelMiddleware.cjs +216 -0
- package/dist/middlewares/ParallelMiddleware.cjs.map +1 -0
- package/dist/middlewares/ParallelMiddleware.d.cts +45 -0
- package/dist/middlewares/ParallelMiddleware.d.cts.map +1 -0
- package/dist/middlewares/ParallelMiddleware.d.mts +45 -0
- package/dist/middlewares/ParallelMiddleware.d.mts.map +1 -0
- package/dist/middlewares/ParallelMiddleware.mjs +214 -0
- package/dist/middlewares/ParallelMiddleware.mjs.map +1 -0
- package/dist/middlewares/index.cjs +5 -1
- package/dist/middlewares/index.cjs.map +1 -1
- package/dist/middlewares/index.d.cts +2 -0
- package/dist/middlewares/index.d.cts.map +1 -1
- package/dist/middlewares/index.d.mts +2 -0
- package/dist/middlewares/index.d.mts.map +1 -1
- package/dist/middlewares/index.mjs +1 -0
- package/dist/middlewares/index.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +16 -0
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +16 -0
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +6 -5
|
@@ -2,7 +2,8 @@ import type { AccountTreeControllerGetAccountsFromSelectedAccountGroupAction, Ac
|
|
|
2
2
|
import type { GetTokenListState } from "@metamask/assets-controllers";
|
|
3
3
|
import { BaseController } from "@metamask/base-controller";
|
|
4
4
|
import type { ControllerGetStateAction, ControllerStateChangeEvent } from "@metamask/base-controller";
|
|
5
|
-
import type {
|
|
5
|
+
import type { ClientControllerStateChangeEvent } from "@metamask/client-controller";
|
|
6
|
+
import type { ApiPlatformClient, BackendWebSocketServiceActions, BackendWebSocketServiceEvents, SupportedCurrency } from "@metamask/core-backend";
|
|
6
7
|
import type { KeyringControllerLockEvent, KeyringControllerUnlockEvent } from "@metamask/keyring-controller";
|
|
7
8
|
import type { InternalAccount } from "@metamask/keyring-internal-api";
|
|
8
9
|
import type { Messenger } from "@metamask/messenger";
|
|
@@ -19,6 +20,21 @@ import type { RpcDataSourceConfig } from "./data-sources/RpcDataSource.cjs";
|
|
|
19
20
|
import type { AccountsControllerAccountBalancesUpdatedEvent } from "./data-sources/SnapDataSource.cjs";
|
|
20
21
|
import type { StakedBalanceDataSourceConfig } from "./data-sources/StakedBalanceDataSource.cjs";
|
|
21
22
|
import type { AccountId, AssetPreferences, ChainId, Caip19AssetId, AssetMetadata, AssetPrice, AssetBalance, AssetType, DataType, DataRequest, DataResponse, Asset } from "./types.cjs";
|
|
23
|
+
/**
|
|
24
|
+
* Metadata format passed from the UI when adding a custom token.
|
|
25
|
+
* Mirrors the "pendingTokens" shape used by the extension.
|
|
26
|
+
*/
|
|
27
|
+
export type PendingTokenMetadata = {
|
|
28
|
+
address: string;
|
|
29
|
+
symbol: string;
|
|
30
|
+
name: string;
|
|
31
|
+
decimals: number;
|
|
32
|
+
iconUrl?: string;
|
|
33
|
+
aggregators?: string[];
|
|
34
|
+
occurrences?: number;
|
|
35
|
+
chainId: string;
|
|
36
|
+
unlisted?: boolean;
|
|
37
|
+
};
|
|
22
38
|
declare const CONTROLLER_NAME: "AssetsController";
|
|
23
39
|
/**
|
|
24
40
|
* State structure for AssetsController.
|
|
@@ -51,6 +67,8 @@ export type AssetsControllerState = {
|
|
|
51
67
|
assetPreferences: {
|
|
52
68
|
[assetId: string]: AssetPreferences;
|
|
53
69
|
};
|
|
70
|
+
/** Currently-active ISO 4217 currency code */
|
|
71
|
+
selectedCurrency: SupportedCurrency;
|
|
54
72
|
};
|
|
55
73
|
/**
|
|
56
74
|
* Returns the default state for AssetsController.
|
|
@@ -87,7 +105,7 @@ export type AssetsControllerAssetsDetectedEvent = {
|
|
|
87
105
|
};
|
|
88
106
|
export type AssetsControllerEvents = AssetsControllerStateChangeEvent | AssetsControllerBalanceChangedEvent | AssetsControllerPriceChangedEvent | AssetsControllerAssetsDetectedEvent;
|
|
89
107
|
type AllowedActions = AccountTreeControllerGetAccountsFromSelectedAccountGroupAction | GetTokenListState | NetworkControllerGetStateAction | NetworkControllerGetNetworkClientByIdAction | NetworkEnablementControllerGetStateAction | GetRunnableSnaps | HandleSnapRequest | GetPermissions | BackendWebSocketServiceActions;
|
|
90
|
-
type AllowedEvents = AccountTreeControllerSelectedAccountGroupChangeEvent | KeyringControllerLockEvent | KeyringControllerUnlockEvent | PreferencesControllerStateChangeEvent | NetworkControllerStateChangeEvent | TransactionControllerTransactionConfirmedEvent | TransactionControllerIncomingTransactionsReceivedEvent | NetworkEnablementControllerEvents | AccountsControllerAccountBalancesUpdatedEvent | PermissionControllerStateChange | BackendWebSocketServiceEvents;
|
|
108
|
+
type AllowedEvents = AccountTreeControllerSelectedAccountGroupChangeEvent | ClientControllerStateChangeEvent | KeyringControllerLockEvent | KeyringControllerUnlockEvent | PreferencesControllerStateChangeEvent | NetworkControllerStateChangeEvent | TransactionControllerTransactionConfirmedEvent | TransactionControllerIncomingTransactionsReceivedEvent | NetworkEnablementControllerEvents | AccountsControllerAccountBalancesUpdatedEvent | PermissionControllerStateChange | BackendWebSocketServiceEvents;
|
|
91
109
|
export type AssetsControllerMessenger = Messenger<typeof CONTROLLER_NAME, AssetsControllerActions | AllowedActions, AssetsControllerEvents | AllowedEvents>;
|
|
92
110
|
/**
|
|
93
111
|
* Payload for the first init/fetch MetaMetrics event.
|
|
@@ -164,8 +182,10 @@ export type AssetsControllerOptions = {
|
|
|
164
182
|
* based on which chains they support. When active chains change, the controller
|
|
165
183
|
* dynamically adjusts subscriptions.
|
|
166
184
|
*
|
|
167
|
-
* 4. **Keyring Lifecycle**:
|
|
168
|
-
*
|
|
185
|
+
* 4. **Client + Keyring Lifecycle**: Starts subscriptions only when both the UI is
|
|
186
|
+
* open (ClientController) and the wallet is unlocked (KeyringController).
|
|
187
|
+
* Stops when either the UI closes or the keyring locks. See client-controller
|
|
188
|
+
* README for the combined pattern.
|
|
169
189
|
*
|
|
170
190
|
* ## Architecture
|
|
171
191
|
*
|
|
@@ -195,6 +215,7 @@ export declare class AssetsController extends BaseController<typeof CONTROLLER_N
|
|
|
195
215
|
assetTypes?: AssetType[];
|
|
196
216
|
forceUpdate?: boolean;
|
|
197
217
|
dataTypes?: DataType[];
|
|
218
|
+
assetsForPriceUpdate?: Caip19AssetId[];
|
|
198
219
|
}): Promise<Record<AccountId, Record<Caip19AssetId, Asset>>>;
|
|
199
220
|
getAssetsBalance(accounts: InternalAccount[], options?: {
|
|
200
221
|
chainIds?: ChainId[];
|
|
@@ -212,10 +233,15 @@ export declare class AssetsController extends BaseController<typeof CONTROLLER_N
|
|
|
212
233
|
* Custom assets are included in subscription and fetch operations.
|
|
213
234
|
* Adding a custom asset also unhides it if it was previously hidden.
|
|
214
235
|
*
|
|
236
|
+
* When `pendingMetadata` is provided (e.g. from the extension's pending-tokens
|
|
237
|
+
* flow), the token metadata is persisted immediately into `assetsInfo` so the
|
|
238
|
+
* UI can render it without waiting for the next pipeline fetch.
|
|
239
|
+
*
|
|
215
240
|
* @param accountId - The account ID to add the custom asset for.
|
|
216
241
|
* @param assetId - The CAIP-19 asset ID to add.
|
|
242
|
+
* @param pendingMetadata - Optional token metadata from the UI (pendingTokens format).
|
|
217
243
|
*/
|
|
218
|
-
addCustomAsset(accountId: AccountId, assetId: Caip19AssetId): Promise<void>;
|
|
244
|
+
addCustomAsset(accountId: AccountId, assetId: Caip19AssetId, pendingMetadata?: PendingTokenMetadata): Promise<void>;
|
|
219
245
|
/**
|
|
220
246
|
* Remove a custom asset from an account.
|
|
221
247
|
*
|
|
@@ -244,6 +270,12 @@ export declare class AssetsController extends BaseController<typeof CONTROLLER_N
|
|
|
244
270
|
* @param assetId - The CAIP-19 asset ID to unhide.
|
|
245
271
|
*/
|
|
246
272
|
unhideAsset(assetId: Caip19AssetId): void;
|
|
273
|
+
/**
|
|
274
|
+
* Set the current currency.
|
|
275
|
+
*
|
|
276
|
+
* @param selectedCurrency - The ISO 4217 currency code to set.
|
|
277
|
+
*/
|
|
278
|
+
setSelectedCurrency(selectedCurrency: SupportedCurrency): void;
|
|
247
279
|
/**
|
|
248
280
|
* Subscribe to price updates for all assets held by the given accounts.
|
|
249
281
|
* Polls PriceDataSource which fetches prices from balance state.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsController.d.cts","sourceRoot":"","sources":["../src/AssetsController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,8DAA8D,EAC9D,oDAAoD,EACrD,0CAA0C;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,qCAAqC;AACtE,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAE3B,kCAAkC;AACnC,OAAO,KAAK,EACV,iBAAiB,EACjB,8BAA8B,EAC9B,6BAA6B,
|
|
1
|
+
{"version":3,"file":"AssetsController.d.cts","sourceRoot":"","sources":["../src/AssetsController.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,8 @@ import type { AccountTreeControllerGetAccountsFromSelectedAccountGroupAction, Ac
|
|
|
2
2
|
import type { GetTokenListState } from "@metamask/assets-controllers";
|
|
3
3
|
import { BaseController } from "@metamask/base-controller";
|
|
4
4
|
import type { ControllerGetStateAction, ControllerStateChangeEvent } from "@metamask/base-controller";
|
|
5
|
-
import type {
|
|
5
|
+
import type { ClientControllerStateChangeEvent } from "@metamask/client-controller";
|
|
6
|
+
import type { ApiPlatformClient, BackendWebSocketServiceActions, BackendWebSocketServiceEvents, SupportedCurrency } from "@metamask/core-backend";
|
|
6
7
|
import type { KeyringControllerLockEvent, KeyringControllerUnlockEvent } from "@metamask/keyring-controller";
|
|
7
8
|
import type { InternalAccount } from "@metamask/keyring-internal-api";
|
|
8
9
|
import type { Messenger } from "@metamask/messenger";
|
|
@@ -19,6 +20,21 @@ import type { RpcDataSourceConfig } from "./data-sources/RpcDataSource.mjs";
|
|
|
19
20
|
import type { AccountsControllerAccountBalancesUpdatedEvent } from "./data-sources/SnapDataSource.mjs";
|
|
20
21
|
import type { StakedBalanceDataSourceConfig } from "./data-sources/StakedBalanceDataSource.mjs";
|
|
21
22
|
import type { AccountId, AssetPreferences, ChainId, Caip19AssetId, AssetMetadata, AssetPrice, AssetBalance, AssetType, DataType, DataRequest, DataResponse, Asset } from "./types.mjs";
|
|
23
|
+
/**
|
|
24
|
+
* Metadata format passed from the UI when adding a custom token.
|
|
25
|
+
* Mirrors the "pendingTokens" shape used by the extension.
|
|
26
|
+
*/
|
|
27
|
+
export type PendingTokenMetadata = {
|
|
28
|
+
address: string;
|
|
29
|
+
symbol: string;
|
|
30
|
+
name: string;
|
|
31
|
+
decimals: number;
|
|
32
|
+
iconUrl?: string;
|
|
33
|
+
aggregators?: string[];
|
|
34
|
+
occurrences?: number;
|
|
35
|
+
chainId: string;
|
|
36
|
+
unlisted?: boolean;
|
|
37
|
+
};
|
|
22
38
|
declare const CONTROLLER_NAME: "AssetsController";
|
|
23
39
|
/**
|
|
24
40
|
* State structure for AssetsController.
|
|
@@ -51,6 +67,8 @@ export type AssetsControllerState = {
|
|
|
51
67
|
assetPreferences: {
|
|
52
68
|
[assetId: string]: AssetPreferences;
|
|
53
69
|
};
|
|
70
|
+
/** Currently-active ISO 4217 currency code */
|
|
71
|
+
selectedCurrency: SupportedCurrency;
|
|
54
72
|
};
|
|
55
73
|
/**
|
|
56
74
|
* Returns the default state for AssetsController.
|
|
@@ -87,7 +105,7 @@ export type AssetsControllerAssetsDetectedEvent = {
|
|
|
87
105
|
};
|
|
88
106
|
export type AssetsControllerEvents = AssetsControllerStateChangeEvent | AssetsControllerBalanceChangedEvent | AssetsControllerPriceChangedEvent | AssetsControllerAssetsDetectedEvent;
|
|
89
107
|
type AllowedActions = AccountTreeControllerGetAccountsFromSelectedAccountGroupAction | GetTokenListState | NetworkControllerGetStateAction | NetworkControllerGetNetworkClientByIdAction | NetworkEnablementControllerGetStateAction | GetRunnableSnaps | HandleSnapRequest | GetPermissions | BackendWebSocketServiceActions;
|
|
90
|
-
type AllowedEvents = AccountTreeControllerSelectedAccountGroupChangeEvent | KeyringControllerLockEvent | KeyringControllerUnlockEvent | PreferencesControllerStateChangeEvent | NetworkControllerStateChangeEvent | TransactionControllerTransactionConfirmedEvent | TransactionControllerIncomingTransactionsReceivedEvent | NetworkEnablementControllerEvents | AccountsControllerAccountBalancesUpdatedEvent | PermissionControllerStateChange | BackendWebSocketServiceEvents;
|
|
108
|
+
type AllowedEvents = AccountTreeControllerSelectedAccountGroupChangeEvent | ClientControllerStateChangeEvent | KeyringControllerLockEvent | KeyringControllerUnlockEvent | PreferencesControllerStateChangeEvent | NetworkControllerStateChangeEvent | TransactionControllerTransactionConfirmedEvent | TransactionControllerIncomingTransactionsReceivedEvent | NetworkEnablementControllerEvents | AccountsControllerAccountBalancesUpdatedEvent | PermissionControllerStateChange | BackendWebSocketServiceEvents;
|
|
91
109
|
export type AssetsControllerMessenger = Messenger<typeof CONTROLLER_NAME, AssetsControllerActions | AllowedActions, AssetsControllerEvents | AllowedEvents>;
|
|
92
110
|
/**
|
|
93
111
|
* Payload for the first init/fetch MetaMetrics event.
|
|
@@ -164,8 +182,10 @@ export type AssetsControllerOptions = {
|
|
|
164
182
|
* based on which chains they support. When active chains change, the controller
|
|
165
183
|
* dynamically adjusts subscriptions.
|
|
166
184
|
*
|
|
167
|
-
* 4. **Keyring Lifecycle**:
|
|
168
|
-
*
|
|
185
|
+
* 4. **Client + Keyring Lifecycle**: Starts subscriptions only when both the UI is
|
|
186
|
+
* open (ClientController) and the wallet is unlocked (KeyringController).
|
|
187
|
+
* Stops when either the UI closes or the keyring locks. See client-controller
|
|
188
|
+
* README for the combined pattern.
|
|
169
189
|
*
|
|
170
190
|
* ## Architecture
|
|
171
191
|
*
|
|
@@ -195,6 +215,7 @@ export declare class AssetsController extends BaseController<typeof CONTROLLER_N
|
|
|
195
215
|
assetTypes?: AssetType[];
|
|
196
216
|
forceUpdate?: boolean;
|
|
197
217
|
dataTypes?: DataType[];
|
|
218
|
+
assetsForPriceUpdate?: Caip19AssetId[];
|
|
198
219
|
}): Promise<Record<AccountId, Record<Caip19AssetId, Asset>>>;
|
|
199
220
|
getAssetsBalance(accounts: InternalAccount[], options?: {
|
|
200
221
|
chainIds?: ChainId[];
|
|
@@ -212,10 +233,15 @@ export declare class AssetsController extends BaseController<typeof CONTROLLER_N
|
|
|
212
233
|
* Custom assets are included in subscription and fetch operations.
|
|
213
234
|
* Adding a custom asset also unhides it if it was previously hidden.
|
|
214
235
|
*
|
|
236
|
+
* When `pendingMetadata` is provided (e.g. from the extension's pending-tokens
|
|
237
|
+
* flow), the token metadata is persisted immediately into `assetsInfo` so the
|
|
238
|
+
* UI can render it without waiting for the next pipeline fetch.
|
|
239
|
+
*
|
|
215
240
|
* @param accountId - The account ID to add the custom asset for.
|
|
216
241
|
* @param assetId - The CAIP-19 asset ID to add.
|
|
242
|
+
* @param pendingMetadata - Optional token metadata from the UI (pendingTokens format).
|
|
217
243
|
*/
|
|
218
|
-
addCustomAsset(accountId: AccountId, assetId: Caip19AssetId): Promise<void>;
|
|
244
|
+
addCustomAsset(accountId: AccountId, assetId: Caip19AssetId, pendingMetadata?: PendingTokenMetadata): Promise<void>;
|
|
219
245
|
/**
|
|
220
246
|
* Remove a custom asset from an account.
|
|
221
247
|
*
|
|
@@ -244,6 +270,12 @@ export declare class AssetsController extends BaseController<typeof CONTROLLER_N
|
|
|
244
270
|
* @param assetId - The CAIP-19 asset ID to unhide.
|
|
245
271
|
*/
|
|
246
272
|
unhideAsset(assetId: Caip19AssetId): void;
|
|
273
|
+
/**
|
|
274
|
+
* Set the current currency.
|
|
275
|
+
*
|
|
276
|
+
* @param selectedCurrency - The ISO 4217 currency code to set.
|
|
277
|
+
*/
|
|
278
|
+
setSelectedCurrency(selectedCurrency: SupportedCurrency): void;
|
|
247
279
|
/**
|
|
248
280
|
* Subscribe to price updates for all assets held by the given accounts.
|
|
249
281
|
* Polls PriceDataSource which fetches prices from balance state.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsController.d.mts","sourceRoot":"","sources":["../src/AssetsController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,8DAA8D,EAC9D,oDAAoD,EACrD,0CAA0C;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,qCAAqC;AACtE,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAE3B,kCAAkC;AACnC,OAAO,KAAK,EACV,iBAAiB,EACjB,8BAA8B,EAC9B,6BAA6B,
|
|
1
|
+
{"version":3,"file":"AssetsController.d.mts","sourceRoot":"","sources":["../src/AssetsController.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,9 @@ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (
|
|
|
9
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");
|
|
10
10
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
11
11
|
};
|
|
12
|
-
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;
|
|
12
|
+
var _AssetsController_instances, _AssetsController_isEnabled, _AssetsController_isBasicFunctionality, _AssetsController_defaultUpdateInterval, _AssetsController_trackMetaMetricsEvent, _AssetsController_firstInitFetchReported, _AssetsController_uiOpen, _AssetsController_keyringUnlocked, _AssetsController_controllerMutex, _AssetsController_activeSubscriptions, _AssetsController_enabledChains, _AssetsController_selectedAccounts_get, _AssetsController_backendWebsocketDataSource, _AssetsController_accountsApiDataSource, _AssetsController_snapDataSource, _AssetsController_rpcDataSource, _AssetsController_stakedBalanceDataSource, _AssetsController_allBalanceDataSources_get, _AssetsController_priceDataSource, _AssetsController_detectionMiddleware, _AssetsController_tokenDataSource, _AssetsController_unsubscribeBasicFunctionality, _AssetsController_initializeState, _AssetsController_extractEnabledChains, _AssetsController_normalizeChainReference, _AssetsController_subscribeToEvents, _AssetsController_updateActive, _AssetsController_registerActionHandlers, _AssetsController_executeMiddlewares, _AssetsController_updateState, _AssetsController_getAssetsFromState, _AssetsController_tokenStandardToAssetType, _AssetsController_start, _AssetsController_stop, _AssetsController_subscribeAssets, _AssetsController_subscribeAssetsBalance, _AssetsController_subscribeStakedBalance, _AssetsController_buildChainToAccountsMap, _AssetsController_subscribeDataSource, _AssetsController_unsubscribeDataSource, _AssetsController_buildDataRequest, _AssetsController_getEnabledChainsForAccount, _AssetsController_handleAccountGroupChanged, _AssetsController_handleEnabledNetworksChanged;
|
|
13
13
|
import { BaseController } from "@metamask/base-controller";
|
|
14
|
+
import { clientControllerSelectors } from "@metamask/client-controller";
|
|
14
15
|
import { isCaipChainId, isStrictHexString, parseCaipAssetType, parseCaipChainId } from "@metamask/utils";
|
|
15
16
|
import { Mutex } from "async-mutex";
|
|
16
17
|
import BigNumberJS from "bignumber.js";
|
|
@@ -25,6 +26,7 @@ import { StakedBalanceDataSource } from "./data-sources/StakedBalanceDataSource.
|
|
|
25
26
|
import { TokenDataSource } from "./data-sources/TokenDataSource.mjs";
|
|
26
27
|
import { projectLogger, createModuleLogger } from "./logger.mjs";
|
|
27
28
|
import { DetectionMiddleware } from "./middlewares/DetectionMiddleware.mjs";
|
|
29
|
+
import { createParallelBalanceMiddleware, createParallelMiddleware } from "./middlewares/ParallelMiddleware.mjs";
|
|
28
30
|
import { normalizeAssetId } from "./utils.mjs";
|
|
29
31
|
// ============================================================================
|
|
30
32
|
// CONTROLLER CONSTANTS
|
|
@@ -57,6 +59,7 @@ export function getDefaultAssetsControllerState() {
|
|
|
57
59
|
assetsPrice: {},
|
|
58
60
|
customAssets: {},
|
|
59
61
|
assetPreferences: {},
|
|
62
|
+
selectedCurrency: 'usd',
|
|
60
63
|
};
|
|
61
64
|
}
|
|
62
65
|
// ============================================================================
|
|
@@ -93,6 +96,12 @@ const stateMetadata = {
|
|
|
93
96
|
includeInDebugSnapshot: false,
|
|
94
97
|
usedInUi: true,
|
|
95
98
|
},
|
|
99
|
+
selectedCurrency: {
|
|
100
|
+
persist: true,
|
|
101
|
+
includeInStateLogs: false,
|
|
102
|
+
includeInDebugSnapshot: false,
|
|
103
|
+
usedInUi: true,
|
|
104
|
+
},
|
|
96
105
|
};
|
|
97
106
|
// ============================================================================
|
|
98
107
|
// HELPER FUNCTIONS
|
|
@@ -146,6 +155,9 @@ function normalizeResponse(response) {
|
|
|
146
155
|
if (response.errors) {
|
|
147
156
|
normalized.errors = { ...response.errors };
|
|
148
157
|
}
|
|
158
|
+
if (response.updateMode) {
|
|
159
|
+
normalized.updateMode = response.updateMode;
|
|
160
|
+
}
|
|
149
161
|
return normalized;
|
|
150
162
|
}
|
|
151
163
|
// ============================================================================
|
|
@@ -167,8 +179,10 @@ function normalizeResponse(response) {
|
|
|
167
179
|
* based on which chains they support. When active chains change, the controller
|
|
168
180
|
* dynamically adjusts subscriptions.
|
|
169
181
|
*
|
|
170
|
-
* 4. **Keyring Lifecycle**:
|
|
171
|
-
*
|
|
182
|
+
* 4. **Client + Keyring Lifecycle**: Starts subscriptions only when both the UI is
|
|
183
|
+
* open (ClientController) and the wallet is unlocked (KeyringController).
|
|
184
|
+
* Stops when either the UI closes or the keyring locks. See client-controller
|
|
185
|
+
* README for the combined pattern.
|
|
172
186
|
*
|
|
173
187
|
* ## Architecture
|
|
174
188
|
*
|
|
@@ -198,6 +212,10 @@ export class AssetsController extends BaseController {
|
|
|
198
212
|
_AssetsController_trackMetaMetricsEvent.set(this, void 0);
|
|
199
213
|
/** Whether we have already reported first init fetch for this session (reset on #stop). */
|
|
200
214
|
_AssetsController_firstInitFetchReported.set(this, false);
|
|
215
|
+
/** Whether the client (UI) is open. Combined with #keyringUnlocked for #updateActive. */
|
|
216
|
+
_AssetsController_uiOpen.set(this, false);
|
|
217
|
+
/** Whether the keyring is unlocked. Combined with #uiOpen for #updateActive. */
|
|
218
|
+
_AssetsController_keyringUnlocked.set(this, false);
|
|
201
219
|
_AssetsController_controllerMutex.set(this, new Mutex());
|
|
202
220
|
/**
|
|
203
221
|
* Active balance subscriptions keyed by account ID.
|
|
@@ -254,6 +272,7 @@ export class AssetsController extends BaseController {
|
|
|
254
272
|
}), "f");
|
|
255
273
|
__classPrivateFieldSet(this, _AssetsController_priceDataSource, new PriceDataSource({
|
|
256
274
|
queryApiClient,
|
|
275
|
+
getSelectedCurrency: () => this.state.selectedCurrency,
|
|
257
276
|
...priceDataSourceConfig,
|
|
258
277
|
}), "f");
|
|
259
278
|
__classPrivateFieldSet(this, _AssetsController_detectionMiddleware, new DetectionMiddleware(), "f");
|
|
@@ -267,7 +286,7 @@ export class AssetsController extends BaseController {
|
|
|
267
286
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_initializeState).call(this);
|
|
268
287
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_subscribeToEvents).call(this);
|
|
269
288
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_registerActionHandlers).call(this);
|
|
270
|
-
// Subscriptions start only
|
|
289
|
+
// Subscriptions start only when both UI is open and keyring unlocked -> #updateActive().
|
|
271
290
|
// Subscribe to basic-functionality changes after construction so a synchronous
|
|
272
291
|
// onChange during subscribe cannot run before data sources are initialized.
|
|
273
292
|
if (subscribeToBasicFunctionalityChange) {
|
|
@@ -331,6 +350,9 @@ export class AssetsController extends BaseController {
|
|
|
331
350
|
const chainIds = options?.chainIds ?? [...__classPrivateFieldGet(this, _AssetsController_enabledChains, "f")];
|
|
332
351
|
const assetTypes = options?.assetTypes ?? ['fungible'];
|
|
333
352
|
const dataTypes = options?.dataTypes ?? ['balance', 'metadata', 'price'];
|
|
353
|
+
if (accounts.length === 0 || chainIds.length === 0) {
|
|
354
|
+
return __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
|
|
355
|
+
}
|
|
334
356
|
// Collect custom assets for all requested accounts
|
|
335
357
|
const customAssets = [];
|
|
336
358
|
for (const account of accounts) {
|
|
@@ -344,16 +366,21 @@ export class AssetsController extends BaseController {
|
|
|
344
366
|
dataTypes,
|
|
345
367
|
customAssets: customAssets.length > 0 ? customAssets : undefined,
|
|
346
368
|
forceUpdate: true,
|
|
369
|
+
assetsForPriceUpdate: options?.assetsForPriceUpdate,
|
|
347
370
|
});
|
|
348
371
|
const sources = __classPrivateFieldGet(this, _AssetsController_isBasicFunctionality, "f").call(this)
|
|
349
372
|
? [
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
373
|
+
createParallelBalanceMiddleware([
|
|
374
|
+
__classPrivateFieldGet(this, _AssetsController_accountsApiDataSource, "f"),
|
|
375
|
+
__classPrivateFieldGet(this, _AssetsController_snapDataSource, "f"),
|
|
376
|
+
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
|
|
377
|
+
__classPrivateFieldGet(this, _AssetsController_stakedBalanceDataSource, "f"),
|
|
378
|
+
]),
|
|
354
379
|
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
355
|
-
|
|
356
|
-
|
|
380
|
+
createParallelMiddleware([
|
|
381
|
+
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
382
|
+
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
383
|
+
]),
|
|
357
384
|
]
|
|
358
385
|
: [
|
|
359
386
|
__classPrivateFieldGet(this, _AssetsController_rpcDataSource, "f"),
|
|
@@ -361,7 +388,7 @@ export class AssetsController extends BaseController {
|
|
|
361
388
|
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
362
389
|
];
|
|
363
390
|
const { response, durationByDataSource } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, sources, request);
|
|
364
|
-
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, response);
|
|
391
|
+
await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateState).call(this, { ...response, updateMode: 'full' });
|
|
365
392
|
if (__classPrivateFieldGet(this, _AssetsController_trackMetaMetricsEvent, "f") && !__classPrivateFieldGet(this, _AssetsController_firstInitFetchReported, "f")) {
|
|
366
393
|
__classPrivateFieldSet(this, _AssetsController_firstInitFetchReported, true, "f");
|
|
367
394
|
const durationMs = Date.now() - startTime;
|
|
@@ -372,7 +399,8 @@ export class AssetsController extends BaseController {
|
|
|
372
399
|
});
|
|
373
400
|
}
|
|
374
401
|
}
|
|
375
|
-
|
|
402
|
+
const result = __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_getAssetsFromState).call(this, accounts, chainIds, assetTypes);
|
|
403
|
+
return result;
|
|
376
404
|
}
|
|
377
405
|
async getAssetsBalance(accounts, options) {
|
|
378
406
|
// Reuse getAssets with dataTypes: ['balance'] only
|
|
@@ -423,10 +451,15 @@ export class AssetsController extends BaseController {
|
|
|
423
451
|
* Custom assets are included in subscription and fetch operations.
|
|
424
452
|
* Adding a custom asset also unhides it if it was previously hidden.
|
|
425
453
|
*
|
|
454
|
+
* When `pendingMetadata` is provided (e.g. from the extension's pending-tokens
|
|
455
|
+
* flow), the token metadata is persisted immediately into `assetsInfo` so the
|
|
456
|
+
* UI can render it without waiting for the next pipeline fetch.
|
|
457
|
+
*
|
|
426
458
|
* @param accountId - The account ID to add the custom asset for.
|
|
427
459
|
* @param assetId - The CAIP-19 asset ID to add.
|
|
460
|
+
* @param pendingMetadata - Optional token metadata from the UI (pendingTokens format).
|
|
428
461
|
*/
|
|
429
|
-
async addCustomAsset(accountId, assetId) {
|
|
462
|
+
async addCustomAsset(accountId, assetId, pendingMetadata) {
|
|
430
463
|
const normalizedAssetId = normalizeAssetId(assetId);
|
|
431
464
|
log('Adding custom asset', { accountId, assetId: normalizedAssetId });
|
|
432
465
|
this.update((state) => {
|
|
@@ -446,6 +479,28 @@ export class AssetsController extends BaseController {
|
|
|
446
479
|
delete state.assetPreferences[normalizedAssetId];
|
|
447
480
|
}
|
|
448
481
|
}
|
|
482
|
+
// Persist metadata from the UI so the token is immediately renderable
|
|
483
|
+
if (pendingMetadata) {
|
|
484
|
+
const parsed = parseCaipAssetType(normalizedAssetId);
|
|
485
|
+
let tokenType = 'erc20';
|
|
486
|
+
if (parsed.assetNamespace === 'slip44') {
|
|
487
|
+
tokenType = 'native';
|
|
488
|
+
}
|
|
489
|
+
else if (parsed.assetNamespace === 'spl') {
|
|
490
|
+
tokenType = 'spl';
|
|
491
|
+
}
|
|
492
|
+
const assetMetadata = {
|
|
493
|
+
type: tokenType,
|
|
494
|
+
symbol: pendingMetadata.symbol,
|
|
495
|
+
name: pendingMetadata.name,
|
|
496
|
+
decimals: pendingMetadata.decimals,
|
|
497
|
+
image: pendingMetadata.iconUrl,
|
|
498
|
+
aggregators: pendingMetadata.aggregators,
|
|
499
|
+
occurrences: pendingMetadata.occurrences,
|
|
500
|
+
};
|
|
501
|
+
state.assetsInfo[normalizedAssetId] =
|
|
502
|
+
assetMetadata;
|
|
503
|
+
}
|
|
449
504
|
});
|
|
450
505
|
// Fetch data for the newly added custom asset
|
|
451
506
|
const account = __classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).find((a) => a.id === accountId);
|
|
@@ -524,6 +579,34 @@ export class AssetsController extends BaseController {
|
|
|
524
579
|
});
|
|
525
580
|
}
|
|
526
581
|
// ============================================================================
|
|
582
|
+
// CURRENT CURRENCY MANAGEMENT
|
|
583
|
+
// ============================================================================
|
|
584
|
+
/**
|
|
585
|
+
* Set the current currency.
|
|
586
|
+
*
|
|
587
|
+
* @param selectedCurrency - The ISO 4217 currency code to set.
|
|
588
|
+
*/
|
|
589
|
+
setSelectedCurrency(selectedCurrency) {
|
|
590
|
+
const previousCurrency = this.state.selectedCurrency;
|
|
591
|
+
if (previousCurrency === selectedCurrency) {
|
|
592
|
+
return;
|
|
593
|
+
}
|
|
594
|
+
this.update((state) => {
|
|
595
|
+
state.selectedCurrency = selectedCurrency;
|
|
596
|
+
});
|
|
597
|
+
log('Current currency changed', {
|
|
598
|
+
previousCurrency,
|
|
599
|
+
selectedCurrency,
|
|
600
|
+
});
|
|
601
|
+
this.getAssets(__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get), {
|
|
602
|
+
forceUpdate: true,
|
|
603
|
+
dataTypes: ['price'],
|
|
604
|
+
assetsForPriceUpdate: Object.values(this.state.assetsBalance).flatMap((balances) => Object.keys(balances)),
|
|
605
|
+
}).catch((error) => {
|
|
606
|
+
log('Failed to fetch asset prices after current currency change', error);
|
|
607
|
+
});
|
|
608
|
+
}
|
|
609
|
+
// ============================================================================
|
|
527
610
|
// SUBSCRIPTIONS
|
|
528
611
|
// ============================================================================
|
|
529
612
|
/**
|
|
@@ -601,9 +684,15 @@ export class AssetsController extends BaseController {
|
|
|
601
684
|
hasBalance: Boolean(response.assetsBalance),
|
|
602
685
|
hasPrice: Boolean(response.assetsPrice),
|
|
603
686
|
});
|
|
604
|
-
// Run through enrichment middlewares (
|
|
687
|
+
// Run through enrichment middlewares (Detection, then Token + Price in parallel)
|
|
605
688
|
// Include 'metadata' in dataTypes so TokenDataSource runs to enrich detected assets
|
|
606
|
-
const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [
|
|
689
|
+
const { response: enrichedResponse } = await __classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_executeMiddlewares).call(this, [
|
|
690
|
+
__classPrivateFieldGet(this, _AssetsController_detectionMiddleware, "f"),
|
|
691
|
+
createParallelMiddleware([
|
|
692
|
+
__classPrivateFieldGet(this, _AssetsController_tokenDataSource, "f"),
|
|
693
|
+
__classPrivateFieldGet(this, _AssetsController_priceDataSource, "f"),
|
|
694
|
+
]),
|
|
695
|
+
], request ?? {
|
|
607
696
|
accountsWithSupportedChains: [],
|
|
608
697
|
chainIds: [],
|
|
609
698
|
dataTypes: ['balance', 'metadata', 'price'],
|
|
@@ -642,7 +731,7 @@ export class AssetsController extends BaseController {
|
|
|
642
731
|
this.messenger.unregisterActionHandler('AssetsController:unhideAsset');
|
|
643
732
|
}
|
|
644
733
|
}
|
|
645
|
-
_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() {
|
|
734
|
+
_AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctionality = new WeakMap(), _AssetsController_defaultUpdateInterval = new WeakMap(), _AssetsController_trackMetaMetricsEvent = new WeakMap(), _AssetsController_firstInitFetchReported = new WeakMap(), _AssetsController_uiOpen = new WeakMap(), _AssetsController_keyringUnlocked = new WeakMap(), _AssetsController_controllerMutex = new WeakMap(), _AssetsController_activeSubscriptions = new WeakMap(), _AssetsController_enabledChains = new WeakMap(), _AssetsController_backendWebsocketDataSource = new WeakMap(), _AssetsController_accountsApiDataSource = new WeakMap(), _AssetsController_snapDataSource = new WeakMap(), _AssetsController_rpcDataSource = new WeakMap(), _AssetsController_stakedBalanceDataSource = new WeakMap(), _AssetsController_priceDataSource = new WeakMap(), _AssetsController_detectionMiddleware = new WeakMap(), _AssetsController_tokenDataSource = new WeakMap(), _AssetsController_unsubscribeBasicFunctionality = new WeakMap(), _AssetsController_instances = new WeakSet(), _AssetsController_selectedAccounts_get = function _AssetsController_selectedAccounts_get() {
|
|
646
735
|
return this.messenger.call('AccountTreeController:getAccountsFromSelectedAccountGroup');
|
|
647
736
|
}, _AssetsController_allBalanceDataSources_get = function _AssetsController_allBalanceDataSources_get() {
|
|
648
737
|
return [
|
|
@@ -692,9 +781,27 @@ _AssetsController_isEnabled = new WeakMap(), _AssetsController_isBasicFunctional
|
|
|
692
781
|
this.messenger.subscribe('NetworkEnablementController:stateChange', ({ enabledNetworkMap }) => {
|
|
693
782
|
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_handleEnabledNetworksChanged).call(this, enabledNetworkMap).catch(console.error);
|
|
694
783
|
});
|
|
695
|
-
// Keyring lifecycle:
|
|
696
|
-
this.messenger.subscribe('
|
|
697
|
-
|
|
784
|
+
// Client + Keyring lifecycle: only run when UI is open AND keyring is unlocked
|
|
785
|
+
this.messenger.subscribe('ClientController:stateChange', (isUiOpen) => {
|
|
786
|
+
__classPrivateFieldSet(this, _AssetsController_uiOpen, isUiOpen, "f");
|
|
787
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
|
|
788
|
+
}, clientControllerSelectors.selectIsUiOpen);
|
|
789
|
+
this.messenger.subscribe('KeyringController:unlock', () => {
|
|
790
|
+
__classPrivateFieldSet(this, _AssetsController_keyringUnlocked, true, "f");
|
|
791
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
|
|
792
|
+
});
|
|
793
|
+
this.messenger.subscribe('KeyringController:lock', () => {
|
|
794
|
+
__classPrivateFieldSet(this, _AssetsController_keyringUnlocked, false, "f");
|
|
795
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_updateActive).call(this);
|
|
796
|
+
});
|
|
797
|
+
}, _AssetsController_updateActive = function _AssetsController_updateActive() {
|
|
798
|
+
const shouldRun = __classPrivateFieldGet(this, _AssetsController_uiOpen, "f") && __classPrivateFieldGet(this, _AssetsController_keyringUnlocked, "f");
|
|
799
|
+
if (shouldRun) {
|
|
800
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_start).call(this);
|
|
801
|
+
}
|
|
802
|
+
else {
|
|
803
|
+
__classPrivateFieldGet(this, _AssetsController_instances, "m", _AssetsController_stop).call(this);
|
|
804
|
+
}
|
|
698
805
|
}, _AssetsController_registerActionHandlers = function _AssetsController_registerActionHandlers() {
|
|
699
806
|
this.messenger.registerMethodActionHandlers(this, MESSENGER_EXPOSED_METHODS);
|
|
700
807
|
}, _AssetsController_executeMiddlewares =
|
|
@@ -752,8 +859,8 @@ async function _AssetsController_executeMiddlewares(sources, request, initialRes
|
|
|
752
859
|
// STATE MANAGEMENT
|
|
753
860
|
// ============================================================================
|
|
754
861
|
async function _AssetsController_updateState(response) {
|
|
755
|
-
// Normalize asset IDs (checksum EVM addresses) before storing in state
|
|
756
862
|
const normalizedResponse = normalizeResponse(response);
|
|
863
|
+
const mode = normalizedResponse.updateMode ?? 'merge';
|
|
757
864
|
const releaseLock = await __classPrivateFieldGet(this, _AssetsController_controllerMutex, "f").acquire();
|
|
758
865
|
try {
|
|
759
866
|
const previousState = this.state;
|
|
@@ -779,15 +886,27 @@ async function _AssetsController_updateState(response) {
|
|
|
779
886
|
if (normalizedResponse.assetsBalance) {
|
|
780
887
|
for (const [accountId, accountBalances] of Object.entries(normalizedResponse.assetsBalance)) {
|
|
781
888
|
const previousBalances = previousState.assetsBalance[accountId] ?? {};
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
889
|
+
const customAssetIds = state.customAssets[accountId] ?? [];
|
|
890
|
+
// Full: response is authoritative; preserve custom assets not in response. Merge: response overlays previous.
|
|
891
|
+
const effective = mode === 'full'
|
|
892
|
+
? (() => {
|
|
893
|
+
const next = {
|
|
894
|
+
...accountBalances,
|
|
895
|
+
};
|
|
896
|
+
for (const customId of customAssetIds) {
|
|
897
|
+
if (!(customId in next)) {
|
|
898
|
+
const prev = previousBalances[customId];
|
|
899
|
+
next[customId] =
|
|
900
|
+
prev ?? { amount: '0' };
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
return next;
|
|
904
|
+
})()
|
|
905
|
+
: { ...previousBalances, ...accountBalances };
|
|
906
|
+
for (const [assetId, balance] of Object.entries(effective)) {
|
|
786
907
|
const previousBalance = previousBalances[assetId];
|
|
787
|
-
const
|
|
788
|
-
const newAmount = balanceData.amount;
|
|
908
|
+
const newAmount = balance.amount;
|
|
789
909
|
const oldAmount = previousBalance?.amount;
|
|
790
|
-
// Track if balance actually changed
|
|
791
910
|
if (oldAmount !== newAmount) {
|
|
792
911
|
changedBalances.push({
|
|
793
912
|
accountId,
|
|
@@ -797,7 +916,7 @@ async function _AssetsController_updateState(response) {
|
|
|
797
916
|
});
|
|
798
917
|
}
|
|
799
918
|
}
|
|
800
|
-
|
|
919
|
+
balances[accountId] = effective;
|
|
801
920
|
}
|
|
802
921
|
}
|
|
803
922
|
// Update prices in state
|
|
@@ -975,7 +1094,7 @@ async function _AssetsController_updateState(response) {
|
|
|
975
1094
|
}
|
|
976
1095
|
__classPrivateFieldGet(this, _AssetsController_activeSubscriptions, "f").clear();
|
|
977
1096
|
}, _AssetsController_subscribeAssets = function _AssetsController_subscribeAssets() {
|
|
978
|
-
if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length === 0) {
|
|
1097
|
+
if (__classPrivateFieldGet(this, _AssetsController_instances, "a", _AssetsController_selectedAccounts_get).length === 0 || __classPrivateFieldGet(this, _AssetsController_enabledChains, "f").size === 0) {
|
|
979
1098
|
return;
|
|
980
1099
|
}
|
|
981
1100
|
// Subscribe to balance updates (batched by data source)
|