@metamask/assets-controllers 92.0.0 → 93.1.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.
- package/CHANGELOG.md +30 -1
- package/dist/AccountTrackerController.cjs +8 -2
- package/dist/AccountTrackerController.cjs.map +1 -1
- package/dist/AccountTrackerController.d.cts +2 -2
- package/dist/AccountTrackerController.d.cts.map +1 -1
- package/dist/AccountTrackerController.d.mts +2 -2
- package/dist/AccountTrackerController.d.mts.map +1 -1
- package/dist/AccountTrackerController.mjs +8 -2
- package/dist/AccountTrackerController.mjs.map +1 -1
- package/dist/AssetsContractController.cjs.map +1 -1
- package/dist/AssetsContractController.d.cts +1 -1
- package/dist/AssetsContractController.d.cts.map +1 -1
- package/dist/AssetsContractController.d.mts +1 -1
- package/dist/AssetsContractController.d.mts.map +1 -1
- package/dist/AssetsContractController.mjs.map +1 -1
- package/dist/CurrencyRateController.cjs +2 -6
- package/dist/CurrencyRateController.cjs.map +1 -1
- package/dist/CurrencyRateController.d.cts.map +1 -1
- package/dist/CurrencyRateController.d.mts.map +1 -1
- package/dist/CurrencyRateController.mjs +2 -6
- package/dist/CurrencyRateController.mjs.map +1 -1
- package/dist/DeFiPositionsController/DeFiPositionsController.cjs.map +1 -1
- package/dist/DeFiPositionsController/DeFiPositionsController.d.cts +1 -1
- package/dist/DeFiPositionsController/DeFiPositionsController.d.cts.map +1 -1
- package/dist/DeFiPositionsController/DeFiPositionsController.d.mts +1 -1
- package/dist/DeFiPositionsController/DeFiPositionsController.d.mts.map +1 -1
- package/dist/DeFiPositionsController/DeFiPositionsController.mjs.map +1 -1
- package/dist/MultichainAssetsController/MultichainAssetsController.cjs.map +1 -1
- package/dist/MultichainAssetsController/MultichainAssetsController.d.cts +2 -1
- package/dist/MultichainAssetsController/MultichainAssetsController.d.cts.map +1 -1
- package/dist/MultichainAssetsController/MultichainAssetsController.d.mts +2 -1
- package/dist/MultichainAssetsController/MultichainAssetsController.d.mts.map +1 -1
- package/dist/MultichainAssetsController/MultichainAssetsController.mjs.map +1 -1
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.cjs.map +1 -1
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.cts +1 -1
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.cts.map +1 -1
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.mts +1 -1
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.d.mts.map +1 -1
- package/dist/MultichainAssetsRatesController/MultichainAssetsRatesController.mjs.map +1 -1
- package/dist/MultichainBalancesController/MultichainBalancesController.cjs.map +1 -1
- package/dist/MultichainBalancesController/MultichainBalancesController.d.cts +2 -1
- package/dist/MultichainBalancesController/MultichainBalancesController.d.cts.map +1 -1
- package/dist/MultichainBalancesController/MultichainBalancesController.d.mts +2 -1
- package/dist/MultichainBalancesController/MultichainBalancesController.d.mts.map +1 -1
- package/dist/MultichainBalancesController/MultichainBalancesController.mjs.map +1 -1
- package/dist/NftController.cjs.map +1 -1
- package/dist/NftController.d.cts +2 -1
- package/dist/NftController.d.cts.map +1 -1
- package/dist/NftController.d.mts +2 -1
- package/dist/NftController.d.mts.map +1 -1
- package/dist/NftController.mjs.map +1 -1
- package/dist/NftDetectionController.cjs.map +1 -1
- package/dist/NftDetectionController.d.cts +4 -3
- package/dist/NftDetectionController.d.cts.map +1 -1
- package/dist/NftDetectionController.d.mts +4 -3
- package/dist/NftDetectionController.d.mts.map +1 -1
- package/dist/NftDetectionController.mjs.map +1 -1
- package/dist/RatesController/RatesController.cjs.map +1 -1
- package/dist/RatesController/RatesController.d.cts.map +1 -1
- package/dist/RatesController/RatesController.d.mts.map +1 -1
- package/dist/RatesController/RatesController.mjs.map +1 -1
- package/dist/TokenBalancesController.cjs +18 -3
- package/dist/TokenBalancesController.cjs.map +1 -1
- package/dist/TokenBalancesController.d.cts +2 -2
- package/dist/TokenBalancesController.d.cts.map +1 -1
- package/dist/TokenBalancesController.d.mts +2 -2
- package/dist/TokenBalancesController.d.mts.map +1 -1
- package/dist/TokenBalancesController.mjs +18 -3
- package/dist/TokenBalancesController.mjs.map +1 -1
- package/dist/TokenDetectionController.cjs.map +1 -1
- package/dist/TokenDetectionController.mjs.map +1 -1
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.cjs.map +1 -1
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.cts +2 -1
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.cts.map +1 -1
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.mts +2 -1
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.d.mts.map +1 -1
- package/dist/TokenSearchDiscoveryDataController/TokenSearchDiscoveryDataController.mjs.map +1 -1
- package/dist/TokensController.cjs.map +1 -1
- package/dist/TokensController.d.cts +1 -1
- package/dist/TokensController.d.cts.map +1 -1
- package/dist/TokensController.d.mts +1 -1
- package/dist/TokensController.d.mts.map +1 -1
- package/dist/TokensController.mjs.map +1 -1
- package/dist/assetsUtil.cjs.map +1 -1
- package/dist/assetsUtil.d.cts +1 -1
- package/dist/assetsUtil.d.cts.map +1 -1
- package/dist/assetsUtil.d.mts +1 -1
- package/dist/assetsUtil.d.mts.map +1 -1
- package/dist/assetsUtil.mjs.map +1 -1
- package/dist/balances.cjs +1 -3
- package/dist/balances.cjs.map +1 -1
- package/dist/balances.d.cts.map +1 -1
- package/dist/balances.d.mts.map +1 -1
- package/dist/balances.mjs +1 -3
- package/dist/balances.mjs.map +1 -1
- package/dist/crypto-compare-service/crypto-compare.cjs.map +1 -1
- package/dist/crypto-compare-service/crypto-compare.d.cts.map +1 -1
- package/dist/crypto-compare-service/crypto-compare.d.mts.map +1 -1
- package/dist/crypto-compare-service/crypto-compare.mjs.map +1 -1
- package/dist/multi-chain-accounts-service/api-balance-fetcher.cjs.map +1 -1
- package/dist/multi-chain-accounts-service/api-balance-fetcher.d.cts.map +1 -1
- package/dist/multi-chain-accounts-service/api-balance-fetcher.d.mts.map +1 -1
- package/dist/multi-chain-accounts-service/api-balance-fetcher.mjs.map +1 -1
- package/dist/multicall.cjs +4 -0
- package/dist/multicall.cjs.map +1 -1
- package/dist/multicall.d.cts.map +1 -1
- package/dist/multicall.d.mts.map +1 -1
- package/dist/multicall.mjs +4 -0
- package/dist/multicall.mjs.map +1 -1
- package/dist/rpc-service/rpc-balance-fetcher.cjs +2 -2
- package/dist/rpc-service/rpc-balance-fetcher.cjs.map +1 -1
- package/dist/rpc-service/rpc-balance-fetcher.d.cts.map +1 -1
- package/dist/rpc-service/rpc-balance-fetcher.d.mts.map +1 -1
- package/dist/rpc-service/rpc-balance-fetcher.mjs +2 -2
- package/dist/rpc-service/rpc-balance-fetcher.mjs.map +1 -1
- package/dist/selectors/stringify-balance.cjs.map +1 -1
- package/dist/selectors/stringify-balance.d.cts +1 -1
- package/dist/selectors/stringify-balance.d.cts.map +1 -1
- package/dist/selectors/stringify-balance.d.mts +1 -1
- package/dist/selectors/stringify-balance.d.mts.map +1 -1
- package/dist/selectors/stringify-balance.mjs.map +1 -1
- package/dist/selectors/token-selectors.cjs.map +1 -1
- package/dist/selectors/token-selectors.d.cts +1 -1
- package/dist/selectors/token-selectors.d.cts.map +1 -1
- package/dist/selectors/token-selectors.d.mts +1 -1
- package/dist/selectors/token-selectors.d.mts.map +1 -1
- package/dist/selectors/token-selectors.mjs.map +1 -1
- package/dist/token-service.cjs +3 -3
- package/dist/token-service.cjs.map +1 -1
- package/dist/token-service.mjs +3 -3
- package/dist/token-service.mjs.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-balance-fetcher.cjs","sourceRoot":"","sources":["../../src/multi-chain-accounts-service/api-balance-fetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BigNumber } from '@ethersproject/bignumber';\nimport { Contract } from '@ethersproject/contracts';\nimport type { Web3Provider } from '@ethersproject/providers';\nimport {\n safelyExecute,\n safelyExecuteWithTimeout,\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 { STAKING_CONTRACT_ADDRESS_BY_CHAINID } from '../AssetsContractController';\nimport {\n accountAddressToCaipReference,\n reduceInBatchesSerially,\n SupportedStakedBalanceNetworks,\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 = 20;\n\n// Timeout for accounts API requests (10 seconds)\nconst ACCOUNTS_API_TIMEOUT_MS = 10_000;\n\nexport type ChainIdHex = Hex;\nexport type ChecksumAddress = Hex;\n\nexport type ProcessedBalance = {\n success: boolean;\n value?: BN;\n account: ChecksumAddress | string;\n token: ChecksumAddress;\n chainId: ChainIdHex;\n};\n\nexport type BalanceFetchResult = {\n balances: ProcessedBalance[];\n unprocessedChainIds?: 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 jwtToken?: string;\n }): Promise<BalanceFetchResult>;\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 type GetProviderFunction = (chainId: ChainIdHex) => Web3Provider;\n\nexport class AccountsApiBalanceFetcher implements BalanceFetcher {\n readonly #platform: 'extension' | 'mobile' = 'extension';\n\n readonly #getProvider?: GetProviderFunction;\n\n constructor(\n platform: 'extension' | 'mobile' = 'extension',\n getProvider?: GetProviderFunction,\n ) {\n this.#platform = platform;\n this.#getProvider = getProvider;\n }\n\n supports(chainId: ChainIdHex): boolean {\n return SUPPORTED_NETWORKS_ACCOUNTS_API_V4.includes(chainId);\n }\n\n async #fetchStakedBalances(\n addrs: CaipAccountAddress[],\n ): Promise<ProcessedBalance[]> {\n // Return empty array if no provider is available for blockchain calls\n if (!this.#getProvider) {\n return [];\n }\n\n const results: ProcessedBalance[] = [];\n\n // Group addresses by chain ID\n const addressesByChain: Record<ChainIdHex, ChecksumAddress[]> = {};\n\n for (const caipAddr of addrs) {\n const [, chainRef, address] = caipAddr.split(':');\n const chainId = toHex(parseInt(chainRef, 10)) as ChainIdHex;\n const checksumAddress = checksum(address);\n\n if (!addressesByChain[chainId]) {\n addressesByChain[chainId] = [];\n }\n addressesByChain[chainId].push(checksumAddress);\n }\n\n // Process each supported chain\n for (const [chainId, addresses] of Object.entries(addressesByChain)) {\n const chainIdHex = chainId as ChainIdHex;\n\n // Only fetch staked balance on supported networks (mainnet and hoodi)\n if (\n ![\n SupportedStakedBalanceNetworks.mainnet,\n SupportedStakedBalanceNetworks.hoodi,\n ].includes(chainIdHex as SupportedStakedBalanceNetworks)\n ) {\n continue;\n }\n\n // Only fetch staked balance if contract address exists\n if (!(chainIdHex in STAKING_CONTRACT_ADDRESS_BY_CHAINID)) {\n continue;\n }\n\n const contractAddress =\n STAKING_CONTRACT_ADDRESS_BY_CHAINID[\n chainIdHex as keyof typeof STAKING_CONTRACT_ADDRESS_BY_CHAINID\n ];\n const provider = this.#getProvider(chainIdHex);\n\n const abi = [\n {\n inputs: [\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'getShares',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'uint256', name: 'shares', type: 'uint256' },\n ],\n name: 'convertToAssets',\n outputs: [\n { internalType: 'uint256', name: 'assets', type: 'uint256' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n ];\n\n try {\n const contract = new Contract(contractAddress, abi, provider);\n\n // Get shares for each address\n for (const address of addresses) {\n try {\n const shares = await safelyExecute(() =>\n contract.getShares(address),\n );\n\n if (shares && (shares as BigNumber).gt(0)) {\n // Convert shares to assets (actual staked ETH amount)\n const assets = await safelyExecute(() =>\n contract.convertToAssets(shares),\n );\n\n if (assets) {\n results.push({\n success: true,\n value: new BN((assets as BigNumber).toString()),\n account: address,\n token: checksum(contractAddress) as ChecksumAddress,\n chainId: chainIdHex,\n });\n }\n } else {\n // Return zero balance for accounts with no staked assets\n results.push({\n success: true,\n value: new BN('0'),\n account: address,\n token: checksum(contractAddress) as ChecksumAddress,\n chainId: chainIdHex,\n });\n }\n } catch (error) {\n // Log error and continue with next address\n console.error(\n `Error fetching staked balance for ${address}:`,\n error,\n );\n results.push({\n success: false,\n account: address,\n token: checksum(contractAddress) as ChecksumAddress,\n chainId: chainIdHex,\n });\n }\n }\n } catch (error) {\n console.error(\n `Error setting up staking contract for chain ${chainId}:`,\n error,\n );\n }\n }\n\n return results;\n }\n\n async #fetchBalances(addrs: CaipAccountAddress[], jwtToken?: string) {\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 return await fetchMultiChainBalancesV4(\n { accountAddresses: addrs },\n this.#platform,\n jwtToken,\n );\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 type ResponseData = Awaited<ReturnType<typeof fetchMultiChainBalancesV4>>;\n\n const allUnprocessedNetworks = new Set<number>();\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 response = await fetchMultiChainBalancesV4(\n { accountAddresses: batch },\n this.#platform,\n jwtToken,\n );\n // Collect unprocessed networks from each batch\n if (response.unprocessedNetworks) {\n response.unprocessedNetworks.forEach((network) =>\n allUnprocessedNetworks.add(network),\n );\n }\n return [...(workingResult || []), ...response.balances];\n },\n initialResult: [],\n });\n\n return {\n balances: allBalances,\n unprocessedNetworks: Array.from(allUnprocessedNetworks),\n } as ResponseData;\n }\n\n async fetch({\n chainIds,\n queryAllAccounts,\n selectedAccount,\n allAccounts,\n jwtToken,\n }: Parameters<BalanceFetcher['fetch']>[0]): Promise<BalanceFetchResult> {\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 { balances: [] };\n }\n\n // Let errors propagate to TokenBalancesController for RPC fallback\n // Use timeout to prevent hanging API calls (30 seconds)\n const apiResponse = await safelyExecuteWithTimeout(\n () => this.#fetchBalances(caipAddrs, jwtToken),\n false, // don't log error here, let it propagate\n ACCOUNTS_API_TIMEOUT_MS,\n );\n\n // If API call timed out or failed, throw error to trigger RPC fallback\n if (!apiResponse) {\n throw new Error('Accounts API request timed out or failed');\n }\n\n // Extract unprocessed networks and convert to hex chain IDs\n const unprocessedChainIds: ChainIdHex[] | undefined =\n apiResponse.unprocessedNetworks\n ? apiResponse.unprocessedNetworks.map(\n (chainId) => toHex(chainId) as ChainIdHex,\n )\n : undefined;\n\n const stakedBalances = await this.#fetchStakedBalances(caipAddrs);\n\n const results: ProcessedBalance[] = [];\n\n // Collect all unique addresses and chains from the CAIP addresses\n const addressChainMap = new Map<string, Set<ChainIdHex>>();\n caipAddrs.forEach((caipAddr) => {\n const [, chainRef, address] = caipAddr.split(':');\n const chainId = toHex(parseInt(chainRef, 10)) as ChainIdHex;\n const checksumAddress = checksum(address);\n\n if (!addressChainMap.has(checksumAddress)) {\n addressChainMap.set(checksumAddress, new Set());\n }\n addressChainMap.get(checksumAddress)?.add(chainId);\n });\n\n // Ensure native token entries exist for all addresses on all requested chains\n const ZERO_ADDRESS =\n '0x0000000000000000000000000000000000000000' as ChecksumAddress;\n const nativeBalancesFromAPI = new Map<string, BN>(); // key: `${address}-${chainId}`\n\n // Process regular API balances\n if (apiResponse.balances) {\n const apiBalances = apiResponse.balances.flatMap((b) => {\n const addressPart = b.accountAddress?.split(':')[2];\n if (!addressPart) {\n return [];\n }\n const account = checksum(addressPart);\n const token = checksum(b.address);\n // Use original address for zero address tokens, checksummed for others\n // TODO: this is a hack to get the correct account address type but needs to be fixed\n // by mgrating tokenBalancesController to checksum addresses\n const finalAccount: ChecksumAddress | string =\n token === ZERO_ADDRESS ? account : addressPart;\n const chainId = toHex(b.chainId) as ChainIdHex;\n\n let value: BN | undefined;\n try {\n // Convert string balance to BN avoiding floating point precision issues\n const { balance: balanceStr, decimals } = b;\n\n // Split the balance string into integer and decimal parts\n const [integerPart = '0', decimalPart = ''] = balanceStr.split('.');\n\n // Pad or truncate decimal part to match token decimals\n const paddedDecimalPart = decimalPart\n .padEnd(decimals, '0')\n .slice(0, decimals);\n\n // Combine and create BN\n const fullIntegerStr = integerPart + paddedDecimalPart;\n value = new BN(fullIntegerStr);\n } catch {\n value = undefined;\n }\n\n // Track native balances for later\n if (token === ZERO_ADDRESS && value !== undefined) {\n nativeBalancesFromAPI.set(`${finalAccount}-${chainId}`, value);\n }\n\n return [\n {\n success: value !== undefined,\n value,\n account: finalAccount,\n token,\n chainId,\n },\n ];\n });\n results.push(...apiBalances);\n }\n\n // Add zero native balance entries for addresses that API didn't return\n addressChainMap.forEach((chains, address) => {\n chains.forEach((chainId) => {\n const key = `${address}-${chainId}`;\n const existingBalance = nativeBalancesFromAPI.get(key);\n\n if (!existingBalance) {\n // Add zero native balance entry if API succeeded but didn't return one\n results.push({\n success: true,\n value: new BN('0'),\n account: address as ChecksumAddress,\n token: ZERO_ADDRESS,\n chainId,\n });\n }\n });\n });\n\n // Add staked balances\n results.push(...stakedBalances);\n\n return {\n balances: results,\n unprocessedChainIds,\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"api-balance-fetcher.cjs","sourceRoot":"","sources":["../../src/multi-chain-accounts-service/api-balance-fetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BigNumber } from '@ethersproject/bignumber';\nimport { Contract } from '@ethersproject/contracts';\nimport type { Web3Provider } from '@ethersproject/providers';\nimport {\n safelyExecute,\n safelyExecuteWithTimeout,\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 { STAKING_CONTRACT_ADDRESS_BY_CHAINID } from '../AssetsContractController';\nimport {\n accountAddressToCaipReference,\n reduceInBatchesSerially,\n SupportedStakedBalanceNetworks,\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 = 20;\n\n// Timeout for accounts API requests (10 seconds)\nconst ACCOUNTS_API_TIMEOUT_MS = 10_000;\n\nexport type ChainIdHex = Hex;\nexport type ChecksumAddress = Hex;\n\nexport type ProcessedBalance = {\n success: boolean;\n value?: BN;\n account: ChecksumAddress | string;\n token: ChecksumAddress;\n chainId: ChainIdHex;\n};\n\nexport type BalanceFetchResult = {\n balances: ProcessedBalance[];\n unprocessedChainIds?: 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 jwtToken?: string;\n }): Promise<BalanceFetchResult>;\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 type GetProviderFunction = (chainId: ChainIdHex) => Web3Provider;\n\nexport class AccountsApiBalanceFetcher implements BalanceFetcher {\n readonly #platform: 'extension' | 'mobile' = 'extension';\n\n readonly #getProvider?: GetProviderFunction;\n\n constructor(\n platform: 'extension' | 'mobile' = 'extension',\n getProvider?: GetProviderFunction,\n ) {\n this.#platform = platform;\n this.#getProvider = getProvider;\n }\n\n supports(chainId: ChainIdHex): boolean {\n return SUPPORTED_NETWORKS_ACCOUNTS_API_V4.includes(chainId);\n }\n\n async #fetchStakedBalances(\n addrs: CaipAccountAddress[],\n ): Promise<ProcessedBalance[]> {\n // Return empty array if no provider is available for blockchain calls\n if (!this.#getProvider) {\n return [];\n }\n\n const results: ProcessedBalance[] = [];\n\n // Group addresses by chain ID\n const addressesByChain: Record<ChainIdHex, ChecksumAddress[]> = {};\n\n for (const caipAddr of addrs) {\n const [, chainRef, address] = caipAddr.split(':');\n const chainId = toHex(parseInt(chainRef, 10));\n const checksumAddress = checksum(address);\n\n if (!addressesByChain[chainId]) {\n addressesByChain[chainId] = [];\n }\n addressesByChain[chainId].push(checksumAddress);\n }\n\n // Process each supported chain\n for (const [chainId, addresses] of Object.entries(addressesByChain)) {\n const chainIdHex = chainId as ChainIdHex;\n\n // Only fetch staked balance on supported networks (mainnet and hoodi)\n if (\n ![\n SupportedStakedBalanceNetworks.mainnet,\n SupportedStakedBalanceNetworks.hoodi,\n ].includes(chainIdHex as SupportedStakedBalanceNetworks)\n ) {\n continue;\n }\n\n // Only fetch staked balance if contract address exists\n if (!(chainIdHex in STAKING_CONTRACT_ADDRESS_BY_CHAINID)) {\n continue;\n }\n\n const contractAddress = STAKING_CONTRACT_ADDRESS_BY_CHAINID[chainIdHex];\n const provider = this.#getProvider(chainIdHex);\n\n const abi = [\n {\n inputs: [\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'getShares',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'uint256', name: 'shares', type: 'uint256' },\n ],\n name: 'convertToAssets',\n outputs: [\n { internalType: 'uint256', name: 'assets', type: 'uint256' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n ];\n\n try {\n const contract = new Contract(contractAddress, abi, provider);\n\n // Get shares for each address\n for (const address of addresses) {\n try {\n const shares = await safelyExecute(() =>\n contract.getShares(address),\n );\n\n if (shares && (shares as BigNumber).gt(0)) {\n // Convert shares to assets (actual staked ETH amount)\n const assets = await safelyExecute(() =>\n contract.convertToAssets(shares),\n );\n\n if (assets) {\n results.push({\n success: true,\n value: new BN((assets as BigNumber).toString()),\n account: address,\n token: checksum(contractAddress),\n chainId: chainIdHex,\n });\n }\n } else {\n // Return zero balance for accounts with no staked assets\n results.push({\n success: true,\n value: new BN('0'),\n account: address,\n token: checksum(contractAddress),\n chainId: chainIdHex,\n });\n }\n } catch (error) {\n // Log error and continue with next address\n console.error(\n `Error fetching staked balance for ${address}:`,\n error,\n );\n results.push({\n success: false,\n account: address,\n token: checksum(contractAddress),\n chainId: chainIdHex,\n });\n }\n }\n } catch (error) {\n console.error(\n `Error setting up staking contract for chain ${chainId}:`,\n error,\n );\n }\n }\n\n return results;\n }\n\n async #fetchBalances(addrs: CaipAccountAddress[], jwtToken?: string) {\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 return await fetchMultiChainBalancesV4(\n { accountAddresses: addrs },\n this.#platform,\n jwtToken,\n );\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 type ResponseData = Awaited<ReturnType<typeof fetchMultiChainBalancesV4>>;\n\n const allUnprocessedNetworks = new Set<number>();\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 response = await fetchMultiChainBalancesV4(\n { accountAddresses: batch },\n this.#platform,\n jwtToken,\n );\n // Collect unprocessed networks from each batch\n if (response.unprocessedNetworks) {\n response.unprocessedNetworks.forEach((network) =>\n allUnprocessedNetworks.add(network),\n );\n }\n return [...(workingResult || []), ...response.balances];\n },\n initialResult: [],\n });\n\n return {\n balances: allBalances,\n unprocessedNetworks: Array.from(allUnprocessedNetworks),\n } as ResponseData;\n }\n\n async fetch({\n chainIds,\n queryAllAccounts,\n selectedAccount,\n allAccounts,\n jwtToken,\n }: Parameters<BalanceFetcher['fetch']>[0]): Promise<BalanceFetchResult> {\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 { balances: [] };\n }\n\n // Let errors propagate to TokenBalancesController for RPC fallback\n // Use timeout to prevent hanging API calls (30 seconds)\n const apiResponse = await safelyExecuteWithTimeout(\n () => this.#fetchBalances(caipAddrs, jwtToken),\n false, // don't log error here, let it propagate\n ACCOUNTS_API_TIMEOUT_MS,\n );\n\n // If API call timed out or failed, throw error to trigger RPC fallback\n if (!apiResponse) {\n throw new Error('Accounts API request timed out or failed');\n }\n\n // Extract unprocessed networks and convert to hex chain IDs\n const unprocessedChainIds: ChainIdHex[] | undefined =\n apiResponse.unprocessedNetworks\n ? apiResponse.unprocessedNetworks.map((chainId) => toHex(chainId))\n : undefined;\n\n const stakedBalances = await this.#fetchStakedBalances(caipAddrs);\n\n const results: ProcessedBalance[] = [];\n\n // Collect all unique addresses and chains from the CAIP addresses\n const addressChainMap = new Map<string, Set<ChainIdHex>>();\n caipAddrs.forEach((caipAddr) => {\n const [, chainRef, address] = caipAddr.split(':');\n const chainId = toHex(parseInt(chainRef, 10));\n const checksumAddress = checksum(address);\n\n if (!addressChainMap.has(checksumAddress)) {\n addressChainMap.set(checksumAddress, new Set());\n }\n addressChainMap.get(checksumAddress)?.add(chainId);\n });\n\n // Ensure native token entries exist for all addresses on all requested chains\n const ZERO_ADDRESS =\n '0x0000000000000000000000000000000000000000' as ChecksumAddress;\n const nativeBalancesFromAPI = new Map<string, BN>(); // key: `${address}-${chainId}`\n\n // Process regular API balances\n if (apiResponse.balances) {\n const apiBalances = apiResponse.balances.flatMap((b) => {\n const addressPart = b.accountAddress?.split(':')[2];\n if (!addressPart) {\n return [];\n }\n const account = checksum(addressPart);\n const token = checksum(b.address);\n // Use original address for zero address tokens, checksummed for others\n // TODO: this is a hack to get the correct account address type but needs to be fixed\n // by mgrating tokenBalancesController to checksum addresses\n const finalAccount: ChecksumAddress | string =\n token === ZERO_ADDRESS ? account : addressPart;\n const chainId = toHex(b.chainId);\n\n let value: BN | undefined;\n try {\n // Convert string balance to BN avoiding floating point precision issues\n const { balance: balanceStr, decimals } = b;\n\n // Split the balance string into integer and decimal parts\n const [integerPart = '0', decimalPart = ''] = balanceStr.split('.');\n\n // Pad or truncate decimal part to match token decimals\n const paddedDecimalPart = decimalPart\n .padEnd(decimals, '0')\n .slice(0, decimals);\n\n // Combine and create BN\n const fullIntegerStr = integerPart + paddedDecimalPart;\n value = new BN(fullIntegerStr);\n } catch {\n value = undefined;\n }\n\n // Track native balances for later\n if (token === ZERO_ADDRESS && value !== undefined) {\n nativeBalancesFromAPI.set(`${finalAccount}-${chainId}`, value);\n }\n\n return [\n {\n success: value !== undefined,\n value,\n account: finalAccount,\n token,\n chainId,\n },\n ];\n });\n results.push(...apiBalances);\n }\n\n // Add zero native balance entries for addresses that API didn't return\n addressChainMap.forEach((chains, address) => {\n chains.forEach((chainId) => {\n const key = `${address}-${chainId}`;\n const existingBalance = nativeBalancesFromAPI.get(key);\n\n if (!existingBalance) {\n // Add zero native balance entry if API succeeded but didn't return one\n results.push({\n success: true,\n value: new BN('0'),\n account: address as ChecksumAddress,\n token: ZERO_ADDRESS,\n chainId,\n });\n }\n });\n });\n\n // Add staked balances\n results.push(...stakedBalances);\n\n return {\n balances: results,\n unprocessedChainIds,\n };\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-balance-fetcher.d.cts","sourceRoot":"","sources":["../../src/multi-chain-accounts-service/api-balance-fetcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,iCAAiC;AAO7D,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAsB,GAAG,EAAE,wBAAwB;AAC/D,OAAO,EAAE,cAAc;AAiBvB,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,GAAG,MAAM,CAAC;IAClC,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,mBAAmB,CAAC,EAAE,UAAU,EAAE,CAAC;CACpC,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;QAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACjC,CAAC;AAUF,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,UAAU,KAAK,YAAY,CAAC;AAExE,qBAAa,yBAA0B,YAAW,cAAc;;gBAM5D,QAAQ,GAAE,WAAW,GAAG,QAAsB,EAC9C,WAAW,CAAC,EAAE,mBAAmB;IAMnC,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO;
|
|
1
|
+
{"version":3,"file":"api-balance-fetcher.d.cts","sourceRoot":"","sources":["../../src/multi-chain-accounts-service/api-balance-fetcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,iCAAiC;AAO7D,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAsB,GAAG,EAAE,wBAAwB;AAC/D,OAAO,EAAE,cAAc;AAiBvB,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,GAAG,MAAM,CAAC;IAClC,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,mBAAmB,CAAC,EAAE,UAAU,EAAE,CAAC;CACpC,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;QAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACjC,CAAC;AAUF,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,UAAU,KAAK,YAAY,CAAC;AAExE,qBAAa,yBAA0B,YAAW,cAAc;;gBAM5D,QAAQ,GAAE,WAAW,GAAG,QAAsB,EAC9C,WAAW,CAAC,EAAE,mBAAmB;IAMnC,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO;IAoLhC,KAAK,CAAC,EACV,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,QAAQ,GACT,EAAE,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA2IxE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-balance-fetcher.d.mts","sourceRoot":"","sources":["../../src/multi-chain-accounts-service/api-balance-fetcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,iCAAiC;AAO7D,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAsB,GAAG,EAAE,wBAAwB;AAC/D,OAAO,EAAE,cAAc;AAiBvB,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,GAAG,MAAM,CAAC;IAClC,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,mBAAmB,CAAC,EAAE,UAAU,EAAE,CAAC;CACpC,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;QAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACjC,CAAC;AAUF,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,UAAU,KAAK,YAAY,CAAC;AAExE,qBAAa,yBAA0B,YAAW,cAAc;;gBAM5D,QAAQ,GAAE,WAAW,GAAG,QAAsB,EAC9C,WAAW,CAAC,EAAE,mBAAmB;IAMnC,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO;
|
|
1
|
+
{"version":3,"file":"api-balance-fetcher.d.mts","sourceRoot":"","sources":["../../src/multi-chain-accounts-service/api-balance-fetcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,iCAAiC;AAO7D,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAsB,GAAG,EAAE,wBAAwB;AAC/D,OAAO,EAAE,cAAc;AAiBvB,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,GAAG,MAAM,CAAC;IAClC,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,UAAU,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,mBAAmB,CAAC,EAAE,UAAU,EAAE,CAAC;CACpC,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;QAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACjC,CAAC;AAUF,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,UAAU,KAAK,YAAY,CAAC;AAExE,qBAAa,yBAA0B,YAAW,cAAc;;gBAM5D,QAAQ,GAAE,WAAW,GAAG,QAAsB,EAC9C,WAAW,CAAC,EAAE,mBAAmB;IAMnC,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO;IAoLhC,KAAK,CAAC,EACV,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,QAAQ,GACT,EAAE,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA2IxE"}
|
|
@@ -1 +1 @@
|
|
|
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 type { BigNumber } from '@ethersproject/bignumber';\nimport { Contract } from '@ethersproject/contracts';\nimport type { Web3Provider } from '@ethersproject/providers';\nimport {\n safelyExecute,\n safelyExecuteWithTimeout,\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 { STAKING_CONTRACT_ADDRESS_BY_CHAINID } from '../AssetsContractController';\nimport {\n accountAddressToCaipReference,\n reduceInBatchesSerially,\n SupportedStakedBalanceNetworks,\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 = 20;\n\n// Timeout for accounts API requests (10 seconds)\nconst ACCOUNTS_API_TIMEOUT_MS = 10_000;\n\nexport type ChainIdHex = Hex;\nexport type ChecksumAddress = Hex;\n\nexport type ProcessedBalance = {\n success: boolean;\n value?: BN;\n account: ChecksumAddress | string;\n token: ChecksumAddress;\n chainId: ChainIdHex;\n};\n\nexport type BalanceFetchResult = {\n balances: ProcessedBalance[];\n unprocessedChainIds?: 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 jwtToken?: string;\n }): Promise<BalanceFetchResult>;\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 type GetProviderFunction = (chainId: ChainIdHex) => Web3Provider;\n\nexport class AccountsApiBalanceFetcher implements BalanceFetcher {\n readonly #platform: 'extension' | 'mobile' = 'extension';\n\n readonly #getProvider?: GetProviderFunction;\n\n constructor(\n platform: 'extension' | 'mobile' = 'extension',\n getProvider?: GetProviderFunction,\n ) {\n this.#platform = platform;\n this.#getProvider = getProvider;\n }\n\n supports(chainId: ChainIdHex): boolean {\n return SUPPORTED_NETWORKS_ACCOUNTS_API_V4.includes(chainId);\n }\n\n async #fetchStakedBalances(\n addrs: CaipAccountAddress[],\n ): Promise<ProcessedBalance[]> {\n // Return empty array if no provider is available for blockchain calls\n if (!this.#getProvider) {\n return [];\n }\n\n const results: ProcessedBalance[] = [];\n\n // Group addresses by chain ID\n const addressesByChain: Record<ChainIdHex, ChecksumAddress[]> = {};\n\n for (const caipAddr of addrs) {\n const [, chainRef, address] = caipAddr.split(':');\n const chainId = toHex(parseInt(chainRef, 10)) as ChainIdHex;\n const checksumAddress = checksum(address);\n\n if (!addressesByChain[chainId]) {\n addressesByChain[chainId] = [];\n }\n addressesByChain[chainId].push(checksumAddress);\n }\n\n // Process each supported chain\n for (const [chainId, addresses] of Object.entries(addressesByChain)) {\n const chainIdHex = chainId as ChainIdHex;\n\n // Only fetch staked balance on supported networks (mainnet and hoodi)\n if (\n ![\n SupportedStakedBalanceNetworks.mainnet,\n SupportedStakedBalanceNetworks.hoodi,\n ].includes(chainIdHex as SupportedStakedBalanceNetworks)\n ) {\n continue;\n }\n\n // Only fetch staked balance if contract address exists\n if (!(chainIdHex in STAKING_CONTRACT_ADDRESS_BY_CHAINID)) {\n continue;\n }\n\n const contractAddress =\n STAKING_CONTRACT_ADDRESS_BY_CHAINID[\n chainIdHex as keyof typeof STAKING_CONTRACT_ADDRESS_BY_CHAINID\n ];\n const provider = this.#getProvider(chainIdHex);\n\n const abi = [\n {\n inputs: [\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'getShares',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'uint256', name: 'shares', type: 'uint256' },\n ],\n name: 'convertToAssets',\n outputs: [\n { internalType: 'uint256', name: 'assets', type: 'uint256' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n ];\n\n try {\n const contract = new Contract(contractAddress, abi, provider);\n\n // Get shares for each address\n for (const address of addresses) {\n try {\n const shares = await safelyExecute(() =>\n contract.getShares(address),\n );\n\n if (shares && (shares as BigNumber).gt(0)) {\n // Convert shares to assets (actual staked ETH amount)\n const assets = await safelyExecute(() =>\n contract.convertToAssets(shares),\n );\n\n if (assets) {\n results.push({\n success: true,\n value: new BN((assets as BigNumber).toString()),\n account: address,\n token: checksum(contractAddress) as ChecksumAddress,\n chainId: chainIdHex,\n });\n }\n } else {\n // Return zero balance for accounts with no staked assets\n results.push({\n success: true,\n value: new BN('0'),\n account: address,\n token: checksum(contractAddress) as ChecksumAddress,\n chainId: chainIdHex,\n });\n }\n } catch (error) {\n // Log error and continue with next address\n console.error(\n `Error fetching staked balance for ${address}:`,\n error,\n );\n results.push({\n success: false,\n account: address,\n token: checksum(contractAddress) as ChecksumAddress,\n chainId: chainIdHex,\n });\n }\n }\n } catch (error) {\n console.error(\n `Error setting up staking contract for chain ${chainId}:`,\n error,\n );\n }\n }\n\n return results;\n }\n\n async #fetchBalances(addrs: CaipAccountAddress[], jwtToken?: string) {\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 return await fetchMultiChainBalancesV4(\n { accountAddresses: addrs },\n this.#platform,\n jwtToken,\n );\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 type ResponseData = Awaited<ReturnType<typeof fetchMultiChainBalancesV4>>;\n\n const allUnprocessedNetworks = new Set<number>();\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 response = await fetchMultiChainBalancesV4(\n { accountAddresses: batch },\n this.#platform,\n jwtToken,\n );\n // Collect unprocessed networks from each batch\n if (response.unprocessedNetworks) {\n response.unprocessedNetworks.forEach((network) =>\n allUnprocessedNetworks.add(network),\n );\n }\n return [...(workingResult || []), ...response.balances];\n },\n initialResult: [],\n });\n\n return {\n balances: allBalances,\n unprocessedNetworks: Array.from(allUnprocessedNetworks),\n } as ResponseData;\n }\n\n async fetch({\n chainIds,\n queryAllAccounts,\n selectedAccount,\n allAccounts,\n jwtToken,\n }: Parameters<BalanceFetcher['fetch']>[0]): Promise<BalanceFetchResult> {\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 { balances: [] };\n }\n\n // Let errors propagate to TokenBalancesController for RPC fallback\n // Use timeout to prevent hanging API calls (30 seconds)\n const apiResponse = await safelyExecuteWithTimeout(\n () => this.#fetchBalances(caipAddrs, jwtToken),\n false, // don't log error here, let it propagate\n ACCOUNTS_API_TIMEOUT_MS,\n );\n\n // If API call timed out or failed, throw error to trigger RPC fallback\n if (!apiResponse) {\n throw new Error('Accounts API request timed out or failed');\n }\n\n // Extract unprocessed networks and convert to hex chain IDs\n const unprocessedChainIds: ChainIdHex[] | undefined =\n apiResponse.unprocessedNetworks\n ? apiResponse.unprocessedNetworks.map(\n (chainId) => toHex(chainId) as ChainIdHex,\n )\n : undefined;\n\n const stakedBalances = await this.#fetchStakedBalances(caipAddrs);\n\n const results: ProcessedBalance[] = [];\n\n // Collect all unique addresses and chains from the CAIP addresses\n const addressChainMap = new Map<string, Set<ChainIdHex>>();\n caipAddrs.forEach((caipAddr) => {\n const [, chainRef, address] = caipAddr.split(':');\n const chainId = toHex(parseInt(chainRef, 10)) as ChainIdHex;\n const checksumAddress = checksum(address);\n\n if (!addressChainMap.has(checksumAddress)) {\n addressChainMap.set(checksumAddress, new Set());\n }\n addressChainMap.get(checksumAddress)?.add(chainId);\n });\n\n // Ensure native token entries exist for all addresses on all requested chains\n const ZERO_ADDRESS =\n '0x0000000000000000000000000000000000000000' as ChecksumAddress;\n const nativeBalancesFromAPI = new Map<string, BN>(); // key: `${address}-${chainId}`\n\n // Process regular API balances\n if (apiResponse.balances) {\n const apiBalances = apiResponse.balances.flatMap((b) => {\n const addressPart = b.accountAddress?.split(':')[2];\n if (!addressPart) {\n return [];\n }\n const account = checksum(addressPart);\n const token = checksum(b.address);\n // Use original address for zero address tokens, checksummed for others\n // TODO: this is a hack to get the correct account address type but needs to be fixed\n // by mgrating tokenBalancesController to checksum addresses\n const finalAccount: ChecksumAddress | string =\n token === ZERO_ADDRESS ? account : addressPart;\n const chainId = toHex(b.chainId) as ChainIdHex;\n\n let value: BN | undefined;\n try {\n // Convert string balance to BN avoiding floating point precision issues\n const { balance: balanceStr, decimals } = b;\n\n // Split the balance string into integer and decimal parts\n const [integerPart = '0', decimalPart = ''] = balanceStr.split('.');\n\n // Pad or truncate decimal part to match token decimals\n const paddedDecimalPart = decimalPart\n .padEnd(decimals, '0')\n .slice(0, decimals);\n\n // Combine and create BN\n const fullIntegerStr = integerPart + paddedDecimalPart;\n value = new BN(fullIntegerStr);\n } catch {\n value = undefined;\n }\n\n // Track native balances for later\n if (token === ZERO_ADDRESS && value !== undefined) {\n nativeBalancesFromAPI.set(`${finalAccount}-${chainId}`, value);\n }\n\n return [\n {\n success: value !== undefined,\n value,\n account: finalAccount,\n token,\n chainId,\n },\n ];\n });\n results.push(...apiBalances);\n }\n\n // Add zero native balance entries for addresses that API didn't return\n addressChainMap.forEach((chains, address) => {\n chains.forEach((chainId) => {\n const key = `${address}-${chainId}`;\n const existingBalance = nativeBalancesFromAPI.get(key);\n\n if (!existingBalance) {\n // Add zero native balance entry if API succeeded but didn't return one\n results.push({\n success: true,\n value: new BN('0'),\n account: address as ChecksumAddress,\n token: ZERO_ADDRESS,\n chainId,\n });\n }\n });\n });\n\n // Add staked balances\n results.push(...stakedBalances);\n\n return {\n balances: results,\n unprocessedChainIds,\n };\n }\n}\n"]}
|
|
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 type { BigNumber } from '@ethersproject/bignumber';\nimport { Contract } from '@ethersproject/contracts';\nimport type { Web3Provider } from '@ethersproject/providers';\nimport {\n safelyExecute,\n safelyExecuteWithTimeout,\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 { STAKING_CONTRACT_ADDRESS_BY_CHAINID } from '../AssetsContractController';\nimport {\n accountAddressToCaipReference,\n reduceInBatchesSerially,\n SupportedStakedBalanceNetworks,\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 = 20;\n\n// Timeout for accounts API requests (10 seconds)\nconst ACCOUNTS_API_TIMEOUT_MS = 10_000;\n\nexport type ChainIdHex = Hex;\nexport type ChecksumAddress = Hex;\n\nexport type ProcessedBalance = {\n success: boolean;\n value?: BN;\n account: ChecksumAddress | string;\n token: ChecksumAddress;\n chainId: ChainIdHex;\n};\n\nexport type BalanceFetchResult = {\n balances: ProcessedBalance[];\n unprocessedChainIds?: 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 jwtToken?: string;\n }): Promise<BalanceFetchResult>;\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 type GetProviderFunction = (chainId: ChainIdHex) => Web3Provider;\n\nexport class AccountsApiBalanceFetcher implements BalanceFetcher {\n readonly #platform: 'extension' | 'mobile' = 'extension';\n\n readonly #getProvider?: GetProviderFunction;\n\n constructor(\n platform: 'extension' | 'mobile' = 'extension',\n getProvider?: GetProviderFunction,\n ) {\n this.#platform = platform;\n this.#getProvider = getProvider;\n }\n\n supports(chainId: ChainIdHex): boolean {\n return SUPPORTED_NETWORKS_ACCOUNTS_API_V4.includes(chainId);\n }\n\n async #fetchStakedBalances(\n addrs: CaipAccountAddress[],\n ): Promise<ProcessedBalance[]> {\n // Return empty array if no provider is available for blockchain calls\n if (!this.#getProvider) {\n return [];\n }\n\n const results: ProcessedBalance[] = [];\n\n // Group addresses by chain ID\n const addressesByChain: Record<ChainIdHex, ChecksumAddress[]> = {};\n\n for (const caipAddr of addrs) {\n const [, chainRef, address] = caipAddr.split(':');\n const chainId = toHex(parseInt(chainRef, 10));\n const checksumAddress = checksum(address);\n\n if (!addressesByChain[chainId]) {\n addressesByChain[chainId] = [];\n }\n addressesByChain[chainId].push(checksumAddress);\n }\n\n // Process each supported chain\n for (const [chainId, addresses] of Object.entries(addressesByChain)) {\n const chainIdHex = chainId as ChainIdHex;\n\n // Only fetch staked balance on supported networks (mainnet and hoodi)\n if (\n ![\n SupportedStakedBalanceNetworks.mainnet,\n SupportedStakedBalanceNetworks.hoodi,\n ].includes(chainIdHex as SupportedStakedBalanceNetworks)\n ) {\n continue;\n }\n\n // Only fetch staked balance if contract address exists\n if (!(chainIdHex in STAKING_CONTRACT_ADDRESS_BY_CHAINID)) {\n continue;\n }\n\n const contractAddress = STAKING_CONTRACT_ADDRESS_BY_CHAINID[chainIdHex];\n const provider = this.#getProvider(chainIdHex);\n\n const abi = [\n {\n inputs: [\n { internalType: 'address', name: 'account', type: 'address' },\n ],\n name: 'getShares',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [\n { internalType: 'uint256', name: 'shares', type: 'uint256' },\n ],\n name: 'convertToAssets',\n outputs: [\n { internalType: 'uint256', name: 'assets', type: 'uint256' },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n ];\n\n try {\n const contract = new Contract(contractAddress, abi, provider);\n\n // Get shares for each address\n for (const address of addresses) {\n try {\n const shares = await safelyExecute(() =>\n contract.getShares(address),\n );\n\n if (shares && (shares as BigNumber).gt(0)) {\n // Convert shares to assets (actual staked ETH amount)\n const assets = await safelyExecute(() =>\n contract.convertToAssets(shares),\n );\n\n if (assets) {\n results.push({\n success: true,\n value: new BN((assets as BigNumber).toString()),\n account: address,\n token: checksum(contractAddress),\n chainId: chainIdHex,\n });\n }\n } else {\n // Return zero balance for accounts with no staked assets\n results.push({\n success: true,\n value: new BN('0'),\n account: address,\n token: checksum(contractAddress),\n chainId: chainIdHex,\n });\n }\n } catch (error) {\n // Log error and continue with next address\n console.error(\n `Error fetching staked balance for ${address}:`,\n error,\n );\n results.push({\n success: false,\n account: address,\n token: checksum(contractAddress),\n chainId: chainIdHex,\n });\n }\n }\n } catch (error) {\n console.error(\n `Error setting up staking contract for chain ${chainId}:`,\n error,\n );\n }\n }\n\n return results;\n }\n\n async #fetchBalances(addrs: CaipAccountAddress[], jwtToken?: string) {\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 return await fetchMultiChainBalancesV4(\n { accountAddresses: addrs },\n this.#platform,\n jwtToken,\n );\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 type ResponseData = Awaited<ReturnType<typeof fetchMultiChainBalancesV4>>;\n\n const allUnprocessedNetworks = new Set<number>();\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 response = await fetchMultiChainBalancesV4(\n { accountAddresses: batch },\n this.#platform,\n jwtToken,\n );\n // Collect unprocessed networks from each batch\n if (response.unprocessedNetworks) {\n response.unprocessedNetworks.forEach((network) =>\n allUnprocessedNetworks.add(network),\n );\n }\n return [...(workingResult || []), ...response.balances];\n },\n initialResult: [],\n });\n\n return {\n balances: allBalances,\n unprocessedNetworks: Array.from(allUnprocessedNetworks),\n } as ResponseData;\n }\n\n async fetch({\n chainIds,\n queryAllAccounts,\n selectedAccount,\n allAccounts,\n jwtToken,\n }: Parameters<BalanceFetcher['fetch']>[0]): Promise<BalanceFetchResult> {\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 { balances: [] };\n }\n\n // Let errors propagate to TokenBalancesController for RPC fallback\n // Use timeout to prevent hanging API calls (30 seconds)\n const apiResponse = await safelyExecuteWithTimeout(\n () => this.#fetchBalances(caipAddrs, jwtToken),\n false, // don't log error here, let it propagate\n ACCOUNTS_API_TIMEOUT_MS,\n );\n\n // If API call timed out or failed, throw error to trigger RPC fallback\n if (!apiResponse) {\n throw new Error('Accounts API request timed out or failed');\n }\n\n // Extract unprocessed networks and convert to hex chain IDs\n const unprocessedChainIds: ChainIdHex[] | undefined =\n apiResponse.unprocessedNetworks\n ? apiResponse.unprocessedNetworks.map((chainId) => toHex(chainId))\n : undefined;\n\n const stakedBalances = await this.#fetchStakedBalances(caipAddrs);\n\n const results: ProcessedBalance[] = [];\n\n // Collect all unique addresses and chains from the CAIP addresses\n const addressChainMap = new Map<string, Set<ChainIdHex>>();\n caipAddrs.forEach((caipAddr) => {\n const [, chainRef, address] = caipAddr.split(':');\n const chainId = toHex(parseInt(chainRef, 10));\n const checksumAddress = checksum(address);\n\n if (!addressChainMap.has(checksumAddress)) {\n addressChainMap.set(checksumAddress, new Set());\n }\n addressChainMap.get(checksumAddress)?.add(chainId);\n });\n\n // Ensure native token entries exist for all addresses on all requested chains\n const ZERO_ADDRESS =\n '0x0000000000000000000000000000000000000000' as ChecksumAddress;\n const nativeBalancesFromAPI = new Map<string, BN>(); // key: `${address}-${chainId}`\n\n // Process regular API balances\n if (apiResponse.balances) {\n const apiBalances = apiResponse.balances.flatMap((b) => {\n const addressPart = b.accountAddress?.split(':')[2];\n if (!addressPart) {\n return [];\n }\n const account = checksum(addressPart);\n const token = checksum(b.address);\n // Use original address for zero address tokens, checksummed for others\n // TODO: this is a hack to get the correct account address type but needs to be fixed\n // by mgrating tokenBalancesController to checksum addresses\n const finalAccount: ChecksumAddress | string =\n token === ZERO_ADDRESS ? account : addressPart;\n const chainId = toHex(b.chainId);\n\n let value: BN | undefined;\n try {\n // Convert string balance to BN avoiding floating point precision issues\n const { balance: balanceStr, decimals } = b;\n\n // Split the balance string into integer and decimal parts\n const [integerPart = '0', decimalPart = ''] = balanceStr.split('.');\n\n // Pad or truncate decimal part to match token decimals\n const paddedDecimalPart = decimalPart\n .padEnd(decimals, '0')\n .slice(0, decimals);\n\n // Combine and create BN\n const fullIntegerStr = integerPart + paddedDecimalPart;\n value = new BN(fullIntegerStr);\n } catch {\n value = undefined;\n }\n\n // Track native balances for later\n if (token === ZERO_ADDRESS && value !== undefined) {\n nativeBalancesFromAPI.set(`${finalAccount}-${chainId}`, value);\n }\n\n return [\n {\n success: value !== undefined,\n value,\n account: finalAccount,\n token,\n chainId,\n },\n ];\n });\n results.push(...apiBalances);\n }\n\n // Add zero native balance entries for addresses that API didn't return\n addressChainMap.forEach((chains, address) => {\n chains.forEach((chainId) => {\n const key = `${address}-${chainId}`;\n const existingBalance = nativeBalancesFromAPI.get(key);\n\n if (!existingBalance) {\n // Add zero native balance entry if API succeeded but didn't return one\n results.push({\n success: true,\n value: new BN('0'),\n account: address as ChecksumAddress,\n token: ZERO_ADDRESS,\n chainId,\n });\n }\n });\n });\n\n // Add staked balances\n results.push(...stakedBalances);\n\n return {\n balances: results,\n unprocessedChainIds,\n };\n }\n}\n"]}
|
package/dist/multicall.cjs
CHANGED
|
@@ -299,6 +299,10 @@ const MULTICALL_CONTRACT_BY_CHAINID = {
|
|
|
299
299
|
'0x8f': '0xcA11bde05977b3631167028862bE2a173976CA11',
|
|
300
300
|
// XDC, contract found but not in multicall3 repo
|
|
301
301
|
'0x32': '0x0B1795ccA8E4eC4df02346a082df54D437F8D9aF',
|
|
302
|
+
// MegaETH TESTNET v2 (timothy chain ID 6343)
|
|
303
|
+
'0x18c7': '0xcA11bde05977b3631167028862bE2a173976CA11',
|
|
304
|
+
// MegaETH mainnet, contract found matching multicall3 bytecode
|
|
305
|
+
'0x10e6': '0xcA11bde05977b3631167028862bE2a173976CA11',
|
|
302
306
|
};
|
|
303
307
|
const multicallAbi = [
|
|
304
308
|
{
|
package/dist/multicall.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multicall.cjs","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAoD;AAGpD,kDAAuB;AAEvB,6EAAiF;AACjF,iDAAuD;AAEvD,+DAA+D;AAC/D,MAAM,6BAA6B,GAAG;IACpC,KAAK,EAAE,4CAA4C;IACnD,MAAM,EAAE,4CAA4C;IACpD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;IACnD,KAAK,EAAE,4CAA4C;IACnD,UAAU,EAAE,4CAA4C;IACxD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,SAAS,EAAE,4CAA4C;IACvD,UAAU,EAAE,4CAA4C;IACxD,KAAK,EAAE,4CAA4C;IACnD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,UAAU,EAAE,4CAA4C;IACxD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,WAAW,EAAE,4CAA4C;IACzD,MAAM,EAAE,4CAA4C;IACpD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,aAAa,EAAE,4CAA4C;IAC3D,aAAa,EAAE,4CAA4C;IAC3D,YAAY,EAAE,4CAA4C;IAC1D,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,WAAW,EAAE,4CAA4C;IACzD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,KAAK,EAAE,4CAA4C;IACnD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,YAAY,EAAE,4CAA4C;IAC1D,OAAO,EAAE,4CAA4C;IACrD,UAAU,EAAE,4CAA4C;IACxD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,WAAW,EAAE,4CAA4C;IACzD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,UAAU,EAAE,4CAA4C;IACxD,YAAY,EAAE,4CAA4C;IAC1D,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,YAAY,EAAE,4CAA4C;IAC1D,YAAY,EAAE,4CAA4C;IAC1D,WAAW,EAAE,4CAA4C;IACzD,YAAY,EAAE,4CAA4C;IAC1D,YAAY,EAAE,4CAA4C;IAC1D,YAAY,EAAE,4CAA4C;IAC1D,YAAY,EAAE,4CAA4C;IAC1D,YAAY,EAAE,4CAA4C;IAC1D,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,WAAW,EAAE,4CAA4C;IACzD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,aAAa,EAAE,4CAA4C;IAC3D,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,MAAM,EAAE,4CAA4C;IACpD,WAAW,EAAE,4CAA4C;IACzD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,SAAS,EAAE,4CAA4C;IACvD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,WAAW,EAAE,4CAA4C;IACzD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,UAAU,EAAE,4CAA4C;IACxD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,UAAU,EAAE,4CAA4C;IACxD,OAAO,EAAE,4CAA4C;IACrD,SAAS,EAAE,4CAA4C;IACvD,MAAM,EAAE,4CAA4C;IACpD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,WAAW,EAAE,4CAA4C;IACzD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,SAAS,EAAE,4CAA4C;IACvD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,WAAW,EAAE,4CAA4C;IACzD,QAAQ,EAAE,4CAA4C;IACtD,SAAS,EAAE,4CAA4C;IACvD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,aAAa,EAAE,4CAA4C;IAC3D,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,OAAO,EAAE,4CAA4C;IACrD,WAAW,EAAE,4CAA4C;IACzD,cAAc,EAAE,4CAA4C;IAC5D,UAAU,EAAE,4CAA4C;IACxD,SAAS,EAAE,4CAA4C;IACvD,QAAQ,EAAE,4CAA4C;IACtD,MAAM,EAAE,4CAA4C;IACpD,MAAM,EAAE,4CAA4C;IACpD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,OAAO,EAAE,4CAA4C;IACrD,uDAAuD;IACvD,OAAO,EAAE,4CAA4C;IACrD,kDAAkD;IAClD,QAAQ,EAAE,4CAA4C;IACtD,oDAAoD;IACpD,QAAQ,EAAE,4CAA4C;IACtD,oDAAoD;IACpD,MAAM,EAAE,4CAA4C;IACpD,kDAAkD;IAClD,UAAU,EAAE,4CAA4C;IACxD,qDAAqD;IACrD,OAAO,EAAE,4CAA4C;IACrD,qDAAqD;IACrD,QAAQ,EAAE,4CAA4C;IACtD,gBAAgB;IAChB,QAAQ,EAAE,4CAA4C;IACtD,WAAW;IACX,OAAO,EAAE,4CAA4C;IACrD,uDAAuD;IACvD,SAAS,EAAE,4CAA4C;IACvD,kBAAkB;IAClB,QAAQ,EAAE,4CAA4C;IACtD,WAAW;IACX,QAAQ,EAAE,4CAA4C;IACtD,sDAAsD;IACtD,OAAO,EAAE,4CAA4C;IACrD,gBAAgB;IAChB,QAAQ,EAAE,4CAA4C;IACtD,SAAS;IACT,SAAS,EAAE,4CAA4C;IACvD,kDAAkD;IAClD,MAAM,EAAE,4CAA4C;IACpD,QAAQ;IACR,SAAS,EAAE,4CAA4C;IACvD,gBAAgB;IAChB,MAAM,EAAE,4CAA4C;IACpD,iDAAiD;IACjD,MAAM,EAAE,4CAA4C;CACjC,CAAC;AAEtB,MAAM,YAAY,GAAG;IACnB;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,SAAS;QAC1B,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE;YACxC;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;oBACnC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE;iBACpC;aACF;SACF;QACD,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;oBACjC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE;iBACtC;aACF;SACF;KACF;CACF,CAAC;AAEF,yCAAyC;AACzC,MAAM,aAAa,GAAG;IACpB;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,UAAU;QAChB,eAAe,EAAE,SAAS;QAC1B,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;oBACnC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE;oBACtC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE;iBACpC;aACF;SACF;QACD,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE;oBACV,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;oBACjC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE;iBACtC;aACF;SACF;KACF;CACF,CAAC;AAqBF,8CAA8C;AAC9C,MAAM,YAAY,GAAG,4CAA4C,CAAC;AAClE,MAAM,mBAAmB,GAAG,oBAAoB,CAAC;AACjD,MAAM,wBAAwB,GAAG,eAAe,CAAC;AACjD,MAAM,mBAAmB,GAAG,WAAW,CAAC;AACxC,MAAM,0BAA0B,GAAG,iBAAiB,CAAC;AAErD,sBAAsB;AACtB,MAAM,oBAAoB,GAAG;IAC3B;QACE,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACxC,eAAe,EAAE,MAAM;KACxB;CACF,CAAC;AAEF,+BAA+B;AAC/B,MAAM,8BAA8B,GAAG;IACrC;QACE,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC3C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC/C,eAAe,EAAE,MAAM;KACxB;CACF,CAAC;AAEF,+DAA+D;AAC/D,MAAM,oBAAoB,GAAG;IAC3B;QACE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACvE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACjE,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;IACD;QACE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACtE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACvE,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;CACF,CAAC;AAEF,MAAM,SAAS,GAAG,KAAK,EACrB,KAAa,EACb,gBAAqB,EACrB,QAAsB,EACtB,oBAA4B,EACA,EAAE;IAC9B,MAAM,iBAAiB,GAAG,IAAI,oBAAQ,CACpC,gBAAgB,EAChB,YAAY,EACZ,QAAQ,CACT,CAAC;IAEF,OAAO,MAAM,IAAA,oCAAuB,EAA0B;QAC5D,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,oBAAoB;QAC/B,aAAa,EAAE,EAAE;QACjB,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE;YACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACpC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;gBAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,kBAAkB,CAClD,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,EACzD,IAAI,CAAC,SAAS,CACf;aACF,CAAC,CAAC,CAAC;YAEJ,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,UAAU,CAAC,YAAY,CAC7D,KAAK,EACL,QAAQ,CACT,CAAC;YAEF,OAAO;gBACL,GAAG,aAAa;gBAChB,GAAG,OAAO,CAAC,GAAG,CACZ,CAAC,CAA2C,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC;oBAC3D,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,KAAK,EAAE,CAAC,CAAC,OAAO;wBACd,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,oBAAoB,CAC9C,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAC1B,CAAC,CAAC,UAAU,CACb,CAAC,CAAC,CAAC;wBACN,CAAC,CAAC,SAAS;iBACd,CAAC,CACH;aACF,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,KAAK,EACpB,KAAa,EACb,gBAAwB,EACI,EAAE;IAC9B,OAAO,MAAM,IAAA,oCAAuB,EAA0B;QAC5D,MAAM,EAAE,KAAK;QACb,SAAS,EAAE,gBAAgB;QAC3B,aAAa,EAAE,EAAE;QACjB,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE;YACxC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CACzD,CACF,CAAC;YACF,OAAO;gBACL,GAAG,aAAa;gBAChB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACrB,OAAO,EAAE,CAAC,CAAC,MAAM,KAAK,WAAW;oBACjC,KAAK,EAAE,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;iBACtD,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;;;;;;;;GAWG;AACI,MAAM,mBAAmB,GAAG,KAAK,EACtC,KAAa,EACb,OAAY,EACZ,QAAsB,EACtB,oBAAoB,GAAG,GAAG,EAC1B,gBAAgB,GAAG,EAAE,EACO,EAAE;IAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,gBAAgB,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;IAChE,IAAI,gBAAgB,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,CACpB,KAAK,EACL,gBAAgB,EAChB,QAAQ,EACR,oBAAoB,CACrB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,0BAA0B;YAC1B,yEAAyE;YACzE,IACE,CAAC,KAAK;gBACN,OAAO,KAAK,KAAK,QAAQ;gBACzB,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;gBAClB,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAC/B,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;AACjD,CAAC,CAAC;AAnCW,QAAA,mBAAmB,uBAmC9B;AAEF;;;;;;;;GAQG;AACI,MAAM,UAAU,GAAG,KAAK,EAC7B,KAAuB,EACvB,OAAY,EACZ,QAAsB,EACO,EAAE;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,iBAAiB,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,kBAAkB,GAAG,IAAI,oBAAQ,CACrC,iBAAiB,EACjB,aAAa,EACb,QAAQ,CACT,CAAC;IAEF,OAAO,MAAM,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC,CAAC;AAjBW,QAAA,UAAU,cAiBrB;AAEF;;;;;;;;;GASG;AACH,MAAM,qBAAqB,GAAG,CAC5B,OAA2B,EAC3B,WAIG,EACH,OAAY,EACZ,QAAsB,EACtB,aAAsB,EAItB,EAAE;IACF,MAAM,UAAU,GAAuC,EAAE,CAAC;IAC1D,MAAM,gBAAgB,GAAuB,EAAE,CAAC;IAEhD,yCAAyC;IACzC,MAAM,aAAa,GAAG,IAAI,oBAAQ,CAChC,YAAY,EACZ,oBAAoB,EACpB,QAAQ,CACT,CAAC;IAEF,MAAM,iBAAiB,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACjE,MAAM,kBAAkB,GAAG,IAAI,oBAAQ,CACrC,iBAAiB,EACjB,8BAA8B,EAC9B,QAAQ,CACT,CAAC;IAEF,mEAAmE;IAEnE,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAChC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YACnE,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1B,oDAAoD;gBACpD,MAAM,UAAU,GAAG,kBAAkB,CAAC,SAAS,CAAC,oBAAoB,CAClE,wBAAwB,EACxB,MAAM,CAAC,UAAU,CAClB,CAAC,CAAC,CAAC,CAAC;gBAEL,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC9B,UAAU,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;gBAChC,CAAC;gBACD,UAAU,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,GAAG,IAAI,eAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxE,CAAC;iBAAM,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAClC,wDAAwD;gBACxD,qCAAqC;gBACrC,OAAO,CAAC,IAAI,CACV,oEAAoE,CACrE,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,gDAAgD;gBAChD,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,oBAAoB,CAC7D,mBAAmB,EACnB,MAAM,CAAC,UAAU,CAClB,CAAC,CAAC,CAAC,CAAC;gBAEL,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC9B,UAAU,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;gBAChC,CAAC;gBACD,UAAU,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,GAAG,IAAI,eAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAGR,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;IAElC,IAAI,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,MAAM,CAAC,cAAc,GAAG,gBAAgB,CAAC;IAC3C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,yBAAyB,GAAG,KAAK,EACrC,aAAuB,EACvB,QAAsB,EACtB,gBAAgB,GAAG,EAAE,EACQ,EAAE;IAC/B,MAAM,UAAU,GAAuB,EAAE,CAAC;IAE1C,MAAM,IAAA,oCAAuB,EAAe;QAC1C,MAAM,EAAE,aAAa;QACrB,SAAS,EAAE,gBAAgB;QAC3B,aAAa,EAAE,SAAS;QACxB,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE;YAC5B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;gBAC9B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;gBACvD,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,IAAI,eAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACnC,WAAW;iBACZ,CAAC;YACJ,CAAC,CAAC,CACH,CAAC;YAEF,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBACzB,IACE,MAAM,CAAC,MAAM,KAAK,WAAW;oBAC7B,MAAM,CAAC,KAAK,CAAC,OAAO;oBACpB,MAAM,CAAC,KAAK,CAAC,OAAO,KAAK,IAAI,EAC7B,CAAC;oBACD,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC9D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,wBAAwB,GAAG,KAAK,EACpC,cAAwB,EACxB,aAAuB,EACvB,QAAsB,EACtB,aAAsB,EACtB,gBAAwB,EACqB,EAAE;IAC/C,MAAM,UAAU,GAAuC,EAAE,CAAC;IAE1D,mEAAmE;IACnE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9B,MAAM,UAAU,GAAW,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAoD,EAAE,CAAC;QAExE,cAAc,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;YACtC,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;gBACpC,MAAM,QAAQ,GAAG,IAAI,oBAAQ,CAC3B,YAAY,EACZ,oBAAoB,EACpB,QAAQ,CACT,CAAC;gBACF,UAAU,CAAC,IAAI,CAAC;oBACd,QAAQ;oBACR,iBAAiB,EAAE,mBAAmB;oBACtC,SAAS,EAAE,CAAC,WAAW,CAAC;iBACzB,CAAC,CAAC;gBACH,WAAW,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAClE,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACrC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;gBACzD,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC9B,UAAU,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;gBAChC,CAAC;gBACD,UAAU,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,KAAW,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kEAAkE;IAClE,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,cAAc,GAAG,MAAM,yBAAyB,CACpD,aAAa,EACb,QAAQ,EACR,gBAAgB,CACjB,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,UAAU,CAAC,YAAY,CAAC,GAAG,cAAc,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,yBAAyB,GAAG,KAAK,EACrC,aAAuB,EACvB,OAAY,EACZ,QAAsB,EACtB,gBAAwB,EACK,EAAE;IAC/B,MAAM,gBAAgB,GAAuB,EAAE,CAAC;IAEhD,MAAM,sBAAsB,GAC1B,8DAAmC,CACjC,OAA2D,CAC5D,CAAC;IAEJ,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC5B,oCAAoC;QACpC,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,YAAY,GAAW,EAAE,CAAC;IAChC,MAAM,WAAW,GAA8B,EAAE,CAAC;IAElD,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;QACpC,MAAM,QAAQ,GAAG,IAAI,oBAAQ,CAC3B,sBAAsB,EACtB,oBAAoB,EACpB,QAAQ,CACT,CAAC;QACF,YAAY,CAAC,IAAI,CAAC;YAChB,QAAQ;YACR,iBAAiB,EAAE,mBAAmB;YACtC,SAAS,EAAE,CAAC,WAAW,CAAC;SACzB,CAAC,CAAC;QACH,WAAW,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IACtE,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACvC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YAC3C,gBAAgB,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC,KAAW,CAAC;QACrD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACI,MAAM,6BAA6B,GAAG,KAAK,EAChD,aAAuB,EACvB,OAAY,EACZ,QAAsB,EACO,EAAE;IAC/B,MAAM,sBAAsB,GAC1B,8DAAmC,CACjC,OAA2D,CAC5D,CAAC;IAEJ,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,oBAAQ,CAClC,sBAAsB,EACtB,oBAAoB,EACpB,QAAQ,CACT,CAAC;IAEF,IAAI,CAAC;QACH,uCAAuC;QACvC,MAAM,UAAU,GAAqB,aAAa,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACvE,MAAM,EAAE,sBAAsB;YAC9B,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,eAAe,CAAC,SAAS,CAAC,kBAAkB,CACpD,mBAAmB,EACnB,CAAC,WAAW,CAAC,CACd;SACF,CAAC,CAAC,CAAC;QAEJ,MAAM,YAAY,GAAG,MAAM,IAAA,kBAAU,EAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAErE,gEAAgE;QAChE,MAAM,iBAAiB,GAAsC,EAAE,CAAC;QAChE,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YACrC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC,oBAAoB,CAC9D,mBAAmB,EACnB,MAAM,CAAC,UAAU,CAClB,CAAC,CAAC,CAAC,CAAC;gBACL,MAAM,MAAM,GAAG,IAAI,eAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAE5C,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,eAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzB,iBAAiB,CAAC,IAAI,CAAC;wBACrB,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC;wBAC7B,MAAM;qBACP,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,sEAAsE;QACtE,MAAM,UAAU,GAAqB,iBAAiB,CAAC,GAAG,CACxD,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YACf,MAAM,EAAE,sBAAsB;YAC9B,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,eAAe,CAAC,SAAS,CAAC,kBAAkB,CACpD,0BAA0B,EAC1B,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CACpB;SACF,CAAC,CACH,CAAC;QAEF,MAAM,YAAY,GAAG,MAAM,IAAA,kBAAU,EAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAErE,qCAAqC;QACrC,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE;YAC1C,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACxB,MAAM,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC,oBAAoB,CAC9D,0BAA0B,EAC1B,WAAW,CAAC,UAAU,CACvB,CAAC,CAAC,CAAC,CAAC;gBACL,MAAM,MAAM,GAAG,IAAI,eAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAE5C,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAC7C,MAAM,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACxD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AA1FW,QAAA,6BAA6B,iCA0FxC;AAEF;;;;;;;;;;;GAWG;AACI,MAAM,oCAAoC,GAAG,KAAK,EACvD,kBAAoE,EACpE,OAAY,EACZ,QAAsB,EACtB,aAAsB,EACtB,aAAsB,EAIrB,EAAE;IACH,qCAAqC;IACrC,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,EAAE,CAAC;QACxE,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;IAC/B,CAAC;IAED,gEAAgE;IAChE,MAAM,oBAAoB,GAAG,KAAK,CAAC,IAAI,CACrC,IAAI,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CACrE,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,KAAK,YAAY,CAAC,CAAC,CAAC,wCAAwC;IAEnG,MAAM,mBAAmB,GAAG,KAAK,CAAC,IAAI,CACpC,IAAI,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CACjE,CAAC;IAEF,iDAAiD;IACjD,IACE,CAAC,6BAA6B,CAC5B,OAAqD,CACtD,EACD,CAAC;QACD,wEAAwE;QACxE,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAClD,oBAAoB,EACpB,mBAAmB,EACnB,QAAQ,EACR,aAAa,EACb,EAAE,CACH,CAAC;QAEF,MAAM,MAAM,GAGR,EAAE,aAAa,EAAE,CAAC;QAEtB,+CAA+C;QAC/C,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,cAAc,GAAG,MAAM,yBAAyB,CACpD,mBAAmB,EACnB,OAAO,EACP,QAAQ,EACR,EAAE,CACH,CAAC;YAEF,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3C,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;YACzC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACH,mCAAmC;QACnC,MAAM,QAAQ,GAAqB,EAAE,CAAC;QACtC,MAAM,cAAc,GAId,EAAE,CAAC;QAET,iDAAiD;QACjD,MAAM,iBAAiB,GAAG,IAAI,oBAAQ,CACpC,YAAY,EACZ,oBAAoB,EACpB,QAAQ,CACT,CAAC;QAEF,gEAAgE;QAChE,kBAAkB,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACnC,KAAK,CAAC,cAAc;iBACjB,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,KAAK,YAAY,CAAC;iBACvD,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;gBACxB,QAAQ,CAAC,IAAI,CAAC;oBACZ,MAAM,EAAE,YAAY;oBACpB,YAAY,EAAE,IAAI;oBAClB,QAAQ,EAAE,iBAAiB,CAAC,SAAS,CAAC,kBAAkB,CACtD,mBAAmB,EACnB,CAAC,KAAK,CAAC,cAAc,CAAC,CACvB;iBACF,CAAC,CAAC;gBACH,cAAc,CAAC,IAAI,CAAC;oBAClB,YAAY;oBACZ,WAAW,EAAE,KAAK,CAAC,cAAc;oBACjC,QAAQ,EAAE,OAAO;iBAClB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,8CAA8C;QAC9C,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,iBAAiB,GAAG,6BAA6B,CAAC,OAAO,CAAC,CAAC;YACjE,MAAM,sBAAsB,GAAG,IAAI,oBAAQ,CACzC,iBAAiB,EACjB,8BAA8B,EAC9B,QAAQ,CACT,CAAC;YAEF,mBAAmB,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;gBAC1C,QAAQ,CAAC,IAAI,CAAC;oBACZ,MAAM,EAAE,iBAAiB;oBACzB,YAAY,EAAE,IAAI;oBAClB,QAAQ,EAAE,sBAAsB,CAAC,SAAS,CAAC,kBAAkB,CAC3D,wBAAwB,EACxB,CAAC,WAAW,CAAC,CACd;iBACF,CAAC,CAAC;gBACH,cAAc,CAAC,IAAI,CAAC;oBAClB,YAAY,EAAE,YAAY;oBAC1B,WAAW;oBACX,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAED,0FAA0F;QAE1F,+BAA+B;QAC/B,MAAM,gBAAgB,GAAG,GAAG,CAAC,CAAC,iDAAiD;QAC/E,MAAM,UAAU,GAAuB,EAAE,CAAC;QAE1C,MAAM,IAAA,oCAAuB,EAAuB;YAClD,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,gBAAgB;YAC3B,aAAa,EAAE,SAAS;YACxB,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE;gBAC5B,MAAM,YAAY,GAAG,MAAM,IAAA,kBAAU,EAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAChE,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;YACnC,CAAC;SACF,CAAC,CAAC;QAEH,oDAAoD;QACpD,IAAI,cAAc,GAAuB,EAAE,CAAC;QAC5C,IAAI,aAAa,EAAE,CAAC;YAClB,cAAc,GAAG,MAAM,IAAA,qCAA6B,EAClD,mBAAmB,EACnB,OAAO,EACP,QAAQ,CACT,CAAC;QACJ,CAAC;QAED,6BAA6B;QAC7B,MAAM,MAAM,GAAG,qBAAqB,CAClC,UAAU,EACV,cAAc,EACd,OAAO,EACP,QAAQ,EACR,KAAK,CACN,CAAC;QAEF,gCAAgC;QAChC,IAAI,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;QACzC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0BAA0B;QAC1B,yEAAyE;QACzE,IACE,CAAC,KAAK;YACN,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;YAClB,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAC/B,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,6DAA6D;QAC7D,MAAM,aAAa,GAAG,MAAM,wBAAwB,CAClD,oBAAoB,EACpB,mBAAmB,EACnB,QAAQ,EACR,aAAa,EACb,EAAE,CACH,CAAC;QAEF,MAAM,MAAM,GAGR,EAAE,aAAa,EAAE,CAAC;QAEtB,+CAA+C;QAC/C,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,cAAc,GAAG,MAAM,yBAAyB,CACpD,mBAAmB,EACnB,OAAO,EACP,QAAQ,EACR,EAAE,CACH,CAAC;YAEF,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3C,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;YACzC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC,CAAC;AA/MW,QAAA,oCAAoC,wCA+M/C","sourcesContent":["import { Contract } from '@ethersproject/contracts';\nimport type { Web3Provider } from '@ethersproject/providers';\nimport type { Hex } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { STAKING_CONTRACT_ADDRESS_BY_CHAINID } from './AssetsContractController';\nimport { reduceInBatchesSerially } from './assetsUtil';\n\n// https://github.com/mds1/multicall/blob/main/deployments.json\nconst MULTICALL_CONTRACT_BY_CHAINID = {\n '0x1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xaa36a7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4268': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5e9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b6e6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x18fc4a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x45': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1a4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xaa37dc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa4b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa4ba': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x66eed': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x66eee': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x66eeb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15f2249': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x89': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13881': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13882': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x44d': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x5a2': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x98a': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x64': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x27d8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa86a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa869': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfa2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfa': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfaf0': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x38': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x61': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15eb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xcc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x504': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x505': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x507': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2a15c308d': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x2a15c3083': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x63564c40': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x19': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x152': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5535072': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6c1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x10': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x72': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x120': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4e454152': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x250': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5c2359': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xec0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x42': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x80': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x440': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x257': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe9fe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xd3a0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x84444': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2329': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2328': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x12': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa516': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5afe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa4ec': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xaef3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x116ea': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x116e9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2019': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3e9': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x7d1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x141': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4d2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1e14': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1e15': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1251': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7f08': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8ae': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x138b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1389': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1388': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f92': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x14a33': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x14a34': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2105': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x936': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xff': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x46a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x46b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x14f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xd2af': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe9ac0ce': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe705': '0xca11bde05977b3631167028862be2a173976ca11',\n '0xe704': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe708': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2b6f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x39': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x23a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1644': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xdea8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3af': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x171': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3e7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x76adf1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3b9ac9ff': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2c': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x2e': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x15b3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x82751': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8274f': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x82750': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x96f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3cc5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4571': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe99': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7d0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1297': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1d5e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3a14269b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x561bf78b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x235ddd0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3cd156dc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5d456c62': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x79f99296': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x585eb4b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x507aaa2a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1fc3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x32d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a73': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a72': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a71': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe9ac0d6': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1069': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7e5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x53': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x52': '0xca11bde05977b3631167028862be2a173976ca11',\n '0xe298': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1a8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x94': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2c6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2803': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2802': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c5f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c60': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4cb2f': '0xdbfa261cd7d17bb40479a0493ad6c0fee435859e',\n '0x7f93': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xb660': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xb02113d3f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xdad': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xdae': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15b38': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15b32': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x45c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x45b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x41a6ace': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa729': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f47b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b59': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1b58': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xc3': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x16fd8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xc7': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x405': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x334': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1ce': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1cf': '0xca11bde05977b3631167028862be2a173976ca11',\n '0xa70e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x868b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa0c71fd': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13e31': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa1337': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f2b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xf63': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x144': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x118': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x12c': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x18995f': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x2b74': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0xfc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x9da': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x137': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13ed': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x24b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xba9302': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7c8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x138d5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x343b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x34a1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3109': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x91b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa96': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x22c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2be3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xbf03': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b254': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa7b14': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2276': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b9e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6a63bb8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15af3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15af1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xae3f3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x531': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c61': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c58': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1d88': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5b9b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4c7e1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa53b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1a2b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x406': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x2cef': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x18b2': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x182a9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xc4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfdd': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfde': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x99c0a0f': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x22cf': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x310c5': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x46f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x659': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x139c968f9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xed88': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xd036': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x31bf8c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1cbc67bfdc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x98967f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4f588': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x16db': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x3a': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x59': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1e0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2eb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x221': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Injective, contract found but not in multicall3 repo\n '0x6f0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Hemi, contract found but not in multicall3 repo\n '0xa867': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Plasma, contract found but not in multicall3 repo\n '0x2611': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Nonmia, contract found but not in multicall3 repo\n '0xa6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // XRPL, contract found but not in multicall3 repo\n '0x15f900': '0x6B5eFbC0C82eBb26CA13a4F11836f36Fc6fdBC5D',\n // Soneium, contract found but not in multicall3 repo\n '0x74c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Genesys, contract found but not in multicall3 repo\n '0x407b': '0x90a2377F233E3461BACa6080d4837837d8762927',\n // EDU (Animoca)\n '0xa3c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Abstract\n '0xab5': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n // Berachain, contract found but not in multicall3 repo\n '0x138de': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // MegaETH TESTNET\n '0x18c6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Apechain\n '0x8173': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Matchain, contract found but not in multicall3 repo\n '0x2ba': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Monad TESTNET\n '0x279f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Katana\n '0xb67d2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Lens, contract found but not in multicall3 repo\n '0xe8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Plume\n '0x18232': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Monad Mainnet\n '0x8f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // XDC, contract found but not in multicall3 repo\n '0x32': '0x0B1795ccA8E4eC4df02346a082df54D437F8D9aF',\n} as Record<Hex, Hex>;\n\nconst multicallAbi = [\n {\n name: 'tryAggregate',\n type: 'function',\n stateMutability: 'payable',\n inputs: [\n { name: 'requireSuccess', type: 'bool' },\n {\n name: 'calls',\n type: 'tuple[]',\n components: [\n { name: 'target', type: 'address' },\n { name: 'callData', type: 'bytes' },\n ],\n },\n ],\n outputs: [\n {\n name: 'returnData',\n type: 'tuple[]',\n components: [\n { name: 'success', type: 'bool' },\n { name: 'returnData', type: 'bytes' },\n ],\n },\n ],\n },\n];\n\n// Multicall3 ABI for aggregate3 function\nconst multicall3Abi = [\n {\n name: 'aggregate3',\n type: 'function',\n stateMutability: 'payable',\n inputs: [\n {\n name: 'calls',\n type: 'tuple[]',\n components: [\n { name: 'target', type: 'address' },\n { name: 'allowFailure', type: 'bool' },\n { name: 'callData', type: 'bytes' },\n ],\n },\n ],\n outputs: [\n {\n name: 'returnData',\n type: 'tuple[]',\n components: [\n { name: 'success', type: 'bool' },\n { name: 'returnData', type: 'bytes' },\n ],\n },\n ],\n },\n];\n\nexport type Call = {\n contract: Contract;\n functionSignature: string;\n arguments: unknown[];\n};\n\nexport type MulticallResult = { success: boolean; value: unknown };\n\nexport type Aggregate3Call = {\n target: string;\n allowFailure: boolean;\n callData: string;\n};\n\nexport type Aggregate3Result = {\n success: boolean;\n returnData: string;\n};\n\n// Constants for encoded strings and addresses\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\nconst BALANCE_OF_FUNCTION = 'balanceOf(address)';\nconst GET_ETH_BALANCE_FUNCTION = 'getEthBalance';\nconst GET_SHARES_FUNCTION = 'getShares';\nconst CONVERT_TO_ASSETS_FUNCTION = 'convertToAssets';\n\n// ERC20 balanceOf ABI\nconst ERC20_BALANCE_OF_ABI = [\n {\n name: 'balanceOf',\n type: 'function',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n];\n\n// Multicall3 getEthBalance ABI\nconst MULTICALL3_GET_ETH_BALANCE_ABI = [\n {\n name: 'getEthBalance',\n type: 'function',\n inputs: [{ name: 'addr', type: 'address' }],\n outputs: [{ name: 'balance', type: 'uint256' }],\n stateMutability: 'view',\n },\n];\n\n// Staking contract ABI with both getShares and convertToAssets\nconst STAKING_CONTRACT_ABI = [\n {\n inputs: [{ internalType: 'address', name: 'account', type: 'address' }],\n name: 'getShares',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'shares', type: 'uint256' }],\n name: 'convertToAssets',\n outputs: [{ internalType: 'uint256', name: 'assets', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n];\n\nconst multicall = async (\n calls: Call[],\n multicallAddress: Hex,\n provider: Web3Provider,\n maxCallsPerMulticall: number,\n): Promise<MulticallResult[]> => {\n const multicallContract = new Contract(\n multicallAddress,\n multicallAbi,\n provider,\n );\n\n return await reduceInBatchesSerially<Call, MulticallResult[]>({\n values: calls,\n batchSize: maxCallsPerMulticall,\n initialResult: [],\n eachBatch: async (workingResult, batch) => {\n const calldata = batch.map((call) => ({\n target: call.contract.address,\n callData: call.contract.interface.encodeFunctionData(\n call.contract.interface.functions[call.functionSignature],\n call.arguments,\n ),\n }));\n\n const results = await multicallContract.callStatic.tryAggregate(\n false,\n calldata,\n );\n\n return [\n ...workingResult,\n ...results.map(\n (r: { success: boolean; returnData: string }, i: number) => ({\n success: r.success,\n value: r.success\n ? batch[i].contract.interface.decodeFunctionResult(\n batch[i].functionSignature,\n r.returnData,\n )[0]\n : undefined,\n }),\n ),\n ];\n },\n });\n};\n\nconst fallback = async (\n calls: Call[],\n maxCallsParallel: number,\n): Promise<MulticallResult[]> => {\n return await reduceInBatchesSerially<Call, MulticallResult[]>({\n values: calls,\n batchSize: maxCallsParallel,\n initialResult: [],\n eachBatch: async (workingResult, batch) => {\n const results = await Promise.allSettled(\n batch.map((call) =>\n call.contract[call.functionSignature](...call.arguments),\n ),\n );\n return [\n ...workingResult,\n ...results.map((p) => ({\n success: p.status === 'fulfilled',\n value: p.status === 'fulfilled' ? p.value : undefined,\n })),\n ];\n },\n });\n};\n\n/**\n * Executes an array of contract calls. If the chain supports multicalls,\n * the calls will be executed in single RPC requests (up to maxCallsPerMulticall).\n * Otherwise the calls will be executed separately in parallel (up to maxCallsParallel).\n *\n * @param calls - An array of contract calls to execute.\n * @param chainId - The hexadecimal chain id.\n * @param provider - An ethers rpc provider.\n * @param maxCallsPerMulticall - If multicall is supported, the maximum number of calls to exeute in each multicall.\n * @param maxCallsParallel - If multicall is not supported, the maximum number of calls to execute in parallel.\n * @returns An array of results, with a success boolean and value for each call.\n */\nexport const multicallOrFallback = async (\n calls: Call[],\n chainId: Hex,\n provider: Web3Provider,\n maxCallsPerMulticall = 300,\n maxCallsParallel = 20,\n): Promise<MulticallResult[]> => {\n if (calls.length === 0) {\n return [];\n }\n\n const multicallAddress = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n if (multicallAddress) {\n try {\n return await multicall(\n calls,\n multicallAddress,\n provider,\n maxCallsPerMulticall,\n );\n } catch (error: unknown) {\n // Fallback only on revert\n // https://docs.ethers.org/v5/troubleshooting/errors/#help-CALL_EXCEPTION\n if (\n !error ||\n typeof error !== 'object' ||\n !('code' in error) ||\n error.code !== 'CALL_EXCEPTION'\n ) {\n throw error;\n }\n }\n }\n\n return await fallback(calls, maxCallsParallel);\n};\n\n/**\n * Execute multiple contract calls using Multicall3's aggregate3 function.\n * This allows for more efficient batch calls with individual failure handling.\n *\n * @param calls - Array of calls to execute via aggregate3\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @returns Promise resolving to array of results from aggregate3\n */\nexport const aggregate3 = async (\n calls: Aggregate3Call[],\n chainId: Hex,\n provider: Web3Provider,\n): Promise<Aggregate3Result[]> => {\n if (calls.length === 0) {\n return [];\n }\n\n const multicall3Address = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n const multicall3Contract = new Contract(\n multicall3Address,\n multicall3Abi,\n provider,\n );\n\n return await multicall3Contract.callStatic.aggregate3(calls);\n};\n\n/**\n * Processes and decodes balance results from aggregate3 calls\n *\n * @param results - Array of results from aggregate3 calls\n * @param callMapping - Array mapping call indices to token and user addresses\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @param includeStaked - Whether to include staked balances\n * @returns Map of token address to map of user address to balance\n */\nconst processBalanceResults = (\n results: Aggregate3Result[],\n callMapping: {\n tokenAddress: string;\n userAddress: string;\n callType: 'erc20' | 'native' | 'staking';\n }[],\n chainId: Hex,\n provider: Web3Provider,\n includeStaked: boolean,\n): {\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n} => {\n const balanceMap: Record<string, Record<string, BN>> = {};\n const stakedBalanceMap: Record<string, BN> = {};\n\n // Create contract instances for decoding\n const erc20Contract = new Contract(\n ZERO_ADDRESS,\n ERC20_BALANCE_OF_ABI,\n provider,\n );\n\n const multicall3Address = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n const multicall3Contract = new Contract(\n multicall3Address,\n MULTICALL3_GET_ETH_BALANCE_ABI,\n provider,\n );\n\n // Staking contracts are now handled separately in two-step process\n\n results.forEach((result, index) => {\n if (result.success) {\n const { tokenAddress, userAddress, callType } = callMapping[index];\n if (callType === 'native') {\n // For native token, decode the getEthBalance result\n const balanceRaw = multicall3Contract.interface.decodeFunctionResult(\n GET_ETH_BALANCE_FUNCTION,\n result.returnData,\n )[0];\n\n if (!balanceMap[tokenAddress]) {\n balanceMap[tokenAddress] = {};\n }\n balanceMap[tokenAddress][userAddress] = new BN(balanceRaw.toString());\n } else if (callType === 'staking') {\n // Staking is now handled separately in two-step process\n // This case should not occur anymore\n console.warn(\n 'Staking callType found in main processing - this should not happen',\n );\n } else {\n // For ERC20 tokens, decode the balanceOf result\n const balanceRaw = erc20Contract.interface.decodeFunctionResult(\n BALANCE_OF_FUNCTION,\n result.returnData,\n )[0];\n\n if (!balanceMap[tokenAddress]) {\n balanceMap[tokenAddress] = {};\n }\n balanceMap[tokenAddress][userAddress] = new BN(balanceRaw.toString());\n }\n }\n });\n\n const result: {\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n } = { tokenBalances: balanceMap };\n\n if (includeStaked && Object.keys(stakedBalanceMap).length > 0) {\n result.stakedBalances = stakedBalanceMap;\n }\n\n return result;\n};\n\n/**\n * Fallback function to get native token balances using individual eth_getBalance calls\n * when Multicall3 is not supported on the chain.\n *\n * @param userAddresses - Array of user addresses to check balances for\n * @param provider - An ethers rpc provider\n * @param maxCallsParallel - Maximum number of parallel calls (default: 20)\n * @returns Promise resolving to map of user address to balance\n */\nconst getNativeBalancesFallback = async (\n userAddresses: string[],\n provider: Web3Provider,\n maxCallsParallel = 20,\n): Promise<Record<string, BN>> => {\n const balanceMap: Record<string, BN> = {};\n\n await reduceInBatchesSerially<string, void>({\n values: userAddresses,\n batchSize: maxCallsParallel,\n initialResult: undefined,\n eachBatch: async (_, batch) => {\n const results = await Promise.allSettled(\n batch.map(async (userAddress) => {\n const balance = await provider.getBalance(userAddress);\n return {\n success: true,\n balance: new BN(balance.toString()),\n userAddress,\n };\n }),\n );\n\n results.forEach((result) => {\n if (\n result.status === 'fulfilled' &&\n result.value.success &&\n result.value.balance !== null\n ) {\n balanceMap[result.value.userAddress] = result.value.balance;\n }\n });\n },\n });\n\n return balanceMap;\n};\n\n/**\n * Fallback function to get token balances using individual calls\n * when Multicall3 is not supported or when aggregate3 calls fail.\n *\n * @param tokenAddresses - Array of ERC20 token contract addresses\n * @param userAddresses - Array of user addresses to check balances for\n * @param provider - An ethers rpc provider\n * @param includeNative - Whether to include native token balances (default: true)\n * @param maxCallsParallel - Maximum number of parallel calls (default: 20)\n * @returns Promise resolving to map of token address to map of user address to balance\n */\nconst getTokenBalancesFallback = async (\n tokenAddresses: string[],\n userAddresses: string[],\n provider: Web3Provider,\n includeNative: boolean,\n maxCallsParallel: number,\n): Promise<Record<string, Record<string, BN>>> => {\n const balanceMap: Record<string, Record<string, BN>> = {};\n\n // Handle ERC20 token balances using the existing fallback function\n if (tokenAddresses.length > 0) {\n const erc20Calls: Call[] = [];\n const callMapping: { tokenAddress: string; userAddress: string }[] = [];\n\n tokenAddresses.forEach((tokenAddress) => {\n userAddresses.forEach((userAddress) => {\n const contract = new Contract(\n tokenAddress,\n ERC20_BALANCE_OF_ABI,\n provider,\n );\n erc20Calls.push({\n contract,\n functionSignature: BALANCE_OF_FUNCTION,\n arguments: [userAddress],\n });\n callMapping.push({ tokenAddress, userAddress });\n });\n });\n\n const erc20Results = await fallback(erc20Calls, maxCallsParallel);\n erc20Results.forEach((result, index) => {\n if (result.success) {\n const { tokenAddress, userAddress } = callMapping[index];\n if (!balanceMap[tokenAddress]) {\n balanceMap[tokenAddress] = {};\n }\n balanceMap[tokenAddress][userAddress] = result.value as BN;\n }\n });\n }\n\n // Handle native token balances using the native fallback function\n if (includeNative) {\n const nativeBalances = await getNativeBalancesFallback(\n userAddresses,\n provider,\n maxCallsParallel,\n );\n if (Object.keys(nativeBalances).length > 0) {\n balanceMap[ZERO_ADDRESS] = nativeBalances;\n }\n }\n\n return balanceMap;\n};\n\n/**\n * Fallback function to get staked balances using individual calls\n * when Multicall3 is not supported or when aggregate3 calls fail.\n *\n * @param userAddresses - Array of user addresses to check staked balances for\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @param maxCallsParallel - Maximum number of parallel calls (default: 20)\n * @returns Promise resolving to map of user address to staked balance\n */\nconst getStakedBalancesFallback = async (\n userAddresses: string[],\n chainId: Hex,\n provider: Web3Provider,\n maxCallsParallel: number,\n): Promise<Record<string, BN>> => {\n const stakedBalanceMap: Record<string, BN> = {};\n\n const stakingContractAddress =\n STAKING_CONTRACT_ADDRESS_BY_CHAINID[\n chainId as keyof typeof STAKING_CONTRACT_ADDRESS_BY_CHAINID\n ];\n\n if (!stakingContractAddress) {\n // No staking support for this chain\n return stakedBalanceMap;\n }\n\n const stakingCalls: Call[] = [];\n const callMapping: { userAddress: string }[] = [];\n\n userAddresses.forEach((userAddress) => {\n const contract = new Contract(\n stakingContractAddress,\n STAKING_CONTRACT_ABI,\n provider,\n );\n stakingCalls.push({\n contract,\n functionSignature: GET_SHARES_FUNCTION,\n arguments: [userAddress],\n });\n callMapping.push({ userAddress });\n });\n\n const stakingResults = await fallback(stakingCalls, maxCallsParallel);\n stakingResults.forEach((result, index) => {\n if (result.success) {\n const { userAddress } = callMapping[index];\n stakedBalanceMap[userAddress] = result.value as BN;\n }\n });\n\n return stakedBalanceMap;\n};\n\n/**\n * Get staked balances for multiple addresses using two-step process:\n * 1. Get shares for all addresses\n * 2. Convert non-zero shares to assets\n *\n * @param userAddresses - Array of user addresses to check\n * @param chainId - Chain ID as hex string\n * @param provider - Ethers provider\n * @returns Promise resolving to map of user address to staked balance\n */\nexport const getStakedBalancesForAddresses = async (\n userAddresses: string[],\n chainId: Hex,\n provider: Web3Provider,\n): Promise<Record<string, BN>> => {\n const stakingContractAddress =\n STAKING_CONTRACT_ADDRESS_BY_CHAINID[\n chainId as keyof typeof STAKING_CONTRACT_ADDRESS_BY_CHAINID\n ];\n\n if (!stakingContractAddress) {\n return {};\n }\n\n const stakingContract = new Contract(\n stakingContractAddress,\n STAKING_CONTRACT_ABI,\n provider,\n );\n\n try {\n // Step 1: Get shares for all addresses\n const shareCalls: Aggregate3Call[] = userAddresses.map((userAddress) => ({\n target: stakingContractAddress,\n allowFailure: true,\n callData: stakingContract.interface.encodeFunctionData(\n GET_SHARES_FUNCTION,\n [userAddress],\n ),\n }));\n\n const shareResults = await aggregate3(shareCalls, chainId, provider);\n\n // Step 2: For addresses with non-zero shares, convert to assets\n const nonZeroSharesData: { address: string; shares: BN }[] = [];\n shareResults.forEach((result, index) => {\n if (result.success) {\n const sharesRaw = stakingContract.interface.decodeFunctionResult(\n GET_SHARES_FUNCTION,\n result.returnData,\n )[0];\n const shares = new BN(sharesRaw.toString());\n\n if (shares.gt(new BN(0))) {\n nonZeroSharesData.push({\n address: userAddresses[index],\n shares,\n });\n }\n }\n });\n\n if (nonZeroSharesData.length === 0) {\n return {};\n }\n\n // Step 3: Convert shares to assets for addresses with non-zero shares\n const assetCalls: Aggregate3Call[] = nonZeroSharesData.map(\n ({ shares }) => ({\n target: stakingContractAddress,\n allowFailure: true,\n callData: stakingContract.interface.encodeFunctionData(\n CONVERT_TO_ASSETS_FUNCTION,\n [shares.toString()],\n ),\n }),\n );\n\n const assetResults = await aggregate3(assetCalls, chainId, provider);\n\n // Step 4: Build final result mapping\n const result: Record<string, BN> = {};\n assetResults.forEach((assetResult, index) => {\n if (assetResult.success) {\n const assetsRaw = stakingContract.interface.decodeFunctionResult(\n CONVERT_TO_ASSETS_FUNCTION,\n assetResult.returnData,\n )[0];\n const assets = new BN(assetsRaw.toString());\n\n const { address } = nonZeroSharesData[index];\n result[address] = assets;\n }\n });\n\n return result;\n } catch (error) {\n console.error('Error fetching staked balances:', error);\n return {};\n }\n};\n\n/**\n * Get token balances (both ERC20 and native) for multiple addresses using aggregate3.\n * This is more efficient than individual balanceOf calls for multiple addresses and tokens.\n * Native token balances are mapped to the zero address (0x0000000000000000000000000000000000000000).\n *\n * @param accountTokenGroups - Array of objects containing account addresses and their associated token addresses\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @param includeNative - Whether to include native token balances (default: true)\n * @param includeStaked - Whether to include staked balances from supported staking contracts (default: false)\n * @returns Promise resolving to object containing tokenBalances map and optional stakedBalances map\n */\nexport const getTokenBalancesForMultipleAddresses = async (\n accountTokenGroups: { accountAddress: Hex; tokenAddresses: Hex[] }[],\n chainId: Hex,\n provider: Web3Provider,\n includeNative: boolean,\n includeStaked: boolean,\n): Promise<{\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n}> => {\n // Return early if no groups provided\n if (accountTokenGroups.length === 0 && !includeNative && !includeStaked) {\n return { tokenBalances: {} };\n }\n\n // Extract unique token addresses and user addresses from groups\n const uniqueTokenAddresses = Array.from(\n new Set(accountTokenGroups.flatMap((group) => group.tokenAddresses)),\n ).filter((tokenAddress) => tokenAddress !== ZERO_ADDRESS); // Exclude native token from ERC20 calls\n\n const uniqueUserAddresses = Array.from(\n new Set(accountTokenGroups.map((group) => group.accountAddress)),\n );\n\n // Check if Multicall3 is supported on this chain\n if (\n !MULTICALL_CONTRACT_BY_CHAINID[\n chainId as keyof typeof MULTICALL_CONTRACT_BY_CHAINID\n ]\n ) {\n // Fallback to individual balance calls when Multicall3 is not supported\n const tokenBalances = await getTokenBalancesFallback(\n uniqueTokenAddresses,\n uniqueUserAddresses,\n provider,\n includeNative,\n 20,\n );\n\n const result: {\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n } = { tokenBalances };\n\n // Handle staked balances fallback if requested\n if (includeStaked) {\n const stakedBalances = await getStakedBalancesFallback(\n uniqueUserAddresses,\n chainId,\n provider,\n 20,\n );\n\n if (Object.keys(stakedBalances).length > 0) {\n result.stakedBalances = stakedBalances;\n }\n }\n\n return result;\n }\n\n try {\n // Create calls directly from pairs\n const allCalls: Aggregate3Call[] = [];\n const allCallMapping: {\n tokenAddress: string;\n userAddress: string;\n callType: 'erc20' | 'native' | 'staking';\n }[] = [];\n\n // Create a temporary ERC20 contract for encoding\n const tempERC20Contract = new Contract(\n ZERO_ADDRESS,\n ERC20_BALANCE_OF_ABI,\n provider,\n );\n\n // Create ERC20 balance calls for all account-token combinations\n accountTokenGroups.forEach((group) => {\n group.tokenAddresses\n .filter((tokenAddress) => tokenAddress !== ZERO_ADDRESS)\n .forEach((tokenAddress) => {\n allCalls.push({\n target: tokenAddress,\n allowFailure: true,\n callData: tempERC20Contract.interface.encodeFunctionData(\n BALANCE_OF_FUNCTION,\n [group.accountAddress],\n ),\n });\n allCallMapping.push({\n tokenAddress,\n userAddress: group.accountAddress,\n callType: 'erc20',\n });\n });\n });\n\n // Add native token balance calls if requested\n if (includeNative) {\n const multicall3Address = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n const multicall3TempContract = new Contract(\n multicall3Address,\n MULTICALL3_GET_ETH_BALANCE_ABI,\n provider,\n );\n\n uniqueUserAddresses.forEach((userAddress) => {\n allCalls.push({\n target: multicall3Address,\n allowFailure: true,\n callData: multicall3TempContract.interface.encodeFunctionData(\n GET_ETH_BALANCE_FUNCTION,\n [userAddress],\n ),\n });\n allCallMapping.push({\n tokenAddress: ZERO_ADDRESS,\n userAddress,\n callType: 'native',\n });\n });\n }\n\n // Note: Staking balances will be handled separately in two steps after token/native calls\n\n // Execute all calls in batches\n const maxCallsPerBatch = 300; // Limit calls per batch to avoid gas/size limits\n const allResults: Aggregate3Result[] = [];\n\n await reduceInBatchesSerially<Aggregate3Call, void>({\n values: allCalls,\n batchSize: maxCallsPerBatch,\n initialResult: undefined,\n eachBatch: async (_, batch) => {\n const batchResults = await aggregate3(batch, chainId, provider);\n allResults.push(...batchResults);\n },\n });\n\n // Handle staking balances in two steps if requested\n let stakedBalances: Record<string, BN> = {};\n if (includeStaked) {\n stakedBalances = await getStakedBalancesForAddresses(\n uniqueUserAddresses,\n chainId,\n provider,\n );\n }\n\n // Process and return results\n const result = processBalanceResults(\n allResults,\n allCallMapping,\n chainId,\n provider,\n false, // Don't include staked from main processing\n );\n\n // Add staked balances to result\n if (includeStaked && Object.keys(stakedBalances).length > 0) {\n result.stakedBalances = stakedBalances;\n }\n\n return result;\n } catch (error) {\n // Fallback only on revert\n // https://docs.ethers.org/v5/troubleshooting/errors/#help-CALL_EXCEPTION\n if (\n !error ||\n typeof error !== 'object' ||\n !('code' in error) ||\n error.code !== 'CALL_EXCEPTION'\n ) {\n throw error;\n }\n\n // Fallback to individual balance calls when aggregate3 fails\n const tokenBalances = await getTokenBalancesFallback(\n uniqueTokenAddresses,\n uniqueUserAddresses,\n provider,\n includeNative,\n 20,\n );\n\n const result: {\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n } = { tokenBalances };\n\n // Handle staked balances fallback if requested\n if (includeStaked) {\n const stakedBalances = await getStakedBalancesFallback(\n uniqueUserAddresses,\n chainId,\n provider,\n 20,\n );\n\n if (Object.keys(stakedBalances).length > 0) {\n result.stakedBalances = stakedBalances;\n }\n }\n\n return result;\n }\n};\n"]}
|
|
1
|
+
{"version":3,"file":"multicall.cjs","sourceRoot":"","sources":["../src/multicall.ts"],"names":[],"mappings":"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","sourcesContent":["import { Contract } from '@ethersproject/contracts';\nimport type { Web3Provider } from '@ethersproject/providers';\nimport type { Hex } from '@metamask/utils';\nimport BN from 'bn.js';\n\nimport { STAKING_CONTRACT_ADDRESS_BY_CHAINID } from './AssetsContractController';\nimport { reduceInBatchesSerially } from './assetsUtil';\n\n// https://github.com/mds1/multicall/blob/main/deployments.json\nconst MULTICALL_CONTRACT_BY_CHAINID = {\n '0x1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xaa36a7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4268': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5e9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b6e6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x18fc4a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x45': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1a4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xaa37dc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa4b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa4ba': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x66eed': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x66eee': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x66eeb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15f2249': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x89': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13881': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13882': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x44d': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x5a2': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x98a': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x64': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x27d8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa86a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa869': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfa2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfa': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfaf0': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x38': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x61': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15eb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xcc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x504': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x505': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x507': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2a15c308d': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x2a15c3083': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x63564c40': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x19': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x152': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5535072': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6c1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x10': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x72': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x120': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4e454152': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x250': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5c2359': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xec0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x42': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x80': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x440': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x257': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe9fe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xd3a0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x84444': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2329': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2328': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x12': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa516': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5afe': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa4ec': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xaef3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x116ea': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x116e9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2019': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3e9': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x7d1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x141': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4d2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1e14': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1e15': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1251': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7f08': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8ae': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x138b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1389': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1388': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f92': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x14a33': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x14a34': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2105': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x936': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xff': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x46a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x46b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x14f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xd2af': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe9ac0ce': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe705': '0xca11bde05977b3631167028862be2a173976ca11',\n '0xe704': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe708': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2b6f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x39': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x23a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1644': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xdea8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3af': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x171': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3e7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x76adf1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3b9ac9ff': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2c': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x2e': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x15b3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x82751': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8274f': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x82750': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x96f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3cc5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4571': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe99': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7d0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1297': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1d5e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3a14269b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x561bf78b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x235ddd0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3cd156dc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5d456c62': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x79f99296': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x585eb4b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x507aaa2a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1fc3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x32d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a73': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a72': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x8a71': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xe9ac0d6': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1069': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7e5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x53': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x52': '0xca11bde05977b3631167028862be2a173976ca11',\n '0xe298': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1a8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x94': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2c6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2803': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2802': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c5f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c60': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13a': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4cb2f': '0xdbfa261cd7d17bb40479a0493ad6c0fee435859e',\n '0x7f93': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xb660': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xb02113d3f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xdad': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xdae': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15b38': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15b32': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x45c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x45b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x41a6ace': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa729': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f47b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b59': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1b58': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xc3': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x16fd8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xc7': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x405': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x334': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1ce': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1cf': '0xca11bde05977b3631167028862be2a173976ca11',\n '0xa70e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x868b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa0c71fd': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13e31': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa1337': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f2b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xf63': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x144': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x118': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x12c': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x18995f': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0x2b74': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n '0xfc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x9da': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x137': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x13ed': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x24b1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xba9302': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x7c8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x138d5': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6d': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x343b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x34a1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x3109': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x91b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa96': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x22c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2be3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xbf03': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b254': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa7b14': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2276': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1b9e': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x6a63bb8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15af3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x15af1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xae3f3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x531': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c61': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x28c58': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1d88': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x5b9b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4c7e1': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xa53b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1a2b': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x406': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x2cef': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x18b2': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x182a9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xc4': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfdd': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xfde': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x99c0a0f': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x22cf': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x310c5': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x46f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x659': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x139c968f9': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xed88': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0xd036': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1f3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x31bf8c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x1cbc67bfdc': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x98967f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x4f588': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x16db': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x3a': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x59': '0xca11bde05977b3631167028862be2a173976ca11',\n '0x1e0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x2eb': '0xcA11bde05977b3631167028862bE2a173976CA11',\n '0x221': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Injective, contract found but not in multicall3 repo\n '0x6f0': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Hemi, contract found but not in multicall3 repo\n '0xa867': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Plasma, contract found but not in multicall3 repo\n '0x2611': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Nonmia, contract found but not in multicall3 repo\n '0xa6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // XRPL, contract found but not in multicall3 repo\n '0x15f900': '0x6B5eFbC0C82eBb26CA13a4F11836f36Fc6fdBC5D',\n // Soneium, contract found but not in multicall3 repo\n '0x74c': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Genesys, contract found but not in multicall3 repo\n '0x407b': '0x90a2377F233E3461BACa6080d4837837d8762927',\n // EDU (Animoca)\n '0xa3c3': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Abstract\n '0xab5': '0xF9cda624FBC7e059355ce98a31693d299FACd963',\n // Berachain, contract found but not in multicall3 repo\n '0x138de': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // MegaETH TESTNET\n '0x18c6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Apechain\n '0x8173': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Matchain, contract found but not in multicall3 repo\n '0x2ba': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Monad TESTNET\n '0x279f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Katana\n '0xb67d2': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Lens, contract found but not in multicall3 repo\n '0xe8': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Plume\n '0x18232': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // Monad Mainnet\n '0x8f': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // XDC, contract found but not in multicall3 repo\n '0x32': '0x0B1795ccA8E4eC4df02346a082df54D437F8D9aF',\n // MegaETH TESTNET v2 (timothy chain ID 6343)\n '0x18c7': '0xcA11bde05977b3631167028862bE2a173976CA11',\n // MegaETH mainnet, contract found matching multicall3 bytecode\n '0x10e6': '0xcA11bde05977b3631167028862bE2a173976CA11',\n} as Record<Hex, Hex>;\n\nconst multicallAbi = [\n {\n name: 'tryAggregate',\n type: 'function',\n stateMutability: 'payable',\n inputs: [\n { name: 'requireSuccess', type: 'bool' },\n {\n name: 'calls',\n type: 'tuple[]',\n components: [\n { name: 'target', type: 'address' },\n { name: 'callData', type: 'bytes' },\n ],\n },\n ],\n outputs: [\n {\n name: 'returnData',\n type: 'tuple[]',\n components: [\n { name: 'success', type: 'bool' },\n { name: 'returnData', type: 'bytes' },\n ],\n },\n ],\n },\n];\n\n// Multicall3 ABI for aggregate3 function\nconst multicall3Abi = [\n {\n name: 'aggregate3',\n type: 'function',\n stateMutability: 'payable',\n inputs: [\n {\n name: 'calls',\n type: 'tuple[]',\n components: [\n { name: 'target', type: 'address' },\n { name: 'allowFailure', type: 'bool' },\n { name: 'callData', type: 'bytes' },\n ],\n },\n ],\n outputs: [\n {\n name: 'returnData',\n type: 'tuple[]',\n components: [\n { name: 'success', type: 'bool' },\n { name: 'returnData', type: 'bytes' },\n ],\n },\n ],\n },\n];\n\nexport type Call = {\n contract: Contract;\n functionSignature: string;\n arguments: unknown[];\n};\n\nexport type MulticallResult = { success: boolean; value: unknown };\n\nexport type Aggregate3Call = {\n target: string;\n allowFailure: boolean;\n callData: string;\n};\n\nexport type Aggregate3Result = {\n success: boolean;\n returnData: string;\n};\n\n// Constants for encoded strings and addresses\nconst ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\nconst BALANCE_OF_FUNCTION = 'balanceOf(address)';\nconst GET_ETH_BALANCE_FUNCTION = 'getEthBalance';\nconst GET_SHARES_FUNCTION = 'getShares';\nconst CONVERT_TO_ASSETS_FUNCTION = 'convertToAssets';\n\n// ERC20 balanceOf ABI\nconst ERC20_BALANCE_OF_ABI = [\n {\n name: 'balanceOf',\n type: 'function',\n inputs: [{ name: 'account', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }],\n stateMutability: 'view',\n },\n];\n\n// Multicall3 getEthBalance ABI\nconst MULTICALL3_GET_ETH_BALANCE_ABI = [\n {\n name: 'getEthBalance',\n type: 'function',\n inputs: [{ name: 'addr', type: 'address' }],\n outputs: [{ name: 'balance', type: 'uint256' }],\n stateMutability: 'view',\n },\n];\n\n// Staking contract ABI with both getShares and convertToAssets\nconst STAKING_CONTRACT_ABI = [\n {\n inputs: [{ internalType: 'address', name: 'account', type: 'address' }],\n name: 'getShares',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'shares', type: 'uint256' }],\n name: 'convertToAssets',\n outputs: [{ internalType: 'uint256', name: 'assets', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n];\n\nconst multicall = async (\n calls: Call[],\n multicallAddress: Hex,\n provider: Web3Provider,\n maxCallsPerMulticall: number,\n): Promise<MulticallResult[]> => {\n const multicallContract = new Contract(\n multicallAddress,\n multicallAbi,\n provider,\n );\n\n return await reduceInBatchesSerially<Call, MulticallResult[]>({\n values: calls,\n batchSize: maxCallsPerMulticall,\n initialResult: [],\n eachBatch: async (workingResult, batch) => {\n const calldata = batch.map((call) => ({\n target: call.contract.address,\n callData: call.contract.interface.encodeFunctionData(\n call.contract.interface.functions[call.functionSignature],\n call.arguments,\n ),\n }));\n\n const results = await multicallContract.callStatic.tryAggregate(\n false,\n calldata,\n );\n\n return [\n ...workingResult,\n ...results.map(\n (r: { success: boolean; returnData: string }, i: number) => ({\n success: r.success,\n value: r.success\n ? batch[i].contract.interface.decodeFunctionResult(\n batch[i].functionSignature,\n r.returnData,\n )[0]\n : undefined,\n }),\n ),\n ];\n },\n });\n};\n\nconst fallback = async (\n calls: Call[],\n maxCallsParallel: number,\n): Promise<MulticallResult[]> => {\n return await reduceInBatchesSerially<Call, MulticallResult[]>({\n values: calls,\n batchSize: maxCallsParallel,\n initialResult: [],\n eachBatch: async (workingResult, batch) => {\n const results = await Promise.allSettled(\n batch.map((call) =>\n call.contract[call.functionSignature](...call.arguments),\n ),\n );\n return [\n ...workingResult,\n ...results.map((p) => ({\n success: p.status === 'fulfilled',\n value: p.status === 'fulfilled' ? p.value : undefined,\n })),\n ];\n },\n });\n};\n\n/**\n * Executes an array of contract calls. If the chain supports multicalls,\n * the calls will be executed in single RPC requests (up to maxCallsPerMulticall).\n * Otherwise the calls will be executed separately in parallel (up to maxCallsParallel).\n *\n * @param calls - An array of contract calls to execute.\n * @param chainId - The hexadecimal chain id.\n * @param provider - An ethers rpc provider.\n * @param maxCallsPerMulticall - If multicall is supported, the maximum number of calls to exeute in each multicall.\n * @param maxCallsParallel - If multicall is not supported, the maximum number of calls to execute in parallel.\n * @returns An array of results, with a success boolean and value for each call.\n */\nexport const multicallOrFallback = async (\n calls: Call[],\n chainId: Hex,\n provider: Web3Provider,\n maxCallsPerMulticall = 300,\n maxCallsParallel = 20,\n): Promise<MulticallResult[]> => {\n if (calls.length === 0) {\n return [];\n }\n\n const multicallAddress = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n if (multicallAddress) {\n try {\n return await multicall(\n calls,\n multicallAddress,\n provider,\n maxCallsPerMulticall,\n );\n } catch (error: unknown) {\n // Fallback only on revert\n // https://docs.ethers.org/v5/troubleshooting/errors/#help-CALL_EXCEPTION\n if (\n !error ||\n typeof error !== 'object' ||\n !('code' in error) ||\n error.code !== 'CALL_EXCEPTION'\n ) {\n throw error;\n }\n }\n }\n\n return await fallback(calls, maxCallsParallel);\n};\n\n/**\n * Execute multiple contract calls using Multicall3's aggregate3 function.\n * This allows for more efficient batch calls with individual failure handling.\n *\n * @param calls - Array of calls to execute via aggregate3\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @returns Promise resolving to array of results from aggregate3\n */\nexport const aggregate3 = async (\n calls: Aggregate3Call[],\n chainId: Hex,\n provider: Web3Provider,\n): Promise<Aggregate3Result[]> => {\n if (calls.length === 0) {\n return [];\n }\n\n const multicall3Address = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n const multicall3Contract = new Contract(\n multicall3Address,\n multicall3Abi,\n provider,\n );\n\n return await multicall3Contract.callStatic.aggregate3(calls);\n};\n\n/**\n * Processes and decodes balance results from aggregate3 calls\n *\n * @param results - Array of results from aggregate3 calls\n * @param callMapping - Array mapping call indices to token and user addresses\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @param includeStaked - Whether to include staked balances\n * @returns Map of token address to map of user address to balance\n */\nconst processBalanceResults = (\n results: Aggregate3Result[],\n callMapping: {\n tokenAddress: string;\n userAddress: string;\n callType: 'erc20' | 'native' | 'staking';\n }[],\n chainId: Hex,\n provider: Web3Provider,\n includeStaked: boolean,\n): {\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n} => {\n const balanceMap: Record<string, Record<string, BN>> = {};\n const stakedBalanceMap: Record<string, BN> = {};\n\n // Create contract instances for decoding\n const erc20Contract = new Contract(\n ZERO_ADDRESS,\n ERC20_BALANCE_OF_ABI,\n provider,\n );\n\n const multicall3Address = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n const multicall3Contract = new Contract(\n multicall3Address,\n MULTICALL3_GET_ETH_BALANCE_ABI,\n provider,\n );\n\n // Staking contracts are now handled separately in two-step process\n\n results.forEach((result, index) => {\n if (result.success) {\n const { tokenAddress, userAddress, callType } = callMapping[index];\n if (callType === 'native') {\n // For native token, decode the getEthBalance result\n const balanceRaw = multicall3Contract.interface.decodeFunctionResult(\n GET_ETH_BALANCE_FUNCTION,\n result.returnData,\n )[0];\n\n if (!balanceMap[tokenAddress]) {\n balanceMap[tokenAddress] = {};\n }\n balanceMap[tokenAddress][userAddress] = new BN(balanceRaw.toString());\n } else if (callType === 'staking') {\n // Staking is now handled separately in two-step process\n // This case should not occur anymore\n console.warn(\n 'Staking callType found in main processing - this should not happen',\n );\n } else {\n // For ERC20 tokens, decode the balanceOf result\n const balanceRaw = erc20Contract.interface.decodeFunctionResult(\n BALANCE_OF_FUNCTION,\n result.returnData,\n )[0];\n\n if (!balanceMap[tokenAddress]) {\n balanceMap[tokenAddress] = {};\n }\n balanceMap[tokenAddress][userAddress] = new BN(balanceRaw.toString());\n }\n }\n });\n\n const result: {\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n } = { tokenBalances: balanceMap };\n\n if (includeStaked && Object.keys(stakedBalanceMap).length > 0) {\n result.stakedBalances = stakedBalanceMap;\n }\n\n return result;\n};\n\n/**\n * Fallback function to get native token balances using individual eth_getBalance calls\n * when Multicall3 is not supported on the chain.\n *\n * @param userAddresses - Array of user addresses to check balances for\n * @param provider - An ethers rpc provider\n * @param maxCallsParallel - Maximum number of parallel calls (default: 20)\n * @returns Promise resolving to map of user address to balance\n */\nconst getNativeBalancesFallback = async (\n userAddresses: string[],\n provider: Web3Provider,\n maxCallsParallel = 20,\n): Promise<Record<string, BN>> => {\n const balanceMap: Record<string, BN> = {};\n\n await reduceInBatchesSerially<string, void>({\n values: userAddresses,\n batchSize: maxCallsParallel,\n initialResult: undefined,\n eachBatch: async (_, batch) => {\n const results = await Promise.allSettled(\n batch.map(async (userAddress) => {\n const balance = await provider.getBalance(userAddress);\n return {\n success: true,\n balance: new BN(balance.toString()),\n userAddress,\n };\n }),\n );\n\n results.forEach((result) => {\n if (\n result.status === 'fulfilled' &&\n result.value.success &&\n result.value.balance !== null\n ) {\n balanceMap[result.value.userAddress] = result.value.balance;\n }\n });\n },\n });\n\n return balanceMap;\n};\n\n/**\n * Fallback function to get token balances using individual calls\n * when Multicall3 is not supported or when aggregate3 calls fail.\n *\n * @param tokenAddresses - Array of ERC20 token contract addresses\n * @param userAddresses - Array of user addresses to check balances for\n * @param provider - An ethers rpc provider\n * @param includeNative - Whether to include native token balances (default: true)\n * @param maxCallsParallel - Maximum number of parallel calls (default: 20)\n * @returns Promise resolving to map of token address to map of user address to balance\n */\nconst getTokenBalancesFallback = async (\n tokenAddresses: string[],\n userAddresses: string[],\n provider: Web3Provider,\n includeNative: boolean,\n maxCallsParallel: number,\n): Promise<Record<string, Record<string, BN>>> => {\n const balanceMap: Record<string, Record<string, BN>> = {};\n\n // Handle ERC20 token balances using the existing fallback function\n if (tokenAddresses.length > 0) {\n const erc20Calls: Call[] = [];\n const callMapping: { tokenAddress: string; userAddress: string }[] = [];\n\n tokenAddresses.forEach((tokenAddress) => {\n userAddresses.forEach((userAddress) => {\n const contract = new Contract(\n tokenAddress,\n ERC20_BALANCE_OF_ABI,\n provider,\n );\n erc20Calls.push({\n contract,\n functionSignature: BALANCE_OF_FUNCTION,\n arguments: [userAddress],\n });\n callMapping.push({ tokenAddress, userAddress });\n });\n });\n\n const erc20Results = await fallback(erc20Calls, maxCallsParallel);\n erc20Results.forEach((result, index) => {\n if (result.success) {\n const { tokenAddress, userAddress } = callMapping[index];\n if (!balanceMap[tokenAddress]) {\n balanceMap[tokenAddress] = {};\n }\n balanceMap[tokenAddress][userAddress] = result.value as BN;\n }\n });\n }\n\n // Handle native token balances using the native fallback function\n if (includeNative) {\n const nativeBalances = await getNativeBalancesFallback(\n userAddresses,\n provider,\n maxCallsParallel,\n );\n if (Object.keys(nativeBalances).length > 0) {\n balanceMap[ZERO_ADDRESS] = nativeBalances;\n }\n }\n\n return balanceMap;\n};\n\n/**\n * Fallback function to get staked balances using individual calls\n * when Multicall3 is not supported or when aggregate3 calls fail.\n *\n * @param userAddresses - Array of user addresses to check staked balances for\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @param maxCallsParallel - Maximum number of parallel calls (default: 20)\n * @returns Promise resolving to map of user address to staked balance\n */\nconst getStakedBalancesFallback = async (\n userAddresses: string[],\n chainId: Hex,\n provider: Web3Provider,\n maxCallsParallel: number,\n): Promise<Record<string, BN>> => {\n const stakedBalanceMap: Record<string, BN> = {};\n\n const stakingContractAddress = STAKING_CONTRACT_ADDRESS_BY_CHAINID[chainId];\n\n if (!stakingContractAddress) {\n // No staking support for this chain\n return stakedBalanceMap;\n }\n\n const stakingCalls: Call[] = [];\n const callMapping: { userAddress: string }[] = [];\n\n userAddresses.forEach((userAddress) => {\n const contract = new Contract(\n stakingContractAddress,\n STAKING_CONTRACT_ABI,\n provider,\n );\n stakingCalls.push({\n contract,\n functionSignature: GET_SHARES_FUNCTION,\n arguments: [userAddress],\n });\n callMapping.push({ userAddress });\n });\n\n const stakingResults = await fallback(stakingCalls, maxCallsParallel);\n stakingResults.forEach((result, index) => {\n if (result.success) {\n const { userAddress } = callMapping[index];\n stakedBalanceMap[userAddress] = result.value as BN;\n }\n });\n\n return stakedBalanceMap;\n};\n\n/**\n * Get staked balances for multiple addresses using two-step process:\n * 1. Get shares for all addresses\n * 2. Convert non-zero shares to assets\n *\n * @param userAddresses - Array of user addresses to check\n * @param chainId - Chain ID as hex string\n * @param provider - Ethers provider\n * @returns Promise resolving to map of user address to staked balance\n */\nexport const getStakedBalancesForAddresses = async (\n userAddresses: string[],\n chainId: Hex,\n provider: Web3Provider,\n): Promise<Record<string, BN>> => {\n const stakingContractAddress = STAKING_CONTRACT_ADDRESS_BY_CHAINID[chainId];\n\n if (!stakingContractAddress) {\n return {};\n }\n\n const stakingContract = new Contract(\n stakingContractAddress,\n STAKING_CONTRACT_ABI,\n provider,\n );\n\n try {\n // Step 1: Get shares for all addresses\n const shareCalls: Aggregate3Call[] = userAddresses.map((userAddress) => ({\n target: stakingContractAddress,\n allowFailure: true,\n callData: stakingContract.interface.encodeFunctionData(\n GET_SHARES_FUNCTION,\n [userAddress],\n ),\n }));\n\n const shareResults = await aggregate3(shareCalls, chainId, provider);\n\n // Step 2: For addresses with non-zero shares, convert to assets\n const nonZeroSharesData: { address: string; shares: BN }[] = [];\n shareResults.forEach((result, index) => {\n if (result.success) {\n const sharesRaw = stakingContract.interface.decodeFunctionResult(\n GET_SHARES_FUNCTION,\n result.returnData,\n )[0];\n const shares = new BN(sharesRaw.toString());\n\n if (shares.gt(new BN(0))) {\n nonZeroSharesData.push({\n address: userAddresses[index],\n shares,\n });\n }\n }\n });\n\n if (nonZeroSharesData.length === 0) {\n return {};\n }\n\n // Step 3: Convert shares to assets for addresses with non-zero shares\n const assetCalls: Aggregate3Call[] = nonZeroSharesData.map(\n ({ shares }) => ({\n target: stakingContractAddress,\n allowFailure: true,\n callData: stakingContract.interface.encodeFunctionData(\n CONVERT_TO_ASSETS_FUNCTION,\n [shares.toString()],\n ),\n }),\n );\n\n const assetResults = await aggregate3(assetCalls, chainId, provider);\n\n // Step 4: Build final result mapping\n const result: Record<string, BN> = {};\n assetResults.forEach((assetResult, index) => {\n if (assetResult.success) {\n const assetsRaw = stakingContract.interface.decodeFunctionResult(\n CONVERT_TO_ASSETS_FUNCTION,\n assetResult.returnData,\n )[0];\n const assets = new BN(assetsRaw.toString());\n\n const { address } = nonZeroSharesData[index];\n result[address] = assets;\n }\n });\n\n return result;\n } catch (error) {\n console.error('Error fetching staked balances:', error);\n return {};\n }\n};\n\n/**\n * Get token balances (both ERC20 and native) for multiple addresses using aggregate3.\n * This is more efficient than individual balanceOf calls for multiple addresses and tokens.\n * Native token balances are mapped to the zero address (0x0000000000000000000000000000000000000000).\n *\n * @param accountTokenGroups - Array of objects containing account addresses and their associated token addresses\n * @param chainId - The hexadecimal chain id\n * @param provider - An ethers rpc provider\n * @param includeNative - Whether to include native token balances (default: true)\n * @param includeStaked - Whether to include staked balances from supported staking contracts (default: false)\n * @returns Promise resolving to object containing tokenBalances map and optional stakedBalances map\n */\nexport const getTokenBalancesForMultipleAddresses = async (\n accountTokenGroups: { accountAddress: Hex; tokenAddresses: Hex[] }[],\n chainId: Hex,\n provider: Web3Provider,\n includeNative: boolean,\n includeStaked: boolean,\n): Promise<{\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n}> => {\n // Return early if no groups provided\n if (accountTokenGroups.length === 0 && !includeNative && !includeStaked) {\n return { tokenBalances: {} };\n }\n\n // Extract unique token addresses and user addresses from groups\n const uniqueTokenAddresses = Array.from(\n new Set(accountTokenGroups.flatMap((group) => group.tokenAddresses)),\n ).filter((tokenAddress) => tokenAddress !== ZERO_ADDRESS); // Exclude native token from ERC20 calls\n\n const uniqueUserAddresses = Array.from(\n new Set(accountTokenGroups.map((group) => group.accountAddress)),\n );\n\n // Check if Multicall3 is supported on this chain\n if (!MULTICALL_CONTRACT_BY_CHAINID[chainId]) {\n // Fallback to individual balance calls when Multicall3 is not supported\n const tokenBalances = await getTokenBalancesFallback(\n uniqueTokenAddresses,\n uniqueUserAddresses,\n provider,\n includeNative,\n 20,\n );\n\n const result: {\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n } = { tokenBalances };\n\n // Handle staked balances fallback if requested\n if (includeStaked) {\n const stakedBalances = await getStakedBalancesFallback(\n uniqueUserAddresses,\n chainId,\n provider,\n 20,\n );\n\n if (Object.keys(stakedBalances).length > 0) {\n result.stakedBalances = stakedBalances;\n }\n }\n\n return result;\n }\n\n try {\n // Create calls directly from pairs\n const allCalls: Aggregate3Call[] = [];\n const allCallMapping: {\n tokenAddress: string;\n userAddress: string;\n callType: 'erc20' | 'native' | 'staking';\n }[] = [];\n\n // Create a temporary ERC20 contract for encoding\n const tempERC20Contract = new Contract(\n ZERO_ADDRESS,\n ERC20_BALANCE_OF_ABI,\n provider,\n );\n\n // Create ERC20 balance calls for all account-token combinations\n accountTokenGroups.forEach((group) => {\n group.tokenAddresses\n .filter((tokenAddress) => tokenAddress !== ZERO_ADDRESS)\n .forEach((tokenAddress) => {\n allCalls.push({\n target: tokenAddress,\n allowFailure: true,\n callData: tempERC20Contract.interface.encodeFunctionData(\n BALANCE_OF_FUNCTION,\n [group.accountAddress],\n ),\n });\n allCallMapping.push({\n tokenAddress,\n userAddress: group.accountAddress,\n callType: 'erc20',\n });\n });\n });\n\n // Add native token balance calls if requested\n if (includeNative) {\n const multicall3Address = MULTICALL_CONTRACT_BY_CHAINID[chainId];\n const multicall3TempContract = new Contract(\n multicall3Address,\n MULTICALL3_GET_ETH_BALANCE_ABI,\n provider,\n );\n\n uniqueUserAddresses.forEach((userAddress) => {\n allCalls.push({\n target: multicall3Address,\n allowFailure: true,\n callData: multicall3TempContract.interface.encodeFunctionData(\n GET_ETH_BALANCE_FUNCTION,\n [userAddress],\n ),\n });\n allCallMapping.push({\n tokenAddress: ZERO_ADDRESS,\n userAddress,\n callType: 'native',\n });\n });\n }\n\n // Note: Staking balances will be handled separately in two steps after token/native calls\n\n // Execute all calls in batches\n const maxCallsPerBatch = 300; // Limit calls per batch to avoid gas/size limits\n const allResults: Aggregate3Result[] = [];\n\n await reduceInBatchesSerially<Aggregate3Call, void>({\n values: allCalls,\n batchSize: maxCallsPerBatch,\n initialResult: undefined,\n eachBatch: async (_, batch) => {\n const batchResults = await aggregate3(batch, chainId, provider);\n allResults.push(...batchResults);\n },\n });\n\n // Handle staking balances in two steps if requested\n let stakedBalances: Record<string, BN> = {};\n if (includeStaked) {\n stakedBalances = await getStakedBalancesForAddresses(\n uniqueUserAddresses,\n chainId,\n provider,\n );\n }\n\n // Process and return results\n const result = processBalanceResults(\n allResults,\n allCallMapping,\n chainId,\n provider,\n false, // Don't include staked from main processing\n );\n\n // Add staked balances to result\n if (includeStaked && Object.keys(stakedBalances).length > 0) {\n result.stakedBalances = stakedBalances;\n }\n\n return result;\n } catch (error) {\n // Fallback only on revert\n // https://docs.ethers.org/v5/troubleshooting/errors/#help-CALL_EXCEPTION\n if (\n !error ||\n typeof error !== 'object' ||\n !('code' in error) ||\n error.code !== 'CALL_EXCEPTION'\n ) {\n throw error;\n }\n\n // Fallback to individual balance calls when aggregate3 fails\n const tokenBalances = await getTokenBalancesFallback(\n uniqueTokenAddresses,\n uniqueUserAddresses,\n provider,\n includeNative,\n 20,\n );\n\n const result: {\n tokenBalances: Record<string, Record<string, BN>>;\n stakedBalances?: Record<string, BN>;\n } = { tokenBalances };\n\n // Handle staked balances fallback if requested\n if (includeStaked) {\n const stakedBalances = await getStakedBalancesFallback(\n uniqueUserAddresses,\n chainId,\n provider,\n 20,\n );\n\n if (Object.keys(stakedBalances).length > 0) {\n result.stakedBalances = stakedBalances;\n }\n }\n\n return result;\n }\n};\n"]}
|