UNPKG

@macalinao/grill

Version:

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

86 lines (79 loc) 2.36 kB
import type { Account, Address } from "@solana/kit"; import type { Token } from "@solana-program/token"; import { TOKEN_PROGRAM_ADDRESS } from "@solana-program/token"; import type { UseQueryResult } from "@tanstack/react-query"; import { useAssociatedTokenPda } from "./use-associated-token-pda.js"; import { useTokenAccount } from "./use-token-account.js"; export interface UseAssociatedTokenAccountOptions { /** 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; } export interface UseAssociatedTokenAccountResult { /** The ATA address */ address: Address | null; /** The bump seed for the PDA */ bump: number | null; /** The decoded token account data */ tokenAccount: Token | null; /** Whether the PDA is being computed */ isLoadingPda: boolean; /** Whether the account data is being fetched */ isLoadingAccount: boolean; /** Whether either operation is loading */ isLoading: boolean; /** Any error from PDA computation */ pdaError: Error | null; /** Any error from account fetching */ accountError: Error | null; /** Refetch the account data */ refetch: () => void; } /** * Hook that computes the Associated Token Account address and fetches its data * Combines useAssociatedTokenPda and useTokenAccount for convenience * * @example * ```typescript * const { * address, * tokenAccount, * isLoading * } = useAssociatedTokenAccount({ * mint: mintAddress, * owner: walletAddress, * }); * * if (tokenAccount) { * console.log("Balance:", tokenAccount.amount); * } * ``` */ export function useAssociatedTokenAccount( options: UseAssociatedTokenAccountOptions, ): UseQueryResult<Account<Token> | null> & { address: Address | null | undefined; } { const { mint, owner, tokenProgram = TOKEN_PROGRAM_ADDRESS } = options; // Compute the ATA address const ataAddress = useAssociatedTokenPda( mint && owner ? { mint, owner, tokenProgram, } : null, ); // Fetch the token account data const accountResult = useTokenAccount({ address: ataAddress, }); return { ...accountResult, address: ataAddress, }; }