39 lines
1.1 KiB
TypeScript
39 lines
1.1 KiB
TypeScript
|
|
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
|
|||
|
|
}
|