polyte_clob/ws/
user.rs

1//! User channel message types.
2//!
3//! The user channel provides real-time order and trade updates for authenticated users.
4
5use serde::{Deserialize, Serialize};
6
7/// Maker order in a trade
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct MakerOrder {
10    /// Order ID
11    pub order_id: String,
12    /// Maker address
13    pub maker_address: String,
14    /// Matched amount
15    pub matched_amount: String,
16    /// Fee rate
17    pub fee_rate_bps: Option<String>,
18    /// Asset ID
19    pub asset_id: String,
20    /// Price
21    pub price: String,
22}
23
24/// Trade status
25#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
26#[serde(rename_all = "UPPERCASE")]
27pub enum TradeStatus {
28    /// Trade matched
29    Matched,
30    /// Trade mined on chain
31    Mined,
32    /// Trade confirmed
33    Confirmed,
34    /// Trade retrying
35    Retrying,
36    /// Trade failed
37    Failed,
38}
39
40/// Trade message - user trade update
41#[derive(Debug, Clone, Serialize, Deserialize)]
42pub struct TradeMessage {
43    /// Event type (always "trade")
44    pub event_type: String,
45    /// Trade ID
46    pub id: String,
47    /// Asset ID (token ID)
48    pub asset_id: String,
49    /// Market condition ID
50    pub market: String,
51    /// Outcome (YES or NO)
52    pub outcome: String,
53    /// Trade price
54    pub price: String,
55    /// Trade size
56    pub size: String,
57    /// Trade side (BUY or SELL)
58    pub side: String,
59    /// Trade status
60    pub status: TradeStatus,
61    /// Taker order ID
62    pub taker_order_id: String,
63    /// Maker orders involved in the trade
64    pub maker_orders: Vec<MakerOrder>,
65    /// Trade owner address
66    pub owner: Option<String>,
67    /// Transaction hash (when mined/confirmed)
68    pub transaction_hash: Option<String>,
69    /// Timestamp
70    pub timestamp: String,
71}
72
73/// Order event type
74#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
75#[serde(rename_all = "UPPERCASE")]
76pub enum OrderEventType {
77    /// New order placement
78    Placement,
79    /// Order updated (partial fill)
80    Update,
81    /// Order cancelled
82    Cancellation,
83}
84
85/// Order message - user order update
86#[derive(Debug, Clone, Serialize, Deserialize)]
87pub struct OrderMessage {
88    /// Event type (always "order")
89    pub event_type: String,
90    /// Order ID
91    pub id: String,
92    /// Asset ID (token ID)
93    pub asset_id: String,
94    /// Market condition ID
95    pub market: String,
96    /// Outcome (YES or NO)
97    pub outcome: String,
98    /// Order price
99    pub price: String,
100    /// Order side (BUY or SELL)
101    pub side: String,
102    /// Original order size
103    pub original_size: String,
104    /// Size matched so far
105    pub size_matched: String,
106    /// Order event type
107    #[serde(rename = "type")]
108    pub order_type: OrderEventType,
109    /// Order owner address
110    pub order_owner: Option<String>,
111    /// Timestamp
112    pub timestamp: String,
113}
114
115/// User channel message types
116#[derive(Debug, Clone)]
117pub enum UserMessage {
118    /// Trade update
119    Trade(TradeMessage),
120    /// Order update
121    Order(OrderMessage),
122}
123
124impl UserMessage {
125    /// Parse a user channel message from JSON
126    pub fn from_json(json: &str) -> Result<Self, serde_json::Error> {
127        #[derive(Deserialize)]
128        struct RawMessage {
129            event_type: String,
130        }
131
132        let raw: RawMessage = serde_json::from_str(json)?;
133        match raw.event_type.as_str() {
134            "trade" => Ok(UserMessage::Trade(serde_json::from_str(json)?)),
135            "order" => Ok(UserMessage::Order(serde_json::from_str(json)?)),
136            _ => Err(serde::de::Error::custom(format!(
137                "Unknown user event type: {}",
138                raw.event_type
139            ))),
140        }
141    }
142}