@metamask/assets-controllers 74.3.2 → 75.0.0

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.
Files changed (84) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/dist/AccountTrackerController.cjs +28 -6
  3. package/dist/AccountTrackerController.cjs.map +1 -1
  4. package/dist/AccountTrackerController.d.cts +3 -3
  5. package/dist/AccountTrackerController.d.cts.map +1 -1
  6. package/dist/AccountTrackerController.d.mts +3 -3
  7. package/dist/AccountTrackerController.d.mts.map +1 -1
  8. package/dist/AccountTrackerController.mjs +28 -6
  9. package/dist/AccountTrackerController.mjs.map +1 -1
  10. package/dist/CurrencyRateController.cjs +12 -2
  11. package/dist/CurrencyRateController.cjs.map +1 -1
  12. package/dist/CurrencyRateController.d.cts.map +1 -1
  13. package/dist/CurrencyRateController.d.mts.map +1 -1
  14. package/dist/CurrencyRateController.mjs +12 -2
  15. package/dist/CurrencyRateController.mjs.map +1 -1
  16. package/dist/DeFiPositionsController/DeFiPositionsController.cjs +4 -0
  17. package/dist/DeFiPositionsController/DeFiPositionsController.cjs.map +1 -1
  18. package/dist/DeFiPositionsController/DeFiPositionsController.d.cts.map +1 -1
  19. package/dist/DeFiPositionsController/DeFiPositionsController.d.mts.map +1 -1
  20. package/dist/DeFiPositionsController/DeFiPositionsController.mjs +4 -0
  21. package/dist/DeFiPositionsController/DeFiPositionsController.mjs.map +1 -1
  22. package/dist/MultichainAssetsController/MultichainAssetsController.cjs +4 -0
  23. package/dist/MultichainAssetsController/MultichainAssetsController.cjs.map +1 -1
  24. package/dist/MultichainAssetsController/MultichainAssetsController.d.cts.map +1 -1
  25. package/dist/MultichainAssetsController/MultichainAssetsController.d.mts.map +1 -1
  26. package/dist/MultichainAssetsController/MultichainAssetsController.mjs +4 -0
  27. package/dist/MultichainAssetsController/MultichainAssetsController.mjs.map +1 -1
  28. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.cjs +12 -2
  29. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.cjs.map +1 -1
  30. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.cts.map +1 -1
  31. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.mts.map +1 -1
  32. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.mjs +12 -2
  33. package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.mjs.map +1 -1
  34. package/dist/MultichainBalancesController/MultichainBalancesController.cjs +2 -0
  35. package/dist/MultichainBalancesController/MultichainBalancesController.cjs.map +1 -1
  36. package/dist/MultichainBalancesController/MultichainBalancesController.d.cts.map +1 -1
  37. package/dist/MultichainBalancesController/MultichainBalancesController.d.mts.map +1 -1
  38. package/dist/MultichainBalancesController/MultichainBalancesController.mjs +2 -0
  39. package/dist/MultichainBalancesController/MultichainBalancesController.mjs.map +1 -1
  40. package/dist/NftController.cjs +18 -3
  41. package/dist/NftController.cjs.map +1 -1
  42. package/dist/NftController.d.cts.map +1 -1
  43. package/dist/NftController.d.mts.map +1 -1
  44. package/dist/NftController.mjs +18 -3
  45. package/dist/NftController.mjs.map +1 -1
  46. package/dist/RatesController/RatesController.cjs +18 -3
  47. package/dist/RatesController/RatesController.cjs.map +1 -1
  48. package/dist/RatesController/RatesController.d.cts.map +1 -1
  49. package/dist/RatesController/RatesController.d.mts.map +1 -1
  50. package/dist/RatesController/RatesController.mjs +18 -3
  51. package/dist/RatesController/RatesController.mjs.map +1 -1
  52. package/dist/TokenBalancesController.cjs +154 -6
  53. package/dist/TokenBalancesController.cjs.map +1 -1
  54. package/dist/TokenBalancesController.d.cts +55 -4
  55. package/dist/TokenBalancesController.d.cts.map +1 -1
  56. package/dist/TokenBalancesController.d.mts +55 -4
  57. package/dist/TokenBalancesController.d.mts.map +1 -1
  58. package/dist/TokenBalancesController.mjs +154 -6
  59. package/dist/TokenBalancesController.mjs.map +1 -1
  60. package/dist/TokenListController.cjs +12 -2
  61. package/dist/TokenListController.cjs.map +1 -1
  62. package/dist/TokenListController.d.cts.map +1 -1
  63. package/dist/TokenListController.d.mts.map +1 -1
  64. package/dist/TokenListController.mjs +12 -2
  65. package/dist/TokenListController.mjs.map +1 -1
  66. package/dist/TokenRatesController.cjs +6 -1
  67. package/dist/TokenRatesController.cjs.map +1 -1
  68. package/dist/TokenRatesController.d.cts.map +1 -1
  69. package/dist/TokenRatesController.d.mts.map +1 -1
  70. package/dist/TokenRatesController.mjs +6 -1
  71. package/dist/TokenRatesController.mjs.map +1 -1
  72. package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.cjs +12 -2
  73. package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.cjs.map +1 -1
  74. package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.cts.map +1 -1
  75. package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.mts.map +1 -1
  76. package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.mjs +12 -2
  77. package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.mjs.map +1 -1
  78. package/dist/TokensController.cjs +6 -0
  79. package/dist/TokensController.cjs.map +1 -1
  80. package/dist/TokensController.d.cts.map +1 -1
  81. package/dist/TokensController.d.mts.map +1 -1
  82. package/dist/TokensController.mjs +6 -0
  83. package/dist/TokensController.mjs.map +1 -1
  84. package/package.json +9 -9
