init: 初始化 AssetX 项目仓库
包含 webapp(Next.js 用户端)、webapp-back(Go 后端)、 antdesign(管理后台)、landingpage(营销落地页)、 数据库 SQL 和配置文件。
This commit is contained in:
38
webapp/hooks/useTokenDecimals.ts
Normal file
38
webapp/hooks/useTokenDecimals.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user