@metamask/assets-controllers 100.1.0 → 100.2.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 (64) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/dist/AccountTrackerController.cjs +25 -4
  3. package/dist/AccountTrackerController.cjs.map +1 -1
  4. package/dist/AccountTrackerController.d.cts +5 -2
  5. package/dist/AccountTrackerController.d.cts.map +1 -1
  6. package/dist/AccountTrackerController.d.mts +5 -2
  7. package/dist/AccountTrackerController.d.mts.map +1 -1
  8. package/dist/AccountTrackerController.mjs +26 -5
  9. package/dist/AccountTrackerController.mjs.map +1 -1
  10. package/dist/NftController.cjs +198 -150
  11. package/dist/NftController.cjs.map +1 -1
  12. package/dist/NftController.d.cts.map +1 -1
  13. package/dist/NftController.d.mts.map +1 -1
  14. package/dist/NftController.mjs +198 -150
  15. package/dist/NftController.mjs.map +1 -1
  16. package/dist/TokenBalancesController.cjs +51 -12
  17. package/dist/TokenBalancesController.cjs.map +1 -1
  18. package/dist/TokenBalancesController.d.cts.map +1 -1
  19. package/dist/TokenBalancesController.d.mts.map +1 -1
  20. package/dist/TokenBalancesController.mjs +51 -12
  21. package/dist/TokenBalancesController.mjs.map +1 -1
  22. package/dist/TokenDetectionController.cjs +0 -2
  23. package/dist/TokenDetectionController.cjs.map +1 -1
  24. package/dist/TokenDetectionController.d.cts.map +1 -1
  25. package/dist/TokenDetectionController.d.mts.map +1 -1
  26. package/dist/TokenDetectionController.mjs +0 -2
  27. package/dist/TokenDetectionController.mjs.map +1 -1
  28. package/dist/TokenListController.cjs +38 -5
  29. package/dist/TokenListController.cjs.map +1 -1
  30. package/dist/TokenListController.d.cts.map +1 -1
  31. package/dist/TokenListController.d.mts.map +1 -1
  32. package/dist/TokenListController.mjs +38 -5
  33. package/dist/TokenListController.mjs.map +1 -1
  34. package/dist/balances.cjs +46 -12
  35. package/dist/balances.cjs.map +1 -1
  36. package/dist/balances.d.cts +14 -3
  37. package/dist/balances.d.cts.map +1 -1
  38. package/dist/balances.d.mts +14 -3
  39. package/dist/balances.d.mts.map +1 -1
  40. package/dist/balances.mjs +46 -12
  41. package/dist/balances.mjs.map +1 -1
  42. package/dist/index.cjs.map +1 -1
  43. package/dist/index.d.cts +1 -1
  44. package/dist/index.d.cts.map +1 -1
  45. package/dist/index.d.mts +1 -1
  46. package/dist/index.d.mts.map +1 -1
  47. package/dist/index.mjs.map +1 -1
  48. package/dist/multi-chain-accounts-service/api-balance-fetcher.cjs +18 -9
  49. package/dist/multi-chain-accounts-service/api-balance-fetcher.cjs.map +1 -1
  50. package/dist/multi-chain-accounts-service/api-balance-fetcher.d.cts +10 -0
  51. package/dist/multi-chain-accounts-service/api-balance-fetcher.d.cts.map +1 -1
  52. package/dist/multi-chain-accounts-service/api-balance-fetcher.d.mts +10 -0
  53. package/dist/multi-chain-accounts-service/api-balance-fetcher.d.mts.map +1 -1
  54. package/dist/multi-chain-accounts-service/api-balance-fetcher.mjs +18 -9
  55. package/dist/multi-chain-accounts-service/api-balance-fetcher.mjs.map +1 -1
  56. package/dist/rpc-service/rpc-balance-fetcher.cjs +99 -58
  57. package/dist/rpc-service/rpc-balance-fetcher.cjs.map +1 -1
  58. package/dist/rpc-service/rpc-balance-fetcher.d.cts +4 -1
  59. package/dist/rpc-service/rpc-balance-fetcher.d.cts.map +1 -1
  60. package/dist/rpc-service/rpc-balance-fetcher.d.mts +4 -1
  61. package/dist/rpc-service/rpc-balance-fetcher.d.mts.map +1 -1
  62. package/dist/rpc-service/rpc-balance-fetcher.mjs +99 -58
  63. package/dist/rpc-service/rpc-balance-fetcher.mjs.map +1 -1
  64. package/package.json +7 -7
