"use client";
import { useTokenBalances } from "@/lib/hooks/useTokenBalances";
import {
formatUsd,
tokenUsdValue,
useUsdPrices,
} from "@/lib/prices";
import { formatTokenAmount } from "@/lib/tokens";
import { formatAddress } from "@/lib/utils";
import { CHAIN138_ID } from "@/lib/constants/chain138";
interface WalletBalancePanelProps {
address: `0x${string}`;
onDisconnect?: () => void;
}
function BalanceRow({
label,
amount,
usd,
loading,
}: {
label: string;
amount: string;
usd: number | null;
loading?: boolean;
}) {
return (
{label}
{loading ? "Loading…" : amount}
{loading ? "…" : formatUsd(usd)}
);
}
export function WalletBalancePanel({ address, onDisconnect }: WalletBalancePanelProps) {
const { ethUsd, isLoading: pricesLoading } = useUsdPrices();
const {
nativeBalance,
cusdtRaw,
cusdcRaw,
erc20Tokens,
isLoading: balancesLoading,
refetch,
} = useTokenBalances(address);
const loading = balancesLoading || pricesLoading;
const ethRaw = nativeBalance?.value;
const ethUsdVal = tokenUsdValue(ethRaw, 18, "ETH", ethUsd);
const cusdtUsd = tokenUsdValue(cusdtRaw, erc20Tokens[0].decimals, "cUSDT", ethUsd);
const cusdcUsd = tokenUsdValue(cusdcRaw, erc20Tokens[1].decimals, "cUSDC", ethUsd);
const totalUsd =
[ethUsdVal, cusdtUsd, cusdcUsd].reduce((sum, v) => {
if (v == null) return sum;
return (sum ?? 0) + v;
}, null);
return (
Connected wallet
{formatAddress(address)}
Chain {CHAIN138_ID} balances
Estimated total
{loading ? "…" : formatUsd(totalUsd)}
{onDisconnect && (
)}
);
}