Skip to main content

Arc Testnet Balances & Token Supply API

Arc mainnet is live

Most production integrations should use the Arc Mainnet Balances & Token Supply API with EVM(network: arc). Use this page only for Arc testnet data.

Query wallet balances and token supply on Arc testnet with Bitquery GraphQL. Two cubes on network: arc_testnet cover it:

CubeWhat it returns
BalancesComputed current balance per address and currency, with first and last change time and update count
TransactionBalancesPer-transaction pre- and post-balances, and the token's TotalSupply

For the net flow over a time window, the page also uses Transfers.

Every query on this page was executed against the production endpoint before publishing.

Testnet limits
  • ...InUSD fields are 0. Value holdings with the latest price query if you need a dollar figure.
  • Only dataset: realtime exists; leave the dataset argument out.
  • The token-centric Holders cube is not available on Arc testnet because it is served from the archive dataset. Rank Balances rows by amount, as in top holders of a token, for holder rankings within the realtime window.
API Key Required

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 ➤

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_testnet) {
Balances(
where: {Balance: {Address: {is: "0x2de8906a641d65d490bc60a4179d961d59742bcb"}}}
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_testnet) {
Balances(
where: {
Balance: {Address: {is: "0x2de8906a641d65d490bc60a4179d961d59742bcb"}}
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_testnet) {
Balances(
where: {
Balance: {
Address: {
in: [
"0x2de8906a641d65d490bc60a4179d961d59742bcb"
"0x73742278c31a76dbb0d2587d03ef92e6e2141023"
"0x49f9636fe15883e16d5e356a4ea08c9fe6bc219b"
]
}
}
Currency: {SmartContract: {is: "0x3600000000000000000000000000000000000000"}}
}
orderBy: {descending: Balance_Amount}
) {
Balance {
Address
Amount
}
Currency {
Symbol
}
}
}
}

Top holders of a token​

Addresses ranked by their current balance of one token, from Balances. On the testnet this covers balances inside the realtime window rather than a full-chain snapshot, so treat it as a leaderboard of active holders. The top row is usually the Uniswap v4 PoolManager, which holds pool reserves.

{
EVM(network: arc_testnet) {
Balances(
where: {
Currency: {SmartContract: {is: "0xe2cfd2893ad90e8a5b4f87c5cad22d150b1e12a0"}}
}
orderBy: {descending: Balance_Amount}
limit: {count: 20}
) {
Balance {
Address
Amount(selectWhere: {gt: "0"})
UpdateCount
LastChangeTime
}
Currency {
Symbol
}
}
}
}

Balance history of a wallet​

Each change to a wallet's ERC-20 USDC balance, newest first, with the transaction behind it. TransactionBalances gives the balance before (PreBalance) and after (PostBalance) each transaction.

{
EVM(network: arc_testnet) {
TransactionBalances(
limit: {count: 20}
orderBy: {descending: Block_Time}
where: {
TokenBalance: {
Address: {is: "0x2de8906a641d65d490bc60a4179d961d59742bcb"}
Currency: {SmartContract: {is: "0x3600000000000000000000000000000000000000"}}
}
}
) {
Block {
Number
Time
}
Transaction {
Hash
}
TokenBalance {
PreBalance
PostBalance
Currency {
Symbol
}
}
}
}
}

Net change per currency over a window​

Sum the wallet's transfers per currency to see what it gained or lost over the last 24 hours. inflow counts transfers received, outflow counts transfers sent.

{
EVM(network: arc_testnet) {
Transfers(
where: {
any: [
{Transfer: {Sender: {is: "0x2de8906a641d65d490bc60a4179d961d59742bcb"}}}
{Transfer: {Receiver: {is: "0x2de8906a641d65d490bc60a4179d961d59742bcb"}}}
]
Block: {Time: {since_relative: {hours_ago: 24}}}
}
orderBy: {descendingByField: "transfers"}
) {
Transfer {
Currency {
Symbol
SmartContract
Native
}
}
inflow: sum(of: Transfer_Amount, if: {Transfer: {Receiver: {is: "0x2de8906a641d65d490bc60a4179d961d59742bcb"}}})
outflow: sum(of: Transfer_Amount, if: {Transfer: {Sender: {is: "0x2de8906a641d65d490bc60a4179d961d59742bcb"}}})
netChange: calculate(expression: "$inflow - $outflow")
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_testnet) {
TransactionBalances(
where: {
TokenBalance: {Address: {is: "0x2de8906a641d65d490bc60a4179d961d59742bcb"}}
}
) {
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_testnet) {
TransactionBalances(
limit: {count: 1}
orderBy: {descending: Block_Time}
where: {
TokenBalance: {
Currency: {SmartContract: {is: "0xe2cfd2893ad90e8a5b4f87c5cad22d150b1e12a0"}}
}
}
) {
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_testnet) {
TransactionBalances(
where: {
TokenBalance: {
Currency: {SmartContract: {is: "0xe2cfd2893ad90e8a5b4f87c5cad22d150b1e12a0"}}
}
}
) {
Block {
Time
}
Transaction {
Hash
}
TokenBalance {
Currency {
Symbol
}
TotalSupply
}
}
}
}

FAQ​

Why is the Holders cube missing? Holders is built from the archive dataset, and the testnet has none. Rank holders by ordering Balances by amount within the realtime window, as shown above. The Arc mainnet balances guide uses the full Holders cube.

Why does the same wallet show USDC twice? Native USDC (Native: true, 18 decimals) and the ERC-20 USDC interface (0x3600..., 6 decimals) are tracked as two currencies. Sum them yourself if you want one USDC figure. A third row with contract 0xfff...fffe and no symbol is a system ledger mirror and can be ignored.

Are USD values available? No. Every ...InUSD field is 0 on the testnet. Because most balances are dollar stablecoins, Amount is usually the figure you want anyway.

Is TotalSupply raw or decimal-adjusted? Decimal-adjusted. A token with a billion supply reads 1000000000.000000000000000000.

Build with Bitquery

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.