stakewiz-rs 0.1.0

Unofficial Rust client for the Stakewiz API - Solana validator analytics
Documentation
use serde::{Deserialize, Serialize};

/// Full validator info returned by `/validators` and `/validator/{vote_identity}`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Validator {
    pub rank: Option<i64>,
    pub identity: String,
    pub vote_identity: String,
    pub last_vote: Option<u64>,
    pub root_slot: Option<u64>,
    pub credits: Option<u64>,
    pub epoch_credits: Option<u64>,
    pub activated_stake: Option<f64>,
    pub version: Option<String>,
    pub delinquent: Option<bool>,
    pub skip_rate: Option<f64>,
    pub updated_at: Option<String>,
    pub first_epoch_with_stake: Option<u64>,
    pub name: Option<String>,
    pub keybase: Option<String>,
    pub description: Option<String>,
    pub website: Option<String>,
    pub commission: Option<u8>,
    pub image: Option<String>,
    pub ip_latitude: Option<String>,
    pub ip_longitude: Option<String>,
    pub ip_city: Option<String>,
    pub ip_country: Option<String>,
    pub ip_asn: Option<String>,
    pub ip_org: Option<String>,
    #[serde(rename = "mod")]
    pub is_mod: Option<bool>,
    pub is_jito: Option<bool>,
    pub jito_commission_bps: Option<u64>,
    pub vote_success: Option<f64>,
    pub vote_success_score: Option<f64>,
    pub skip_rate_score: Option<f64>,
    pub info_score: Option<f64>,
    pub commission_score: Option<f64>,
    pub first_epoch_distance: Option<u64>,
    pub epoch_distance_score: Option<f64>,
    pub stake_weight: Option<f64>,
    pub above_halt_line: Option<bool>,
    pub stake_weight_score: Option<f64>,
    pub withdraw_authority_score: Option<f64>,
    pub asn: Option<String>,
    pub asn_concentration: Option<f64>,
    pub asn_concentration_score: Option<f64>,
    pub uptime: Option<f64>,
    pub uptime_score: Option<f64>,
    pub wiz_score: Option<f64>,
    pub version_valid: Option<bool>,
    pub city_concentration: Option<f64>,
    pub city_concentration_score: Option<f64>,
    pub invalid_version_score: Option<f64>,
    pub superminority_penalty: Option<f64>,
    pub score_version: Option<u32>,
    pub no_voting_override: Option<bool>,
    pub epoch: Option<u64>,
    pub epoch_slot_height: Option<u64>,
    pub asncity_concentration: Option<f64>,
    pub asncity_concentration_score: Option<f64>,
    pub stake_ratio: Option<f64>,
    pub credit_ratio: Option<f64>,
    pub apy_estimate: Option<f64>,
}

/// Delinquency record from `/validator_delinquencies/{vote_identity}`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Delinquency {
    pub delinquent_minutes: String,
    pub date: String,
}

/// Epoch stake from `/validator_total_stakes/{vote_identity}`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EpochStake {
    pub epoch: u64,
    pub stake: f64,
}

/// Stake changes summary from `/validator_epoch_stakes/{vote_identity}`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StakeChanges {
    pub activating_stake: Option<String>,
    pub activating_count: Option<u64>,
    pub deactivating_stake: Option<String>,
    pub deactivating_count: Option<u64>,
}

/// Detailed stake changes with accounts
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StakeChangesDetailed {
    pub activating: Option<StakeDirection>,
    pub deactivating: Option<StakeDirection>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StakeDirection {
    pub amount: f64,
    pub count: u64,
    pub stake_accounts: Vec<StakeChangeAccount>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StakeChangeAccount {
    pub pubkey: String,
    pub delegated_amount: String,
    pub activation_epoch: u64,
    pub deactivation_epoch: u64,
}

/// Stake account from `/validator_stakes/{vote_identity}`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StakeAccount {
    pub pubkey: String,
    pub delegated_to: Option<String>,
    pub balance: Option<u64>,
    pub credits_observed: Option<u64>,
    pub delegated_stake: Option<u64>,
    pub activation_epoch: Option<u64>,
    pub stake_authority: Option<String>,
    pub withdraw_authority: Option<String>,
    pub rent_exempt_reserve: Option<u64>,
    pub active_stake: Option<u64>,
    pub created_at: Option<String>,
    pub updated_at: Option<String>,
    pub deactivation_epoch: Option<u64>,
}

/// Historic wiz score from `/validator_wiz_scores/{vote_identity}`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HistoricWizScore {
    pub wiz_score: String,
    pub avg_wiz_score: String,
    pub created_at: String,
    pub score_version: u32,
}

/// Vote success from `/validator_vote_success/{vote_identity}`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VoteSuccess {
    pub vote_success: String,
    pub created_at: String,
}

/// Skip rate from `/validator_skip_rate/{vote_identity}`
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SkipRate {
    pub skip_rate: String,
    pub created_at: String,
}