package/dist/balances.cjs CHANGED
@@ -50,9 +50,10 @@ const isNonNaNNumber = (value) => typeof value === 'number' && !Number.isNaN(val
50
50
  * @param tokenRatesState - Token rates state.
51
51
  * @param currencyRateState - Currency rate state.
52
52
  * @param isEvmChainEnabled - Predicate to check EVM chain enablement.
53
+ * @param networkConfigurationsByChainId - Network configurations keyed by chain ID, used to look up native currency for fallback pricing.
53
54
  * @returns token calculation data
54
55
  */
55
- function getEvmTokenBalances(account, tokenBalancesState, tokensState, tokenRatesState, currencyRateState, isEvmChainEnabled) {
56
+ function getEvmTokenBalances(account, tokenBalancesState, tokensState, tokenRatesState, currencyRateState, isEvmChainEnabled, networkConfigurationsByChainId) {
56
57
  const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
57
58
  const accountBalances = tokenBalancesState.tokenBalances[account.address] ?? {};
58
59
  return Object.entries(accountBalances)
@@ -82,6 +83,26 @@ function getEvmTokenBalances(account, tokenBalancesState, tokensState, tokenRate
82
83
  ? (0, codefi_v2_1.getNativeTokenAddress)(chainId)
83
84
  : tokenAddress;
84
85
  const tokenMarketData = tokenRatesState?.marketData?.[chainId]?.[marketDataAddress];
86
+ // For native/staked-native tokens, fall back to currencyRateState when
87
+ // tokenRatesState has no market data for the chain.
88
+ if (!tokenMarketData?.price && (isNative || isStakedNative)) {
89
+ const nativeCurrency = networkConfigurationsByChainId?.[chainId]?.nativeCurrency;
90
+ const fallbackRate = nativeCurrency
91
+ ? currencyRateState.currencyRates[nativeCurrency]?.conversionRate
92
+ : undefined;
93
+ if (!fallbackRate) {
94
+ return null;
95
+ }
96
+ const decimalBalance = parseInt(balance, 16);
97
+ if (!isNonNaNNumber(decimalBalance)) {
98
+ return null;
99
+ }
100
+ const userCurrencyValue = (decimalBalance / Math.pow(10, 18)) * fallbackRate;
101
+ return {
102
+ userCurrencyValue,
103
+ tokenMarketData: tokenMarketData ?? null,
104
+ };
105
+ }
85
106
  if (!tokenMarketData?.price) {
86
107
  return null;
87
108
  }
@@ -159,10 +180,11 @@ function getNonEvmAssetBalances(account, multichainBalancesState, multichainAsse
159
180
  * @param tokenRatesState - Token rates state.
160
181
  * @param currencyRateState - Currency rate state.
161
182
  * @param isEvmChainEnabled - Predicate to check EVM chain enablement.
183
+ * @param networkConfigurationsByChainId - Network configurations keyed by chain ID for fallback pricing.
162
184
  * @returns Total value in user currency.
163
185
  */
164
- function sumEvmAccountBalanceInUserCurrency(account, tokenBalancesState, tokensState, tokenRatesState, currencyRateState, isEvmChainEnabled) {
165
- const tokenBalances = getEvmTokenBalances(account, tokenBalancesState, tokensState, tokenRatesState, currencyRateState, isEvmChainEnabled);
186
+ function sumEvmAccountBalanceInUserCurrency(account, tokenBalancesState, tokensState, tokenRatesState, currencyRateState, isEvmChainEnabled, networkConfigurationsByChainId) {
187
+ const tokenBalances = getEvmTokenBalances(account, tokenBalancesState, tokensState, tokenRatesState, currencyRateState, isEvmChainEnabled, networkConfigurationsByChainId);
166
188
  return tokenBalances.reduce((a, b) => a + b.userCurrencyValue, 0);
167
189
  }
168
190
  /**
@@ -193,13 +215,14 @@ function sumNonEvmAccountBalanceInUserCurrency(account, multichainBalancesState,
193
215
  * @param tokensState - TokensController state
194
216
  * @param currencyRateState - CurrencyRateController state
195
217
  * @param enabledNetworkMap - Map of enabled networks keyed by namespace
218
+ * @param networkConfigurationsByChainId - Network configurations by chain ID.
196
219
  * @returns Aggregated balances for all wallets
197
220
  */
198
- function calculateBalanceForAllWallets(accountTreeState, accountsState, tokenBalancesState, tokenRatesState, multichainRatesState, multichainBalancesState, multichainAssetsState, tokensState, currencyRateState, enabledNetworkMap) {
221
+ function calculateBalanceForAllWallets(accountTreeState, accountsState, tokenBalancesState, tokenRatesState, multichainRatesState, multichainBalancesState, multichainAssetsState, tokensState, currencyRateState, enabledNetworkMap, networkConfigurationsByChainId) {
199
222
  const isEvmChainEnabled = (chainId) => isChainEnabledByMap(enabledNetworkMap, chainId);
200
223
  const isAssetChainEnabled = (assetId) => isChainEnabledByMap(enabledNetworkMap, (0, utils_1.parseCaipAssetType)(assetId).chainId);
201
224
  const getBalance = {
202
- evm: (account) => sumEvmAccountBalanceInUserCurrency(account, tokenBalancesState, tokensState, tokenRatesState, currencyRateState, isEvmChainEnabled),
225
+ evm: (account) => sumEvmAccountBalanceInUserCurrency(account, tokenBalancesState, tokensState, tokenRatesState, currencyRateState, isEvmChainEnabled, networkConfigurationsByChainId),
203
226
  nonEvm: (account) => sumNonEvmAccountBalanceInUserCurrency(account, multichainBalancesState, multichainAssetsState, multichainRatesState, isAssetChainEnabled),
204
227
  };
205
228
  const getFlatAccountBalances = () => Object.entries(accountTreeState.accountTree.wallets ?? {})
@@ -281,16 +304,17 @@ exports.calculateBalanceForAllWallets = calculateBalanceForAllWallets;
281
304
  * @param currencyRateState - CurrencyRateController state.
282
305
  * @param enabledNetworkMap - Map of enabled networks keyed by namespace.
283
306
  * @param period - Period to compute change for ('1d' | '7d' | '30d').
307
+ * @param networkConfigurationsByChainId - Optional network configurations to derive native currency fallback pricing.
284
308
  * @returns Aggregated change details for the requested period.
285
309
  */
286
- function calculateBalanceChangeForAllWallets(accountTreeState, accountsState, tokenBalancesState, tokenRatesState, multichainRatesState, multichainBalancesState, multichainAssetsState, tokensState, currencyRateState, enabledNetworkMap, period) {
310
+ function calculateBalanceChangeForAllWallets(accountTreeState, accountsState, tokenBalancesState, tokenRatesState, multichainRatesState, multichainBalancesState, multichainAssetsState, tokensState, currencyRateState, enabledNetworkMap, period, networkConfigurationsByChainId) {
287
311
  const isEvmChainEnabled = (chainId) => isChainEnabledByMap(enabledNetworkMap, chainId);
288
312
  const isAssetChainEnabled = (assetId) => {
289
313
  const { chainId } = (0, utils_1.parseCaipAssetType)(assetId);
290
314
  return isChainEnabledByMap(enabledNetworkMap, chainId);
291
315
  };
292
316
  const getAccountChange = {
293
- evm: (account) => sumEvmAccountChangeForPeriod(account, period, tokenBalancesState, tokensState, tokenRatesState, currencyRateState, isEvmChainEnabled),
317
+ evm: (account) => sumEvmAccountChangeForPeriod(account, period, tokenBalancesState, tokensState, tokenRatesState, currencyRateState, isEvmChainEnabled, networkConfigurationsByChainId),
294
318
  nonEvm: (account) => sumNonEvmAccountChangeForPeriod(account, period, multichainBalancesState, multichainAssetsState, multichainRatesState, isAssetChainEnabled),
295
319
  };
296
320
  const getFlatAccountChanges = () => Object.entries(accountTreeState.accountTree.wallets ?? {})
@@ -345,14 +369,23 @@ exports.calculateBalanceChangeForAllWallets = calculateBalanceChangeForAllWallet
345
369
  * @param tokenRatesState - Token rates controller state.
346
370
  * @param currencyRateState - Currency rate controller state.
347
371
  * @param isEvmChainEnabled - Predicate that returns true if the EVM chain is enabled.
372
+ * @param networkConfigurationsByChainId - Network configurations keyed by chain ID for fallback pricing.
348
373
  * @returns Object with current and previous totals in user currency.
349
374
  */
350
- function sumEvmAccountChangeForPeriod(account, period, tokenBalancesState, tokensState, tokenRatesState, currencyRateState, isEvmChainEnabled) {
351
- const tokenBalances = getEvmTokenBalances(account, tokenBalancesState, tokensState, tokenRatesState, currencyRateState, isEvmChainEnabled);
375
+ function sumEvmAccountChangeForPeriod(account, period, tokenBalancesState, tokensState, tokenRatesState, currencyRateState, isEvmChainEnabled, networkConfigurationsByChainId) {
376
+ const tokenBalances = getEvmTokenBalances(account, tokenBalancesState, tokensState, tokenRatesState, currencyRateState, isEvmChainEnabled, networkConfigurationsByChainId);
352
377
  const tokenChanges = tokenBalances
353
378
  .map((token) => {
354
- const percentRaw = token.tokenMarketData[evmRatePropertiesRecord[period]];
379
+ const percentRaw = token.tokenMarketData?.[evmRatePropertiesRecord[period]];
355
380
  if (!isNonNaNNumber(percentRaw)) {
381
+ // Fallback tokens (no market data) still contribute their current value
382
+ // but are treated as having 0% change.
383
+ if (token.tokenMarketData === null) {
384
+ return {
385
+ current: token.userCurrencyValue,
386
+ previous: token.userCurrencyValue,
387
+ };
388
+ }
356
389
  return null;
357
390
  }
358
391
  const denom = Number((1 + percentRaw / 100).toFixed(8));
@@ -423,16 +456,17 @@ function sumNonEvmAccountChangeForPeriod(account, period, multichainBalancesStat
423
456
  * @param enabledNetworkMap - Map of enabled networks keyed by namespace.
424
457
  * @param groupId - Account group ID to compute change for.
425
458
  * @param period - Change period ('1d' | '7d' | '30d').
459
+ * @param networkConfigurationsByChainId - Optional network configurations to derive native currency fallback pricing.
426
460
  * @returns Change result including current, previous, delta, percent, and period.
427
461
  */
428
- function calculateBalanceChangeForAccountGroup(accountTreeState, accountsState, tokenBalancesState, tokenRatesState, multichainRatesState, multichainBalancesState, multichainAssetsState, tokensState, currencyRateState, enabledNetworkMap, groupId, period) {
462
+ function calculateBalanceChangeForAccountGroup(accountTreeState, accountsState, tokenBalancesState, tokenRatesState, multichainRatesState, multichainBalancesState, multichainAssetsState, tokensState, currencyRateState, enabledNetworkMap, groupId, period, networkConfigurationsByChainId) {
429
463
  const isEvmChainEnabled = (chainId) => isChainEnabledByMap(enabledNetworkMap, chainId);
430
464
  const isAssetChainEnabled = (assetId) => {
431
465
  const { chainId } = (0, utils_1.parseCaipAssetType)(assetId);
432
466
  return isChainEnabledByMap(enabledNetworkMap, chainId);
433
467
  };
434
468
  const getAccountChange = {
435
- evm: (account) => sumEvmAccountChangeForPeriod(account, period, tokenBalancesState, tokensState, tokenRatesState, currencyRateState, isEvmChainEnabled),
469
+ evm: (account) => sumEvmAccountChangeForPeriod(account, period, tokenBalancesState, tokensState, tokenRatesState, currencyRateState, isEvmChainEnabled, networkConfigurationsByChainId),
436
470
  nonEvm: (account) => sumNonEvmAccountChangeForPeriod(account, period, multichainBalancesState, multichainAssetsState, multichainRatesState, isAssetChainEnabled),
437
471
  };
438
472
  const getFlatAccountChanges = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"balances.cjs","sourceRoot":"","sources":["../src/balances.ts"],"names":[],"mappings":"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","sourcesContent":["import { parseAccountGroupId } from '@metamask/account-api';\nimport type { AccountGroupId } from '@metamask/account-api';\nimport type { AccountTreeControllerState } from '@metamask/account-tree-controller';\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport { isEvmAccountType } from '@metamask/keyring-api';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { Hex } from '@metamask/utils';\nimport type { CaipAssetType, CaipChainId } from '@metamask/utils';\nimport {\n KnownCaipNamespace,\n parseCaipAssetType,\n parseCaipChainId,\n isStrictHexString,\n} from '@metamask/utils';\n\nimport { STAKING_CONTRACT_ADDRESS_BY_CHAINID } from './AssetsContractController';\nimport type { CurrencyRateState } from './CurrencyRateController';\nimport type { MultichainAssetsControllerState } from './MultichainAssetsController';\nimport type { MultichainAssetsRatesControllerState } from './MultichainAssetsRatesController';\nimport type { MultichainBalancesControllerState } from './MultichainBalancesController';\nimport { getNativeTokenAddress } from './token-prices-service/codefi-v2';\nimport type { TokenBalancesControllerState } from './TokenBalancesController';\nimport type { TokenRatesControllerState } from './TokenRatesController';\nimport type { TokensControllerState } from './TokensController';\n\nexport type AccountGroupBalance = {\n walletId: string;\n groupId: string;\n totalBalanceInUserCurrency: number;\n userCurrency: string;\n};\n\nexport type WalletBalance = {\n walletId: string;\n groups: Record<string, AccountGroupBalance>;\n totalBalanceInUserCurrency: number;\n userCurrency: string;\n};\n\nexport type AllWalletsBalance = {\n wallets: Record<string, WalletBalance>;\n totalBalanceInUserCurrency: number;\n userCurrency: string;\n};\n\nexport type BalanceChangePeriod = '1d' | '7d' | '30d';\n\nconst evmRatePropertiesRecord = {\n '1d': 'pricePercentChange1d',\n '7d': 'pricePercentChange7d',\n '30d': 'pricePercentChange30d',\n} as const;\n\nconst nonEvmRatePropertiesRecord = {\n '1d': 'P1D',\n '7d': 'P7D',\n '30d': 'P30D',\n};\n\nexport type BalanceChangeResult = {\n period: BalanceChangePeriod;\n currentTotalInUserCurrency: number;\n previousTotalInUserCurrency: number;\n amountChangeInUserCurrency: number;\n percentChange: number;\n userCurrency: string;\n};\n\nconst isChainEnabledByMap = (\n map: Record<string, Record<string, boolean>> | undefined,\n id: Hex | CaipChainId,\n): boolean => {\n if (!map) {\n return true;\n }\n if (isStrictHexString(id)) {\n return Boolean(map[KnownCaipNamespace.Eip155]?.[id]);\n }\n const { namespace } = parseCaipChainId(id);\n return Boolean(map[namespace]?.[id]);\n};\n\nconst getInternalAccountsForGroup = (\n accountTreeState: AccountTreeControllerState,\n accountsState: AccountsControllerState,\n groupId: string,\n): InternalAccount[] => {\n const walletId = parseAccountGroupId(groupId).wallet.id;\n const wallet = accountTreeState.accountTree.wallets[walletId];\n if (!wallet) {\n return [];\n }\n const group = wallet.groups[groupId as AccountGroupId];\n if (!group) {\n return [];\n }\n return group.accounts\n .map(\n (accountId: string) => accountsState.internalAccounts.accounts[accountId],\n )\n .filter(Boolean);\n};\n\nconst isNonNaNNumber = (value: unknown): value is number =>\n typeof value === 'number' && !Number.isNaN(value);\n\n/**\n * Combined function that gets valid token balances with calculation data\n *\n * @param account - Internal account.\n * @param tokenBalancesState - Token balances state.\n * @param tokensState - Tokens state.\n * @param tokenRatesState - Token rates state.\n * @param currencyRateState - Currency rate state.\n * @param isEvmChainEnabled - Predicate to check EVM chain enablement.\n * @returns token calculation data\n */\nfunction getEvmTokenBalances(\n account: InternalAccount,\n tokenBalancesState: TokenBalancesControllerState,\n tokensState: TokensControllerState,\n tokenRatesState: TokenRatesControllerState,\n currencyRateState: CurrencyRateState,\n isEvmChainEnabled: (chainId: Hex) => boolean,\n) {\n const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as Hex;\n const accountBalances =\n tokenBalancesState.tokenBalances[account.address as Hex] ?? {};\n\n return Object.entries(accountBalances)\n .filter(([chainId]) => isEvmChainEnabled(chainId as Hex))\n .flatMap(([chainId, chainBalances]) =>\n Object.entries(chainBalances).map(([tokenAddress, balance]) => ({\n chainId: chainId as Hex,\n tokenAddress: tokenAddress as Hex,\n balance,\n })),\n )\n .map((tokenBalance) => {\n const { chainId, tokenAddress, balance } = tokenBalance;\n\n const stakingContractAddress =\n STAKING_CONTRACT_ADDRESS_BY_CHAINID[chainId];\n const isNative = tokenAddress === ZERO_ADDRESS;\n const isStakedNative = stakingContractAddress\n ? tokenAddress.toLowerCase() === stakingContractAddress.toLowerCase()\n : false;\n\n // Get Token Info (skip allTokens check for native and staked native)\n if (!isNative && !isStakedNative) {\n const accountTokens =\n tokensState?.allTokens?.[chainId]?.[account.address];\n const token = accountTokens?.find((t) => t.address === tokenAddress);\n if (!token) {\n return null;\n }\n }\n\n // Get market data\n const marketDataAddress =\n isNative || isStakedNative\n ? getNativeTokenAddress(chainId)\n : tokenAddress;\n const tokenMarketData =\n tokenRatesState?.marketData?.[chainId]?.[marketDataAddress];\n if (!tokenMarketData?.price) {\n return null;\n }\n\n // Get conversion rate\n const nativeToUserRate =\n currencyRateState.currencyRates[tokenMarketData.currency]\n ?.conversionRate;\n if (!nativeToUserRate) {\n return null;\n }\n\n // Calculate values\n let decimals = 18;\n if (!isNative && !isStakedNative) {\n const accountTokens =\n tokensState?.allTokens?.[chainId]?.[account.address];\n const token = accountTokens?.find((t) => t.address === tokenAddress);\n decimals = isNonNaNNumber(token?.decimals) ? token?.decimals : 18;\n }\n const decimalBalance = parseInt(balance, 16);\n if (!isNonNaNNumber(decimalBalance)) {\n return null;\n }\n\n const userCurrencyValue =\n (decimalBalance / Math.pow(10, decimals)) *\n tokenMarketData.price *\n nativeToUserRate;\n\n return {\n userCurrencyValue,\n tokenMarketData, // Only needed for change calculations\n };\n })\n .filter((item): item is NonNullable<typeof item> => item !== null);\n}\n\n/**\n * Combined function that gets valid non-EVM asset balances with calculation data\n *\n * @param account - Internal account.\n * @param multichainBalancesState - Multichain balances state.\n * @param multichainAssetsState - Multichain assets state (for ignored assets).\n * @param multichainRatesState - Multichain rates state.\n * @param isAssetChainEnabled - Predicate to check asset chain enablement.\n * @returns token calculation data\n */\nfunction getNonEvmAssetBalances(\n account: InternalAccount,\n multichainBalancesState: MultichainBalancesControllerState,\n multichainAssetsState: MultichainAssetsControllerState,\n multichainRatesState: MultichainAssetsRatesControllerState,\n isAssetChainEnabled: (assetId: CaipAssetType) => boolean,\n) {\n const accountBalances = multichainBalancesState.balances[account.id] ?? {};\n const ignoredAssets =\n multichainAssetsState.allIgnoredAssets[account.id] || [];\n\n return Object.entries(accountBalances)\n .filter(\n ([assetId]) =>\n isAssetChainEnabled(assetId as CaipAssetType) &&\n !ignoredAssets.includes(assetId as CaipAssetType),\n )\n .map(([assetId, balanceData]) => {\n const balanceAmount = parseFloat(balanceData.amount);\n if (Number.isNaN(balanceAmount)) {\n return null;\n }\n\n const conversionRate =\n multichainRatesState.conversionRates[assetId as CaipAssetType];\n if (!conversionRate) {\n return null;\n }\n\n const conversionRateValue = parseFloat(conversionRate.rate);\n if (Number.isNaN(conversionRateValue)) {\n return null;\n }\n\n const userCurrencyValue = balanceAmount * conversionRateValue;\n\n return {\n assetId: assetId as CaipAssetType,\n userCurrencyValue,\n conversionRate, // Only needed for change calculations\n };\n })\n .filter((item): item is NonNullable<typeof item> => item !== null);\n}\n\n/**\n * Sum EVM account token balances in user currency.\n *\n * @param account - Internal account.\n * @param tokenBalancesState - Token balances state.\n * @param tokensState - Tokens state.\n * @param tokenRatesState - Token rates state.\n * @param currencyRateState - Currency rate state.\n * @param isEvmChainEnabled - Predicate to check EVM chain enablement.\n * @returns Total value in user currency.\n */\nfunction sumEvmAccountBalanceInUserCurrency(\n account: InternalAccount,\n tokenBalancesState: TokenBalancesControllerState,\n tokensState: TokensControllerState,\n tokenRatesState: TokenRatesControllerState,\n currencyRateState: CurrencyRateState,\n isEvmChainEnabled: (chainId: Hex) => boolean,\n): number {\n const tokenBalances = getEvmTokenBalances(\n account,\n tokenBalancesState,\n tokensState,\n tokenRatesState,\n currencyRateState,\n isEvmChainEnabled,\n );\n return tokenBalances.reduce((a, b) => a + b.userCurrencyValue, 0);\n}\n\n/**\n * Sum non‑EVM account balances in user currency from multichain sources.\n *\n * @param account - Internal account.\n * @param multichainBalancesState - Multichain balances state.\n * @param multichainAssetsState - Multichain assets state (for ignored assets).\n * @param multichainRatesState - Multichain rates state.\n * @param isAssetChainEnabled - Predicate to check asset chain enablement.\n * @returns Total value in user currency.\n */\nfunction sumNonEvmAccountBalanceInUserCurrency(\n account: InternalAccount,\n multichainBalancesState: MultichainBalancesControllerState,\n multichainAssetsState: MultichainAssetsControllerState,\n multichainRatesState: MultichainAssetsRatesControllerState,\n isAssetChainEnabled: (assetId: CaipAssetType) => boolean,\n): number {\n const assetBalances = getNonEvmAssetBalances(\n account,\n multichainBalancesState,\n multichainAssetsState,\n multichainRatesState,\n isAssetChainEnabled,\n );\n\n return assetBalances.reduce((a, b) => a + b.userCurrencyValue, 0);\n}\n\n/**\n * Calculate balances for all wallets and groups.\n * Pure function – accepts controller states and returns aggregated totals.\n *\n * @param accountTreeState - AccountTreeController state\n * @param accountsState - AccountsController state\n * @param tokenBalancesState - TokenBalancesController state\n * @param tokenRatesState - TokenRatesController state\n * @param multichainRatesState - MultichainAssetsRatesController state\n * @param multichainBalancesState - MultichainBalancesController state\n * @param multichainAssetsState - MultichainAssetsController state\n * @param tokensState - TokensController state\n * @param currencyRateState - CurrencyRateController state\n * @param enabledNetworkMap - Map of enabled networks keyed by namespace\n * @returns Aggregated balances for all wallets\n */\nexport function calculateBalanceForAllWallets(\n accountTreeState: AccountTreeControllerState,\n accountsState: AccountsControllerState,\n tokenBalancesState: TokenBalancesControllerState,\n tokenRatesState: TokenRatesControllerState,\n multichainRatesState: MultichainAssetsRatesControllerState,\n multichainBalancesState: MultichainBalancesControllerState,\n multichainAssetsState: MultichainAssetsControllerState,\n tokensState: TokensControllerState,\n currencyRateState: CurrencyRateState,\n enabledNetworkMap: Record<string, Record<string, boolean>> | undefined,\n): AllWalletsBalance {\n const isEvmChainEnabled = (chainId: Hex): boolean =>\n isChainEnabledByMap(enabledNetworkMap, chainId);\n\n const isAssetChainEnabled = (assetId: CaipAssetType): boolean =>\n isChainEnabledByMap(enabledNetworkMap, parseCaipAssetType(assetId).chainId);\n\n const getBalance = {\n evm: (account: InternalAccount) =>\n sumEvmAccountBalanceInUserCurrency(\n account,\n tokenBalancesState,\n tokensState,\n tokenRatesState,\n currencyRateState,\n isEvmChainEnabled,\n ),\n nonEvm: (account: InternalAccount) =>\n sumNonEvmAccountBalanceInUserCurrency(\n account,\n multichainBalancesState,\n multichainAssetsState,\n multichainRatesState,\n isAssetChainEnabled,\n ),\n };\n\n const getFlatAccountBalances = () =>\n Object.entries(accountTreeState.accountTree.wallets ?? {})\n .flatMap(([walletId, wallet]) =>\n Object.keys(wallet?.groups || {}).flatMap((groupId) => {\n const accounts = getInternalAccountsForGroup(\n accountTreeState,\n accountsState,\n groupId,\n );\n\n return accounts.map((account) => ({\n walletId,\n groupId,\n account,\n isEvm: isEvmAccountType(account.type),\n }));\n }),\n )\n .map((flatAccount) => {\n const flatAccountWithBalance = flatAccount as typeof flatAccount & {\n balance: number;\n };\n flatAccountWithBalance.balance = flatAccount.isEvm\n ? getBalance.evm(flatAccount.account)\n : getBalance.nonEvm(flatAccount.account);\n return flatAccountWithBalance;\n });\n\n const getAggWalletBalance = (\n flatAccountBalances: ReturnType<typeof getFlatAccountBalances>,\n ): number => flatAccountBalances.reduce((a, b) => a + b.balance, 0);\n\n const getWalletBalances = (\n flatAccountBalances: ReturnType<typeof getFlatAccountBalances>,\n ): Record<string, WalletBalance> => {\n const wallets: Record<string, WalletBalance> = {};\n const defaultWalletBalance = (walletId: string): WalletBalance => ({\n walletId,\n groups: {},\n totalBalanceInUserCurrency: 0,\n userCurrency: currencyRateState.currentCurrency,\n });\n const defaultGroupBalance = (\n walletId: string,\n groupId: string,\n ): AccountGroupBalance => ({\n walletId,\n groupId,\n totalBalanceInUserCurrency: 0,\n userCurrency: currencyRateState.currentCurrency,\n });\n\n flatAccountBalances.forEach((flatAccount) => {\n const { walletId, groupId, balance } = flatAccount;\n wallets[walletId] ??= defaultWalletBalance(walletId);\n wallets[walletId].groups[groupId] ??= defaultGroupBalance(\n walletId,\n groupId,\n );\n wallets[walletId].groups[groupId].totalBalanceInUserCurrency += balance;\n wallets[walletId].totalBalanceInUserCurrency += balance;\n });\n\n // Ensure all groups (including empty ones) are represented\n Object.entries(accountTreeState.accountTree.wallets ?? {}).forEach(\n ([walletId, wallet]) => {\n if (!wallet) {\n return;\n }\n wallets[walletId] ??= defaultWalletBalance(walletId);\n Object.keys(wallet.groups || {}).forEach((groupId) => {\n wallets[walletId].groups[groupId] ??= defaultGroupBalance(\n walletId,\n groupId,\n );\n });\n },\n );\n\n return wallets;\n };\n\n const flatAccounts = getFlatAccountBalances();\n return {\n wallets: getWalletBalances(flatAccounts),\n totalBalanceInUserCurrency: getAggWalletBalance(flatAccounts),\n userCurrency: currencyRateState.currentCurrency,\n };\n}\n\n/**\n * Calculate aggregated portfolio value change for a given period (1d, 7d, 30d).\n * Logic mirrors extension/mobile historical aggregation:\n * - For each asset with available percent change for the requested period, compute current value in user currency.\n * - Reconstruct previous value by dividing current by (1 + percent/100).\n * - Sum across all assets, then compute amount change and percent change.\n *\n * @param accountTreeState - AccountTreeController state.\n * @param accountsState - AccountsController state.\n * @param tokenBalancesState - TokenBalancesController state.\n * @param tokenRatesState - TokenRatesController state.\n * @param multichainRatesState - MultichainAssetsRatesController state.\n * @param multichainBalancesState - MultichainBalancesController state.\n * @param multichainAssetsState - MultichainAssetsController state.\n * @param tokensState - TokensController state.\n * @param currencyRateState - CurrencyRateController state.\n * @param enabledNetworkMap - Map of enabled networks keyed by namespace.\n * @param period - Period to compute change for ('1d' | '7d' | '30d').\n * @returns Aggregated change details for the requested period.\n */\nexport function calculateBalanceChangeForAllWallets(\n accountTreeState: AccountTreeControllerState,\n accountsState: AccountsControllerState,\n tokenBalancesState: TokenBalancesControllerState,\n tokenRatesState: TokenRatesControllerState,\n multichainRatesState: MultichainAssetsRatesControllerState,\n multichainBalancesState: MultichainBalancesControllerState,\n multichainAssetsState: MultichainAssetsControllerState,\n tokensState: TokensControllerState,\n currencyRateState: CurrencyRateState,\n enabledNetworkMap: Record<string, Record<string, boolean>> | undefined,\n period: BalanceChangePeriod,\n): BalanceChangeResult {\n const isEvmChainEnabled = (chainId: Hex): boolean =>\n isChainEnabledByMap(enabledNetworkMap, chainId);\n\n const isAssetChainEnabled = (assetId: CaipAssetType): boolean => {\n const { chainId } = parseCaipAssetType(assetId);\n return isChainEnabledByMap(enabledNetworkMap, chainId);\n };\n\n const getAccountChange = {\n evm: (account: InternalAccount) =>\n sumEvmAccountChangeForPeriod(\n account,\n period,\n tokenBalancesState,\n tokensState,\n tokenRatesState,\n currencyRateState,\n isEvmChainEnabled,\n ),\n nonEvm: (account: InternalAccount) =>\n sumNonEvmAccountChangeForPeriod(\n account,\n period,\n multichainBalancesState,\n multichainAssetsState,\n multichainRatesState,\n isAssetChainEnabled,\n ),\n };\n\n const getFlatAccountChanges = () =>\n Object.entries(accountTreeState.accountTree.wallets ?? {})\n .flatMap(([walletId, wallet]) =>\n Object.keys(wallet?.groups || {}).flatMap((groupId) => {\n const accounts = getInternalAccountsForGroup(\n accountTreeState,\n accountsState,\n groupId,\n );\n return accounts.map((account) => ({\n walletId,\n groupId,\n account,\n isEvm: isEvmAccountType(account.type),\n }));\n }),\n )\n .map((flatAccount) => {\n const flatAccountWithChange = flatAccount as typeof flatAccount & {\n current: number;\n previous: number;\n };\n\n const change = flatAccount.isEvm\n ? getAccountChange.evm(flatAccount.account)\n : getAccountChange.nonEvm(flatAccount.account);\n\n flatAccountWithChange.current = change.current;\n flatAccountWithChange.previous = change.previous;\n return flatAccountWithChange;\n });\n\n const getAggregatedTotals = (\n flatAccountChanges: ReturnType<typeof getFlatAccountChanges>,\n ) => {\n return flatAccountChanges.reduce(\n (totals, account) => {\n totals.current += account.current;\n totals.previous += account.previous;\n return totals;\n },\n { current: 0, previous: 0 },\n );\n };\n\n const flatAccountChanges = getFlatAccountChanges();\n const aggregatedTotals = getAggregatedTotals(flatAccountChanges);\n const amountChange = aggregatedTotals.current - aggregatedTotals.previous;\n const percentChange =\n aggregatedTotals.previous !== 0\n ? (amountChange / aggregatedTotals.previous) * 100\n : 0;\n\n return {\n period,\n currentTotalInUserCurrency: Number(aggregatedTotals.current.toFixed(8)),\n previousTotalInUserCurrency: Number(aggregatedTotals.previous.toFixed(8)),\n amountChangeInUserCurrency: Number(amountChange.toFixed(8)),\n percentChange: Number(percentChange.toFixed(8)),\n userCurrency: currencyRateState.currentCurrency,\n };\n}\n\n/**\n * Sum EVM account change for a period (current and previous totals).\n *\n * @param account - Internal account to aggregate.\n * @param period - Change period ('1d' | '7d' | '30d').\n * @param tokenBalancesState - Token balances controller state.\n * @param tokensState - Tokens controller state.\n * @param tokenRatesState - Token rates controller state.\n * @param currencyRateState - Currency rate controller state.\n * @param isEvmChainEnabled - Predicate that returns true if the EVM chain is enabled.\n * @returns Object with current and previous totals in user currency.\n */\nfunction sumEvmAccountChangeForPeriod(\n account: InternalAccount,\n period: BalanceChangePeriod,\n tokenBalancesState: TokenBalancesControllerState,\n tokensState: TokensControllerState,\n tokenRatesState: TokenRatesControllerState,\n currencyRateState: CurrencyRateState,\n isEvmChainEnabled: (chainId: Hex) => boolean,\n): { current: number; previous: number } {\n const tokenBalances = getEvmTokenBalances(\n account,\n tokenBalancesState,\n tokensState,\n tokenRatesState,\n currencyRateState,\n isEvmChainEnabled,\n );\n\n const tokenChanges = tokenBalances\n .map((token) => {\n const percentRaw = token.tokenMarketData[evmRatePropertiesRecord[period]];\n if (!isNonNaNNumber(percentRaw)) {\n return null;\n }\n\n const denom = Number((1 + percentRaw / 100).toFixed(8));\n if (denom === 0) {\n return null;\n }\n\n return {\n current: token.userCurrencyValue,\n previous: token.userCurrencyValue / denom,\n };\n })\n .filter((change): change is NonNullable<typeof change> => change !== null);\n\n return tokenChanges.reduce(\n (totals, change) => {\n totals.current += change.current;\n totals.previous += change.previous;\n return totals;\n },\n { current: 0, previous: 0 },\n );\n}\n\n/**\n * Sum non-EVM account change for a period (current and previous totals).\n *\n * @param account - Internal account to aggregate.\n * @param period - Change period ('1d' | '7d' | '30d').\n * @param multichainBalancesState - Multichain balances controller state.\n * @param multichainAssetsState - Multichain assets controller state.\n * @param multichainRatesState - Multichain assets rates controller state.\n * @param isAssetChainEnabled - Predicate that returns true if the asset's chain is enabled.\n * @returns Object with current and previous totals in user currency.\n */\nfunction sumNonEvmAccountChangeForPeriod(\n account: InternalAccount,\n period: BalanceChangePeriod,\n multichainBalancesState: MultichainBalancesControllerState,\n multichainAssetsState: MultichainAssetsControllerState,\n multichainRatesState: MultichainAssetsRatesControllerState,\n isAssetChainEnabled: (assetId: CaipAssetType) => boolean,\n): { current: number; previous: number } {\n const assetBalances = getNonEvmAssetBalances(\n account,\n multichainBalancesState,\n multichainAssetsState,\n multichainRatesState,\n isAssetChainEnabled,\n );\n\n const assetChanges = assetBalances\n .map((asset) => {\n // Safely access the percent change data with proper type checking\n const marketData = asset.conversionRate?.marketData;\n const pricePercentChange = marketData?.pricePercentChange;\n const percentRaw =\n pricePercentChange?.[nonEvmRatePropertiesRecord[period]];\n\n if (!isNonNaNNumber(percentRaw)) {\n return null;\n }\n\n const denom = Number((1 + percentRaw / 100).toFixed(8));\n if (denom === 0) {\n return null;\n }\n\n return {\n current: asset.userCurrencyValue,\n previous: asset.userCurrencyValue / denom,\n };\n })\n .filter((change): change is NonNullable<typeof change> => change !== null);\n\n return assetChanges.reduce(\n (totals, change) => ({\n current: totals.current + change.current,\n previous: totals.previous + change.previous,\n }),\n { current: 0, previous: 0 },\n );\n}\n\n/**\n * Calculate portfolio value change for a specific account group and period.\n *\n * @param accountTreeState - AccountTreeController state.\n * @param accountsState - AccountsController state.\n * @param tokenBalancesState - TokenBalancesController state.\n * @param tokenRatesState - TokenRatesController state.\n * @param multichainRatesState - MultichainAssetsRatesController state.\n * @param multichainBalancesState - MultichainBalancesController state.\n * @param multichainAssetsState - MultichainAssetsController state.\n * @param tokensState - TokensController state.\n * @param currencyRateState - CurrencyRateController state.\n * @param enabledNetworkMap - Map of enabled networks keyed by namespace.\n * @param groupId - Account group ID to compute change for.\n * @param period - Change period ('1d' | '7d' | '30d').\n * @returns Change result including current, previous, delta, percent, and period.\n */\nexport function calculateBalanceChangeForAccountGroup(\n accountTreeState: AccountTreeControllerState,\n accountsState: AccountsControllerState,\n tokenBalancesState: TokenBalancesControllerState,\n tokenRatesState: TokenRatesControllerState,\n multichainRatesState: MultichainAssetsRatesControllerState,\n multichainBalancesState: MultichainBalancesControllerState,\n multichainAssetsState: MultichainAssetsControllerState,\n tokensState: TokensControllerState,\n currencyRateState: CurrencyRateState,\n enabledNetworkMap: Record<string, Record<string, boolean>> | undefined,\n groupId: string,\n period: BalanceChangePeriod,\n): BalanceChangeResult {\n const isEvmChainEnabled = (chainId: Hex): boolean =>\n isChainEnabledByMap(enabledNetworkMap, chainId);\n\n const isAssetChainEnabled = (assetId: CaipAssetType): boolean => {\n const { chainId } = parseCaipAssetType(assetId);\n return isChainEnabledByMap(enabledNetworkMap, chainId);\n };\n\n const getAccountChange = {\n evm: (account: InternalAccount) =>\n sumEvmAccountChangeForPeriod(\n account,\n period,\n tokenBalancesState,\n tokensState,\n tokenRatesState,\n currencyRateState,\n isEvmChainEnabled,\n ),\n nonEvm: (account: InternalAccount) =>\n sumNonEvmAccountChangeForPeriod(\n account,\n period,\n multichainBalancesState,\n multichainAssetsState,\n multichainRatesState,\n isAssetChainEnabled,\n ),\n };\n\n const getFlatAccountChanges = () => {\n const accounts = getInternalAccountsForGroup(\n accountTreeState,\n accountsState,\n groupId,\n );\n return accounts.map((account) => ({\n account,\n isEvm: isEvmAccountType(account.type),\n }));\n };\n\n const getAggregatedTotals = (\n flatAccountChanges: ReturnType<typeof getFlatAccountChanges>,\n ) => {\n return flatAccountChanges.reduce(\n (totals, { account, isEvm }) => {\n const change = isEvm\n ? getAccountChange.evm(account)\n : getAccountChange.nonEvm(account);\n totals.current += change.current;\n totals.previous += change.previous;\n return totals;\n },\n { current: 0, previous: 0 },\n );\n };\n\n const flatAccountChanges = getFlatAccountChanges();\n const aggregatedTotals = getAggregatedTotals(flatAccountChanges);\n\n const amountChange = aggregatedTotals.current - aggregatedTotals.previous;\n const percentChange =\n aggregatedTotals.previous !== 0\n ? (amountChange / aggregatedTotals.previous) * 100\n : 0;\n\n return {\n period,\n currentTotalInUserCurrency: Number(aggregatedTotals.current.toFixed(8)),\n previousTotalInUserCurrency: Number(aggregatedTotals.previous.toFixed(8)),\n amountChangeInUserCurrency: Number(amountChange.toFixed(8)),\n percentChange: Number(percentChange.toFixed(8)),\n userCurrency: currencyRateState.currentCurrency,\n };\n}\n"]}
1
+ {"version":3,"file":"balances.cjs","sourceRoot":"","sources":["../src/balances.ts"],"names":[],"mappings":"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","sourcesContent":["import { parseAccountGroupId } from '@metamask/account-api';\nimport type { AccountGroupId } from '@metamask/account-api';\nimport type { AccountTreeControllerState } from '@metamask/account-tree-controller';\nimport type { AccountsControllerState } from '@metamask/accounts-controller';\nimport { isEvmAccountType } from '@metamask/keyring-api';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { Hex } from '@metamask/utils';\nimport type { CaipAssetType, CaipChainId } from '@metamask/utils';\nimport {\n KnownCaipNamespace,\n parseCaipAssetType,\n parseCaipChainId,\n isStrictHexString,\n} from '@metamask/utils';\n\nimport { STAKING_CONTRACT_ADDRESS_BY_CHAINID } from './AssetsContractController';\nimport type { CurrencyRateState } from './CurrencyRateController';\nimport type { MultichainAssetsControllerState } from './MultichainAssetsController';\nimport type { MultichainAssetsRatesControllerState } from './MultichainAssetsRatesController';\nimport type { MultichainBalancesControllerState } from './MultichainBalancesController';\nimport { getNativeTokenAddress } from './token-prices-service/codefi-v2';\nimport type { TokenBalancesControllerState } from './TokenBalancesController';\nimport type { TokenRatesControllerState } from './TokenRatesController';\nimport type { TokensControllerState } from './TokensController';\n\nexport type AccountGroupBalance = {\n walletId: string;\n groupId: string;\n totalBalanceInUserCurrency: number;\n userCurrency: string;\n};\n\nexport type WalletBalance = {\n walletId: string;\n groups: Record<string, AccountGroupBalance>;\n totalBalanceInUserCurrency: number;\n userCurrency: string;\n};\n\nexport type AllWalletsBalance = {\n wallets: Record<string, WalletBalance>;\n totalBalanceInUserCurrency: number;\n userCurrency: string;\n};\n\nexport type BalanceChangePeriod = '1d' | '7d' | '30d';\n\nconst evmRatePropertiesRecord = {\n '1d': 'pricePercentChange1d',\n '7d': 'pricePercentChange7d',\n '30d': 'pricePercentChange30d',\n} as const;\n\nconst nonEvmRatePropertiesRecord = {\n '1d': 'P1D',\n '7d': 'P7D',\n '30d': 'P30D',\n};\n\nexport type BalanceChangeResult = {\n period: BalanceChangePeriod;\n currentTotalInUserCurrency: number;\n previousTotalInUserCurrency: number;\n amountChangeInUserCurrency: number;\n percentChange: number;\n userCurrency: string;\n};\n\nconst isChainEnabledByMap = (\n map: Record<string, Record<string, boolean>> | undefined,\n id: Hex | CaipChainId,\n): boolean => {\n if (!map) {\n return true;\n }\n if (isStrictHexString(id)) {\n return Boolean(map[KnownCaipNamespace.Eip155]?.[id]);\n }\n const { namespace } = parseCaipChainId(id);\n return Boolean(map[namespace]?.[id]);\n};\n\nconst getInternalAccountsForGroup = (\n accountTreeState: AccountTreeControllerState,\n accountsState: AccountsControllerState,\n groupId: string,\n): InternalAccount[] => {\n const walletId = parseAccountGroupId(groupId).wallet.id;\n const wallet = accountTreeState.accountTree.wallets[walletId];\n if (!wallet) {\n return [];\n }\n const group = wallet.groups[groupId as AccountGroupId];\n if (!group) {\n return [];\n }\n return group.accounts\n .map(\n (accountId: string) => accountsState.internalAccounts.accounts[accountId],\n )\n .filter(Boolean);\n};\n\nconst isNonNaNNumber = (value: unknown): value is number =>\n typeof value === 'number' && !Number.isNaN(value);\n\n/**\n * Minimal network config shape needed to derive native currency by chain.\n * Compatible with NetworkController's networkConfigurationsByChainId entries.\n */\nexport type NetworkConfigurationNativeCurrency = {\n nativeCurrency: string;\n};\n\n/**\n * Combined function that gets valid token balances with calculation data\n *\n * @param account - Internal account.\n * @param tokenBalancesState - Token balances state.\n * @param tokensState - Tokens state.\n * @param tokenRatesState - Token rates state.\n * @param currencyRateState - Currency rate state.\n * @param isEvmChainEnabled - Predicate to check EVM chain enablement.\n * @param networkConfigurationsByChainId - Network configurations keyed by chain ID, used to look up native currency for fallback pricing.\n * @returns token calculation data\n */\nfunction getEvmTokenBalances(\n account: InternalAccount,\n tokenBalancesState: TokenBalancesControllerState,\n tokensState: TokensControllerState,\n tokenRatesState: TokenRatesControllerState,\n currencyRateState: CurrencyRateState,\n isEvmChainEnabled: (chainId: Hex) => boolean,\n networkConfigurationsByChainId?: Record<\n Hex,\n NetworkConfigurationNativeCurrency\n >,\n) {\n const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' as Hex;\n const accountBalances =\n tokenBalancesState.tokenBalances[account.address as Hex] ?? {};\n\n return Object.entries(accountBalances)\n .filter(([chainId]) => isEvmChainEnabled(chainId as Hex))\n .flatMap(([chainId, chainBalances]) =>\n Object.entries(chainBalances).map(([tokenAddress, balance]) => ({\n chainId: chainId as Hex,\n tokenAddress: tokenAddress as Hex,\n balance,\n })),\n )\n .map((tokenBalance) => {\n const { chainId, tokenAddress, balance } = tokenBalance;\n\n const stakingContractAddress =\n STAKING_CONTRACT_ADDRESS_BY_CHAINID[chainId];\n const isNative = tokenAddress === ZERO_ADDRESS;\n const isStakedNative = stakingContractAddress\n ? tokenAddress.toLowerCase() === stakingContractAddress.toLowerCase()\n : false;\n\n // Get Token Info (skip allTokens check for native and staked native)\n if (!isNative && !isStakedNative) {\n const accountTokens =\n tokensState?.allTokens?.[chainId]?.[account.address];\n const token = accountTokens?.find((t) => t.address === tokenAddress);\n if (!token) {\n return null;\n }\n }\n\n // Get market data\n const marketDataAddress =\n isNative || isStakedNative\n ? getNativeTokenAddress(chainId)\n : tokenAddress;\n const tokenMarketData =\n tokenRatesState?.marketData?.[chainId]?.[marketDataAddress];\n\n // For native/staked-native tokens, fall back to currencyRateState when\n // tokenRatesState has no market data for the chain.\n if (!tokenMarketData?.price && (isNative || isStakedNative)) {\n const nativeCurrency =\n networkConfigurationsByChainId?.[chainId]?.nativeCurrency;\n const fallbackRate = nativeCurrency\n ? currencyRateState.currencyRates[nativeCurrency]?.conversionRate\n : undefined;\n if (!fallbackRate) {\n return null;\n }\n\n const decimalBalance = parseInt(balance, 16);\n if (!isNonNaNNumber(decimalBalance)) {\n return null;\n }\n\n const userCurrencyValue =\n (decimalBalance / Math.pow(10, 18)) * fallbackRate;\n\n return {\n userCurrencyValue,\n tokenMarketData: tokenMarketData ?? null,\n };\n }\n\n if (!tokenMarketData?.price) {\n return null;\n }\n\n // Get conversion rate\n const nativeToUserRate =\n currencyRateState.currencyRates[tokenMarketData.currency]\n ?.conversionRate;\n if (!nativeToUserRate) {\n return null;\n }\n\n // Calculate values\n let decimals = 18;\n if (!isNative && !isStakedNative) {\n const accountTokens =\n tokensState?.allTokens?.[chainId]?.[account.address];\n const token = accountTokens?.find((t) => t.address === tokenAddress);\n decimals = isNonNaNNumber(token?.decimals) ? token?.decimals : 18;\n }\n const decimalBalance = parseInt(balance, 16);\n if (!isNonNaNNumber(decimalBalance)) {\n return null;\n }\n\n const userCurrencyValue =\n (decimalBalance / Math.pow(10, decimals)) *\n tokenMarketData.price *\n nativeToUserRate;\n\n return {\n userCurrencyValue,\n tokenMarketData, // Only needed for change calculations\n };\n })\n .filter((item): item is NonNullable<typeof item> => item !== null);\n}\n\n/**\n * Combined function that gets valid non-EVM asset balances with calculation data\n *\n * @param account - Internal account.\n * @param multichainBalancesState - Multichain balances state.\n * @param multichainAssetsState - Multichain assets state (for ignored assets).\n * @param multichainRatesState - Multichain rates state.\n * @param isAssetChainEnabled - Predicate to check asset chain enablement.\n * @returns token calculation data\n */\nfunction getNonEvmAssetBalances(\n account: InternalAccount,\n multichainBalancesState: MultichainBalancesControllerState,\n multichainAssetsState: MultichainAssetsControllerState,\n multichainRatesState: MultichainAssetsRatesControllerState,\n isAssetChainEnabled: (assetId: CaipAssetType) => boolean,\n) {\n const accountBalances = multichainBalancesState.balances[account.id] ?? {};\n const ignoredAssets =\n multichainAssetsState.allIgnoredAssets[account.id] || [];\n\n return Object.entries(accountBalances)\n .filter(\n ([assetId]) =>\n isAssetChainEnabled(assetId as CaipAssetType) &&\n !ignoredAssets.includes(assetId as CaipAssetType),\n )\n .map(([assetId, balanceData]) => {\n const balanceAmount = parseFloat(balanceData.amount);\n if (Number.isNaN(balanceAmount)) {\n return null;\n }\n\n const conversionRate =\n multichainRatesState.conversionRates[assetId as CaipAssetType];\n if (!conversionRate) {\n return null;\n }\n\n const conversionRateValue = parseFloat(conversionRate.rate);\n if (Number.isNaN(conversionRateValue)) {\n return null;\n }\n\n const userCurrencyValue = balanceAmount * conversionRateValue;\n\n return {\n assetId: assetId as CaipAssetType,\n userCurrencyValue,\n conversionRate, // Only needed for change calculations\n };\n })\n .filter((item): item is NonNullable<typeof item> => item !== null);\n}\n\n/**\n * Sum EVM account token balances in user currency.\n *\n * @param account - Internal account.\n * @param tokenBalancesState - Token balances state.\n * @param tokensState - Tokens state.\n * @param tokenRatesState - Token rates state.\n * @param currencyRateState - Currency rate state.\n * @param isEvmChainEnabled - Predicate to check EVM chain enablement.\n * @param networkConfigurationsByChainId - Network configurations keyed by chain ID for fallback pricing.\n * @returns Total value in user currency.\n */\nfunction sumEvmAccountBalanceInUserCurrency(\n account: InternalAccount,\n tokenBalancesState: TokenBalancesControllerState,\n tokensState: TokensControllerState,\n tokenRatesState: TokenRatesControllerState,\n currencyRateState: CurrencyRateState,\n isEvmChainEnabled: (chainId: Hex) => boolean,\n networkConfigurationsByChainId?: Record<\n Hex,\n NetworkConfigurationNativeCurrency\n >,\n): number {\n const tokenBalances = getEvmTokenBalances(\n account,\n tokenBalancesState,\n tokensState,\n tokenRatesState,\n currencyRateState,\n isEvmChainEnabled,\n networkConfigurationsByChainId,\n );\n return tokenBalances.reduce((a, b) => a + b.userCurrencyValue, 0);\n}\n\n/**\n * Sum non‑EVM account balances in user currency from multichain sources.\n *\n * @param account - Internal account.\n * @param multichainBalancesState - Multichain balances state.\n * @param multichainAssetsState - Multichain assets state (for ignored assets).\n * @param multichainRatesState - Multichain rates state.\n * @param isAssetChainEnabled - Predicate to check asset chain enablement.\n * @returns Total value in user currency.\n */\nfunction sumNonEvmAccountBalanceInUserCurrency(\n account: InternalAccount,\n multichainBalancesState: MultichainBalancesControllerState,\n multichainAssetsState: MultichainAssetsControllerState,\n multichainRatesState: MultichainAssetsRatesControllerState,\n isAssetChainEnabled: (assetId: CaipAssetType) => boolean,\n): number {\n const assetBalances = getNonEvmAssetBalances(\n account,\n multichainBalancesState,\n multichainAssetsState,\n multichainRatesState,\n isAssetChainEnabled,\n );\n\n return assetBalances.reduce((a, b) => a + b.userCurrencyValue, 0);\n}\n\n/**\n * Calculate balances for all wallets and groups.\n * Pure function – accepts controller states and returns aggregated totals.\n *\n * @param accountTreeState - AccountTreeController state\n * @param accountsState - AccountsController state\n * @param tokenBalancesState - TokenBalancesController state\n * @param tokenRatesState - TokenRatesController state\n * @param multichainRatesState - MultichainAssetsRatesController state\n * @param multichainBalancesState - MultichainBalancesController state\n * @param multichainAssetsState - MultichainAssetsController state\n * @param tokensState - TokensController state\n * @param currencyRateState - CurrencyRateController state\n * @param enabledNetworkMap - Map of enabled networks keyed by namespace\n * @param networkConfigurationsByChainId - Network configurations by chain ID.\n * @returns Aggregated balances for all wallets\n */\nexport function calculateBalanceForAllWallets(\n accountTreeState: AccountTreeControllerState,\n accountsState: AccountsControllerState,\n tokenBalancesState: TokenBalancesControllerState,\n tokenRatesState: TokenRatesControllerState,\n multichainRatesState: MultichainAssetsRatesControllerState,\n multichainBalancesState: MultichainBalancesControllerState,\n multichainAssetsState: MultichainAssetsControllerState,\n tokensState: TokensControllerState,\n currencyRateState: CurrencyRateState,\n enabledNetworkMap: Record<string, Record<string, boolean>> | undefined,\n networkConfigurationsByChainId?: Record<\n Hex,\n NetworkConfigurationNativeCurrency\n >,\n): AllWalletsBalance {\n const isEvmChainEnabled = (chainId: Hex): boolean =>\n isChainEnabledByMap(enabledNetworkMap, chainId);\n\n const isAssetChainEnabled = (assetId: CaipAssetType): boolean =>\n isChainEnabledByMap(enabledNetworkMap, parseCaipAssetType(assetId).chainId);\n\n const getBalance = {\n evm: (account: InternalAccount) =>\n sumEvmAccountBalanceInUserCurrency(\n account,\n tokenBalancesState,\n tokensState,\n tokenRatesState,\n currencyRateState,\n isEvmChainEnabled,\n networkConfigurationsByChainId,\n ),\n nonEvm: (account: InternalAccount) =>\n sumNonEvmAccountBalanceInUserCurrency(\n account,\n multichainBalancesState,\n multichainAssetsState,\n multichainRatesState,\n isAssetChainEnabled,\n ),\n };\n\n const getFlatAccountBalances = () =>\n Object.entries(accountTreeState.accountTree.wallets ?? {})\n .flatMap(([walletId, wallet]) =>\n Object.keys(wallet?.groups || {}).flatMap((groupId) => {\n const accounts = getInternalAccountsForGroup(\n accountTreeState,\n accountsState,\n groupId,\n );\n\n return accounts.map((account) => ({\n walletId,\n groupId,\n account,\n isEvm: isEvmAccountType(account.type),\n }));\n }),\n )\n .map((flatAccount) => {\n const flatAccountWithBalance = flatAccount as typeof flatAccount & {\n balance: number;\n };\n flatAccountWithBalance.balance = flatAccount.isEvm\n ? getBalance.evm(flatAccount.account)\n : getBalance.nonEvm(flatAccount.account);\n return flatAccountWithBalance;\n });\n\n const getAggWalletBalance = (\n flatAccountBalances: ReturnType<typeof getFlatAccountBalances>,\n ): number => flatAccountBalances.reduce((a, b) => a + b.balance, 0);\n\n const getWalletBalances = (\n flatAccountBalances: ReturnType<typeof getFlatAccountBalances>,\n ): Record<string, WalletBalance> => {\n const wallets: Record<string, WalletBalance> = {};\n const defaultWalletBalance = (walletId: string): WalletBalance => ({\n walletId,\n groups: {},\n totalBalanceInUserCurrency: 0,\n userCurrency: currencyRateState.currentCurrency,\n });\n const defaultGroupBalance = (\n walletId: string,\n groupId: string,\n ): AccountGroupBalance => ({\n walletId,\n groupId,\n totalBalanceInUserCurrency: 0,\n userCurrency: currencyRateState.currentCurrency,\n });\n\n flatAccountBalances.forEach((flatAccount) => {\n const { walletId, groupId, balance } = flatAccount;\n wallets[walletId] ??= defaultWalletBalance(walletId);\n wallets[walletId].groups[groupId] ??= defaultGroupBalance(\n walletId,\n groupId,\n );\n wallets[walletId].groups[groupId].totalBalanceInUserCurrency += balance;\n wallets[walletId].totalBalanceInUserCurrency += balance;\n });\n\n // Ensure all groups (including empty ones) are represented\n Object.entries(accountTreeState.accountTree.wallets ?? {}).forEach(\n ([walletId, wallet]) => {\n if (!wallet) {\n return;\n }\n wallets[walletId] ??= defaultWalletBalance(walletId);\n Object.keys(wallet.groups || {}).forEach((groupId) => {\n wallets[walletId].groups[groupId] ??= defaultGroupBalance(\n walletId,\n groupId,\n );\n });\n },\n );\n\n return wallets;\n };\n\n const flatAccounts = getFlatAccountBalances();\n return {\n wallets: getWalletBalances(flatAccounts),\n totalBalanceInUserCurrency: getAggWalletBalance(flatAccounts),\n userCurrency: currencyRateState.currentCurrency,\n };\n}\n\n/**\n * Calculate aggregated portfolio value change for a given period (1d, 7d, 30d).\n * Logic mirrors extension/mobile historical aggregation:\n * - For each asset with available percent change for the requested period, compute current value in user currency.\n * - Reconstruct previous value by dividing current by (1 + percent/100).\n * - Sum across all assets, then compute amount change and percent change.\n *\n * @param accountTreeState - AccountTreeController state.\n * @param accountsState - AccountsController state.\n * @param tokenBalancesState - TokenBalancesController state.\n * @param tokenRatesState - TokenRatesController state.\n * @param multichainRatesState - MultichainAssetsRatesController state.\n * @param multichainBalancesState - MultichainBalancesController state.\n * @param multichainAssetsState - MultichainAssetsController state.\n * @param tokensState - TokensController state.\n * @param currencyRateState - CurrencyRateController state.\n * @param enabledNetworkMap - Map of enabled networks keyed by namespace.\n * @param period - Period to compute change for ('1d' | '7d' | '30d').\n * @param networkConfigurationsByChainId - Optional network configurations to derive native currency fallback pricing.\n * @returns Aggregated change details for the requested period.\n */\nexport function calculateBalanceChangeForAllWallets(\n accountTreeState: AccountTreeControllerState,\n accountsState: AccountsControllerState,\n tokenBalancesState: TokenBalancesControllerState,\n tokenRatesState: TokenRatesControllerState,\n multichainRatesState: MultichainAssetsRatesControllerState,\n multichainBalancesState: MultichainBalancesControllerState,\n multichainAssetsState: MultichainAssetsControllerState,\n tokensState: TokensControllerState,\n currencyRateState: CurrencyRateState,\n enabledNetworkMap: Record<string, Record<string, boolean>> | undefined,\n period: BalanceChangePeriod,\n networkConfigurationsByChainId?: Record<\n Hex,\n NetworkConfigurationNativeCurrency\n >,\n): BalanceChangeResult {\n const isEvmChainEnabled = (chainId: Hex): boolean =>\n isChainEnabledByMap(enabledNetworkMap, chainId);\n\n const isAssetChainEnabled = (assetId: CaipAssetType): boolean => {\n const { chainId } = parseCaipAssetType(assetId);\n return isChainEnabledByMap(enabledNetworkMap, chainId);\n };\n\n const getAccountChange = {\n evm: (account: InternalAccount) =>\n sumEvmAccountChangeForPeriod(\n account,\n period,\n tokenBalancesState,\n tokensState,\n tokenRatesState,\n currencyRateState,\n isEvmChainEnabled,\n networkConfigurationsByChainId,\n ),\n nonEvm: (account: InternalAccount) =>\n sumNonEvmAccountChangeForPeriod(\n account,\n period,\n multichainBalancesState,\n multichainAssetsState,\n multichainRatesState,\n isAssetChainEnabled,\n ),\n };\n\n const getFlatAccountChanges = () =>\n Object.entries(accountTreeState.accountTree.wallets ?? {})\n .flatMap(([walletId, wallet]) =>\n Object.keys(wallet?.groups || {}).flatMap((groupId) => {\n const accounts = getInternalAccountsForGroup(\n accountTreeState,\n accountsState,\n groupId,\n );\n return accounts.map((account) => ({\n walletId,\n groupId,\n account,\n isEvm: isEvmAccountType(account.type),\n }));\n }),\n )\n .map((flatAccount) => {\n const flatAccountWithChange = flatAccount as typeof flatAccount & {\n current: number;\n previous: number;\n };\n\n const change = flatAccount.isEvm\n ? getAccountChange.evm(flatAccount.account)\n : getAccountChange.nonEvm(flatAccount.account);\n\n flatAccountWithChange.current = change.current;\n flatAccountWithChange.previous = change.previous;\n return flatAccountWithChange;\n });\n\n const getAggregatedTotals = (\n flatAccountChanges: ReturnType<typeof getFlatAccountChanges>,\n ) => {\n return flatAccountChanges.reduce(\n (totals, account) => {\n totals.current += account.current;\n totals.previous += account.previous;\n return totals;\n },\n { current: 0, previous: 0 },\n );\n };\n\n const flatAccountChanges = getFlatAccountChanges();\n const aggregatedTotals = getAggregatedTotals(flatAccountChanges);\n const amountChange = aggregatedTotals.current - aggregatedTotals.previous;\n const percentChange =\n aggregatedTotals.previous !== 0\n ? (amountChange / aggregatedTotals.previous) * 100\n : 0;\n\n return {\n period,\n currentTotalInUserCurrency: Number(aggregatedTotals.current.toFixed(8)),\n previousTotalInUserCurrency: Number(aggregatedTotals.previous.toFixed(8)),\n amountChangeInUserCurrency: Number(amountChange.toFixed(8)),\n percentChange: Number(percentChange.toFixed(8)),\n userCurrency: currencyRateState.currentCurrency,\n };\n}\n\n/**\n * Sum EVM account change for a period (current and previous totals).\n *\n * @param account - Internal account to aggregate.\n * @param period - Change period ('1d' | '7d' | '30d').\n * @param tokenBalancesState - Token balances controller state.\n * @param tokensState - Tokens controller state.\n * @param tokenRatesState - Token rates controller state.\n * @param currencyRateState - Currency rate controller state.\n * @param isEvmChainEnabled - Predicate that returns true if the EVM chain is enabled.\n * @param networkConfigurationsByChainId - Network configurations keyed by chain ID for fallback pricing.\n * @returns Object with current and previous totals in user currency.\n */\nfunction sumEvmAccountChangeForPeriod(\n account: InternalAccount,\n period: BalanceChangePeriod,\n tokenBalancesState: TokenBalancesControllerState,\n tokensState: TokensControllerState,\n tokenRatesState: TokenRatesControllerState,\n currencyRateState: CurrencyRateState,\n isEvmChainEnabled: (chainId: Hex) => boolean,\n networkConfigurationsByChainId?: Record<\n Hex,\n NetworkConfigurationNativeCurrency\n >,\n): { current: number; previous: number } {\n const tokenBalances = getEvmTokenBalances(\n account,\n tokenBalancesState,\n tokensState,\n tokenRatesState,\n currencyRateState,\n isEvmChainEnabled,\n networkConfigurationsByChainId,\n );\n\n const tokenChanges = tokenBalances\n .map((token) => {\n const percentRaw =\n token.tokenMarketData?.[evmRatePropertiesRecord[period]];\n if (!isNonNaNNumber(percentRaw)) {\n // Fallback tokens (no market data) still contribute their current value\n // but are treated as having 0% change.\n if (token.tokenMarketData === null) {\n return {\n current: token.userCurrencyValue,\n previous: token.userCurrencyValue,\n };\n }\n return null;\n }\n\n const denom = Number((1 + percentRaw / 100).toFixed(8));\n if (denom === 0) {\n return null;\n }\n\n return {\n current: token.userCurrencyValue,\n previous: token.userCurrencyValue / denom,\n };\n })\n .filter((change): change is NonNullable<typeof change> => change !== null);\n\n return tokenChanges.reduce(\n (totals, change) => {\n totals.current += change.current;\n totals.previous += change.previous;\n return totals;\n },\n { current: 0, previous: 0 },\n );\n}\n\n/**\n * Sum non-EVM account change for a period (current and previous totals).\n *\n * @param account - Internal account to aggregate.\n * @param period - Change period ('1d' | '7d' | '30d').\n * @param multichainBalancesState - Multichain balances controller state.\n * @param multichainAssetsState - Multichain assets controller state.\n * @param multichainRatesState - Multichain assets rates controller state.\n * @param isAssetChainEnabled - Predicate that returns true if the asset's chain is enabled.\n * @returns Object with current and previous totals in user currency.\n */\nfunction sumNonEvmAccountChangeForPeriod(\n account: InternalAccount,\n period: BalanceChangePeriod,\n multichainBalancesState: MultichainBalancesControllerState,\n multichainAssetsState: MultichainAssetsControllerState,\n multichainRatesState: MultichainAssetsRatesControllerState,\n isAssetChainEnabled: (assetId: CaipAssetType) => boolean,\n): { current: number; previous: number } {\n const assetBalances = getNonEvmAssetBalances(\n account,\n multichainBalancesState,\n multichainAssetsState,\n multichainRatesState,\n isAssetChainEnabled,\n );\n\n const assetChanges = assetBalances\n .map((asset) => {\n // Safely access the percent change data with proper type checking\n const marketData = asset.conversionRate?.marketData;\n const pricePercentChange = marketData?.pricePercentChange;\n const percentRaw =\n pricePercentChange?.[nonEvmRatePropertiesRecord[period]];\n\n if (!isNonNaNNumber(percentRaw)) {\n return null;\n }\n\n const denom = Number((1 + percentRaw / 100).toFixed(8));\n if (denom === 0) {\n return null;\n }\n\n return {\n current: asset.userCurrencyValue,\n previous: asset.userCurrencyValue / denom,\n };\n })\n .filter((change): change is NonNullable<typeof change> => change !== null);\n\n return assetChanges.reduce(\n (totals, change) => ({\n current: totals.current + change.current,\n previous: totals.previous + change.previous,\n }),\n { current: 0, previous: 0 },\n );\n}\n\n/**\n * Calculate portfolio value change for a specific account group and period.\n *\n * @param accountTreeState - AccountTreeController state.\n * @param accountsState - AccountsController state.\n * @param tokenBalancesState - TokenBalancesController state.\n * @param tokenRatesState - TokenRatesController state.\n * @param multichainRatesState - MultichainAssetsRatesController state.\n * @param multichainBalancesState - MultichainBalancesController state.\n * @param multichainAssetsState - MultichainAssetsController state.\n * @param tokensState - TokensController state.\n * @param currencyRateState - CurrencyRateController state.\n * @param enabledNetworkMap - Map of enabled networks keyed by namespace.\n * @param groupId - Account group ID to compute change for.\n * @param period - Change period ('1d' | '7d' | '30d').\n * @param networkConfigurationsByChainId - Optional network configurations to derive native currency fallback pricing.\n * @returns Change result including current, previous, delta, percent, and period.\n */\nexport function calculateBalanceChangeForAccountGroup(\n accountTreeState: AccountTreeControllerState,\n accountsState: AccountsControllerState,\n tokenBalancesState: TokenBalancesControllerState,\n tokenRatesState: TokenRatesControllerState,\n multichainRatesState: MultichainAssetsRatesControllerState,\n multichainBalancesState: MultichainBalancesControllerState,\n multichainAssetsState: MultichainAssetsControllerState,\n tokensState: TokensControllerState,\n currencyRateState: CurrencyRateState,\n enabledNetworkMap: Record<string, Record<string, boolean>> | undefined,\n groupId: string,\n period: BalanceChangePeriod,\n networkConfigurationsByChainId?: Record<\n Hex,\n NetworkConfigurationNativeCurrency\n >,\n): BalanceChangeResult {\n const isEvmChainEnabled = (chainId: Hex): boolean =>\n isChainEnabledByMap(enabledNetworkMap, chainId);\n\n const isAssetChainEnabled = (assetId: CaipAssetType): boolean => {\n const { chainId } = parseCaipAssetType(assetId);\n return isChainEnabledByMap(enabledNetworkMap, chainId);\n };\n\n const getAccountChange = {\n evm: (account: InternalAccount) =>\n sumEvmAccountChangeForPeriod(\n account,\n period,\n tokenBalancesState,\n tokensState,\n tokenRatesState,\n currencyRateState,\n isEvmChainEnabled,\n networkConfigurationsByChainId,\n ),\n nonEvm: (account: InternalAccount) =>\n sumNonEvmAccountChangeForPeriod(\n account,\n period,\n multichainBalancesState,\n multichainAssetsState,\n multichainRatesState,\n isAssetChainEnabled,\n ),\n };\n\n const getFlatAccountChanges = () => {\n const accounts = getInternalAccountsForGroup(\n accountTreeState,\n accountsState,\n groupId,\n );\n return accounts.map((account) => ({\n account,\n isEvm: isEvmAccountType(account.type),\n }));\n };\n\n const getAggregatedTotals = (\n flatAccountChanges: ReturnType<typeof getFlatAccountChanges>,\n ) => {\n return flatAccountChanges.reduce(\n (totals, { account, isEvm }) => {\n const change = isEvm\n ? getAccountChange.evm(account)\n : getAccountChange.nonEvm(account);\n totals.current += change.current;\n totals.previous += change.previous;\n return totals;\n },\n { current: 0, previous: 0 },\n );\n };\n\n const flatAccountChanges = getFlatAccountChanges();\n const aggregatedTotals = getAggregatedTotals(flatAccountChanges);\n\n const amountChange = aggregatedTotals.current - aggregatedTotals.previous;\n const percentChange =\n aggregatedTotals.previous !== 0\n ? (amountChange / aggregatedTotals.previous) * 100\n : 0;\n\n return {\n period,\n currentTotalInUserCurrency: Number(aggregatedTotals.current.toFixed(8)),\n previousTotalInUserCurrency: Number(aggregatedTotals.previous.toFixed(8)),\n amountChangeInUserCurrency: Number(amountChange.toFixed(8)),\n percentChange: Number(percentChange.toFixed(8)),\n userCurrency: currencyRateState.currentCurrency,\n };\n}\n"]}
@@ -1,5 +1,6 @@
1
1
  import type { AccountTreeControllerState } from "@metamask/account-tree-controller";
2
2
  import type { AccountsControllerState } from "@metamask/accounts-controller";
3
+ import type { Hex } from "@metamask/utils";
3
4
  import type { CurrencyRateState } from "./CurrencyRateController.cjs";
4
5
  import type { MultichainAssetsControllerState } from "./MultichainAssetsController/index.cjs";
5
6
  import type { MultichainAssetsRatesControllerState } from "./MultichainAssetsRatesController/index.cjs";
@@ -33,6 +34,13 @@ export type BalanceChangeResult = {
33
34
  percentChange: number;
34
35
  userCurrency: string;
35
36
  };
37
+ /**
38
+ * Minimal network config shape needed to derive native currency by chain.
39
+ * Compatible with NetworkController's networkConfigurationsByChainId entries.
40
+ */
41
+ export type NetworkConfigurationNativeCurrency = {
42
+ nativeCurrency: string;
43
+ };
36
44
  /**
37
45
  * Calculate balances for all wallets and groups.
38
46
  * Pure function – accepts controller states and returns aggregated totals.
@@ -47,9 +55,10 @@ export type BalanceChangeResult = {
47
55
  * @param tokensState - TokensController state
48
56
  * @param currencyRateState - CurrencyRateController state
49
57
  * @param enabledNetworkMap - Map of enabled networks keyed by namespace
58
+ * @param networkConfigurationsByChainId - Network configurations by chain ID.
50
59
  * @returns Aggregated balances for all wallets
51
60
  */
52
- export declare function calculateBalanceForAllWallets(accountTreeState: AccountTreeControllerState, accountsState: AccountsControllerState, tokenBalancesState: TokenBalancesControllerState, tokenRatesState: TokenRatesControllerState, multichainRatesState: MultichainAssetsRatesControllerState, multichainBalancesState: MultichainBalancesControllerState, multichainAssetsState: MultichainAssetsControllerState, tokensState: TokensControllerState, currencyRateState: CurrencyRateState, enabledNetworkMap: Record<string, Record<string, boolean>> | undefined): AllWalletsBalance;
61
+ export declare function calculateBalanceForAllWallets(accountTreeState: AccountTreeControllerState, accountsState: AccountsControllerState, tokenBalancesState: TokenBalancesControllerState, tokenRatesState: TokenRatesControllerState, multichainRatesState: MultichainAssetsRatesControllerState, multichainBalancesState: MultichainBalancesControllerState, multichainAssetsState: MultichainAssetsControllerState, tokensState: TokensControllerState, currencyRateState: CurrencyRateState, enabledNetworkMap: Record<string, Record<string, boolean>> | undefined, networkConfigurationsByChainId?: Record<Hex, NetworkConfigurationNativeCurrency>): AllWalletsBalance;
53
62
  /**
54
63
  * Calculate aggregated portfolio value change for a given period (1d, 7d, 30d).
55
64
  * Logic mirrors extension/mobile historical aggregation:
@@ -68,9 +77,10 @@ export declare function calculateBalanceForAllWallets(accountTreeState: AccountT
68
77
  * @param currencyRateState - CurrencyRateController state.
69
78
  * @param enabledNetworkMap - Map of enabled networks keyed by namespace.
70
79
  * @param period - Period to compute change for ('1d' | '7d' | '30d').
80
+ * @param networkConfigurationsByChainId - Optional network configurations to derive native currency fallback pricing.
71
81
  * @returns Aggregated change details for the requested period.
72
82
  */
73
- export declare function calculateBalanceChangeForAllWallets(accountTreeState: AccountTreeControllerState, accountsState: AccountsControllerState, tokenBalancesState: TokenBalancesControllerState, tokenRatesState: TokenRatesControllerState, multichainRatesState: MultichainAssetsRatesControllerState, multichainBalancesState: MultichainBalancesControllerState, multichainAssetsState: MultichainAssetsControllerState, tokensState: TokensControllerState, currencyRateState: CurrencyRateState, enabledNetworkMap: Record<string, Record<string, boolean>> | undefined, period: BalanceChangePeriod): BalanceChangeResult;
83
+ export declare function calculateBalanceChangeForAllWallets(accountTreeState: AccountTreeControllerState, accountsState: AccountsControllerState, tokenBalancesState: TokenBalancesControllerState, tokenRatesState: TokenRatesControllerState, multichainRatesState: MultichainAssetsRatesControllerState, multichainBalancesState: MultichainBalancesControllerState, multichainAssetsState: MultichainAssetsControllerState, tokensState: TokensControllerState, currencyRateState: CurrencyRateState, enabledNetworkMap: Record<string, Record<string, boolean>> | undefined, period: BalanceChangePeriod, networkConfigurationsByChainId?: Record<Hex, NetworkConfigurationNativeCurrency>): BalanceChangeResult;
74
84
  /**
75
85
  * Calculate portfolio value change for a specific account group and period.
76
86
  *
@@ -86,7 +96,8 @@ export declare function calculateBalanceChangeForAllWallets(accountTreeState: Ac
86
96
  * @param enabledNetworkMap - Map of enabled networks keyed by namespace.
87
97
  * @param groupId - Account group ID to compute change for.
88
98
  * @param period - Change period ('1d' | '7d' | '30d').
99
+ * @param networkConfigurationsByChainId - Optional network configurations to derive native currency fallback pricing.
89
100
  * @returns Change result including current, previous, delta, percent, and period.
90
101
  */
91
- export declare function calculateBalanceChangeForAccountGroup(accountTreeState: AccountTreeControllerState, accountsState: AccountsControllerState, tokenBalancesState: TokenBalancesControllerState, tokenRatesState: TokenRatesControllerState, multichainRatesState: MultichainAssetsRatesControllerState, multichainBalancesState: MultichainBalancesControllerState, multichainAssetsState: MultichainAssetsControllerState, tokensState: TokensControllerState, currencyRateState: CurrencyRateState, enabledNetworkMap: Record<string, Record<string, boolean>> | undefined, groupId: string, period: BalanceChangePeriod): BalanceChangeResult;
102
+ export declare function calculateBalanceChangeForAccountGroup(accountTreeState: AccountTreeControllerState, accountsState: AccountsControllerState, tokenBalancesState: TokenBalancesControllerState, tokenRatesState: TokenRatesControllerState, multichainRatesState: MultichainAssetsRatesControllerState, multichainBalancesState: MultichainBalancesControllerState, multichainAssetsState: MultichainAssetsControllerState, tokensState: TokensControllerState, currencyRateState: CurrencyRateState, enabledNetworkMap: Record<string, Record<string, boolean>> | undefined, groupId: string, period: BalanceChangePeriod, networkConfigurationsByChainId?: Record<Hex, NetworkConfigurationNativeCurrency>): BalanceChangeResult;
92
103
  //# sourceMappingURL=balances.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"balances.d.cts","sourceRoot":"","sources":["../src/balances.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"balances.d.cts","sourceRoot":"","sources":["../src/balances.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { AccountTreeControllerState } from "@metamask/account-tree-controller";
2
2
  import type { AccountsControllerState } from "@metamask/accounts-controller";
3
+ import type { Hex } from "@metamask/utils";
3
4
  import type { CurrencyRateState } from "./CurrencyRateController.mjs";
4
5
  import type { MultichainAssetsControllerState } from "./MultichainAssetsController/index.mjs";
5
6
  import type { MultichainAssetsRatesControllerState } from "./MultichainAssetsRatesController/index.mjs";
@@ -33,6 +34,13 @@ export type BalanceChangeResult = {
33
34
  percentChange: number;
34
35
  userCurrency: string;
35
36
  };
37
+ /**
38
+ * Minimal network config shape needed to derive native currency by chain.
39
+ * Compatible with NetworkController's networkConfigurationsByChainId entries.
40
+ */
41
+ export type NetworkConfigurationNativeCurrency = {
42
+ nativeCurrency: string;
43
+ };
36
44
  /**
37
45
  * Calculate balances for all wallets and groups.
38
46
  * Pure function – accepts controller states and returns aggregated totals.
@@ -47,9 +55,10 @@ export type BalanceChangeResult = {
47
55
  * @param tokensState - TokensController state
48
56
  * @param currencyRateState - CurrencyRateController state
49
57
  * @param enabledNetworkMap - Map of enabled networks keyed by namespace
58
+ * @param networkConfigurationsByChainId - Network configurations by chain ID.
50
59
  * @returns Aggregated balances for all wallets
51
60
  */
52
- export declare function calculateBalanceForAllWallets(accountTreeState: AccountTreeControllerState, accountsState: AccountsControllerState, tokenBalancesState: TokenBalancesControllerState, tokenRatesState: TokenRatesControllerState, multichainRatesState: MultichainAssetsRatesControllerState, multichainBalancesState: MultichainBalancesControllerState, multichainAssetsState: MultichainAssetsControllerState, tokensState: TokensControllerState, currencyRateState: CurrencyRateState, enabledNetworkMap: Record<string, Record<string, boolean>> | undefined): AllWalletsBalance;
61
+ export declare function calculateBalanceForAllWallets(accountTreeState: AccountTreeControllerState, accountsState: AccountsControllerState, tokenBalancesState: TokenBalancesControllerState, tokenRatesState: TokenRatesControllerState, multichainRatesState: MultichainAssetsRatesControllerState, multichainBalancesState: MultichainBalancesControllerState, multichainAssetsState: MultichainAssetsControllerState, tokensState: TokensControllerState, currencyRateState: CurrencyRateState, enabledNetworkMap: Record<string, Record<string, boolean>> | undefined, networkConfigurationsByChainId?: Record<Hex, NetworkConfigurationNativeCurrency>): AllWalletsBalance;
53
62
  /**
54
63
  * Calculate aggregated portfolio value change for a given period (1d, 7d, 30d).
55
64
  * Logic mirrors extension/mobile historical aggregation:
@@ -68,9 +77,10 @@ export declare function calculateBalanceForAllWallets(accountTreeState: AccountT
68
77
  * @param currencyRateState - CurrencyRateController state.
69
78
  * @param enabledNetworkMap - Map of enabled networks keyed by namespace.
70
79
  * @param period - Period to compute change for ('1d' | '7d' | '30d').
80
+ * @param networkConfigurationsByChainId - Optional network configurations to derive native currency fallback pricing.
71
81
  * @returns Aggregated change details for the requested period.
72
82
  */
73
- export declare function calculateBalanceChangeForAllWallets(accountTreeState: AccountTreeControllerState, accountsState: AccountsControllerState, tokenBalancesState: TokenBalancesControllerState, tokenRatesState: TokenRatesControllerState, multichainRatesState: MultichainAssetsRatesControllerState, multichainBalancesState: MultichainBalancesControllerState, multichainAssetsState: MultichainAssetsControllerState, tokensState: TokensControllerState, currencyRateState: CurrencyRateState, enabledNetworkMap: Record<string, Record<string, boolean>> | undefined, period: BalanceChangePeriod): BalanceChangeResult;
83
+ export declare function calculateBalanceChangeForAllWallets(accountTreeState: AccountTreeControllerState, accountsState: AccountsControllerState, tokenBalancesState: TokenBalancesControllerState, tokenRatesState: TokenRatesControllerState, multichainRatesState: MultichainAssetsRatesControllerState, multichainBalancesState: MultichainBalancesControllerState, multichainAssetsState: MultichainAssetsControllerState, tokensState: TokensControllerState, currencyRateState: CurrencyRateState, enabledNetworkMap: Record<string, Record<string, boolean>> | undefined, period: BalanceChangePeriod, networkConfigurationsByChainId?: Record<Hex, NetworkConfigurationNativeCurrency>): BalanceChangeResult;
74
84
  /**
75
85
  * Calculate portfolio value change for a specific account group and period.
76
86
  *
@@ -86,7 +96,8 @@ export declare function calculateBalanceChangeForAllWallets(accountTreeState: Ac
86
96
  * @param enabledNetworkMap - Map of enabled networks keyed by namespace.
87
97
  * @param groupId - Account group ID to compute change for.
88
98
  * @param period - Change period ('1d' | '7d' | '30d').
99
+ * @param networkConfigurationsByChainId - Optional network configurations to derive native currency fallback pricing.
89
100
  * @returns Change result including current, previous, delta, percent, and period.
90
101
  */
91
- export declare function calculateBalanceChangeForAccountGroup(accountTreeState: AccountTreeControllerState, accountsState: AccountsControllerState, tokenBalancesState: TokenBalancesControllerState, tokenRatesState: TokenRatesControllerState, multichainRatesState: MultichainAssetsRatesControllerState, multichainBalancesState: MultichainBalancesControllerState, multichainAssetsState: MultichainAssetsControllerState, tokensState: TokensControllerState, currencyRateState: CurrencyRateState, enabledNetworkMap: Record<string, Record<string, boolean>> | undefined, groupId: string, period: BalanceChangePeriod): BalanceChangeResult;
102
+ export declare function calculateBalanceChangeForAccountGroup(accountTreeState: AccountTreeControllerState, accountsState: AccountsControllerState, tokenBalancesState: TokenBalancesControllerState, tokenRatesState: TokenRatesControllerState, multichainRatesState: MultichainAssetsRatesControllerState, multichainBalancesState: MultichainBalancesControllerState, multichainAssetsState: MultichainAssetsControllerState, tokensState: TokensControllerState, currencyRateState: CurrencyRateState, enabledNetworkMap: Record<string, Record<string, boolean>> | undefined, groupId: string, period: BalanceChangePeriod, networkConfigurationsByChainId?: Record<Hex, NetworkConfigurationNativeCurrency>): BalanceChangeResult;
92
103
  //# sourceMappingURL=balances.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"balances.d.mts","sourceRoot":"","sources":["../src/balances.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"balances.d.mts","sourceRoot":"","sources":["../src/balances.ts"],"names":[],"mappings":"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"}