polynode 0.7.0

Rust SDK for the PolyNode API — real-time Polymarket data
Documentation
use polynode::PolyNodeClient;

const API_KEY: &str = "pn_live_test_session_tracking_51eca107e9b347b589f5b0a04f98eb1d";

fn truncate(s: &str, max: usize) -> &str {
    if s.len() <= max { s } else { &s[..max] }
}

macro_rules! test_endpoint {
    ($name:expr, $call:expr) => {{
        print!("{:<30} ", $name);
        match $call.await {
            Ok(val) => {
                let dbg = format!("{:?}", val);
                println!("OK  | {}", truncate(&dbg, 200));
                Some(val)
            }
            Err(e) => {
                println!("ERR | {}", e);
                None
            }
        }
    }};
}

#[tokio::main]
async fn main() {
    let client = PolyNodeClient::new(API_KEY).expect("failed to create client");

    println!("=== PolyNode SDK — New REST Endpoint Tests ===\n");
    println!("{:<30} {}", "ENDPOINT", "RESULT");
    println!("{}", "-".repeat(100));

    // 1. Get a real token ID from markets()
    let markets = test_endpoint!("markets(5)", client.markets(Some(5)));
    let token_id = markets
        .as_ref()
        .and_then(|m| m.markets.first())
        .and_then(|m| m.token_id.clone())
        .unwrap_or_else(|| "21742633143463906290569050155826241533067272736897614950488156847949938836455".to_string());
    println!("  -> using token_id: {}...", truncate(&token_id, 40));
    println!();

    // 2. orderbook_rest
    test_endpoint!("orderbook_rest(token_id)", client.orderbook_rest(&token_id));

    // 3. midpoint
    test_endpoint!("midpoint(token_id)", client.midpoint(&token_id));

    // 4. spread
    test_endpoint!("spread(token_id)", client.spread(&token_id));

    // 5. leaderboard
    test_endpoint!("leaderboard(None, None)", client.leaderboard(None, None));

    // 6. trending
    let trending = test_endpoint!("trending()", client.trending());

    // 7. activity
    test_endpoint!("activity()", client.activity());

    // 8. movers
    test_endpoint!("movers()", client.movers());

    // 9. trader_profile
    let wallet = "0x1a1A27de044faFFCCf68E28F03dCfCf5eB3d3cE6";
    test_endpoint!("trader_profile(wallet)", client.trader_profile(wallet));

    // 10. trader_pnl
    test_endpoint!("trader_pnl(wallet, None)", client.trader_pnl(wallet, None));

    // 11. event(slug) - grab a slug from trending if available
    let slug = trending
        .as_ref()
        .and_then(|t| t.carousel.first())
        .and_then(|v| v.get("slug"))
        .and_then(|s| s.as_str())
        .unwrap_or("will-trump-impose-25-tariffs-on-canada-and-mexico-by-march");
    println!("\n  -> using event slug: {}", truncate(slug, 60));
    test_endpoint!("event(slug)", client.event(slug));

    // 12. search_events
    test_endpoint!("search_events(election, 5)", client.search_events("election", Some(5)));

    // 13. markets_by_category (NOTE: API endpoint /v1/markets/category/{cat} does not exist yet — expected 404)
    test_endpoint!("markets_by_category(politics)", client.markets_by_category("politics"));

    println!("\n=== Done ===");
}