polymarket 0.1.0

Rust SDK for Polymarket prediction market - CLOB trading, on-chain operations, and WebSocket streaming
Documentation
use serde::Deserialize;
use rust_decimal::Decimal;

use crate::clob::OrderSide;
#[derive(Debug, Clone, Deserialize)]
pub struct OrderSummary {
    #[serde(with = "rust_decimal::serde::str")]
    pub price: Decimal,
    #[serde(with = "rust_decimal::serde::str")]
    pub size: Decimal,
}

#[derive(Debug, Clone, serde::Deserialize)]
pub struct BookMessage {
    pub market: String,
    pub asset_id: String,
    pub timestamp: String,
    pub bids: Vec<OrderSummary>,
    pub asks: Vec<OrderSummary>,
    pub hash: String,
}

#[derive(Debug, Clone, serde::Deserialize)]
pub struct PriceChange {
    pub asset_id: String,
    #[serde(with = "rust_decimal::serde::str")]
    pub price: Decimal,
    #[serde(with = "rust_decimal::serde::str")]
    pub size: Decimal,
    pub side: OrderSide,
    pub hash: String,
    #[serde(with = "rust_decimal::serde::str")]
    pub best_bid: Decimal,
    #[serde(with = "rust_decimal::serde::str")]
    pub best_ask: Decimal,
}

#[derive(Debug, Clone, serde::Deserialize)]
pub struct PriceChangeMessage {
    pub market: String,
    pub timestamp: String,
    pub price_changes: Vec<PriceChange>,
}

#[derive(Debug, Clone, serde::Deserialize)]
pub struct TickSizeChangeMessage {
    pub market: String,
    pub asset_id: String,
    pub timestamp: String,
    #[serde(with = "rust_decimal::serde::str")]
    pub old_tick_size: Decimal,
    #[serde(with = "rust_decimal::serde::str")]
    pub new_tick_size: Decimal,
}

#[derive(Debug, Clone, serde::Deserialize)]
pub struct LastTradePriceMessage {
    pub market: String,
    pub asset_id: String,
    pub timestamp: String,
    pub side: OrderSide,
    #[serde(with = "rust_decimal::serde::str")]
    pub price: Decimal,
    #[serde(with = "rust_decimal::serde::str")]
    pub size: Decimal,
    #[serde(with = "rust_decimal::serde::str")]
    pub fee_rate_bps: Decimal,
}

#[derive(Debug, Clone, serde::Deserialize)]
pub struct MakerOrder {
    pub asset_id: String,
    pub order_id: String,
    pub owner: String,
    #[serde(with = "rust_decimal::serde::str")]
    pub matched_amount: Decimal,
    pub outcome: String,
    #[serde(with = "rust_decimal::serde::str")]
    pub price: Decimal,
}

#[derive(Debug, Clone, serde::Deserialize)]
pub enum TradeStatus {
    MATCHED,
    MINED,
    CONFIRMED,
    RETRYING,
    FAILED,
}

#[derive(Debug, Clone, serde::Deserialize)]
pub enum TradeType {
    TRADE,
}

#[derive(Debug, Clone, serde::Deserialize)]
pub struct TradeMessage {
    pub id: String,
    pub market: String,
    pub asset_id: String,
    pub owner: String,
    pub timestamp: String,
    pub last_update: String,
    pub maker_orders: Vec<MakerOrder>,
    pub match_time: String,
    pub outcome: String,
    #[serde(with = "rust_decimal::serde::str")]
    pub price: Decimal,
    #[serde(with = "rust_decimal::serde::str")]
    pub size: Decimal,
    pub side: OrderSide,
    pub status: TradeStatus,
    pub taker_order_id: String,
    pub trade_owner: String,
    pub r#type: TradeType,
}

#[derive(Debug, Clone, serde::Deserialize)]
pub enum OrderType {
    PLACEMENT,
    UPDATE,
    CANCELLATION,
}

#[derive(Debug, Clone, serde::Deserialize)]
pub struct OrderMessage {
    pub id: String,
    pub market: String,
    pub asset_id: String,
    pub timestamp: String,
    pub associate_trades: Option<Vec<String>>,
    pub order_owner: String,
    #[serde(with = "rust_decimal::serde::str")]
    pub original_size: Decimal,
    pub outcome: String,
    pub owner: String,
    #[serde(with = "rust_decimal::serde::str")]
    pub price: Decimal,
    pub side: OrderSide,
    #[serde(with = "rust_decimal::serde::str")]
    pub size_matched: Decimal,
    pub r#type: OrderType,
}

#[derive(Debug, Clone, serde::Deserialize)]
#[serde(tag = "event_type", rename_all = "snake_case")]
pub enum WebSocketMessage {
    Trade(TradeMessage),
    Order(OrderMessage),
    Book(BookMessage),
    PriceChange(PriceChangeMessage),
    TickSizeChange(TickSizeChangeMessage),
    LastTradePrice(LastTradePriceMessage),
}