> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getpara.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Query Wallet Balances with Solana Libraries

> Check SOL and SPL token balances using Solana Web3.js or Anchor with Para wallets

export const Card = ({imgUrl, title, description, href, horizontal = false, newTab = false}) => {
  const [isHovered, setIsHovered] = useState(false);
  const handleClick = e => {
    e.preventDefault();
    if (newTab) {
      window.open(href, '_blank', 'noopener,noreferrer');
    } else {
      window.location.href = href;
    }
  };
  return <div className={`not-prose relative my-2 p-[1px] rounded-xl transition-all duration-300 ${isHovered ? 'bg-gradient-to-r from-[#FF4E00] to-[#874AE3]' : 'bg-gray-200'}`} onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)}>
      <a href={href} onClick={handleClick} className={`not-prose flex ${horizontal ? 'flex-row' : 'flex-col'} font-normal h-full bg-white overflow-hidden w-full cursor-pointer rounded-[11px] no-underline`}>
        {imgUrl && <div className={`relative overflow-hidden flex-shrink-0 ${horizontal ? 'w-[30%] rounded-l-[11px]' : 'w-full'}`} onClick={e => e.stopPropagation()}>
            <img src={imgUrl} alt={title} className="w-full h-full object-cover pointer-events-none select-none" draggable="false" />
            <div className="absolute inset-0 pointer-events-none" />
          </div>}
        <div className={`flex-grow px-6 py-5 ${horizontal ? 'w-[70%]' : 'w-full'} flex flex-col ${horizontal && imgUrl ? 'justify-center' : 'justify-start'}`}>
          {title && <h2 className="font-semibold text-base text-gray-800 m-0">{title}</h2>}
          {description && <div className={`font-normal text-gray-500 re leading-6 ${horizontal || !imgUrl ? 'mt-0' : 'mt-1'}`}>
              <p className="m-0 text-xs">{description}</p>
            </div>}
        </div>
      </a>
    </div>;
};

Query SOL and SPL token balances for Para wallets using Solana libraries. This guide covers checking native SOL balances and SPL token balances.

<Card title="Setup Solana Libraries First" description="You must complete the Solana library setup before querying balances" href="/v2/react/guides/web3-operations/solana/setup-libraries" horizontal />

<Tabs>
  <Tab title="@solana/kit">
    ```typescript theme={null}
    import { useParaSolanaSigner } from '@getpara/react-sdk';
    import { createSolanaRpc, address } from '@solana/kit';
    import { getAssociatedTokenAddress } from '@solana/spl-token';

    const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");

    function WalletBalance() {
      const { solanaSigner, isLoading } = useParaSolanaSigner({ rpc });
      const [solBalance, setSolBalance] = useState(0);
      const [tokenBalance, setTokenBalance] = useState(0);

      const fetchBalances = async () => {
        if (!solanaSigner) return;

        try {
          // Get SOL balance
          const { value } = await rpc.getBalance(solanaSigner.address).send();
          setSolBalance(Number(value) / 1e9);

          // Get SPL token balance
          const usdcMint = address("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
          const tokenAccount = await getAssociatedTokenAddress(
            usdcMint,
            solanaSigner.address
          );

          const { value: accountData } = await rpc.getAccountInfo(tokenAccount).send();
          if (accountData && accountData.data) {
            const parsed = JSON.parse(accountData.data);
            setTokenBalance(Number(parsed.parsed.info.tokenAmount.amount) / 1e6);
          } else {
            setTokenBalance(0);
          }
        } catch (error) {
          console.error("Error fetching balances:", error);
        }
      };

      return (
        <div>
          <button onClick={fetchBalances}>Refresh Balances</button>
          <p>SOL Balance: {solBalance}</p>
          <p>USDC Balance: {tokenBalance}</p>
        </div>
      );
    }
    ```
  </Tab>

  <Tab title="@solana/web3.js">
    ```typescript theme={null}
    import { useParaSolana } from './hooks/useParaSolana';
    import { LAMPORTS_PER_SOL, PublicKey } from '@solana/web3.js';
    import { TOKEN_PROGRAM_ID, getAccount, getAssociatedTokenAddress } from '@solana/spl-token';

    function WalletBalance() {
      const { connection, signer } = useParaSolana();
      const [solBalance, setSolBalance] = useState(0);
      const [tokenBalance, setTokenBalance] = useState(0);

      const fetchBalances = async () => {
        try {
          // Get SOL balance
          const balance = await connection.getBalance(signer.sender);
          setSolBalance(balance / LAMPORTS_PER_SOL);

          // Get SPL token balance (example: USDC)
          const usdcMint = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
          const tokenAccount = await getAssociatedTokenAddress(
            usdcMint,
            signer.sender
          );

          try {
            const accountInfo = await getAccount(connection, tokenAccount);
            setTokenBalance(Number(accountInfo.amount) / 1e6); // USDC has 6 decimals
          } catch (error) {
            console.log("Token account not found");
            setTokenBalance(0);
          }
        } catch (error) {
          console.error("Error fetching balances:", error);
        }
      };

      return (
        <div>
          <button onClick={fetchBalances}>Refresh Balances</button>
          <p>SOL Balance: {solBalance}</p>
          <p>USDC Balance: {tokenBalance}</p>
        </div>
      );
    }
    ```
  </Tab>

  <Tab title="Anchor">
    Query balances using the RPC client directly:

    ```typescript theme={null}
    import { useParaSolanaSigner } from "@getpara/react-sdk";
    import { createSolanaRpc, lamports } from "@solana/kit";

    const rpc = createSolanaRpc("https://api.devnet.solana.com");

    function QueryBalances() {
      const { solanaSigner, isLoading } = useParaSolanaSigner({ rpc });

      const getBalance = async () => {
        if (!solanaSigner) return;

        const { value: balance } = await rpc.getBalance(solanaSigner.address as any).send();
        console.log("SOL Balance:", Number(balance) / 1e9);

        // Query token accounts
        const { value: tokenAccounts } = await rpc.getTokenAccountsByOwner(
          solanaSigner.address as any,
          { programId: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" as any },
          { encoding: "jsonParsed" },
        ).send();

        for (const account of tokenAccounts) {
          const parsed = account.account.data.parsed.info;
          console.log(`Token: ${parsed.mint}, Balance: ${parsed.tokenAmount.uiAmountString}`);
        }
      };

      if (isLoading) return <p>Loading...</p>;
      return <button onClick={getBalance}>Query Balances</button>;
    }
    ```
  </Tab>
</Tabs>

## Next Steps

<CardGroup cols={3}>
  <Card title="Send Tokens" description="Transfer SOL and SPL tokens" href="/v2/react/guides/web3-operations/solana/send-tokens" icon="paper-plane" />

  <Card title="Manage Token Accounts" description="Create and manage SPL token accounts" href="/v2/react/guides/web3-operations/solana/manage-token-accounts" icon="folder" />

  <Card title="Execute Transactions" description="Build complex transactions" href="/v2/react/guides/web3-operations/solana/execute-transactions" icon="bolt" />
</CardGroup>
