Skip to content

Quickstart Guide for Circles SDK (Rust)

The recommended entrypoint is circles-sdk. Start with Sdk::new(config, None) for read flows, then attach a runner when you want on-chain execution.

Install crates

Add the SDK and a Tokio runtime to your Cargo.toml:

[dependencies]
circles-sdk = "0.1.1"
alloy-primitives = "1"
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }

Minimal read example

use alloy_primitives::address;
use circles_sdk::{Avatar, Sdk, config};
 
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let sdk = Sdk::new(config::gnosis_mainnet(), None)?;
    let avatar = address!("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
 
    let info = sdk.avatar_info(avatar).await?;
    println!("avatar type: {:?}", info.avatar_type);
 
    if let Avatar::Human(human) = sdk.get_avatar(avatar).await? {
        let balances = human.balances(false, true).await?;
        println!("balance rows: {}", balances.len());
    }
 
    Ok(())
}

Adding a runner for writes

Attach a runner when you want to execute prepared transactions instead of only planning them.

use std::sync::Arc;
 
use alloy_primitives::{U256, address};
use circles_sdk::{Avatar, EoaContractRunner, Sdk, config};
 
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let runner = Arc::new(
        EoaContractRunner::connect(
            "https://rpc.aboutcircles.com/",
            "0xYOUR_PRIVATE_KEY",
        )
        .await?,
    );
 
    let sdk = Sdk::new(config::gnosis_mainnet(), Some(runner))?;
    let from = address!("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
    let to = address!("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");
 
    if let Avatar::Human(human) = sdk.get_avatar(from).await? {
        let prepared = human
            .plan_direct_transfer(
                to,
                U256::from(1_000_000_000_000_000_000u128),
                None,
                None,
            )
            .await?;
 
        println!("prepared {} tx(s)", prepared.len());
        // Swap to `direct_transfer(...)` when you want to submit immediately.
    }
 
    Ok(())
}

Runner options

  • EoaContractRunner: native direct execution from a private key
  • SafeContractRunner: existing single-owner Safe execution
  • SafeExecutionBuilder: prepares canonical Safe payload/hash for a browser or another external signing host