@metamask-previews/assets-controllers 73.0.1-preview-bf50b46b → 73.0.1-preview-e4e5ca5c

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 (96) hide show
  1. package/CHANGELOG.md +1 -13
  2. package/dist/AccountTrackerController.cjs +5 -167
  3. package/dist/AccountTrackerController.cjs.map +1 -1
  4. package/dist/AccountTrackerController.d.cts +2 -14
  5. package/dist/AccountTrackerController.d.cts.map +1 -1
  6. package/dist/AccountTrackerController.d.mts +2 -14
  7. package/dist/AccountTrackerController.d.mts.map +1 -1
  8. package/dist/AccountTrackerController.mjs +5 -167
  9. package/dist/AccountTrackerController.mjs.map +1 -1
  10. package/dist/TokenBalancesController.cjs +321 -267
  11. package/dist/TokenBalancesController.cjs.map +1 -1
  12. package/dist/TokenBalancesController.d.cts +93 -51
  13. package/dist/TokenBalancesController.d.cts.map +1 -1
  14. package/dist/TokenBalancesController.d.mts +93 -51
  15. package/dist/TokenBalancesController.d.mts.map +1 -1
  16. package/dist/TokenBalancesController.mjs +320 -270
  17. package/dist/TokenBalancesController.mjs.map +1 -1
  18. package/dist/assetsUtil.cjs +1 -13
  19. package/dist/assetsUtil.cjs.map +1 -1
  20. package/dist/assetsUtil.d.cts +0 -8
  21. package/dist/assetsUtil.d.cts.map +1 -1
  22. package/dist/assetsUtil.d.mts +0 -8
  23. package/dist/assetsUtil.d.mts.map +1 -1
  24. package/dist/assetsUtil.mjs +1 -12
  25. package/dist/assetsUtil.mjs.map +1 -1
  26. package/dist/constants.cjs +1 -12
  27. package/dist/constants.cjs.map +1 -1
  28. package/dist/constants.d.cts +0 -1
  29. package/dist/constants.d.cts.map +1 -1
  30. package/dist/constants.d.mts +0 -1
  31. package/dist/constants.d.mts.map +1 -1
  32. package/dist/constants.mjs +0 -11
  33. package/dist/constants.mjs.map +1 -1
  34. package/dist/index.cjs +3 -3
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.cts +3 -2
  37. package/dist/index.d.cts.map +1 -1
  38. package/dist/index.d.mts +3 -2
  39. package/dist/index.d.mts.map +1 -1
  40. package/dist/index.mjs +1 -1
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/multi-chain-accounts-service/multi-chain-accounts.cjs +1 -35
  43. package/dist/multi-chain-accounts-service/multi-chain-accounts.cjs.map +1 -1
  44. package/dist/multi-chain-accounts-service/multi-chain-accounts.d.cts +0 -16
  45. package/dist/multi-chain-accounts-service/multi-chain-accounts.d.cts.map +1 -1
  46. package/dist/multi-chain-accounts-service/multi-chain-accounts.d.mts +0 -16
  47. package/dist/multi-chain-accounts-service/multi-chain-accounts.d.mts.map +1 -1
  48. package/dist/multi-chain-accounts-service/multi-chain-accounts.mjs +0 -33
  49. package/dist/multi-chain-accounts-service/multi-chain-accounts.mjs.map +1 -1
  50. package/dist/multi-chain-accounts-service/types.cjs.map +1 -1
  51. package/dist/multi-chain-accounts-service/types.d.cts +0 -8
  52. package/dist/multi-chain-accounts-service/types.d.cts.map +1 -1
  53. package/dist/multi-chain-accounts-service/types.d.mts +0 -8
  54. package/dist/multi-chain-accounts-service/types.d.mts.map +1 -1
  55. package/dist/multi-chain-accounts-service/types.mjs.map +1 -1
  56. package/dist/multicall.cjs +22 -397
  57. package/dist/multicall.cjs.map +1 -1
  58. package/dist/multicall.d.cts +0 -39
  59. package/dist/multicall.d.cts.map +1 -1
  60. package/dist/multicall.d.mts +0 -39
  61. package/dist/multicall.d.mts.map +1 -1
  62. package/dist/multicall.mjs +21 -398
  63. package/dist/multicall.mjs.map +1 -1
  64. package/dist/selectors/balanceSelectors.cjs +275 -0
  65. package/dist/selectors/balanceSelectors.cjs.map +1 -0
  66. package/dist/selectors/balanceSelectors.d.cts +248 -0
  67. package/dist/selectors/balanceSelectors.d.cts.map +1 -0
  68. package/dist/selectors/balanceSelectors.d.mts +248 -0
  69. package/dist/selectors/balanceSelectors.d.mts.map +1 -0
  70. package/dist/selectors/balanceSelectors.mjs +268 -0
  71. package/dist/selectors/balanceSelectors.mjs.map +1 -0
  72. package/package.json +6 -3
  73. package/dist/multi-chain-accounts-service/api-balance-fetcher.cjs +0 -98
  74. package/dist/multi-chain-accounts-service/api-balance-fetcher.cjs.map +0 -1
  75. package/dist/multi-chain-accounts-service/api-balance-fetcher.d.cts +0 -28
  76. package/dist/multi-chain-accounts-service/api-balance-fetcher.d.cts.map +0 -1
  77. package/dist/multi-chain-accounts-service/api-balance-fetcher.d.mts +0 -28
  78. package/dist/multi-chain-accounts-service/api-balance-fetcher.d.mts.map +0 -1
  79. package/dist/multi-chain-accounts-service/api-balance-fetcher.mjs +0 -98
  80. package/dist/multi-chain-accounts-service/api-balance-fetcher.mjs.map +0 -1
  81. package/dist/rpc-service/rpc-balance-fetcher.cjs +0 -128
  82. package/dist/rpc-service/rpc-balance-fetcher.cjs.map +0 -1
  83. package/dist/rpc-service/rpc-balance-fetcher.d.cts +0 -34
  84. package/dist/rpc-service/rpc-balance-fetcher.d.cts.map +0 -1
  85. package/dist/rpc-service/rpc-balance-fetcher.d.mts +0 -34
  86. package/dist/rpc-service/rpc-balance-fetcher.d.mts.map +0 -1
  87. package/dist/rpc-service/rpc-balance-fetcher.mjs +0 -124
  88. package/dist/rpc-service/rpc-balance-fetcher.mjs.map +0 -1
  89. package/dist/selectors.cjs +0 -64
  90. package/dist/selectors.cjs.map +0 -1
  91. package/dist/selectors.d.cts +0 -51
  92. package/dist/selectors.d.cts.map +0 -1
  93. package/dist/selectors.d.mts +0 -51
  94. package/dist/selectors.d.mts.map +0 -1
  95. package/dist/selectors.mjs +0 -61
  96. package/dist/selectors.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-balance-fetcher.mjs","sourceRoot":"","sources":["../../src/multi-chain-accounts-service/api-balance-fetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n safelyExecute,\n toHex,\n toChecksumHexAddress,\n} from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { CaipAccountAddress, Hex } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { fetchMultiChainBalancesV4 } from './multi-chain-accounts';\nimport {\n accountAddressToCaipReference,\n reduceInBatchesSerially,\n} from '../assetsUtil';\nimport { SUPPORTED_NETWORKS_ACCOUNTS_API_V4 } from '../constants';\n\n// Maximum number of account addresses that can be sent to the accounts API in a single request\nconst ACCOUNTS_API_BATCH_SIZE = 50;\n\nexport type ChainIdHex = Hex;\nexport type ChecksumAddress = Hex;\n\nexport type ProcessedBalance = {\n success: boolean;\n value?: BN;\n account: ChecksumAddress;\n token: ChecksumAddress;\n chainId: ChainIdHex;\n};\n\nexport type BalanceFetcher = {\n supports(chainId: ChainIdHex): boolean;\n fetch(input: {\n chainIds: ChainIdHex[];\n queryAllAccounts: boolean;\n selectedAccount: ChecksumAddress;\n allAccounts: InternalAccount[];\n }): Promise<ProcessedBalance[]>;\n};\n\nconst checksum = (addr: string): ChecksumAddress =>\n toChecksumHexAddress(addr) as ChecksumAddress;\n\nconst toCaipAccount = (\n chainId: ChainIdHex,\n account: ChecksumAddress,\n): CaipAccountAddress => accountAddressToCaipReference(chainId, account);\n\nexport class AccountsApiBalanceFetcher implements BalanceFetcher {\n readonly #platform: 'extension' | 'mobile' = 'extension';\n\n constructor(platform: 'extension' | 'mobile' = 'extension') {\n this.#platform = platform;\n }\n\n supports(chainId: ChainIdHex): boolean {\n return SUPPORTED_NETWORKS_ACCOUNTS_API_V4.includes(chainId);\n }\n\n async #fetchBalances(addrs: CaipAccountAddress[]) {\n // If we have fewer than or equal to the batch size, make a single request\n if (addrs.length <= ACCOUNTS_API_BATCH_SIZE) {\n const { balances } = await fetchMultiChainBalancesV4(\n { accountAddresses: addrs },\n this.#platform,\n );\n return balances;\n }\n\n // Otherwise, batch the requests to respect the 50-element limit\n type BalanceData = Awaited<\n ReturnType<typeof fetchMultiChainBalancesV4>\n >['balances'][number];\n\n const allBalances = await reduceInBatchesSerially<\n CaipAccountAddress,\n BalanceData[]\n >({\n values: addrs,\n batchSize: ACCOUNTS_API_BATCH_SIZE,\n eachBatch: async (workingResult, batch) => {\n const { balances } = await fetchMultiChainBalancesV4(\n { accountAddresses: batch },\n this.#platform,\n );\n return [...(workingResult || []), ...balances];\n },\n initialResult: [],\n });\n\n return allBalances;\n }\n\n async fetch({\n chainIds,\n queryAllAccounts,\n selectedAccount,\n allAccounts,\n }: Parameters<BalanceFetcher['fetch']>[0]): Promise<ProcessedBalance[]> {\n const caipAddrs: CaipAccountAddress[] = [];\n\n for (const chainId of chainIds.filter((c) => this.supports(c))) {\n if (queryAllAccounts) {\n allAccounts.forEach((a) =>\n caipAddrs.push(toCaipAccount(chainId, a.address as ChecksumAddress)),\n );\n } else {\n caipAddrs.push(toCaipAccount(chainId, selectedAccount));\n }\n }\n\n if (!caipAddrs.length) {\n return [];\n }\n\n const balances = await safelyExecute(() => this.#fetchBalances(caipAddrs));\n if (!balances) {\n return [];\n }\n\n return balances.flatMap((b) => {\n const account = b.accountAddress?.split(':')[2] as ChecksumAddress;\n if (!account) {\n return [];\n }\n const token = checksum(b.address);\n const chainId = toHex(b.chainId) as ChainIdHex;\n\n let value: BN | undefined;\n try {\n value = new BN((parseFloat(b.balance) * 10 ** b.decimals).toFixed(0));\n } catch {\n value = undefined;\n }\n\n return [\n {\n success: value !== undefined,\n value,\n account,\n token,\n chainId,\n },\n ];\n });\n }\n}\n"]}
