koios-sdk 0.1.1

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

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssetInfo {
    pub policy_id: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub asset_name: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub asset_name_ascii: Option<String>,
    pub fingerprint: String,
    pub minting_tx_hash: String,
    pub total_supply: String,
    pub mint_cnt: u64,
    pub burn_cnt: u64,
    pub creation_time: u64,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub minting_tx_metadata: Option<serde_json::Value>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub token_registry_metadata: Option<TokenRegistryMetadata>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub cip68_metadata: Option<HashMap<String, serde_json::Value>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TokenRegistryMetadata {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub description: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub ticker: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub logo: Option<String>,
    pub decimals: u64,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssetAddress {
    pub payment_address: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub stake_address: Option<String>,
    pub quantity: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssetHistory {
    pub policy_id: String,
    pub asset_name: String,
    pub fingerprint: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub minting_txs: Option<Vec<MintingTransaction>>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MintingTransaction {
    pub tx_hash: String,
    pub block_time: u64,
    pub quantity: String,
    pub metadata: Vec<serde_json::Value>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssetSummary {
    pub policy_id: String,
    pub asset_name: String,
    pub fingerprint: String,
    pub total_transactions: u64,
    pub staked_wallets: u64,
    pub unstaked_addresses: u64,
    pub addresses: u64,
    pub active_stake_pct: f64,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PolicyAssetInfo {
    pub asset_name: String,
    pub asset_name_ascii: String,
    pub fingerprint: String,
    pub minting_tx_hash: String,
    pub total_supply: String,
    pub mint_cnt: u64,
    pub burn_cnt: u64,
    pub creation_time: u64,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub minting_tx_metadata: Option<serde_json::Value>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub token_registry_metadata: Option<TokenRegistryMetadata>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PolicyAssetList {
    pub asset_name: String,
    pub fingerprint: String,
    pub total_supply: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub decimals: Option<u64>,
}

impl AssetInfo {
    pub fn new(
        policy_id: String,
        fingerprint: String,
        minting_tx_hash: String,
        total_supply: String,
        mint_cnt: u64,
        burn_cnt: u64,
        creation_time: u64,
    ) -> Self {
        Self {
            policy_id,
            asset_name: None,
            asset_name_ascii: None,
            fingerprint,
            minting_tx_hash,
            total_supply,
            mint_cnt,
            burn_cnt,
            creation_time,
            minting_tx_metadata: None,
            token_registry_metadata: None,
            cip68_metadata: None,
        }
    }
}

impl TokenRegistryMetadata {
    pub fn new(decimals: u64) -> Self {
        Self {
            name: None,
            description: None,
            ticker: None,
            url: None,
            logo: None,
            decimals,
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssetList {
    pub policy_id: String,
    pub asset_name: String,
    pub asset_name_ascii: String,
    pub fingerprint: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssetAddresses {
    pub payment_address: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub stake_address: Option<String>,
    pub quantity: String,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PolicyAssetMint {
    pub asset_name: String,
    pub asset_name_ascii: String,
    pub fingerprint: String,
    pub minting_tx_hash: String,
    pub total_supply: String,
    pub mint_cnt: u64,
    pub burn_cnt: u64,
    pub creation_time: u64,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub minting_tx_metadata: Option<serde_json::Value>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub decimals: Option<u64>,
}

// Implementation blocks
impl PolicyAssetMint {
    pub fn new(
        asset_name: String,
        asset_name_ascii: String,
        fingerprint: String,
        minting_tx_hash: String,
        total_supply: String,
        mint_cnt: u64,
        burn_cnt: u64,
        creation_time: u64,
    ) -> Self {
        Self {
            asset_name,
            asset_name_ascii,
            fingerprint,
            minting_tx_hash,
            total_supply,
            mint_cnt,
            burn_cnt,
            creation_time,
            minting_tx_metadata: None,
            decimals: None,
        }
    }
}

// Implementation blocks
impl AssetTokenRegistry {
    pub fn new(policy_id: String, asset_name: String, asset_name_ascii: String) -> Self {
        Self {
            policy_id,
            asset_name,
            asset_name_ascii,
            ticker: None,
            description: None,
            url: None,
            decimals: None,
            logo: None,
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssetTokenRegistry {
    pub policy_id: String,
    pub asset_name: String,
    pub asset_name_ascii: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub ticker: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub description: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub url: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub decimals: Option<u64>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub logo: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AssetNftAddress {
    pub payment_address: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub stake_address: Option<String>,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PolicyAssetAddresses {
    pub asset_name: String,
    pub payment_address: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub stake_address: Option<String>,
    pub quantity: String,
}