Arc Balances & Token Supply API
Query wallet balances, holders and token supply on Arc with Bitquery GraphQL. Four cubes on network: arc cover it:
| Cube | What it returns |
|---|---|
Balances | Computed current balance per address and currency, with first and last change time and update count |
Holders | Current holder and token pairs, ranked by token balance |
TransactionBalances | Per-transaction pre- and post-balances, and the token's TotalSupply |
Transfers | Every transfer in and out of a wallet |
Every query on this page was executed against the production endpoint before publishing.
Balances, Holders, TransactionBalances and Transfers all returned Arc data. Only the realtime path answered, so leave the dataset argument out until archive and combined are enabled. Join balances to the latest price query when you need a USD value.
To query or stream data outside the Bitquery IDE, you need an API access token.
Follow the steps here: How to generate Bitquery API token ➤
- Arc Blockchain API overview — network facts, every cube and stream in one place
- Arc Transfers API
- Arc DEX Trades API
- EVM Balances schema
- EVM Token Supply API
On this page: Portfolio · One token · Batch · Top holders · History · Stream · Supply · Supply stream · FAQ
Portfolio of a wallet
▶️ Run in IDE
Every currency an address holds, with the computed balance and when it last changed. Native USDC has Native: true; the ERC-20 interface at 0x3600... is listed separately.
{
EVM(network: arc) {
Balances(
where: {Balance: {Address: {is: "0xada5bb90d0de0bd1b6f3938708f49295a8d1f7cb"}}}
orderBy: {descending: Balance_Amount}
) {
Currency {
Name
Symbol
SmartContract
Native
}
Balance {
Amount
FirstChangeTime
LastChangeTime
UpdateCount
}
}
}
}
Balance of one token
▶️ Run in IDE
The balanceOf equivalent for ERC-20 USDC. For the gas token use Currency: {Native: true} instead of a contract filter.
{
EVM(network: arc) {
Balances(
where: {
Balance: {Address: {is: "0xada5bb90d0de0bd1b6f3938708f49295a8d1f7cb"}}
Currency: {SmartContract: {is: "0x3600000000000000000000000000000000000000"}}
}
) {
Currency {
Symbol
Decimals
}
Balance {
Amount
LastChangeTime
}
}
}
}
Balances of several wallets
▶️ Run in IDE
One call for a batch of addresses, grouped by address and currency.
{
EVM(network: arc) {
Balances(
where: {
Balance: {
Address: {
in: [
"0xada5bb90d0de0bd1b6f3938708f49295a8d1f7cb"
"0xb40bd0f6b1332daf9e987a0ca33efe6e90d0b938"
"0x2bf981e99011ae4050aaa6f33af4bfc26b89f224"
]
}
}
Currency: {SmartContract: {is: "0x3600000000000000000000000000000000000000"}}
}
orderBy: {descending: Balance_Amount}
) {
Balance {
Address
Amount
}
Currency {
Symbol
}
}
}
}
Top holders of a token
▶️ Run in IDE
Current EURC holders ranked by token balance. Add Balance: {Amount: {gt: "0"}} so wallets that once held the token but now hold zero do not appear.
{
EVM(network: arc) {
Holders(
where: {
Currency: {SmartContract: {is: "0xbef5f6d51cb62b58e6a8f77868681825c6fe21c1"}}
Balance: {Amount: {gt: "0"}}
}
orderBy: {descending: Balance_Amount}
limit: {count: 20}
) {
Holder {
Address
}
Balance {
Amount
FirstChangeTime
LastChangeTime
UpdateCount
}
}
}
}
Balance history of a wallet
Each change to a wallet's USDC balance, newest first, with the transaction behind it. TransactionBalances returns the balance before and after each transaction; change is the difference, so positive values are inflows.
{
EVM(network: arc) {
TransactionBalances(
limit: {count: 20}
orderBy: {descending: Block_Time}
where: {
TokenBalance: {
Address: {is: "0xada5bb90d0de0bd1b6f3938708f49295a8d1f7cb"}
Currency: {Native: true}
}
}
) {
Block {
Number
Time
}
Transaction {
Hash
}
TokenBalance {
PreBalance
PostBalance
Currency {
Symbol
}
}
change: calculate(expression: "$TokenBalance_PostBalance - $TokenBalance_PreBalance")
}
}
}
Net change per currency over a window
Sum the transfers in and out per currency to see what a wallet gained or lost over the last 24 hours.
{
EVM(network: arc) {
Transfers(
where: {
any: [
{Transfer: {Receiver: {is: "0xada5bb90d0de0bd1b6f3938708f49295a8d1f7cb"}}}
{Transfer: {Sender: {is: "0xada5bb90d0de0bd1b6f3938708f49295a8d1f7cb"}}}
]
Block: {Time: {since_relative: {hours_ago: 24}}}
}
) {
Transfer {
Currency {
Symbol
SmartContract
Native
}
}
inflow: sum(of: Transfer_Amount, if: {Transfer: {Receiver: {is: "0xada5bb90d0de0bd1b6f3938708f49295a8d1f7cb"}}})
outflow: sum(of: Transfer_Amount, if: {Transfer: {Sender: {is: "0xada5bb90d0de0bd1b6f3938708f49295a8d1f7cb"}}})
transfers: count
}
}
}
Stream balance changes
Every balance change of a wallet as it happens, from TransactionBalances. Widen the filter to a list of addresses or a single token to build alerts.
subscription {
EVM(network: arc) {
TransactionBalances(
where: {
TokenBalance: {Address: {is: "0xada5bb90d0de0bd1b6f3938708f49295a8d1f7cb"}}
}
) {
Block {
Number
Time
}
Transaction {
Hash
}
TokenBalance {
PreBalance
PostBalance
Currency {
Symbol
SmartContract
Native
}
}
}
}
}
Total supply of a token
▶️ Run in IDE
TransactionBalances records the token's total supply after each transaction that touched it. The latest row is the current supply, already adjusted for decimals.
{
EVM(network: arc) {
TransactionBalances(
limit: {count: 1}
orderBy: {descending: Block_Time}
where: {
TokenBalance: {
Currency: {SmartContract: {is: "0xbef5f6d51cb62b58e6a8f77868681825c6fe21c1"}}
}
}
) {
Block {
Time
}
TokenBalance {
Currency {
Symbol
SmartContract
}
TotalSupply
}
}
}
}
Stream supply changes
▶️ Run in IDE
A new row arrives whenever a mint or burn changes the supply of the token.
subscription {
EVM(network: arc) {
TransactionBalances(
where: {
TokenBalance: {
Currency: {SmartContract: {is: "0xbef5f6d51cb62b58e6a8f77868681825c6fe21c1"}}
}
}
) {
Block {
Time
}
Transaction {
Hash
}
TokenBalance {
Currency {
Symbol
}
TotalSupply
}
}
}
}
FAQ
Does the Holders cube work?
Yes. It returned Arc holder rows in the production check on 16 September 2026. Filter Balance.Amount above zero for current holders.
Why does the same wallet show USDC twice?
Native USDC (Native: true, 18 decimals) and the ERC-20 USDC interface (0x3600..., 6 decimals) appear as separate Bitquery currencies. Arc's ERC-20 interface acts on the native balance, so do not add the rows without checking the flow you are measuring. A third row with contract 0xfff...fffe and no symbol is a system ledger mirror and can be ignored.
Are USD values available?
The balance cubes return token amounts. Fetch current prices from Trading.Pairs with Market.Network: "Arc", or use Trading.Tokens for prices across pools, then match tokens in your app. Check the price timestamp before valuing a balance. For a historical price more than 30 days old, derive it from EVM.DEXTrades or EVM.DEXTradeByTokens only after confirming Arc archive data is available.
Is TotalSupply raw or decimal-adjusted?
Decimal-adjusted. A token with a billion supply reads 1000000000.000000000000000000.
Ready to run this in production?
Get an API key and run these queries in minutes, or talk to us about plans and enterprise delivery.