Skip to main content
Token balance are currently supported on: Ethereum, Worldchain, Shape, Zksync, Optimism, Polygon, Geist, Arbitrum, Blast, Linea, Base, Scroll, Gnosis, BNB, Avalanche, Apechain, Lens, Soneium, Rootstock, Abstract, Settlus, Ink, Solana, Bitcoin runes.Dynamic supports fetching the top 3000 tokens by market cap.
The Dynamic UI components (DynamicWidget and UserProfile) have a built in UI for displaying multi asset balances, we strongly recommend using those components if you can! Learn more in the Multi-Asset UI section.

Hook

You can fetch token balances for a user’s wallet using the useTokenBalances hook:
React
import { useTokenBalances } from "@dynamic-labs/sdk-react-core";

const { tokenBalances, isLoading, isError, error } = useTokenBalances();

Return Value

This hook returns an object for tokenBalances with the following properties:
PropertyTypeDescription
networkIdintegerThe network ID of the token i.e. 1 for Ethereum, 137 for Polygon, etc.
addressstringThe address of the token.
namestringThe name of the token.
symbolstringThe symbol of the token.
decimalsintegerThe number of decimals the token has.
logoURIstringThe URI of the token’s logo image.
balancefloatThe balance of the token in the user’s wallet.
rawBalanceintegerThe raw balance of the token in the user’s wallet.
rawBalanceStringstringThe raw balance encoded as a base-10 string. Use this when the balance exceeds Number.MAX_SAFE_INTEGER (>= 2^53) to avoid precision loss — e.g. for high-decimal tokens or pre-divisor wei amounts.

Reference

You can find the full reference for the useTokenBalances hook here.
On chains that distinguish a public balance from a private (shielded) one — Aleo today — use the usePrivateTokenBalances hook to render the private balances. It mirrors useTokenBalances and can be called alongside it.

Full Example

React
import { useDynamicContext, useTokenBalances } from "@dynamic-labs/sdk-react-core";

const Balances = () => {
  const { primaryWallet } = useDynamicContext();
  const { tokenBalances, isLoading, isError, error } = useTokenBalances();

  if(!primaryWallet) return <div>No wallet connected</div>;

  if (isLoading) return <div>Loading...</div>;
  if (isError) return <div>Error: {error.message}</div>;

  return (
    <div>
      {tokenBalances.map((token) => (
        <div key={token.address}>
          <img src={token.logoURI} alt={token.symbol} />
          <div>{token.name}</div>
          <div>{token.symbol}</div>
          <div>{token.balance}</div>
        </div>
      ))}
    </div>
  );
};
Using the JavaScript SDK? See Getting Multichain Token Balances for the equivalent guide.