Skip to main content
Query XLM and token balances for your connected Para wallet or any Stellar address using the Horizon API.

Query Balances

import { useState } from "react";
import { useParaStellar } from "./hooks/useParaStellar";

function BalanceDisplay() {
  const { server, signer, isLoading } = useParaStellar();
  const [balances, setBalances] = useState<{ asset: string; balance: string }[]>([]);

  const queryBalances = async () => {
    if (!signer) return;

    const account = await server.loadAccount(signer.address);

    const parsed = account.balances.map((b) => {
      if (b.asset_type === "native") {
        return { asset: "XLM", balance: b.balance };
      }
      return { asset: `${b.asset_code}:${b.asset_issuer}`, balance: b.balance };
    });

    setBalances(parsed);
    console.log("Balances:", parsed);
  };

  if (isLoading) return <div>Loading...</div>;

  return (
    <div>
      <p>Address: {signer?.address}</p>
      <button onClick={queryBalances}>Query Balances</button>
      {balances.map((b) => (
        <div key={b.asset}>
          {b.balance} {b.asset}
        </div>
      ))}
    </div>
  );
}

Query a Specific Asset

import { Horizon } from "@stellar/stellar-sdk";

async function getAssetBalance(address: string, assetCode: string, assetIssuer: string) {
  const server = new Horizon.Server("https://horizon.stellar.org");
  const account = await server.loadAccount(address);

  const match = account.balances.find(
    (b) => b.asset_type !== "native" && b.asset_code === assetCode && b.asset_issuer === assetIssuer
  );

  return match ? match.balance : "0";
}

// Example: Check USDC balance
const usdcBalance = await getAssetBalance(
  "GABCD...",
  "USDC",
  "GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN"
);
A balance of "0" for a custom asset means the account has a trustline but no tokens. If find returns undefined, the account has no trustline for that asset and cannot receive it until one is created. See Execute Transactions for how to add trustlines.

Next Steps