stakewiz-rs 0.1.0

Unofficial Rust client for the Stakewiz API - Solana validator analytics
Documentation
use stakewiz_rs::{QueryParams, StakewizClient};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = StakewizClient::new();

    // ── 1. Get a single validator ───────────────────────────────────────
    let vote_key = "GE6atKoWiQ2pt3zL7N13pjNHjdLVys8LinG8qeJLcAiL"; // Laine
    let v = client.get_validator(vote_key).await?;
    println!(
        "Validator: {} (rank #{})",
        v.name.as_deref().unwrap_or("?"),
        v.rank.unwrap_or(0)
    );
    println!("  Commission: {}%", v.commission.unwrap_or(0));
    println!("  APY estimate: {:.2}%", v.apy_estimate.unwrap_or(0.0));
    println!("  Wiz Score: {:.2}", v.wiz_score.unwrap_or(0.0));
    println!("  Jito: {}", v.is_jito.unwrap_or(false));
    println!();

    // ── 2. Get all stake accounts for a validator ───────────────────────
    let sanctum_vote = "LSTmLs1DENX82ihc7jU134mydiV3NDEPXsRrekAY6Ys";
    let stakes = client.get_validator_stakes(sanctum_vote).await?;
    println!("Sanctum validator has {} stake accounts", stakes.len());

    // Show top 5 by active stake
    let mut sorted = stakes.clone();
    sorted.sort_by(|a, b| {
        b.active_stake
            .unwrap_or(0)
            .cmp(&a.active_stake.unwrap_or(0))
    });
    for acc in sorted.iter().take(5) {
        println!(
            "  {}{:.2} SOL",
            &acc.pubkey[..16],
            acc.active_stake.unwrap_or(0) as f64 / 1e9
        );
    }
    println!();

    // ── 3. Epoch stake history with query params ────────────────────────
    let params = QueryParams::new().sort_desc("epoch").limit(5);
    let epoch_stakes = client
        .get_validator_total_stakes(vote_key, Some(&params))
        .await?;
    println!("Recent epoch stakes for Laine:");
    for es in &epoch_stakes {
        println!("  Epoch {}: {:.2} SOL", es.epoch, es.stake);
    }
    println!();

    // ── 4. Current epoch info ───────────────────────────────────────────
    let epoch_info = client.get_epoch_info().await?;
    println!("Current epoch: {}", epoch_info.epoch);
    println!(
        "  Progress: {:.1}%",
        epoch_info.elapsed_seconds as f64 / epoch_info.duration_seconds as f64 * 100.0
    );
    println!(
        "  ~{:.1} hours remaining",
        epoch_info.remaining_seconds as f64 / 3600.0
    );
    println!();

    // ── 5. Cluster stats ────────────────────────────────────────────────
    let cluster = client.get_cluster_stats().await?;
    println!("Cluster averages:");
    println!("  APY: {:.2}%", cluster.avg_apy.unwrap_or(0.0));
    println!("  Avg commission: {:.1}%", cluster.avg_commission.unwrap_or(0.0));
    println!("  Median stake: {:.0} SOL", cluster.median_stake.unwrap_or(0.0));

    Ok(())
}