UNPKG

@macalinao/grill

Version:

Modern Solana development kit for React applications with automatic account batching, caching, and transaction notifications

62 lines (54 loc) 1.77 kB
import type { TokenAmount } from "@macalinao/token-utils"; import { createTokenAmount } from "@macalinao/token-utils"; import type { Address } from "@solana/kit"; import { TOKEN_PROGRAM_ADDRESS } from "@solana-program/token"; import { useMemo } from "react"; import { useAssociatedTokenAccount } from "./use-associated-token-account.js"; import { useTokenInfo } from "./use-token-info.js"; export interface UseATABalanceOptions { /** The mint address of the token */ mint: Address | null | undefined; /** The owner address of the token account */ owner: Address | null | undefined; /** The token program address (defaults to TOKEN_PROGRAM_ADDRESS) */ tokenProgram?: Address; } /** * Hook that fetches an Associated Token Account balance as a TokenAmount. * This combines useAssociatedTokenAccount and useTokenInfo to provide the complete balance information. * * @example * ```typescript * const balance = useATABalance({ * mint: mintAddress, * owner: walletAddress, * }); * * if (balance) { * console.log("Balance:", formatTokenAmount(balance)); * } * ``` */ export function useATABalance( options: UseATABalanceOptions, ): TokenAmount | null { const { mint, owner, tokenProgram = TOKEN_PROGRAM_ADDRESS } = options; // Fetch the ATA and its data const { data: ataAccount } = useAssociatedTokenAccount({ mint, owner, tokenProgram, }); // Fetch the token info const { data: tokenInfo } = useTokenInfo({ mint }); return useMemo(() => { if (!tokenInfo) { return null; } // If ATA doesn't exist, return zero balance if (!ataAccount) { return createTokenAmount(tokenInfo, 0n); } return createTokenAmount(tokenInfo, ataAccount.data.amount); }, [ataAccount, tokenInfo]); }