import { createPublicClient, http, parseAbi } from 'viem';
import { sei } from 'viem/chains';
const client = createPublicClient({ chain: sei, transport: http() });
const ERC20_ABI = parseAbi([
'function balanceOf(address owner) view returns (uint256)',
'function symbol() view returns (string)',
'function decimals() view returns (uint8)',
]);
const tokens = [
'0xTokenA',
'0xTokenB',
'0xTokenC',
] as const;
const owner = '0xYourAddress';
// Fetch symbol, decimals, and balance for every token in one call
const results = await client.multicall({
contracts: tokens.flatMap((address) => [
{ address, abi: ERC20_ABI, functionName: 'symbol' },
{ address, abi: ERC20_ABI, functionName: 'decimals' },
{ address, abi: ERC20_ABI, functionName: 'balanceOf', args: [owner] },
]),
});
// Results are returned in the same order as the input contracts array
// Each result has { status: 'success' | 'failure', result, error }
tokens.forEach((address, i) => {
const symbol = results[i * 3];
const decimals = results[i * 3 + 1];
const balance = results[i * 3 + 2];
if (symbol.status === 'success' && balance.status === 'success') {
console.log(`${address}: ${balance.result} (${symbol.result})`);
}
});