Skip to content

Get Token Balances of an Avatar

Read-only balance lookup using circles-rpc + circles-types. (Transfers are runner-dependent and will come later.)

use circles_rpc::{BalanceMethods, QueryMethods, RpcClient};
use circles_types::{Address, FilterPredicate, OrderBy, QueryParams, TokenBalanceRow};
use reqwest::Url;
 
#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let client = RpcClient::http(Url::parse("https://rpc.aboutcircles.com/")?);
    let balances = BalanceMethods::new(client);
 
    let avatar: Address = "0x1234567890123456789012345678901234567890".parse()?;
    let balance = balances
        .get_total_balance(avatar, /* as_time_circles */ false, /* use_v2 */ true)
        .await?;
 
    println!("Total balance: {balance:?}");
 
    // Token-level balances
    let queries = QueryMethods::new(RpcClient::http(Url::parse("https://rpc.aboutcircles.com/")?));
    let rows: Vec<TokenBalanceRow> = queries
        .circles_query(QueryParams {
            namespace: "circles".into(),
            table: "tokenBalances".into(),
            columns: vec!["owner".into(), "token".into(), "balance".into()],
            filter: vec![FilterPredicate::equals("owner".into(), avatar.to_string()).into()],
            order: vec![OrderBy::desc("balance".into())],
            limit: Some(50),
        })
        .await?;
 
    for row in rows.iter().take(5) {
        println!("token {} balance {}", row.token, row.balance);
    }
 
    Ok(())
}