Skip to main content
Check the SOL balance and SPL token balances for the connected wallet using the Phantom SDK.
import { useSolana, useAccounts } from "@phantom/react-sdk";
import { Connection, PublicKey, LAMPORTS_PER_SOL } from "@solana/web3.js";
import { getAssociatedTokenAddress, getAccount } from "@solana/spl-token";
import { useEffect, useState } from "react";

function WalletBalance() {
  const { solana } = useSolana();
  const addresses = useAccounts();
  const [solBalance, setSolBalance] = useState<number | null>(null);
  const [loading, setLoading] = useState(false);

  const checkBalance = async () => {
    if (!addresses?.[0]) return;

    setLoading(true);
    try {
      const connection = new Connection("https://api.mainnet-beta.solana.com");
      const publicKey = new PublicKey(addresses[0].address);

      // Get SOL balance
      const balance = await connection.getBalance(publicKey);
      setSolBalance(balance / LAMPORTS_PER_SOL);
    } catch (error) {
      console.error("Failed to fetch balance:", error);
    } finally {
      setLoading(false);
    }
  };

  useEffect(() => {
    if (addresses?.[0]) {
      checkBalance();
    }
  }, [addresses]);

  if (!addresses?.[0]) {
    return <div>Please connect your wallet</div>;
  }

  return (
    <div>
      <h2>Wallet Balance</h2>
      <p>Address: {addresses[0].address}</p>
      {loading ? (
        <p>Loading balance...</p>
      ) : (
        <p>SOL Balance: {solBalance?.toFixed(4) ?? "0.0000"} SOL</p>
      )}
      <button onClick={checkBalance}>Refresh Balance</button>
    </div>
  );
}

Get token balances

Check balances for specific SPL tokens:
import { useSolana, useAccounts } from "@phantom/react-sdk";
import { Connection, PublicKey } from "@solana/web3.js";
import { getAssociatedTokenAddress, getAccount, getMint } from "@solana/spl-token";
import { useState } from "react";

const USDC_MINT = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");

function TokenBalance() {
  const { solana } = useSolana();
  const addresses = useAccounts();
  const [tokenBalance, setTokenBalance] = useState<string | null>(null);

  const checkTokenBalance = async () => {
    if (!addresses?.[0]) return;

    try {
      const connection = new Connection("https://api.mainnet-beta.solana.com");
      const publicKey = new PublicKey(addresses[0].address);

      // Get associated token account
      const tokenAccount = await getAssociatedTokenAddress(USDC_MINT, publicKey);

      // Get token account info
      const accountInfo = await getAccount(connection, tokenAccount);
      
      // Get mint info to get decimals
      const mintInfo = await getMint(connection, USDC_MINT);
      
      // Calculate balance with decimals
      const balance = Number(accountInfo.amount) / 10 ** mintInfo.decimals;
      setTokenBalance(balance.toFixed(mintInfo.decimals));
    } catch (error) {
      // Token account doesn't exist
      setTokenBalance("0");
    }
  };

  return (
    <div>
      <button onClick={checkTokenBalance}>Check USDC Balance</button>
      {tokenBalance !== null && <p>USDC Balance: {tokenBalance}</p>}
    </div>
  );
}