@@ -1,128 +0,0 @@
1
- "use strict";
2
- var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
- if (kind === "m") throw new TypeError("Private method is not writable");
4
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
- };
8
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
- };
13
- var _RpcBalanceFetcher_instances, _RpcBalanceFetcher_getProvider, _RpcBalanceFetcher_getNetworkClient, _RpcBalanceFetcher_getTokensState, _RpcBalanceFetcher_ensureFreshBlockData;
14
- Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.RpcBalanceFetcher = void 0;
16
- const controller_utils_1 = require("@metamask/controller-utils");
17
- const multicall_1 = require("../multicall.cjs");
18
- const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
19
- const checksum = (addr) => (0, controller_utils_1.toChecksumHexAddress)(addr);
20
- class RpcBalanceFetcher {
21
- constructor(getProvider, getNetworkClient, getTokensState) {
22
- _RpcBalanceFetcher_instances.add(this);
23
- _RpcBalanceFetcher_getProvider.set(this, void 0);
24
- _RpcBalanceFetcher_getNetworkClient.set(this, void 0);
25
- _RpcBalanceFetcher_getTokensState.set(this, void 0);
26
- __classPrivateFieldSet(this, _RpcBalanceFetcher_getProvider, getProvider, "f");
27
- __classPrivateFieldSet(this, _RpcBalanceFetcher_getNetworkClient, getNetworkClient, "f");
28
- __classPrivateFieldSet(this, _RpcBalanceFetcher_getTokensState, getTokensState, "f");
29
- }
30
- supports() {
31
- return true; // fallback – supports every chain
32
- }
33
- async fetch({ chainIds, queryAllAccounts, selectedAccount, allAccounts, }) {
34
- const results = [];
35
- for (const chainId of chainIds) {
36
- const tokensState = __classPrivateFieldGet(this, _RpcBalanceFetcher_getTokensState, "f").call(this);
37
- const accountTokenGroups = buildAccountTokenGroupsStatic(chainId, queryAllAccounts, selectedAccount, allAccounts, tokensState.allTokens, tokensState.allDetectedTokens);
38
- if (!accountTokenGroups.length) {
39
- continue;
40
- }
41
- const provider = __classPrivateFieldGet(this, _RpcBalanceFetcher_getProvider, "f").call(this, chainId);
42
- await __classPrivateFieldGet(this, _RpcBalanceFetcher_instances, "m", _RpcBalanceFetcher_ensureFreshBlockData).call(this, chainId);
43
- const { tokenBalances } = await (0, multicall_1.getTokenBalancesForMultipleAddresses)(accountTokenGroups, chainId, provider, true, // include native
44
- false);
45
- Object.entries(tokenBalances).forEach(([tokenAddr, balances]) => {
46
- Object.entries(balances).forEach(([acct, bn]) => {
47
- results.push({
48
- success: bn !== null,
49
- value: bn,
50
- account: acct,
51
- token: checksum(tokenAddr),
52
- chainId,
53
- });
54
- });
55
- });
56
- }
57
- return results;
58
- }
59
- }
60
- exports.RpcBalanceFetcher = RpcBalanceFetcher;
61
- _RpcBalanceFetcher_getProvider = new WeakMap(), _RpcBalanceFetcher_getNetworkClient = new WeakMap(), _RpcBalanceFetcher_getTokensState = new WeakMap(), _RpcBalanceFetcher_instances = new WeakSet(), _RpcBalanceFetcher_ensureFreshBlockData =
62
- /**
63
- * Ensures that the block tracker has the latest block data before performing multicall operations.
64
- * This is a temporary fix to ensure that the block number is up to date.
65
- *
66
- * @param chainId - The chain id to update block data for.
67
- */
68
- async function _RpcBalanceFetcher_ensureFreshBlockData(chainId) {
69
- // Force fresh block data before multicall
70
- // TODO: This is a temporary fix to ensure that the block number is up to date.
71
- // We should remove this once we have a better solution for this on the block tracker controller.
72
- const networkClient = __classPrivateFieldGet(this, _RpcBalanceFetcher_getNetworkClient, "f").call(this, chainId);
73
- await networkClient.blockTracker?.checkForLatestBlock?.();
74
- };
75
- /**
76
- * Merges imported & detected tokens for the requested chain and returns a list
77
- * of `{ accountAddress, tokenAddresses[] }` suitable for getTokenBalancesForMultipleAddresses.
78
- *
79
- * @param chainId - The chain ID to build account token groups for
80
- * @param queryAllAccounts - Whether to query all accounts or just the selected one
81
- * @param selectedAccount - The currently selected account
82
- * @param allAccounts - All available accounts
83
- * @param allTokens - All tokens from TokensController
84
- * @param allDetectedTokens - All detected tokens from TokensController
85
- * @returns Array of account/token groups for multicall
86
- */
87
- function buildAccountTokenGroupsStatic(chainId, queryAllAccounts, selectedAccount, allAccounts, allTokens, allDetectedTokens) {
88
- const pairs = [];
89
- const add = ([account, tokens]) => {
90
- const shouldInclude = queryAllAccounts || checksum(account) === checksum(selectedAccount);
91
- if (!shouldInclude) {
92
- return;
93
- }
94
- tokens.forEach((t) => pairs.push({
95
- accountAddress: account,
96
- tokenAddress: checksum(t.address),
97
- }));
98
- };
99
- Object.entries(allTokens[chainId] ?? {}).forEach(add);
100
- Object.entries(allDetectedTokens[chainId] ?? {}).forEach(add);
101
- if (queryAllAccounts) {
102
- allAccounts.forEach((a) => {
103
- pairs.push({
104
- accountAddress: a.address,
105
- tokenAddress: ZERO_ADDRESS,
106
- });
107
- });
108
- }
109
- if (!pairs.length) {
110
- return [];
111
- }
112
- // group by account
113
- const map = new Map();
114
- pairs.forEach(({ accountAddress, tokenAddress }) => {
115
- if (!map.has(accountAddress)) {
116
- map.set(accountAddress, []);
117
- }
118
- const tokens = map.get(accountAddress);
119
- if (tokens) {
120
- tokens.push(tokenAddress);
121
- }
122
- });
123
- return Array.from(map.entries()).map(([accountAddress, tokenAddresses]) => ({
124
- accountAddress,
125
- tokenAddresses,
126
- }));
127
- }
128
- //# sourceMappingURL=rpc-balance-fetcher.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rpc-balance-fetcher.cjs","sourceRoot":"","sources":["../../src/rpc-service/rpc-balance-fetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Web3Provider } from '@ethersproject/providers';\nimport { toChecksumHexAddress } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkClient } from '@metamask/network-controller';\nimport type { Hex } from '@metamask/utils';\nimport type BN from 'bn.js';\n\nimport { getTokenBalancesForMultipleAddresses } from '../multicall';\nimport type { TokensControllerState } from '../TokensController';\n\nexport type ChainIdHex = Hex;\nexport type ChecksumAddress = Hex;\n\nexport type ProcessedBalance = {\n success: boolean;\n value?: BN;\n account: ChecksumAddress;\n token: ChecksumAddress;\n chainId: ChainIdHex;\n};\n\nexport type BalanceFetcher = {\n supports(chainId: ChainIdHex): boolean;\n fetch(input: {\n chainIds: ChainIdHex[];\n queryAllAccounts: boolean;\n selectedAccount: ChecksumAddress;\n allAccounts: InternalAccount[];\n }): Promise<ProcessedBalance[]>;\n};\n\nconst ZERO_ADDRESS =\n '0x0000000000000000000000000000000000000000' as ChecksumAddress;\n\nconst checksum = (addr: string): ChecksumAddress =>\n toChecksumHexAddress(addr) as ChecksumAddress;\n\nexport class RpcBalanceFetcher implements BalanceFetcher {\n readonly #getProvider: (chainId: ChainIdHex) => Web3Provider;\n\n readonly #getNetworkClient: (chainId: ChainIdHex) => NetworkClient;\n\n readonly #getTokensState: () => {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n };\n\n constructor(\n getProvider: (chainId: ChainIdHex) => Web3Provider,\n getNetworkClient: (chainId: ChainIdHex) => NetworkClient,\n getTokensState: () => {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n },\n ) {\n this.#getProvider = getProvider;\n this.#getNetworkClient = getNetworkClient;\n this.#getTokensState = getTokensState;\n }\n\n supports(): boolean {\n return true; // fallback – supports every chain\n }\n\n async fetch({\n chainIds,\n queryAllAccounts,\n selectedAccount,\n allAccounts,\n }: Parameters<BalanceFetcher['fetch']>[0]): Promise<ProcessedBalance[]> {\n const results: ProcessedBalance[] = [];\n\n for (const chainId of chainIds) {\n const tokensState = this.#getTokensState();\n const accountTokenGroups = buildAccountTokenGroupsStatic(\n chainId,\n queryAllAccounts,\n selectedAccount,\n allAccounts,\n tokensState.allTokens,\n tokensState.allDetectedTokens,\n );\n if (!accountTokenGroups.length) {\n continue;\n }\n\n const provider = this.#getProvider(chainId);\n await this.#ensureFreshBlockData(chainId);\n\n const { tokenBalances } = await getTokenBalancesForMultipleAddresses(\n accountTokenGroups,\n chainId,\n provider,\n true, // include native\n false, // include staked\n );\n\n Object.entries(tokenBalances).forEach(([tokenAddr, balances]) => {\n Object.entries(balances).forEach(([acct, bn]) => {\n results.push({\n success: bn !== null,\n value: bn as BN,\n account: acct as ChecksumAddress,\n token: checksum(tokenAddr),\n chainId,\n });\n });\n });\n }\n\n return results;\n }\n\n /**\n * Ensures that the block tracker has the latest block data before performing multicall operations.\n * This is a temporary fix to ensure that the block number is up to date.\n *\n * @param chainId - The chain id to update block data for.\n */\n async #ensureFreshBlockData(chainId: Hex): Promise<void> {\n // Force fresh block data before multicall\n // TODO: This is a temporary fix to ensure that the block number is up to date.\n // We should remove this once we have a better solution for this on the block tracker controller.\n const networkClient = this.#getNetworkClient(chainId);\n await networkClient.blockTracker?.checkForLatestBlock?.();\n }\n}\n\n/**\n * Merges imported & detected tokens for the requested chain and returns a list\n * of `{ accountAddress, tokenAddresses[] }` suitable for getTokenBalancesForMultipleAddresses.\n *\n * @param chainId - The chain ID to build account token groups for\n * @param queryAllAccounts - Whether to query all accounts or just the selected one\n * @param selectedAccount - The currently selected account\n * @param allAccounts - All available accounts\n * @param allTokens - All tokens from TokensController\n * @param allDetectedTokens - All detected tokens from TokensController\n * @returns Array of account/token groups for multicall\n */\nfunction buildAccountTokenGroupsStatic(\n chainId: ChainIdHex,\n queryAllAccounts: boolean,\n selectedAccount: ChecksumAddress,\n allAccounts: InternalAccount[],\n allTokens: TokensControllerState['allTokens'],\n allDetectedTokens: TokensControllerState['allDetectedTokens'],\n): { accountAddress: ChecksumAddress; tokenAddresses: ChecksumAddress[] }[] {\n const pairs: {\n accountAddress: ChecksumAddress;\n tokenAddress: ChecksumAddress;\n }[] = [];\n\n const add = ([account, tokens]: [string, unknown[]]) => {\n const shouldInclude =\n queryAllAccounts || checksum(account) === checksum(selectedAccount);\n if (!shouldInclude) {\n return;\n }\n (tokens as unknown[]).forEach((t: unknown) =>\n pairs.push({\n accountAddress: account as ChecksumAddress,\n tokenAddress: checksum((t as { address: string }).address),\n }),\n );\n };\n\n Object.entries(allTokens[chainId] ?? {}).forEach(\n add as (entry: [string, unknown]) => void,\n );\n Object.entries(allDetectedTokens[chainId] ?? {}).forEach(\n add as (entry: [string, unknown]) => void,\n );\n\n if (queryAllAccounts) {\n allAccounts.forEach((a) => {\n pairs.push({\n accountAddress: a.address as ChecksumAddress,\n tokenAddress: ZERO_ADDRESS,\n });\n });\n }\n\n if (!pairs.length) {\n return [];\n }\n\n // group by account\n const map = new Map<ChecksumAddress, ChecksumAddress[]>();\n pairs.forEach(({ accountAddress, tokenAddress }) => {\n if (!map.has(accountAddress)) {\n map.set(accountAddress, []);\n }\n const tokens = map.get(accountAddress);\n if (tokens) {\n tokens.push(tokenAddress);\n }\n });\n\n return Array.from(map.entries()).map(([accountAddress, tokenAddresses]) => ({\n accountAddress,\n tokenAddresses,\n }));\n}\n"]}
@@ -1,34 +0,0 @@
1
- import type { Web3Provider } from "@ethersproject/providers";
2
- import type { InternalAccount } from "@metamask/keyring-internal-api";
3
- import type { NetworkClient } from "@metamask/network-controller";
4
- import type { Hex } from "@metamask/utils";
5
- import type BN from "bn.js";
6
- import type { TokensControllerState } from "../TokensController.cjs";
7
- export type ChainIdHex = Hex;
8
- export type ChecksumAddress = Hex;
9
- export type ProcessedBalance = {
10
- success: boolean;
11
- value?: BN;
12
- account: ChecksumAddress;
13
- token: ChecksumAddress;
14
- chainId: ChainIdHex;
15
- };
16
- export type BalanceFetcher = {
17
- supports(chainId: ChainIdHex): boolean;
18
- fetch(input: {
19
- chainIds: ChainIdHex[];
20
- queryAllAccounts: boolean;
21
- selectedAccount: ChecksumAddress;
22
- allAccounts: InternalAccount[];
23
- }): Promise<ProcessedBalance[]>;
24
- };
25
- export declare class RpcBalanceFetcher implements BalanceFetcher {
26
- #private;
27
- constructor(getProvider: (chainId: ChainIdHex) => Web3Provider, getNetworkClient: (chainId: ChainIdHex) => NetworkClient, getTokensState: () => {
28
- allTokens: TokensControllerState['allTokens'];
29
- allDetectedTokens: TokensControllerState['allDetectedTokens'];
30
- });
31
- supports(): boolean;
32
- fetch({ chainIds, queryAllAccounts, selectedAccount, allAccounts, }: Parameters<BalanceFetcher['fetch']>[0]): Promise<ProcessedBalance[]>;
33
- }
34
- //# sourceMappingURL=rpc-balance-fetcher.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rpc-balance-fetcher.d.cts","sourceRoot":"","sources":["../../src/rpc-service/rpc-balance-fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iCAAiC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,qCAAqC;AAClE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAC3C,OAAO,KAAK,EAAE,cAAc;AAG5B,OAAO,KAAK,EAAE,qBAAqB,EAAE,gCAA4B;AAEjE,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC;AAC7B,MAAM,MAAM,eAAe,GAAG,GAAG,CAAC;AAElC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,EAAE,CAAC;IACX,OAAO,EAAE,eAAe,CAAC;IACzB,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC;IACvC,KAAK,CAAC,KAAK,EAAE;QACX,QAAQ,EAAE,UAAU,EAAE,CAAC;QACvB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,eAAe,EAAE,eAAe,CAAC;QACjC,WAAW,EAAE,eAAe,EAAE,CAAC;KAChC,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;CACjC,CAAC;AAQF,qBAAa,iBAAkB,YAAW,cAAc;;gBAWpD,WAAW,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,YAAY,EAClD,gBAAgB,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,aAAa,EACxD,cAAc,EAAE,MAAM;QACpB,SAAS,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAC9C,iBAAiB,EAAE,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;KAC/D;IAOH,QAAQ,IAAI,OAAO;IAIb,KAAK,CAAC,EACV,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,EAAE,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;CAyDxE"}
@@ -1,34 +0,0 @@
1
- import type { Web3Provider } from "@ethersproject/providers";
2
- import type { InternalAccount } from "@metamask/keyring-internal-api";
3
- import type { NetworkClient } from "@metamask/network-controller";
4
- import type { Hex } from "@metamask/utils";
5
- import type BN from "bn.js";
6
- import type { TokensControllerState } from "../TokensController.mjs";
7
- export type ChainIdHex = Hex;
8
- export type ChecksumAddress = Hex;
9
- export type ProcessedBalance = {
10
- success: boolean;
11
- value?: BN;
12
- account: ChecksumAddress;
13
- token: ChecksumAddress;
14
- chainId: ChainIdHex;
15
- };
16
- export type BalanceFetcher = {
17
- supports(chainId: ChainIdHex): boolean;
18
- fetch(input: {
19
- chainIds: ChainIdHex[];
20
- queryAllAccounts: boolean;
21
- selectedAccount: ChecksumAddress;
22
- allAccounts: InternalAccount[];
23
- }): Promise<ProcessedBalance[]>;
24
- };
25
- export declare class RpcBalanceFetcher implements BalanceFetcher {
26
- #private;
27
- constructor(getProvider: (chainId: ChainIdHex) => Web3Provider, getNetworkClient: (chainId: ChainIdHex) => NetworkClient, getTokensState: () => {
28
- allTokens: TokensControllerState['allTokens'];
29
- allDetectedTokens: TokensControllerState['allDetectedTokens'];
30
- });
31
- supports(): boolean;
32
- fetch({ chainIds, queryAllAccounts, selectedAccount, allAccounts, }: Parameters<BalanceFetcher['fetch']>[0]): Promise<ProcessedBalance[]>;
33
- }
34
- //# sourceMappingURL=rpc-balance-fetcher.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rpc-balance-fetcher.d.mts","sourceRoot":"","sources":["../../src/rpc-service/rpc-balance-fetcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iCAAiC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,qCAAqC;AAClE,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAC3C,OAAO,KAAK,EAAE,cAAc;AAG5B,OAAO,KAAK,EAAE,qBAAqB,EAAE,gCAA4B;AAEjE,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC;AAC7B,MAAM,MAAM,eAAe,GAAG,GAAG,CAAC;AAElC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,EAAE,CAAC;IACX,OAAO,EAAE,eAAe,CAAC;IACzB,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC;IACvC,KAAK,CAAC,KAAK,EAAE;QACX,QAAQ,EAAE,UAAU,EAAE,CAAC;QACvB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,eAAe,EAAE,eAAe,CAAC;QACjC,WAAW,EAAE,eAAe,EAAE,CAAC;KAChC,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;CACjC,CAAC;AAQF,qBAAa,iBAAkB,YAAW,cAAc;;gBAWpD,WAAW,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,YAAY,EAClD,gBAAgB,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,aAAa,EACxD,cAAc,EAAE,MAAM;QACpB,SAAS,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;QAC9C,iBAAiB,EAAE,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;KAC/D;IAOH,QAAQ,IAAI,OAAO;IAIb,KAAK,CAAC,EACV,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,WAAW,GACZ,EAAE,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;CAyDxE"}
@@ -1,124 +0,0 @@
1
- var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
- if (kind === "m") throw new TypeError("Private method is not writable");
3
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
- };
7
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
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
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
- };
12
- var _RpcBalanceFetcher_instances, _RpcBalanceFetcher_getProvider, _RpcBalanceFetcher_getNetworkClient, _RpcBalanceFetcher_getTokensState, _RpcBalanceFetcher_ensureFreshBlockData;
13
- import { toChecksumHexAddress } from "@metamask/controller-utils";
14
- import { getTokenBalancesForMultipleAddresses } from "../multicall.mjs";
15
- const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
16
- const checksum = (addr) => toChecksumHexAddress(addr);
17
- export class RpcBalanceFetcher {
18
- constructor(getProvider, getNetworkClient, getTokensState) {
19
- _RpcBalanceFetcher_instances.add(this);
20
- _RpcBalanceFetcher_getProvider.set(this, void 0);
21
- _RpcBalanceFetcher_getNetworkClient.set(this, void 0);
22
- _RpcBalanceFetcher_getTokensState.set(this, void 0);
23
- __classPrivateFieldSet(this, _RpcBalanceFetcher_getProvider, getProvider, "f");
24
- __classPrivateFieldSet(this, _RpcBalanceFetcher_getNetworkClient, getNetworkClient, "f");
25
- __classPrivateFieldSet(this, _RpcBalanceFetcher_getTokensState, getTokensState, "f");
26
- }
27
- supports() {
28
- return true; // fallback – supports every chain
29
- }
30
- async fetch({ chainIds, queryAllAccounts, selectedAccount, allAccounts, }) {
31
- const results = [];
32
- for (const chainId of chainIds) {
33
- const tokensState = __classPrivateFieldGet(this, _RpcBalanceFetcher_getTokensState, "f").call(this);
34
- const accountTokenGroups = buildAccountTokenGroupsStatic(chainId, queryAllAccounts, selectedAccount, allAccounts, tokensState.allTokens, tokensState.allDetectedTokens);
35
- if (!accountTokenGroups.length) {
36
- continue;
37
- }
38
- const provider = __classPrivateFieldGet(this, _RpcBalanceFetcher_getProvider, "f").call(this, chainId);
39
- await __classPrivateFieldGet(this, _RpcBalanceFetcher_instances, "m", _RpcBalanceFetcher_ensureFreshBlockData).call(this, chainId);
40
- const { tokenBalances } = await getTokenBalancesForMultipleAddresses(accountTokenGroups, chainId, provider, true, // include native
41
- false);
42
- Object.entries(tokenBalances).forEach(([tokenAddr, balances]) => {
43
- Object.entries(balances).forEach(([acct, bn]) => {
44
- results.push({
45
- success: bn !== null,
46
- value: bn,
47
- account: acct,
48
- token: checksum(tokenAddr),
49
- chainId,
50
- });
51
- });
52
- });
53
- }
54
- return results;
55
- }
56
- }
57
- _RpcBalanceFetcher_getProvider = new WeakMap(), _RpcBalanceFetcher_getNetworkClient = new WeakMap(), _RpcBalanceFetcher_getTokensState = new WeakMap(), _RpcBalanceFetcher_instances = new WeakSet(), _RpcBalanceFetcher_ensureFreshBlockData =
58
- /**
59
- * Ensures that the block tracker has the latest block data before performing multicall operations.
60
- * This is a temporary fix to ensure that the block number is up to date.
61
- *
62
- * @param chainId - The chain id to update block data for.
63
- */
64
- async function _RpcBalanceFetcher_ensureFreshBlockData(chainId) {
65
- // Force fresh block data before multicall
66
- // TODO: This is a temporary fix to ensure that the block number is up to date.
67
- // We should remove this once we have a better solution for this on the block tracker controller.
68
- const networkClient = __classPrivateFieldGet(this, _RpcBalanceFetcher_getNetworkClient, "f").call(this, chainId);
69
- await networkClient.blockTracker?.checkForLatestBlock?.();
70
- };
71
- /**
72
- * Merges imported & detected tokens for the requested chain and returns a list
73
- * of `{ accountAddress, tokenAddresses[] }` suitable for getTokenBalancesForMultipleAddresses.
74
- *
75
- * @param chainId - The chain ID to build account token groups for
76
- * @param queryAllAccounts - Whether to query all accounts or just the selected one
77
- * @param selectedAccount - The currently selected account
78
- * @param allAccounts - All available accounts
79
- * @param allTokens - All tokens from TokensController
80
- * @param allDetectedTokens - All detected tokens from TokensController
81
- * @returns Array of account/token groups for multicall
82
- */
83
- function buildAccountTokenGroupsStatic(chainId, queryAllAccounts, selectedAccount, allAccounts, allTokens, allDetectedTokens) {
84
- const pairs = [];
85
- const add = ([account, tokens]) => {
86
- const shouldInclude = queryAllAccounts || checksum(account) === checksum(selectedAccount);
87
- if (!shouldInclude) {
88
- return;
89
- }
90
- tokens.forEach((t) => pairs.push({
91
- accountAddress: account,
92
- tokenAddress: checksum(t.address),
93
- }));
94
- };
95
- Object.entries(allTokens[chainId] ?? {}).forEach(add);
96
- Object.entries(allDetectedTokens[chainId] ?? {}).forEach(add);
97
- if (queryAllAccounts) {
98
- allAccounts.forEach((a) => {
99
- pairs.push({
100
- accountAddress: a.address,
101
- tokenAddress: ZERO_ADDRESS,
102
- });
103
- });
104
- }
105
- if (!pairs.length) {
106
- return [];
107
- }
108
- // group by account
109
- const map = new Map();
110
- pairs.forEach(({ accountAddress, tokenAddress }) => {
111
- if (!map.has(accountAddress)) {
112
- map.set(accountAddress, []);
113
- }
114
- const tokens = map.get(accountAddress);
115
- if (tokens) {
116
- tokens.push(tokenAddress);
117
- }
118
- });
119
- return Array.from(map.entries()).map(([accountAddress, tokenAddresses]) => ({
120
- accountAddress,
121
- tokenAddresses,
122
- }));
123
- }
124
- //# sourceMappingURL=rpc-balance-fetcher.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rpc-balance-fetcher.mjs","sourceRoot":"","sources":["../../src/rpc-service/rpc-balance-fetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Web3Provider } from '@ethersproject/providers';\nimport { toChecksumHexAddress } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkClient } from '@metamask/network-controller';\nimport type { Hex } from '@metamask/utils';\nimport type BN from 'bn.js';\n\nimport { getTokenBalancesForMultipleAddresses } from '../multicall';\nimport type { TokensControllerState } from '../TokensController';\n\nexport type ChainIdHex = Hex;\nexport type ChecksumAddress = Hex;\n\nexport type ProcessedBalance = {\n success: boolean;\n value?: BN;\n account: ChecksumAddress;\n token: ChecksumAddress;\n chainId: ChainIdHex;\n};\n\nexport type BalanceFetcher = {\n supports(chainId: ChainIdHex): boolean;\n fetch(input: {\n chainIds: ChainIdHex[];\n queryAllAccounts: boolean;\n selectedAccount: ChecksumAddress;\n allAccounts: InternalAccount[];\n }): Promise<ProcessedBalance[]>;\n};\n\nconst ZERO_ADDRESS =\n '0x0000000000000000000000000000000000000000' as ChecksumAddress;\n\nconst checksum = (addr: string): ChecksumAddress =>\n toChecksumHexAddress(addr) as ChecksumAddress;\n\nexport class RpcBalanceFetcher implements BalanceFetcher {\n readonly #getProvider: (chainId: ChainIdHex) => Web3Provider;\n\n readonly #getNetworkClient: (chainId: ChainIdHex) => NetworkClient;\n\n readonly #getTokensState: () => {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n };\n\n constructor(\n getProvider: (chainId: ChainIdHex) => Web3Provider,\n getNetworkClient: (chainId: ChainIdHex) => NetworkClient,\n getTokensState: () => {\n allTokens: TokensControllerState['allTokens'];\n allDetectedTokens: TokensControllerState['allDetectedTokens'];\n },\n ) {\n this.#getProvider = getProvider;\n this.#getNetworkClient = getNetworkClient;\n this.#getTokensState = getTokensState;\n }\n\n supports(): boolean {\n return true; // fallback – supports every chain\n }\n\n async fetch({\n chainIds,\n queryAllAccounts,\n selectedAccount,\n allAccounts,\n }: Parameters<BalanceFetcher['fetch']>[0]): Promise<ProcessedBalance[]> {\n const results: ProcessedBalance[] = [];\n\n for (const chainId of chainIds) {\n const tokensState = this.#getTokensState();\n const accountTokenGroups = buildAccountTokenGroupsStatic(\n chainId,\n queryAllAccounts,\n selectedAccount,\n allAccounts,\n tokensState.allTokens,\n tokensState.allDetectedTokens,\n );\n if (!accountTokenGroups.length) {\n continue;\n }\n\n const provider = this.#getProvider(chainId);\n await this.#ensureFreshBlockData(chainId);\n\n const { tokenBalances } = await getTokenBalancesForMultipleAddresses(\n accountTokenGroups,\n chainId,\n provider,\n true, // include native\n false, // include staked\n );\n\n Object.entries(tokenBalances).forEach(([tokenAddr, balances]) => {\n Object.entries(balances).forEach(([acct, bn]) => {\n results.push({\n success: bn !== null,\n value: bn as BN,\n account: acct as ChecksumAddress,\n token: checksum(tokenAddr),\n chainId,\n });\n });\n });\n }\n\n return results;\n }\n\n /**\n * Ensures that the block tracker has the latest block data before performing multicall operations.\n * This is a temporary fix to ensure that the block number is up to date.\n *\n * @param chainId - The chain id to update block data for.\n */\n async #ensureFreshBlockData(chainId: Hex): Promise<void> {\n // Force fresh block data before multicall\n // TODO: This is a temporary fix to ensure that the block number is up to date.\n // We should remove this once we have a better solution for this on the block tracker controller.\n const networkClient = this.#getNetworkClient(chainId);\n await networkClient.blockTracker?.checkForLatestBlock?.();\n }\n}\n\n/**\n * Merges imported & detected tokens for the requested chain and returns a list\n * of `{ accountAddress, tokenAddresses[] }` suitable for getTokenBalancesForMultipleAddresses.\n *\n * @param chainId - The chain ID to build account token groups for\n * @param queryAllAccounts - Whether to query all accounts or just the selected one\n * @param selectedAccount - The currently selected account\n * @param allAccounts - All available accounts\n * @param allTokens - All tokens from TokensController\n * @param allDetectedTokens - All detected tokens from TokensController\n * @returns Array of account/token groups for multicall\n */\nfunction buildAccountTokenGroupsStatic(\n chainId: ChainIdHex,\n queryAllAccounts: boolean,\n selectedAccount: ChecksumAddress,\n allAccounts: InternalAccount[],\n allTokens: TokensControllerState['allTokens'],\n allDetectedTokens: TokensControllerState['allDetectedTokens'],\n): { accountAddress: ChecksumAddress; tokenAddresses: ChecksumAddress[] }[] {\n const pairs: {\n accountAddress: ChecksumAddress;\n tokenAddress: ChecksumAddress;\n }[] = [];\n\n const add = ([account, tokens]: [string, unknown[]]) => {\n const shouldInclude =\n queryAllAccounts || checksum(account) === checksum(selectedAccount);\n if (!shouldInclude) {\n return;\n }\n (tokens as unknown[]).forEach((t: unknown) =>\n pairs.push({\n accountAddress: account as ChecksumAddress,\n tokenAddress: checksum((t as { address: string }).address),\n }),\n );\n };\n\n Object.entries(allTokens[chainId] ?? {}).forEach(\n add as (entry: [string, unknown]) => void,\n );\n Object.entries(allDetectedTokens[chainId] ?? {}).forEach(\n add as (entry: [string, unknown]) => void,\n );\n\n if (queryAllAccounts) {\n allAccounts.forEach((a) => {\n pairs.push({\n accountAddress: a.address as ChecksumAddress,\n tokenAddress: ZERO_ADDRESS,\n });\n });\n }\n\n if (!pairs.length) {\n return [];\n }\n\n // group by account\n const map = new Map<ChecksumAddress, ChecksumAddress[]>();\n pairs.forEach(({ accountAddress, tokenAddress }) => {\n if (!map.has(accountAddress)) {\n map.set(accountAddress, []);\n }\n const tokens = map.get(accountAddress);\n if (tokens) {\n tokens.push(tokenAddress);\n }\n });\n\n return Array.from(map.entries()).map(([accountAddress, tokenAddresses]) => ({\n accountAddress,\n tokenAddresses,\n }));\n}\n"]}
@@ -1,64 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.evmAggregatedBalancesForAccount = void 0;
4
- const controller_utils_1 = require("@metamask/controller-utils");
5
- const reselect_1 = require("reselect");
6
- const currencyConversionRate = (state) => state.currencyRates;
7
- const evmTokenBalances = (state) => state.tokenBalances;
8
- const evmTokenRates = (state) => state.marketData;
9
- const tokensInformations = (state) => state.allTokens;
10
- exports.evmAggregatedBalancesForAccount = (0, reselect_1.createSelector)(evmTokenBalances, evmTokenRates, currencyConversionRate, tokensInformations, (_state, account) => account, (tokenBalances, tokenRates, currencyConversionRateState, tokensInformationsState, account) => {
11
- const balancesForAccount = tokenBalances?.[account];
12
- if (!balancesForAccount) {
13
- return {};
14
- }
15
- // Calculate total balance value across all chains for this account
16
- let totalBalance = 0;
17
- for (const [chainId, chainBalances] of Object.entries(balancesForAccount)) {
18
- for (const [tokenAddress, balance] of Object.entries(chainBalances)) {
19
- // tokenRates is organized by chainId -> tokenAddress -> MarketDataDetails
20
- // We need to find the market data for this token across all chains
21
- let marketData;
22
- for (const chainData of Object.values(tokenRates)) {
23
- if (chainData[tokenAddress]) {
24
- marketData = chainData[tokenAddress];
25
- break;
26
- }
27
- }
28
- const rateToUse = currencyConversionRateState[marketData?.currency ?? '']
29
- ?.conversionRate ?? 0;
30
- if (marketData?.price) {
31
- const { price } = marketData;
32
- // Find the token decimals from tokensInformations
33
- let tokenDecimals = 18; // Default to 18 decimals
34
- const chainTokens = tokensInformationsState[chainId];
35
- if (chainTokens) {
36
- // Look through all accounts in this chain to find the token
37
- for (const accountTokens of Object.values(chainTokens)) {
38
- if (Array.isArray(accountTokens)) {
39
- const foundToken = accountTokens.find((token) => token.address.toLowerCase() === tokenAddress.toLowerCase());
40
- if (foundToken && foundToken.decimals !== undefined) {
41
- tokenDecimals = foundToken.decimals;
42
- break;
43
- }
44
- }
45
- }
46
- }
47
- // Convert all balances to 18 decimal equivalent first
48
- let normalizedBalance = (0, controller_utils_1.convertHexToDecimal)(balance);
49
- // If token has different decimals, convert to 18 decimals
50
- if (tokenDecimals !== 18) {
51
- const decimalDifference = 18 - tokenDecimals;
52
- normalizedBalance *= Math.pow(10, decimalDifference);
53
- }
54
- // Now divide by 10^18 since everything is normalized to 18 decimals
55
- const balanceInTokens = normalizedBalance / Math.pow(10, 18);
56
- const tokenValue = price * balanceInTokens * rateToUse;
57
- const roundedTokenValue = Math.round(tokenValue * 100) / 100; // Round to 2 decimal places
58
- totalBalance += roundedTokenValue;
59
- }
60
- }
61
- }
62
- return totalBalance;
63
- });
64
- //# sourceMappingURL=selectors.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"selectors.cjs","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"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","sourcesContent":["import { convertHexToDecimal } from '@metamask/controller-utils';\nimport type { Hex } from '@metamask/utils';\nimport { createSelector } from 'reselect';\n\nimport type { CurrencyRateState } from './CurrencyRateController';\nimport type { TokenBalancesControllerState } from './TokenBalancesController';\nimport type { TokenRatesControllerState } from './TokenRatesController';\nimport type { TokensControllerState } from './TokensController';\n\nconst currencyConversionRate = (state: CurrencyRateState) =>\n state.currencyRates;\n\nconst evmTokenBalances = (state: TokenBalancesControllerState) =>\n state.tokenBalances;\n\nconst evmTokenRates = (state: TokenRatesControllerState) => state.marketData;\n\nconst tokensInformations = (state: TokensControllerState) => state.allTokens;\n\nexport const evmAggregatedBalancesForAccount = createSelector(\n evmTokenBalances,\n evmTokenRates,\n currencyConversionRate,\n tokensInformations,\n (_state: TokenBalancesControllerState, account: Hex) => account,\n (\n tokenBalances,\n tokenRates,\n currencyConversionRateState,\n tokensInformationsState,\n account,\n ) => {\n const balancesForAccount = tokenBalances?.[account];\n if (!balancesForAccount) {\n return {};\n }\n\n // Calculate total balance value across all chains for this account\n let totalBalance = 0;\n\n for (const [chainId, chainBalances] of Object.entries(balancesForAccount)) {\n for (const [tokenAddress, balance] of Object.entries(chainBalances)) {\n // tokenRates is organized by chainId -> tokenAddress -> MarketDataDetails\n // We need to find the market data for this token across all chains\n let marketData;\n for (const chainData of Object.values(tokenRates)) {\n if (chainData[tokenAddress as Hex]) {\n marketData = chainData[tokenAddress as Hex];\n break;\n }\n }\n\n const rateToUse =\n currencyConversionRateState[marketData?.currency ?? '']\n ?.conversionRate ?? 0;\n\n if (marketData?.price) {\n const { price } = marketData;\n\n // Find the token decimals from tokensInformations\n let tokenDecimals = 18; // Default to 18 decimals\n const chainTokens = tokensInformationsState[chainId as Hex];\n if (chainTokens) {\n // Look through all accounts in this chain to find the token\n for (const accountTokens of Object.values(chainTokens)) {\n if (Array.isArray(accountTokens)) {\n const foundToken = accountTokens.find(\n (token: { address: string; decimals: number }) =>\n token.address.toLowerCase() === tokenAddress.toLowerCase(),\n );\n if (foundToken && foundToken.decimals !== undefined) {\n tokenDecimals = foundToken.decimals;\n break;\n }\n }\n }\n }\n\n // Convert all balances to 18 decimal equivalent first\n let normalizedBalance = convertHexToDecimal(balance);\n\n // If token has different decimals, convert to 18 decimals\n if (tokenDecimals !== 18) {\n const decimalDifference = 18 - tokenDecimals;\n normalizedBalance *= Math.pow(10, decimalDifference);\n }\n\n // Now divide by 10^18 since everything is normalized to 18 decimals\n const balanceInTokens = normalizedBalance / Math.pow(10, 18);\n const tokenValue = price * balanceInTokens * rateToUse;\n const roundedTokenValue = Math.round(tokenValue * 100) / 100; // Round to 2 decimal places\n\n totalBalance += roundedTokenValue;\n }\n }\n }\n\n return totalBalance;\n },\n);\n"]}
@@ -1,51 +0,0 @@
1
- import type { Hex } from "@metamask/utils";
2
- import type { CurrencyRateState } from "./CurrencyRateController.cjs";
3
- import type { TokenBalancesControllerState } from "./TokenBalancesController.cjs";
4
- import type { TokenRatesControllerState } from "./TokenRatesController.cjs";
5
- import type { TokensControllerState } from "./TokensController.cjs";
6
- export declare const evmAggregatedBalancesForAccount: ((state: TokenBalancesControllerState & TokenRatesControllerState & CurrencyRateState & TokensControllerState, account: `0x${string}`) => {}) & {
7
- clearCache: () => void;
8
- resultsCount: () => number;
9
- resetResultsCount: () => void;
10
- } & {
11
- resultFunc: (resultFuncArgs_0: import("./TokenBalancesController.cjs").TokenBalances, resultFuncArgs_1: Record<`0x${string}`, Record<`0x${string}`, import("./TokenRatesController.cjs").MarketDataDetails>>, resultFuncArgs_2: Record<string, {
12
- conversionDate: number | null;
13
- conversionRate: number | null;
14
- usdConversionRate: number | null;
15
- }>, resultFuncArgs_3: {
16
- [chainId: `0x${string}`]: {
17
- [key: string]: import("./TokenRatesController.cjs").Token[];
18
- };
19
- }, resultFuncArgs_4: `0x${string}`) => {};
20
- memoizedResultFunc: ((resultFuncArgs_0: import("./TokenBalancesController.cjs").TokenBalances, resultFuncArgs_1: Record<`0x${string}`, Record<`0x${string}`, import("./TokenRatesController.cjs").MarketDataDetails>>, resultFuncArgs_2: Record<string, {
21
- conversionDate: number | null;
22
- conversionRate: number | null;
23
- usdConversionRate: number | null;
24
- }>, resultFuncArgs_3: {
25
- [chainId: `0x${string}`]: {
26
- [key: string]: import("./TokenRatesController.cjs").Token[];
27
- };
28
- }, resultFuncArgs_4: `0x${string}`) => {}) & {
29
- clearCache: () => void;
30
- resultsCount: () => number;
31
- resetResultsCount: () => void;
32
- };
33
- lastResult: () => {};
34
- dependencies: [(state: TokenBalancesControllerState) => import("./TokenBalancesController.cjs").TokenBalances, (state: TokenRatesControllerState) => Record<`0x${string}`, Record<`0x${string}`, import("./TokenRatesController.cjs").MarketDataDetails>>, (state: CurrencyRateState) => Record<string, {
35
- conversionDate: number | null;
36
- conversionRate: number | null;
37
- usdConversionRate: number | null;
38
- }>, (state: TokensControllerState) => {
39
- [chainId: `0x${string}`]: {
40
- [key: string]: import("./TokenRatesController.cjs").Token[];
41
- };
42
- }, (_state: TokenBalancesControllerState, account: Hex) => `0x${string}`];
43
- recomputations: () => number;
44
- resetRecomputations: () => void;
45
- dependencyRecomputations: () => number;
46
- resetDependencyRecomputations: () => void;
47
- } & {
48
- argsMemoize: typeof import("reselect").weakMapMemoize;
49
- memoize: typeof import("reselect").weakMapMemoize;
50
- };
51
- //# sourceMappingURL=selectors.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"selectors.d.cts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAG3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,qCAAiC;AAClE,OAAO,KAAK,EAAE,4BAA4B,EAAE,sCAAkC;AAC9E,OAAO,KAAK,EAAE,yBAAyB,EAAE,mCAA+B;AACxE,OAAO,KAAK,EAAE,qBAAqB,EAAE,+BAA2B;AAYhE,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAPX,4BAA4B,gEAG/B,yBAAyB,+GANhB,iBAAiB;;;;gBAQrB,qBAAqB;;;;gBAO7C,4BAA4B,WAAW,GAAG;;;;;;;;CA2EpD,CAAC"}
@@ -1,51 +0,0 @@
1
- import type { Hex } from "@metamask/utils";
2
- import type { CurrencyRateState } from "./CurrencyRateController.mjs";
3
- import type { TokenBalancesControllerState } from "./TokenBalancesController.mjs";
4
- import type { TokenRatesControllerState } from "./TokenRatesController.mjs";
5
- import type { TokensControllerState } from "./TokensController.mjs";
6
- export declare const evmAggregatedBalancesForAccount: ((state: TokenBalancesControllerState & TokenRatesControllerState & CurrencyRateState & TokensControllerState, account: `0x${string}`) => {}) & {
7
- clearCache: () => void;
8
- resultsCount: () => number;
9
- resetResultsCount: () => void;
10
- } & {
11
- resultFunc: (resultFuncArgs_0: import("./TokenBalancesController.mjs").TokenBalances, resultFuncArgs_1: Record<`0x${string}`, Record<`0x${string}`, import("./TokenRatesController.mjs").MarketDataDetails>>, resultFuncArgs_2: Record<string, {
12
- conversionDate: number | null;
13
- conversionRate: number | null;
14
- usdConversionRate: number | null;
15
- }>, resultFuncArgs_3: {
16
- [chainId: `0x${string}`]: {
17
- [key: string]: import("./TokenRatesController.mjs").Token[];
18
- };
19
- }, resultFuncArgs_4: `0x${string}`) => {};
20
- memoizedResultFunc: ((resultFuncArgs_0: import("./TokenBalancesController.mjs").TokenBalances, resultFuncArgs_1: Record<`0x${string}`, Record<`0x${string}`, import("./TokenRatesController.mjs").MarketDataDetails>>, resultFuncArgs_2: Record<string, {
21
- conversionDate: number | null;
22
- conversionRate: number | null;
23
- usdConversionRate: number | null;
24
- }>, resultFuncArgs_3: {
25
- [chainId: `0x${string}`]: {
26
- [key: string]: import("./TokenRatesController.mjs").Token[];
27
- };
28
- }, resultFuncArgs_4: `0x${string}`) => {}) & {
29
- clearCache: () => void;
30
- resultsCount: () => number;
31
- resetResultsCount: () => void;
32
- };
33
- lastResult: () => {};
34
- dependencies: [(state: TokenBalancesControllerState) => import("./TokenBalancesController.mjs").TokenBalances, (state: TokenRatesControllerState) => Record<`0x${string}`, Record<`0x${string}`, import("./TokenRatesController.mjs").MarketDataDetails>>, (state: CurrencyRateState) => Record<string, {
35
- conversionDate: number | null;
36
- conversionRate: number | null;
37
- usdConversionRate: number | null;
38
- }>, (state: TokensControllerState) => {
39
- [chainId: `0x${string}`]: {
40
- [key: string]: import("./TokenRatesController.mjs").Token[];
41
- };
42
- }, (_state: TokenBalancesControllerState, account: Hex) => `0x${string}`];
43
- recomputations: () => number;
44
- resetRecomputations: () => void;
45
- dependencyRecomputations: () => number;
46
- resetDependencyRecomputations: () => void;
47
- } & {
48
- argsMemoize: typeof import("reselect").weakMapMemoize;
49
- memoize: typeof import("reselect").weakMapMemoize;
50
- };
51
- //# sourceMappingURL=selectors.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"selectors.d.mts","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAG3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,qCAAiC;AAClE,OAAO,KAAK,EAAE,4BAA4B,EAAE,sCAAkC;AAC9E,OAAO,KAAK,EAAE,yBAAyB,EAAE,mCAA+B;AACxE,OAAO,KAAK,EAAE,qBAAqB,EAAE,+BAA2B;AAYhE,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAPX,4BAA4B,gEAG/B,yBAAyB,+GANhB,iBAAiB;;;;gBAQrB,qBAAqB;;;;gBAO7C,4BAA4B,WAAW,GAAG;;;;;;;;CA2EpD,CAAC"}