init: 初始化 AssetX 项目仓库
包含 webapp(Next.js 用户端)、webapp-back(Go 后端)、 antdesign(管理后台)、landingpage(营销落地页)、 数据库 SQL 和配置文件。
This commit is contained in:
127
webapp/hooks/useBalance.ts
Normal file
127
webapp/hooks/useBalance.ts
Normal file
@@ -0,0 +1,127 @@
|
||||
import { useAccount, useReadContract } from 'wagmi'
|
||||
import { formatUnits } from 'viem'
|
||||
import { abis, getContractAddress } from '@/lib/contracts'
|
||||
import { useTokenList } from './useTokenList'
|
||||
|
||||
/**
|
||||
* 查询 USDC 余额
|
||||
*/
|
||||
export function useUSDCBalance() {
|
||||
const { address, chainId } = useAccount()
|
||||
const { bySymbol } = useTokenList()
|
||||
const usdcToken = bySymbol['USDC']
|
||||
const contractAddress = chainId ? getContractAddress('USDC', chainId) : undefined
|
||||
|
||||
const { data: balance, isLoading, error, refetch } = useReadContract({
|
||||
address: contractAddress,
|
||||
abi: abis.USDY,
|
||||
functionName: 'balanceOf',
|
||||
args: address ? [address] : undefined,
|
||||
query: {
|
||||
enabled: !!address && !!chainId && !!contractAddress,
|
||||
refetchInterval: 10000,
|
||||
}
|
||||
})
|
||||
|
||||
const usdcDecimals = usdcToken?.onChainDecimals ?? usdcToken?.decimals ?? 18
|
||||
const formattedBalance = balance ? formatUnits(balance as bigint, usdcDecimals) : '0'
|
||||
|
||||
return {
|
||||
balance: balance as bigint | undefined,
|
||||
formattedBalance,
|
||||
isLoading,
|
||||
error,
|
||||
refetch,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询 YT LP Token 余额
|
||||
*/
|
||||
export function useYTLPBalance() {
|
||||
const { address, chainId } = useAccount()
|
||||
const { bySymbol } = useTokenList()
|
||||
const lpToken = bySymbol['YTLPToken'] ?? bySymbol['LP']
|
||||
const contractAddress = chainId ? getContractAddress('YTLPToken', chainId) : undefined
|
||||
|
||||
const { data: balance, isLoading, error, refetch } = useReadContract({
|
||||
address: contractAddress,
|
||||
abi: abis.YTLPToken,
|
||||
functionName: 'balanceOf',
|
||||
args: address ? [address] : undefined,
|
||||
query: {
|
||||
enabled: !!address && !!chainId && !!contractAddress,
|
||||
refetchInterval: 10000,
|
||||
}
|
||||
})
|
||||
|
||||
const lpDecimals = lpToken?.onChainDecimals ?? lpToken?.decimals ?? 18
|
||||
const formattedBalance = balance ? formatUnits(balance as bigint, lpDecimals) : '0'
|
||||
|
||||
return {
|
||||
balance: balance as bigint | undefined,
|
||||
formattedBalance,
|
||||
isLoading,
|
||||
error,
|
||||
refetch,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 通用 ERC20 余额查询(按合约地址)
|
||||
*/
|
||||
export function useTokenBalance(contractAddress: string | undefined, decimals: number = 18) {
|
||||
const { address } = useAccount()
|
||||
|
||||
const { data: balance, isLoading, error, refetch } = useReadContract({
|
||||
address: contractAddress as `0x${string}` | undefined,
|
||||
abi: abis.YTToken,
|
||||
functionName: 'balanceOf',
|
||||
args: address ? [address] : undefined,
|
||||
query: {
|
||||
enabled: !!address && !!contractAddress,
|
||||
refetchInterval: 10000,
|
||||
}
|
||||
})
|
||||
|
||||
const formattedBalance = balance ? formatUnits(balance as bigint, decimals) : '0'
|
||||
|
||||
return {
|
||||
balance: balance as bigint | undefined,
|
||||
formattedBalance,
|
||||
isLoading,
|
||||
error,
|
||||
refetch,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询 USDC 授权额度
|
||||
*/
|
||||
export function useUSDCAllowance(spenderAddress?: `0x${string}`) {
|
||||
const { address, chainId } = useAccount()
|
||||
const { bySymbol } = useTokenList()
|
||||
const usdcToken = bySymbol['USDC']
|
||||
const contractAddress = chainId ? getContractAddress('USDC', chainId) : undefined
|
||||
|
||||
const { data: allowance, isLoading, error, refetch } = useReadContract({
|
||||
address: contractAddress,
|
||||
abi: abis.USDY,
|
||||
functionName: 'allowance',
|
||||
args: address && spenderAddress ? [address, spenderAddress] : undefined,
|
||||
query: {
|
||||
enabled: !!address && !!chainId && !!spenderAddress && !!contractAddress,
|
||||
}
|
||||
})
|
||||
|
||||
const usdcDecimals = usdcToken?.onChainDecimals ?? usdcToken?.decimals ?? 18
|
||||
const formattedAllowance = allowance ? formatUnits(allowance as bigint, usdcDecimals) : '0'
|
||||
|
||||
return {
|
||||
allowance: allowance as bigint | undefined,
|
||||
formattedAllowance,
|
||||
isLoading,
|
||||
error,
|
||||
refetch,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user