koios-sdk 0.1.1

A Rust SDK for the Koios Cardano API
Documentation
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DrepInfo {
    pub drep_id: String,
    pub hex: String,
    pub has_script: bool,
    pub registered: bool,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub deposit: Option<String>,
    pub active: bool,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub expires_epoch_no: Option<u64>,
    pub amount: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_hash: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DrepEpochSummary {
    pub epoch_no: u64,
    pub amount: String,
    pub dreps: u64,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DrepMetadata {
    pub drep_id: String,
    pub hex: String,
    pub has_script: bool,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_hash: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_json: Option<serde_json::Value>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub bytes: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub warning: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub language: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub comment: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub is_valid: Option<bool>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DrepUpdate {
    pub drep_id: String,
    pub hex: String,
    pub has_script: bool,
    pub update_tx_hash: String,
    pub cert_index: u64,
    pub block_time: u64,
    pub action: DrepAction,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub deposit: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_hash: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_json: Option<serde_json::Value>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum DrepAction {
    Updated,
    Registered,
    Deregistered,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DrepVote {
    pub proposal_id: String,
    pub proposal_tx_hash: String,
    pub proposal_index: u64,
    pub vote_tx_hash: String,
    pub block_time: u64,
    pub vote: Vote,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_hash: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum Vote {
    Yes,
    No,
    Abstain,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProposalList {
    pub block_time: u64,
    pub proposal_id: String,
    pub proposal_tx_hash: String,
    pub proposal_index: u64,
    pub proposal_type: ProposalType,
    pub proposal_description: serde_json::Value,
    pub deposit: String,
    pub return_address: String,
    pub proposed_epoch: u64,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub ratified_epoch: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub enacted_epoch: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub dropped_epoch: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub expired_epoch: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub expiration: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_hash: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_json: Option<serde_json::Value>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_comment: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_language: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_is_valid: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub withdrawal: Option<ProposalWithdrawal>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub param_proposal: Option<serde_json::Value>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ProposalType {
    ParameterChange,
    HardForkInitiation,
    TreasuryWithdrawals,
    NoConfidence,
    NewCommittee,
    NewConstitution,
    InfoAction,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProposalWithdrawal {
    pub stake_address: String,
    pub amount: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProposalVote {
    pub block_time: u64,
    pub voter_role: VoterRole,
    pub voter_id: String,
    pub voter_hex: String,
    pub voter_has_script: bool,
    pub vote: Vote,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_hash: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum VoterRole {
    ConstitutionalCommittee,
    DRep,
    SPO,
}

// Fix for CommitteeInfo voting power
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CommitteeInfo {
    pub proposal_id: String,
    pub proposal_tx_hash: String,
    pub proposal_index: u64,
    pub quorum_numerator: u64,
    pub quorum_denominator: u64,
    pub members: Vec<CommitteeMember>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CommitteeMember {
    pub status: CommitteeMemberStatus,
    pub cc_cold_hex: String,
    pub cc_cold_has_script: bool,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub cc_hot_hex: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub cc_hot_has_script: Option<bool>,
    pub expiration_epoch: u64,
}

#[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum CommitteeMemberStatus {
    Authorized,
    NotAuthorized,
    Resigned,
}

// Implementation blocks for key types
impl DrepInfo {
    pub fn new(
        drep_id: String,
        hex: String,
        has_script: bool,
        registered: bool,
        active: bool,
        amount: String,
    ) -> Self {
        Self {
            drep_id,
            hex,
            has_script,
            registered,
            deposit: None,
            active,
            expires_epoch_no: None,
            amount,
            meta_url: None,
            meta_hash: None,
        }
    }
}

impl ProposalList {
    pub fn new(
        block_time: u64,
        proposal_id: String,
        proposal_tx_hash: String,
        proposal_index: u64,
        proposal_type: ProposalType,
        proposal_description: serde_json::Value,
        deposit: String,
        return_address: String,
        proposed_epoch: u64,
    ) -> Self {
        Self {
            block_time,
            proposal_id,
            proposal_tx_hash,
            proposal_index,
            proposal_type,
            proposal_description,
            deposit,
            return_address,
            proposed_epoch,
            ratified_epoch: None,
            enacted_epoch: None,
            dropped_epoch: None,
            expired_epoch: None,
            expiration: None,
            meta_url: None,
            meta_hash: None,
            meta_json: None,
            meta_comment: None,
            meta_language: None,
            meta_is_valid: None,
            withdrawal: None,
            param_proposal: None,
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DrepHistory {
    pub drep_id: String,
    pub epoch_no: u64,
    pub amount: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CommitteeVotes {
    pub proposal_id: String,
    pub proposal_tx_hash: String,
    pub proposal_index: u64,
    pub vote_tx_hash: String,
    pub block_time: u64,
    pub vote: Vote,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_hash: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VoterProposalList {
    pub block_time: u64,
    pub proposal_id: String,
    pub proposal_tx_hash: String,
    pub proposal_index: u64,
    pub proposal_type: ProposalType,
    pub proposal_description: serde_json::Value,
    pub deposit: String,
    pub return_address: String,
    pub proposed_epoch: u64,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub ratified_epoch: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub enacted_epoch: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub dropped_epoch: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub expired_epoch: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub expiration: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_hash: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_json: Option<serde_json::Value>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_comment: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_language: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub meta_is_valid: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub withdrawal: Option<ProposalWithdrawal>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub param_proposal: Option<serde_json::Value>,
}

// Implementation blocks
impl DrepHistory {
    pub fn new(drep_id: String, epoch_no: u64, amount: String) -> Self {
        Self {
            drep_id,
            epoch_no,
            amount,
        }
    }
}

impl VoterProposalList {
    pub fn new(
        block_time: u64,
        proposal_id: String,
        proposal_tx_hash: String,
        proposal_index: u64,
        proposal_type: ProposalType,
        proposal_description: serde_json::Value,
        deposit: String,
        return_address: String,
        proposed_epoch: u64,
    ) -> Self {
        Self {
            block_time,
            proposal_id,
            proposal_tx_hash,
            proposal_index,
            proposal_type,
            proposal_description,
            deposit,
            return_address,
            proposed_epoch,
            ratified_epoch: None,
            enacted_epoch: None,
            dropped_epoch: None,
            expired_epoch: None,
            expiration: None,
            meta_url: None,
            meta_hash: None,
            meta_json: None,
            meta_comment: None,
            meta_language: None,
            meta_is_valid: None,
            withdrawal: None,
            param_proposal: None,
        }
    }
}