Skip to content

Subscribing to Avatar Events

Rust event fetching/decoding. HTTP is available now; websocket streaming is behind the circles-rpc ws feature.

HTTP fetch and parse

use circles_rpc::{EventsMethods, RpcClient};
use reqwest::Url;
 
#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let client = RpcClient::http(Url::parse("https://rpc.aboutcircles.com/")?);
    let events = EventsMethods::new(client);
 
    let parsed = events
        .circles_events(None, /* from_block */ 0, /* to_block */ None, None)
        .await?;
 
    for evt in parsed.iter().take(5) {
        println!("event type: {:?}", evt.event_type);
    }
 
    Ok(())
}

Websocket streaming (optional)

Enable the ws feature for circles-rpc in Cargo.toml:

circles-rpc = { version = "0.1", features = ["ws"] }

Then subscribe:

use circles_rpc::{EventsMethods, RpcClient};
use reqwest::Url;
 
#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // Requires ws feature and a websocket endpoint
    let client = RpcClient::ws(Url::parse("wss://rpc.aboutcircles.com/ws")?).await?;
    let events = EventsMethods::new(client);
 
    let filter = serde_json::json!({ "addresses": [] }); // adjust filters as needed
    let mut sub = events.subscribe_parsed_events(filter).await?;
 
while let Some(evt) = sub.next().await {
    let evt = evt?;
    println!("streamed event: {:?}", evt.event_type);
}
 
Ok(())
}

Decoding details

  • CirclesEvent wraps CirclesEventType plus the raw data map.
  • If an event type isn’t mapped yet, it is parsed as CirclesEventType::CrcUnknownEvent (no frames are dropped).
  • Heartbeat/empty frames from some providers are ignored in the streaming helper.