包含 webapp(Next.js 用户端)、webapp-back(Go 后端)、 antdesign(管理后台)、landingpage(营销落地页)、 数据库 SQL 和配置文件。
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
|
||
}
|