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(())
}