import { useReadContract } from 'wagmi' /** 最小 ERC20 decimals ABI,无需引入完整 ABI 文件 */ const DECIMALS_ABI = [ { inputs: [], name: 'decimals', outputs: [{ internalType: 'uint8', name: '', type: 'uint8' }], stateMutability: 'view', type: 'function', }, ] as const /** * 从合约地址直接读取精度(适用于产品 API 返回 contractAddress 的场景) * 优先从合约 decimals() 读取,失败时回退到 fallback(通常是 token.decimals) * * @param contractAddress 合约地址,直接来自产品/Token 对象 * @param fallback 备用精度(来自 token.decimals 或链配置) */ export function useTokenDecimalsFromAddress( contractAddress: string | undefined, fallback: number = 18 ): number { const { data, isError } = useReadContract({ address: contractAddress as `0x${string}` | undefined, abi: DECIMALS_ABI, functionName: 'decimals', query: { enabled: !!contractAddress, staleTime: Infinity, gcTime: Infinity, retry: 2, }, }) return (data !== undefined && !isError) ? Number(data) : fallback }