UNPKG

@smartinvoicexyz/hooks

Version:

Unified source for React hooks used across the Smart Invoice protocol.

131 lines (130 loc) 3.6 kB
import _ from 'lodash'; import { erc20Abi } from 'viem'; import { useReadContract, useReadContracts } from 'wagmi'; export const useTokenMetadata = ({ address, chainId, }) => { const result = useReadContracts({ allowFailure: false, query: { enabled: !!address && !!chainId, refetchInterval: false, }, contracts: [ { address, chainId, abi: erc20Abi, functionName: 'decimals', }, { address, chainId, abi: erc20Abi, functionName: 'name', }, { address, chainId, abi: erc20Abi, functionName: 'symbol', }, { address, chainId, abi: erc20Abi, functionName: 'totalSupply', }, ], }); return { ...result, data: result.data ? { address: address, decimals: Number(result.data[0]), name: result.data[1], symbol: result.data[2], totalSupply: result.data[3], } : undefined, }; }; export const useTokenBalance = ({ tokenAddress, address, chainId, }) => { const { data, error, isLoading, isPending } = useReadContract({ query: { enabled: !!address && !!chainId && !!tokenAddress, }, address: tokenAddress, chainId, abi: erc20Abi, functionName: 'balanceOf', args: [address], }); return { data: _.isNil(data) ? undefined : BigInt(data), error, isLoading, isPending, }; }; export const useTokenData = ({ address, tokenAddress, chainId, }) => { const result = useReadContracts({ allowFailure: false, query: { enabled: !!address && !!chainId && !!tokenAddress, }, contracts: [ { address: tokenAddress, chainId, abi: erc20Abi, functionName: 'decimals', }, { address: tokenAddress, chainId, abi: erc20Abi, functionName: 'name', }, { address: tokenAddress, chainId, abi: erc20Abi, functionName: 'symbol', }, { address: tokenAddress, chainId, abi: erc20Abi, functionName: 'totalSupply', }, { address: tokenAddress, chainId, abi: erc20Abi, functionName: 'balanceOf', args: [address], }, ], }); return { error: result.error, isPending: result.isPending, isLoading: result.isLoading, metadata: result.data ? { address: tokenAddress, decimals: Number(result.data[0]), name: result.data[1], symbol: result.data[2], totalSupply: result.data[3], } : undefined, balance: result.data ? { decimals: Number(result.data[0]), symbol: result.data[2], value: result.data[4], } : undefined, }; };