polyte_clob/api/
markets.rs

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