polymarket 0.1.0

Rust SDK for Polymarket prediction market - CLOB trading, on-chain operations, and WebSocket streaming
Documentation
use chrono::{DateTime, Utc};
use serde::{Deserialize, Deserializer};

pub fn deserialize_clob_token_ids<'de, D>(deserializer: D) -> Result<Vec<String>, D::Error>
where
    D: Deserializer<'de>,
{
    let s: String = Deserialize::deserialize(deserializer)?;
    serde_json::from_str(&s).map_err(serde::de::Error::custom)
}

#[derive(Debug, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Market {
    // Required core fields
    pub id: String,
    pub question: String,
    pub condition_id: String,
    pub slug: String,
    pub resolution_source: String,
    pub end_date: DateTime<Utc>,
    pub start_date: DateTime<Utc>,
    pub description: String,
    pub outcomes: String,
    pub outcome_prices: String,
    pub active: bool,
    pub closed: bool,
    pub created_at: DateTime<Utc>,
    pub updated_at: DateTime<Utc>,
    pub restricted: bool,
    pub enable_order_book: bool,
    pub order_price_min_tick_size: f64,
    pub order_min_size: f64,
    pub has_reviewed_dates: bool,
    #[serde(deserialize_with = "deserialize_clob_token_ids")]
    pub clob_token_ids: Vec<String>,
    pub spread: f64,
    pub approved: bool,

    // Optional fields with defaults
    #[serde(default)]
    pub archived: Option<bool>,
    #[serde(default)]
    pub resolved_by: Option<String>,
    #[serde(rename = "questionID", default)]
    pub question_id: Option<String>,
    #[serde(default)]
    pub volume_num: Option<f64>,
    #[serde(default)]
    pub liquidity_num: Option<f64>,
    #[serde(default)]
    pub end_date_iso: Option<String>,
    #[serde(default)]
    pub start_date_iso: Option<String>,
    #[serde(default)]
    pub volume_clob: Option<f64>,
    #[serde(default)]
    pub liquidity_clob: Option<f64>,
    #[serde(default)]
    pub accepting_orders: Option<bool>,
    #[serde(default)]
    pub accepting_orders_timestamp: Option<DateTime<Utc>>,
    #[serde(default)]
    pub neg_risk: Option<bool>,
    #[serde(default)]
    pub ready: Option<bool>,
    #[serde(default)]
    pub funded: Option<bool>,
    #[serde(default)]
    pub competitive: Option<f64>,
    #[serde(default)]
    pub last_trade_price: Option<f64>,
    #[serde(default)]
    pub best_bid: Option<f64>,
    #[serde(default)]
    pub best_ask: Option<f64>,
    #[serde(default)]
    pub automatically_active: Option<bool>,
    #[serde(default)]
    pub clear_book_on_start: Option<bool>,
    #[serde(default)]
    pub manual_activation: Option<bool>,
    #[serde(default)]
    pub neg_risk_other: Option<bool>,
    #[serde(default)]
    pub uma_resolution_status: Option<String>,
    #[serde(default)]
    pub uma_resolution_statuses: Option<String>,
    #[serde(default)]
    pub pending_deployment: Option<bool>,
    #[serde(default)]
    pub deploying: Option<bool>,
    #[serde(default)]
    pub deploying_timestamp: Option<DateTime<Utc>>,
    #[serde(default)]
    pub event_start_time: Option<DateTime<Utc>>,
    #[serde(default)]
    pub fees_enabled: Option<bool>,

    // Additional optional fields from API
    #[serde(default)]
    pub image: Option<String>,
    #[serde(default)]
    pub icon: Option<String>,
    #[serde(default)]
    pub volume: Option<String>,
    #[serde(default)]
    pub liquidity: Option<String>,
    #[serde(default)]
    pub market_maker_address: Option<String>,
    #[serde(default)]
    pub new: Option<bool>,
    #[serde(default)]
    pub featured: Option<bool>,
    #[serde(default)]
    pub submitted_by: Option<String>,
    #[serde(default)]
    pub volume_24hr: Option<f64>,
    #[serde(default)]
    pub volume_1wk: Option<f64>,
    #[serde(default)]
    pub volume_1mo: Option<f64>,
    #[serde(default)]
    pub volume_1yr: Option<f64>,
    #[serde(default)]
    pub volume_24hr_clob: Option<f64>,
    #[serde(default)]
    pub volume_1wk_clob: Option<f64>,
    #[serde(default)]
    pub volume_1mo_clob: Option<f64>,
    #[serde(default)]
    pub volume_1yr_clob: Option<f64>,
    #[serde(default)]
    pub custom_liveness: Option<f64>,
    #[serde(default)]
    pub cyom: Option<bool>,
    #[serde(default)]
    pub holding_rewards_enabled: Option<bool>,
    #[serde(default)]
    pub pager_duty_notification_enabled: Option<bool>,
    #[serde(default)]
    pub rfq_enabled: Option<bool>,
    #[serde(default)]
    pub rewards_min_size: Option<f64>,
    #[serde(default)]
    pub rewards_max_spread: Option<f64>,
    #[serde(default)]
    pub uma_bond: Option<String>,
    #[serde(default)]
    pub uma_reward: Option<String>,
    #[serde(default)]
    pub one_hour_price_change: Option<f64>,
    #[serde(default)]
    pub one_day_price_change: Option<f64>,
    #[serde(default)]
    pub neg_risk_request_id: Option<String>,
}