UNPKG

@biconomy/abstractjs

Version:

SDK for Biconomy integration with support for account abstraction, smart accounts, ERC-4337.

71 lines 2.68 kB
import { erc20Abi, getContract } from "viem"; /** * Fetches and aggregates ERC20 token balances across multiple chains for a given account * * @param parameters - {@link GetUnifiedERC20BalanceParameters} Configuration for balance fetching * @param parameters.mcToken - The multichain ERC20 token contract * @param parameters.account - The multichain smart account to check balances for * * @returns Promise resolving to {@link UnifiedERC20Balance} containing total balance and per-chain breakdown * * @throws Error if token decimals mismatch across chains * * @example * const balance = await getUnifiedERC20Balance({ * mcToken: mcUSDC, * account: myMultichainAccount * }); * * console.log(`Total balance: ${balance.balance}`); * console.log(`Decimals: ${balance.decimals}`); * balance.breakdown.forEach(chainBalance => { * console.log(`Chain ${chainBalance.chainId}: ${chainBalance.balance}`); * }); */ export async function getUnifiedERC20Balance(parameters) { const { mcToken, account: account_ } = parameters; const relevantTokensByChain = Array.from(mcToken.deployments).filter(([chainId]) => account_.deployments.some((account) => account.client.chain?.id === chainId)); const balances = await Promise.all(relevantTokensByChain.map(async ([chainId, address]) => { const { publicClient, address: accountAddress } = account_.deploymentOn(chainId, true); const tokenContract = getContract({ abi: erc20Abi, address, client: publicClient }); const [balance, decimals] = await Promise.all([ tokenContract.read.balanceOf([accountAddress]), tokenContract.read.decimals() ]); return { balance, decimals, chainId }; })); return { ...balances .map((balance) => { return { balance: balance.balance, decimals: balance.decimals }; }) .reduce((curr, acc) => { if (curr.decimals !== acc.decimals) { throw Error(` Error while trying to fetch a unified ERC20 balance. The addresses provided in the mapping don't have the same number of decimals across all chains. The function can't fetch a unified balance for token mappings with differing decimals. `); } return { balance: curr.balance + acc.balance, decimals: curr.decimals }; }), breakdown: balances, mcToken }; } //# sourceMappingURL=getUnifiedERC20Balance.js.map