polyte_clob/api/
markets.rs

1use polyte_core::QueryBuilder;
2use reqwest::Client;
3use serde::{Deserialize, Serialize};
4use url::Url;
5
6use crate::{
7    request::{AuthMode, Request},
8    types::OrderSide,
9};
10
11/// Markets namespace for market-related operations
12#[derive(Clone)]
13pub struct Markets {
14    pub(crate) client: Client,
15    pub(crate) base_url: Url,
16    pub(crate) chain_id: u64,
17}
18
19impl Markets {
20    /// Get a market by condition ID
21    pub fn get(&self, condition_id: impl Into<String>) -> Request<Market> {
22        Request::get(
23            self.client.clone(),
24            self.base_url.clone(),
25            format!("/markets/{}", urlencoding::encode(&condition_id.into())),
26            AuthMode::None,
27            self.chain_id,
28        )
29    }
30
31    /// List all markets
32    pub fn list(&self) -> Request<ListMarketsResponse> {
33        Request::get(
34            self.client.clone(),
35            self.base_url.clone(),
36            "/markets",
37            AuthMode::None,
38            self.chain_id,
39        )
40    }
41
42    /// Get order book for a token
43    pub fn order_book(&self, token_id: impl Into<String>) -> Request<OrderBook> {
44        Request::get(
45            self.client.clone(),
46            self.base_url.clone(),
47            "/book",
48            AuthMode::None,
49            self.chain_id,
50        )
51        .query("token_id", token_id.into())
52    }
53
54    /// Get price for a token and side
55    pub fn price(&self, token_id: impl Into<String>, side: OrderSide) -> Request<PriceResponse> {
56        Request::get(
57            self.client.clone(),
58            self.base_url.clone(),
59            "/price",
60            AuthMode::None,
61            self.chain_id,
62        )
63        .query("token_id", token_id.into())
64        .query("side", side.to_string())
65    }
66
67    /// Get midpoint price for a token
68    pub fn midpoint(&self, token_id: impl Into<String>) -> Request<MidpointResponse> {
69        Request::get(
70            self.client.clone(),
71            self.base_url.clone(),
72            "/midpoint",
73            AuthMode::None,
74            self.chain_id,
75        )
76        .query("token_id", token_id.into())
77    }
78}
79
80/// Market information
81#[derive(Debug, Clone, Serialize, Deserialize)]
82pub struct Market {
83    pub condition_id: String,
84    pub question_id: String,
85    pub tokens: Vec<MarketToken>,
86    pub rewards: Option<serde_json::Value>,
87    pub minimum_order_size: f64,
88    pub minimum_tick_size: f64,
89    pub description: String,
90    pub category: Option<String>,
91    pub end_date_iso: Option<String>,
92    pub question: String,
93    pub active: bool,
94    pub closed: bool,
95    pub archived: bool,
96    pub neg_risk: Option<bool>,
97    pub neg_risk_market_id: Option<String>,
98    pub enable_order_book: Option<bool>,
99}
100
101/// Markets list response
102#[derive(Debug, Clone, Serialize, Deserialize)]
103pub struct ListMarketsResponse {
104    pub data: Vec<Market>,
105    pub next_cursor: Option<String>,
106}
107
108/// Market token (outcome)
109#[derive(Debug, Clone, Serialize, Deserialize)]
110pub struct MarketToken {
111    pub token_id: Option<String>,
112    pub outcome: String,
113    pub price: Option<f64>,
114    pub winner: Option<bool>,
115}
116
117/// Order book level (price and size)
118#[derive(Debug, Clone, Serialize, Deserialize)]
119pub struct OrderLevel {
120    pub price: String,
121    pub size: String,
122}
123
124/// Order book data
125#[derive(Debug, Clone, Serialize, Deserialize)]
126pub struct OrderBook {
127    pub market: String,
128    pub asset_id: String,
129    pub bids: Vec<OrderLevel>,
130    pub asks: Vec<OrderLevel>,
131    pub timestamp: u64,
132    pub hash: String,
133}
134
135/// Price response
136#[derive(Debug, Clone, Serialize, Deserialize)]
137pub struct PriceResponse {
138    pub price: String,
139}
140
141/// Midpoint price response
142#[derive(Debug, Clone, Serialize, Deserialize)]
143pub struct MidpointResponse {
144    pub mid: String,
145}