@@ -14,7 +14,15 @@ export type TokenBalancesControllerState = {
14
14
  tokenBalances: TokenBalances;
15
15
  };
16
16
  export type TokenBalancesControllerGetStateAction = ControllerGetStateAction<typeof CONTROLLER, TokenBalancesControllerState>;
17
- export type TokenBalancesControllerActions = TokenBalancesControllerGetStateAction;
17
+ export type TokenBalancesControllerUpdateChainPollingConfigsAction = {
18
+ type: `TokenBalancesController:updateChainPollingConfigs`;
19
+ handler: TokenBalancesController['updateChainPollingConfigs'];
20
+ };
21
+ export type TokenBalancesControllerGetChainPollingConfigAction = {
22
+ type: `TokenBalancesController:getChainPollingConfig`;
23
+ handler: TokenBalancesController['getChainPollingConfig'];
24
+ };
25
+ export type TokenBalancesControllerActions = TokenBalancesControllerGetStateAction | TokenBalancesControllerUpdateChainPollingConfigsAction | TokenBalancesControllerGetChainPollingConfigAction;
18
26
  export type TokenBalancesControllerStateChangeEvent = ControllerStateChangeEvent<typeof CONTROLLER, TokenBalancesControllerState>;
19
27
  export type NativeBalanceEvent = {
20
28
  type: `${typeof CONTROLLER}:updatedNativeBalance`;
@@ -24,14 +32,25 @@ export type TokenBalancesControllerEvents = TokenBalancesControllerStateChangeEv
24
32
  export type AllowedActions = NetworkControllerGetNetworkClientByIdAction | NetworkControllerGetStateAction | TokensControllerGetStateAction | PreferencesControllerGetStateAction | AccountsControllerGetSelectedAccountAction | AccountsControllerListAccountsAction | AccountTrackerUpdateNativeBalancesAction | AccountTrackerUpdateStakedBalancesAction;
25
33
  export type AllowedEvents = TokensControllerStateChangeEvent | PreferencesControllerStateChangeEvent | NetworkControllerStateChangeEvent | KeyringControllerAccountRemovedEvent;
26
34
  export type TokenBalancesControllerMessenger = RestrictedMessenger<typeof CONTROLLER, TokenBalancesControllerActions | AllowedActions, TokenBalancesControllerEvents | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
35
+ export type ChainPollingConfig = {
36
+ /** Polling interval in milliseconds for this chain */
37
+ interval: number;
38
+ };
39
+ export type UpdateChainPollingConfigsOptions = {
40
+ /** Whether to immediately fetch balances after updating configs (default: true) */
41
+ immediateUpdate?: boolean;
42
+ };
27
43
  export type TokenBalancesControllerOptions = {
28
44
  messenger: TokenBalancesControllerMessenger;
45
+ /** Default interval for chains not specified in chainPollingIntervals */
29
46
  interval?: number;
47
+ /** Per-chain polling configuration */
48
+ chainPollingIntervals?: Record<ChainIdHex, ChainPollingConfig>;
30
49
  state?: Partial<TokenBalancesControllerState>;
31
50
  /** When `true`, balances for *all* known accounts are queried. */
32
51
  queryMultipleAccounts?: boolean;
33
- /** Enable AccountsAPI strategy (if supported chain). */
34
- useAccountsAPI?: boolean;
52
+ /** Array of chainIds that should use Accounts-API strategy (if supported by API). */
53
+ accountsApiChainIds?: ChainIdHex[];
35
54
  /** Disable external HTTP calls (privacy / offline mode). */
36
55
  allowExternalServices?: () => boolean;
37
56
  /** Custom logger. */
@@ -66,14 +85,46 @@ declare const TokenBalancesController_base: (abstract new (...args: any[]) => {
66
85
  }) & typeof import("@metamask/base-controller").BaseController;
67
86
  export declare class TokenBalancesController extends TokenBalancesController_base<typeof CONTROLLER, TokenBalancesControllerState, TokenBalancesControllerMessenger> {
68
87
  #private;
69
- constructor({ messenger, interval, state, queryMultipleAccounts, useAccountsAPI, allowExternalServices, }: TokenBalancesControllerOptions);
88
+ constructor({ messenger, interval, chainPollingIntervals, state, queryMultipleAccounts, accountsApiChainIds, allowExternalServices, }: TokenBalancesControllerOptions);
89
+ /**
90
+ * Override to support per-chain polling intervals by grouping chains by interval
91
+ *
92
+ * @param options0 - The polling options
93
+ * @param options0.chainIds - Chain IDs to start polling for
94
+ */
95
+ _startPolling({ chainIds }: {
96
+ chainIds: ChainIdHex[];
97
+ }): void;
98
+ /**
99
+ * Override to handle our custom polling approach
100
+ */
101
+ _stopPollingByPollingTokenSetId(): void;
102
+ /**
103
+ * Get polling configuration for a chain (includes default fallback)
104
+ *
105
+ * @param chainId - The chain ID to get config for
106
+ * @returns The polling configuration for the chain
107
+ */
108
+ getChainPollingConfig(chainId: ChainIdHex): ChainPollingConfig;
70
109
  _executePoll({ chainIds }: {
71
110
  chainIds: ChainIdHex[];
72
111
  }): Promise<void>;
112
+ /**
113
+ * Update multiple chain polling configurations at once
114
+ *
115
+ * @param configs - Object mapping chain IDs to polling configurations
116
+ * @param options - Optional configuration for the update behavior
117
+ * @param options.immediateUpdate - Whether to immediately fetch balances after updating configs (default: true)
118
+ */
119
+ updateChainPollingConfigs(configs: Record<ChainIdHex, ChainPollingConfig>, options?: UpdateChainPollingConfigsOptions): void;
73
120
  updateBalances({ chainIds }?: {
74
121
  chainIds?: ChainIdHex[];
75
122
  }): Promise<void>;
76
123
  resetState(): void;
124
+ /**
125
+ * Clean up all timers and resources when controller is destroyed
126
+ */
127
+ destroy(): void;
77
128
  }
78
129
  export default TokenBalancesController;
79
130
  //# sourceMappingURL=TokenBalancesController.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TokenBalancesController.d.cts","sourceRoot":"","sources":["../src/TokenBalancesController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TokenBalancesController.d.cts","sourceRoot":"","sources":["../src/TokenBalancesController.ts"],"names":[],"mappings":"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"}
@@ -14,7 +14,15 @@ export type TokenBalancesControllerState = {
14
14
  tokenBalances: TokenBalances;
15
15
  };
16
16
  export type TokenBalancesControllerGetStateAction = ControllerGetStateAction<typeof CONTROLLER, TokenBalancesControllerState>;
17
- export type TokenBalancesControllerActions = TokenBalancesControllerGetStateAction;
17
+ export type TokenBalancesControllerUpdateChainPollingConfigsAction = {
18
+ type: `TokenBalancesController:updateChainPollingConfigs`;
19
+ handler: TokenBalancesController['updateChainPollingConfigs'];
20
+ };
21
+ export type TokenBalancesControllerGetChainPollingConfigAction = {
22
+ type: `TokenBalancesController:getChainPollingConfig`;
23
+ handler: TokenBalancesController['getChainPollingConfig'];
24
+ };
25
+ export type TokenBalancesControllerActions = TokenBalancesControllerGetStateAction | TokenBalancesControllerUpdateChainPollingConfigsAction | TokenBalancesControllerGetChainPollingConfigAction;
18
26
  export type TokenBalancesControllerStateChangeEvent = ControllerStateChangeEvent<typeof CONTROLLER, TokenBalancesControllerState>;
19
27
  export type NativeBalanceEvent = {
20
28
  type: `${typeof CONTROLLER}:updatedNativeBalance`;
@@ -24,14 +32,25 @@ export type TokenBalancesControllerEvents = TokenBalancesControllerStateChangeEv
24
32
  export type AllowedActions = NetworkControllerGetNetworkClientByIdAction | NetworkControllerGetStateAction | TokensControllerGetStateAction | PreferencesControllerGetStateAction | AccountsControllerGetSelectedAccountAction | AccountsControllerListAccountsAction | AccountTrackerUpdateNativeBalancesAction | AccountTrackerUpdateStakedBalancesAction;
25
33
  export type AllowedEvents = TokensControllerStateChangeEvent | PreferencesControllerStateChangeEvent | NetworkControllerStateChangeEvent | KeyringControllerAccountRemovedEvent;
26
34
  export type TokenBalancesControllerMessenger = RestrictedMessenger<typeof CONTROLLER, TokenBalancesControllerActions | AllowedActions, TokenBalancesControllerEvents | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
35
+ export type ChainPollingConfig = {
36
+ /** Polling interval in milliseconds for this chain */
37
+ interval: number;
38
+ };
39
+ export type UpdateChainPollingConfigsOptions = {
40
+ /** Whether to immediately fetch balances after updating configs (default: true) */
41
+ immediateUpdate?: boolean;
42
+ };
27
43
  export type TokenBalancesControllerOptions = {
28
44
  messenger: TokenBalancesControllerMessenger;
45
+ /** Default interval for chains not specified in chainPollingIntervals */
29
46
  interval?: number;
47
+ /** Per-chain polling configuration */
48
+ chainPollingIntervals?: Record<ChainIdHex, ChainPollingConfig>;
30
49
  state?: Partial<TokenBalancesControllerState>;
31
50
  /** When `true`, balances for *all* known accounts are queried. */
32
51
  queryMultipleAccounts?: boolean;
33
- /** Enable AccountsAPI strategy (if supported chain). */
34
- useAccountsAPI?: boolean;
52
+ /** Array of chainIds that should use Accounts-API strategy (if supported by API). */
53
+ accountsApiChainIds?: ChainIdHex[];
35
54
  /** Disable external HTTP calls (privacy / offline mode). */
36
55
  allowExternalServices?: () => boolean;
37
56
  /** Custom logger. */
@@ -66,14 +85,46 @@ declare const TokenBalancesController_base: (abstract new (...args: any[]) => {
66
85
  }) & typeof import("@metamask/base-controller").BaseController;
67
86
  export declare class TokenBalancesController extends TokenBalancesController_base<typeof CONTROLLER, TokenBalancesControllerState, TokenBalancesControllerMessenger> {
68
87
  #private;
69
- constructor({ messenger, interval, state, queryMultipleAccounts, useAccountsAPI, allowExternalServices, }: TokenBalancesControllerOptions);
88
+ constructor({ messenger, interval, chainPollingIntervals, state, queryMultipleAccounts, accountsApiChainIds, allowExternalServices, }: TokenBalancesControllerOptions);
89
+ /**
90
+ * Override to support per-chain polling intervals by grouping chains by interval
91
+ *
92
+ * @param options0 - The polling options
93
+ * @param options0.chainIds - Chain IDs to start polling for
94
+ */
95
+ _startPolling({ chainIds }: {
96
+ chainIds: ChainIdHex[];
97
+ }): void;
98
+ /**
99
+ * Override to handle our custom polling approach
100
+ */
101
+ _stopPollingByPollingTokenSetId(): void;
102
+ /**
103
+ * Get polling configuration for a chain (includes default fallback)
104
+ *
105
+ * @param chainId - The chain ID to get config for
106
+ * @returns The polling configuration for the chain
107
+ */
108
+ getChainPollingConfig(chainId: ChainIdHex): ChainPollingConfig;
70
109
  _executePoll({ chainIds }: {
71
110
  chainIds: ChainIdHex[];
72
111
  }): Promise<void>;
112
+ /**
113
+ * Update multiple chain polling configurations at once
114
+ *
115
+ * @param configs - Object mapping chain IDs to polling configurations
116
+ * @param options - Optional configuration for the update behavior
117
+ * @param options.immediateUpdate - Whether to immediately fetch balances after updating configs (default: true)
118
+ */
119
+ updateChainPollingConfigs(configs: Record<ChainIdHex, ChainPollingConfig>, options?: UpdateChainPollingConfigsOptions): void;
73
120
  updateBalances({ chainIds }?: {
74
121
  chainIds?: ChainIdHex[];
75
122
  }): Promise<void>;
76
123
  resetState(): void;
124
+ /**
125
+ * Clean up all timers and resources when controller is destroyed
126
+ */
127
+ destroy(): void;
77
128
  }
78
129
  export default TokenBalancesController;
79
130
  //# sourceMappingURL=TokenBalancesController.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TokenBalancesController.d.mts","sourceRoot":"","sources":["../src/TokenBalancesController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TokenBalancesController.d.mts","sourceRoot":"","sources":["../src/TokenBalancesController.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _TokenBalancesController_instances, _TokenBalancesController_queryAllAccounts, _TokenBalancesController_balanceFetchers, _TokenBalancesController_allTokens, _TokenBalancesController_detectedTokens, _TokenBalancesController_chainIdsWithTokens, _TokenBalancesController_getProvider, _TokenBalancesController_getNetworkClient, _TokenBalancesController_onTokensChanged, _TokenBalancesController_onNetworkChanged, _TokenBalancesController_onAccountRemoved;
12
+ var _TokenBalancesController_instances, _TokenBalancesController_queryAllAccounts, _TokenBalancesController_accountsApiChainIds, _TokenBalancesController_balanceFetchers, _TokenBalancesController_allTokens, _TokenBalancesController_detectedTokens, _TokenBalancesController_defaultInterval, _TokenBalancesController_chainPollingConfig, _TokenBalancesController_intervalPollingTimers, _TokenBalancesController_isControllerPollingActive, _TokenBalancesController_requestedChainIds, _TokenBalancesController_chainIdsWithTokens, _TokenBalancesController_getProvider, _TokenBalancesController_getNetworkClient, _TokenBalancesController_createAccountsApiFetcher, _TokenBalancesController_startIntervalGroupPolling, _TokenBalancesController_startPollingForInterval, _TokenBalancesController_setPollingTimer, _TokenBalancesController_onTokensChanged, _TokenBalancesController_onNetworkChanged, _TokenBalancesController_onAccountRemoved;
13
13
  import { Web3Provider } from "@ethersproject/providers";
14
14
  import { BNToHex, isValidHexAddress, toChecksumHexAddress, toHex } from "@metamask/controller-utils";
15
15
  import { StaticIntervalPollingController } from "@metamask/polling-controller";
@@ -23,7 +23,12 @@ import { RpcBalanceFetcher } from "./rpc-service/rpc-balance-fetcher.mjs";
23
23
  const CONTROLLER = 'TokenBalancesController';
24
24
  const DEFAULT_INTERVAL_MS = 180000; // 3 minutes
25
25
  const metadata = {
26
- tokenBalances: { persist: true, anonymous: false },
26
+ tokenBalances: {
27
+ includeInStateLogs: false,
28
+ persist: true,
29
+ anonymous: false,
30
+ usedInUi: true,
31
+ },
27
32
  };
28
33
  // endregion
29
34
  // ────────────────────────────────────────────────────────────────────────────
@@ -35,7 +40,7 @@ const checksum = (addr) => toChecksumHexAddress(addr);
35
40
  // ────────────────────────────────────────────────────────────────────────────
36
41
  // region: Main controller
37
42
  export class TokenBalancesController extends StaticIntervalPollingController() {
38
- constructor({ messenger, interval = DEFAULT_INTERVAL_MS, state = {}, queryMultipleAccounts = true, useAccountsAPI = false, allowExternalServices = () => true, }) {
43
+ constructor({ messenger, interval = DEFAULT_INTERVAL_MS, chainPollingIntervals = {}, state = {}, queryMultipleAccounts = true, accountsApiChainIds = [], allowExternalServices = () => true, }) {
39
44
  super({
40
45
  name: CONTROLLER,
41
46
  messenger,
@@ -44,9 +49,20 @@ export class TokenBalancesController extends StaticIntervalPollingController() {
44
49
  });
45
50
  _TokenBalancesController_instances.add(this);
46
51
  _TokenBalancesController_queryAllAccounts.set(this, void 0);
52
+ _TokenBalancesController_accountsApiChainIds.set(this, void 0);
47
53
  _TokenBalancesController_balanceFetchers.set(this, void 0);
48
54
  _TokenBalancesController_allTokens.set(this, {});
49
55
  _TokenBalancesController_detectedTokens.set(this, {});
56
+ /** Default polling interval for chains without specific configuration */
57
+ _TokenBalancesController_defaultInterval.set(this, void 0);
58
+ /** Per-chain polling configuration */
59
+ _TokenBalancesController_chainPollingConfig.set(this, void 0);
60
+ /** Active polling timers grouped by interval */
61
+ _TokenBalancesController_intervalPollingTimers.set(this, new Map());
62
+ /** Track if controller-level polling is active */
63
+ _TokenBalancesController_isControllerPollingActive.set(this, false);
64
+ /** Store original chainIds from startPolling to preserve intent */
65
+ _TokenBalancesController_requestedChainIds.set(this, []);
50
66
  _TokenBalancesController_getProvider.set(this, (chainId) => {
51
67
  const { networkConfigurationsByChainId } = this.messagingSystem.call('NetworkController:getState');
52
68
  const cfg = networkConfigurationsByChainId[chainId];
@@ -60,6 +76,24 @@ export class TokenBalancesController extends StaticIntervalPollingController() {
60
76
  const { networkClientId } = cfg.rpcEndpoints[cfg.defaultRpcEndpointIndex];
61
77
  return this.messagingSystem.call('NetworkController:getNetworkClientById', networkClientId);
62
78
  });
79
+ /**
80
+ * Creates an AccountsApiBalanceFetcher that only supports chains in the accountsApiChainIds array
81
+ *
82
+ * @returns A BalanceFetcher that wraps AccountsApiBalanceFetcher with chainId filtering
83
+ */
84
+ _TokenBalancesController_createAccountsApiFetcher.set(this, () => {
85
+ const originalFetcher = new AccountsApiBalanceFetcher('extension', __classPrivateFieldGet(this, _TokenBalancesController_getProvider, "f"));
86
+ return {
87
+ supports: (chainId) => {
88
+ // Only support chains that are both:
89
+ // 1. In our specified accountsApiChainIds array
90
+ // 2. Actually supported by the AccountsApi
91
+ return (__classPrivateFieldGet(this, _TokenBalancesController_accountsApiChainIds, "f").includes(chainId) &&
92
+ originalFetcher.supports(chainId));
93
+ },
94
+ fetch: originalFetcher.fetch.bind(originalFetcher),
95
+ };
96
+ });
63
97
  _TokenBalancesController_onTokensChanged.set(this, async (state) => {
64
98
  const changed = [];
65
99
  let hasChanges = false;
@@ -174,10 +208,13 @@ export class TokenBalancesController extends StaticIntervalPollingController() {
174
208
  });
175
209
  });
176
210
  __classPrivateFieldSet(this, _TokenBalancesController_queryAllAccounts, queryMultipleAccounts, "f");
211
+ __classPrivateFieldSet(this, _TokenBalancesController_accountsApiChainIds, [...accountsApiChainIds], "f");
212
+ __classPrivateFieldSet(this, _TokenBalancesController_defaultInterval, interval, "f");
213
+ __classPrivateFieldSet(this, _TokenBalancesController_chainPollingConfig, { ...chainPollingIntervals }, "f");
177
214
  // Strategy order: API first, then RPC fallback
178
215
  __classPrivateFieldSet(this, _TokenBalancesController_balanceFetchers, [
179
- ...(useAccountsAPI && allowExternalServices()
180
- ? [new AccountsApiBalanceFetcher('extension', __classPrivateFieldGet(this, _TokenBalancesController_getProvider, "f"))]
216
+ ...(accountsApiChainIds.length > 0 && allowExternalServices()
217
+ ? [__classPrivateFieldGet(this, _TokenBalancesController_createAccountsApiFetcher, "f").call(this)]
181
218
  : []),
182
219
  new RpcBalanceFetcher(__classPrivateFieldGet(this, _TokenBalancesController_getProvider, "f"), __classPrivateFieldGet(this, _TokenBalancesController_getNetworkClient, "f"), () => ({
183
220
  allTokens: __classPrivateFieldGet(this, _TokenBalancesController_allTokens, "f"),
@@ -196,10 +233,61 @@ export class TokenBalancesController extends StaticIntervalPollingController() {
196
233
  });
197
234
  this.messagingSystem.subscribe('NetworkController:stateChange', __classPrivateFieldGet(this, _TokenBalancesController_onNetworkChanged, "f"));
198
235
  this.messagingSystem.subscribe('KeyringController:accountRemoved', __classPrivateFieldGet(this, _TokenBalancesController_onAccountRemoved, "f"));
236
+ // Register action handlers for polling interval control
237
+ this.messagingSystem.registerActionHandler(`TokenBalancesController:updateChainPollingConfigs`, this.updateChainPollingConfigs.bind(this));
238
+ this.messagingSystem.registerActionHandler(`TokenBalancesController:getChainPollingConfig`, this.getChainPollingConfig.bind(this));
239
+ }
240
+ /**
241
+ * Override to support per-chain polling intervals by grouping chains by interval
242
+ *
243
+ * @param options0 - The polling options
244
+ * @param options0.chainIds - Chain IDs to start polling for
245
+ */
246
+ _startPolling({ chainIds }) {
247
+ // Store the original chainIds to preserve intent across config updates
248
+ __classPrivateFieldSet(this, _TokenBalancesController_requestedChainIds, [...chainIds], "f");
249
+ __classPrivateFieldSet(this, _TokenBalancesController_isControllerPollingActive, true, "f");
250
+ __classPrivateFieldGet(this, _TokenBalancesController_instances, "m", _TokenBalancesController_startIntervalGroupPolling).call(this, chainIds, true);
251
+ }
252
+ /**
253
+ * Override to handle our custom polling approach
254
+ */
255
+ _stopPollingByPollingTokenSetId() {
256
+ __classPrivateFieldSet(this, _TokenBalancesController_isControllerPollingActive, false, "f");
257
+ __classPrivateFieldSet(this, _TokenBalancesController_requestedChainIds, [], "f"); // Clear original intent when stopping
258
+ __classPrivateFieldGet(this, _TokenBalancesController_intervalPollingTimers, "f").forEach((timer) => clearInterval(timer));
259
+ __classPrivateFieldGet(this, _TokenBalancesController_intervalPollingTimers, "f").clear();
260
+ }
261
+ /**
262
+ * Get polling configuration for a chain (includes default fallback)
263
+ *
264
+ * @param chainId - The chain ID to get config for
265
+ * @returns The polling configuration for the chain
266
+ */
267
+ getChainPollingConfig(chainId) {
268
+ return (__classPrivateFieldGet(this, _TokenBalancesController_chainPollingConfig, "f")[chainId] ?? {
269
+ interval: __classPrivateFieldGet(this, _TokenBalancesController_defaultInterval, "f"),
270
+ });
199
271
  }
200
272
  async _executePoll({ chainIds }) {
273
+ // This won't be called with our custom implementation, but keep for compatibility
201
274
  await this.updateBalances({ chainIds });
202
275
  }
276
+ /**
277
+ * Update multiple chain polling configurations at once
278
+ *
279
+ * @param configs - Object mapping chain IDs to polling configurations
280
+ * @param options - Optional configuration for the update behavior
281
+ * @param options.immediateUpdate - Whether to immediately fetch balances after updating configs (default: true)
282
+ */
283
+ updateChainPollingConfigs(configs, options = { immediateUpdate: true }) {
284
+ Object.assign(__classPrivateFieldGet(this, _TokenBalancesController_chainPollingConfig, "f"), configs);
285
+ // If polling is currently active, restart with new interval groupings
286
+ if (__classPrivateFieldGet(this, _TokenBalancesController_isControllerPollingActive, "f")) {
287
+ // Restart polling with immediate fetch by default, unless explicitly disabled
288
+ __classPrivateFieldGet(this, _TokenBalancesController_instances, "m", _TokenBalancesController_startIntervalGroupPolling).call(this, __classPrivateFieldGet(this, _TokenBalancesController_requestedChainIds, "f"), options.immediateUpdate);
289
+ }
290
+ }
203
291
  async updateBalances({ chainIds } = {}) {
204
292
  const targetChains = chainIds ?? __classPrivateFieldGet(this, _TokenBalancesController_instances, "m", _TokenBalancesController_chainIdsWithTokens).call(this);
205
293
  if (!targetChains.length) {
@@ -310,14 +398,74 @@ export class TokenBalancesController extends StaticIntervalPollingController() {
310
398
  resetState() {
311
399
  this.update(() => ({ tokenBalances: {} }));
312
400
  }
401
+ /**
402
+ * Clean up all timers and resources when controller is destroyed
403
+ */
404
+ destroy() {
405
+ __classPrivateFieldSet(this, _TokenBalancesController_isControllerPollingActive, false, "f");
406
+ __classPrivateFieldGet(this, _TokenBalancesController_intervalPollingTimers, "f").forEach((timer) => clearInterval(timer));
407
+ __classPrivateFieldGet(this, _TokenBalancesController_intervalPollingTimers, "f").clear();
408
+ // Unregister action handlers
409
+ this.messagingSystem.unregisterActionHandler(`TokenBalancesController:updateChainPollingConfigs`);
410
+ this.messagingSystem.unregisterActionHandler(`TokenBalancesController:getChainPollingConfig`);
411
+ super.destroy();
412
+ }
313
413
  }
314
- _TokenBalancesController_queryAllAccounts = new WeakMap(), _TokenBalancesController_balanceFetchers = new WeakMap(), _TokenBalancesController_allTokens = new WeakMap(), _TokenBalancesController_detectedTokens = new WeakMap(), _TokenBalancesController_getProvider = new WeakMap(), _TokenBalancesController_getNetworkClient = new WeakMap(), _TokenBalancesController_onTokensChanged = new WeakMap(), _TokenBalancesController_onNetworkChanged = new WeakMap(), _TokenBalancesController_onAccountRemoved = new WeakMap(), _TokenBalancesController_instances = new WeakSet(), _TokenBalancesController_chainIdsWithTokens = function _TokenBalancesController_chainIdsWithTokens() {
414
+ _TokenBalancesController_queryAllAccounts = new WeakMap(), _TokenBalancesController_accountsApiChainIds = new WeakMap(), _TokenBalancesController_balanceFetchers = new WeakMap(), _TokenBalancesController_allTokens = new WeakMap(), _TokenBalancesController_detectedTokens = new WeakMap(), _TokenBalancesController_defaultInterval = new WeakMap(), _TokenBalancesController_chainPollingConfig = new WeakMap(), _TokenBalancesController_intervalPollingTimers = new WeakMap(), _TokenBalancesController_isControllerPollingActive = new WeakMap(), _TokenBalancesController_requestedChainIds = new WeakMap(), _TokenBalancesController_getProvider = new WeakMap(), _TokenBalancesController_getNetworkClient = new WeakMap(), _TokenBalancesController_createAccountsApiFetcher = new WeakMap(), _TokenBalancesController_onTokensChanged = new WeakMap(), _TokenBalancesController_onNetworkChanged = new WeakMap(), _TokenBalancesController_onAccountRemoved = new WeakMap(), _TokenBalancesController_instances = new WeakSet(), _TokenBalancesController_chainIdsWithTokens = function _TokenBalancesController_chainIdsWithTokens() {
315
415
  return [
316
416
  ...new Set([
317
417
  ...Object.keys(__classPrivateFieldGet(this, _TokenBalancesController_allTokens, "f")),
318
418
  ...Object.keys(__classPrivateFieldGet(this, _TokenBalancesController_detectedTokens, "f")),
319
419
  ]),
320
420
  ];
421
+ }, _TokenBalancesController_startIntervalGroupPolling = function _TokenBalancesController_startIntervalGroupPolling(chainIds, immediate = true) {
422
+ // Stop any existing interval timers
423
+ __classPrivateFieldGet(this, _TokenBalancesController_intervalPollingTimers, "f").forEach((timer) => clearInterval(timer));
424
+ __classPrivateFieldGet(this, _TokenBalancesController_intervalPollingTimers, "f").clear();
425
+ // Group chains by their polling intervals
426
+ const intervalGroups = new Map();
427
+ for (const chainId of chainIds) {
428
+ const config = this.getChainPollingConfig(chainId);
429
+ const existing = intervalGroups.get(config.interval) || [];
430
+ existing.push(chainId);
431
+ intervalGroups.set(config.interval, existing);
432
+ }
433
+ // Start separate polling loop for each interval group
434
+ for (const [interval, chainIdsGroup] of intervalGroups) {
435
+ __classPrivateFieldGet(this, _TokenBalancesController_instances, "m", _TokenBalancesController_startPollingForInterval).call(this, interval, chainIdsGroup, immediate);
436
+ }
437
+ }, _TokenBalancesController_startPollingForInterval = function _TokenBalancesController_startPollingForInterval(interval, chainIds, immediate = true) {
438
+ const pollFunction = async () => {
439
+ if (!__classPrivateFieldGet(this, _TokenBalancesController_isControllerPollingActive, "f")) {
440
+ return;
441
+ }
442
+ try {
443
+ await this._executePoll({ chainIds });
444
+ }
445
+ catch (error) {
446
+ console.warn(`Polling failed for chains ${chainIds.join(', ')} with interval ${interval}:`, error);
447
+ }
448
+ };
449
+ // Poll immediately first if requested
450
+ if (immediate) {
451
+ pollFunction().catch((error) => {
452
+ console.warn(`Immediate polling failed for chains ${chainIds.join(', ')}:`, error);
453
+ });
454
+ }
455
+ // Then start regular interval polling
456
+ __classPrivateFieldGet(this, _TokenBalancesController_instances, "m", _TokenBalancesController_setPollingTimer).call(this, interval, chainIds, pollFunction);
457
+ }, _TokenBalancesController_setPollingTimer = function _TokenBalancesController_setPollingTimer(interval, chainIds, pollFunction) {
458
+ // Clear any existing timer for this interval first
459
+ const existingTimer = __classPrivateFieldGet(this, _TokenBalancesController_intervalPollingTimers, "f").get(interval);
460
+ if (existingTimer) {
461
+ clearInterval(existingTimer);
462
+ }
463
+ const timer = setInterval(() => {
464
+ pollFunction().catch((error) => {
465
+ console.warn(`Interval polling failed for chains ${chainIds.join(', ')}:`, error);
466
+ });
467
+ }, interval);
468
+ __classPrivateFieldGet(this, _TokenBalancesController_intervalPollingTimers, "f").set(interval, timer);
321
469
  };
322
470
  export default TokenBalancesController;
323
471
  //# sourceMappingURL=TokenBalancesController.mjs.map