Skip to main content
Get all token accounts and their balances for the connected wallet. Useful for displaying a complete token portfolio.
import { useSolana, useAccounts } from "@phantom/react-sdk";
import { Connection, PublicKey } from "@solana/web3.js";
import { TOKEN_PROGRAM_ID } from "@solana/spl-token";
import { useEffect, useState } from "react";

interface TokenAccount {
  mint: string;
  balance: string;
  decimals: number;
}

function TokenAccounts() {
  const { solana } = useSolana();
  const addresses = useAccounts();
  const [tokens, setTokens] = useState<TokenAccount[]>([]);
  const [loading, setLoading] = useState(false);

  const fetchTokenAccounts = 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 all token accounts using connection method
      const response = await connection.getParsedTokenAccountsByOwner(
        publicKey,
        { programId: TOKEN_PROGRAM_ID }
      );

      const tokenList: TokenAccount[] = response.value.map((item) => {
        const info = item.account.data.parsed.info;
        return {
          mint: info.mint,
          balance: info.tokenAmount.uiAmountString || "0",
          decimals: info.tokenAmount.decimals,
        };
      });

      setTokens(tokenList);
    } catch (error) {
      console.error("Failed to fetch token accounts:", error);
    } finally {
      setLoading(false);
    }
  };

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

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

  return (
    <div>
      <h2>Token Accounts</h2>
      <button onClick={fetchTokenAccounts} disabled={loading}>
        {loading ? "Loading..." : "Refresh Tokens"}
      </button>
      {tokens.length === 0 ? (
        <p>No token accounts found</p>
      ) : (
        <ul>
          {tokens.map((token) => (
            <li key={token.mint}>
              <strong>Mint:</strong> {token.mint}
              <br />
              <strong>Balance:</strong> {token.balance}
            </li>
          ))}
        </ul>
      )}
    </div>
  );
}

Filter by specific token

Get the token account for a specific mint:
import { Connection, PublicKey } from "@solana/web3.js";
import { getAssociatedTokenAddress, getAccount } from "@solana/spl-token";

async function getTokenAccountForMint(
  connection: Connection,
  owner: PublicKey,
  mint: PublicKey
) {
  try {
    const tokenAccount = await getAssociatedTokenAddress(mint, owner);
    const accountInfo = await getAccount(connection, tokenAccount);
    return accountInfo;
  } catch {
    return null; // Token account doesn't exist
  }
}