@biconomy/abstractjs
Version:
SDK for Biconomy integration with support for account abstraction, smart accounts, ERC-4337.
71 lines • 2.68 kB
JavaScript
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