polyte_clob/api/
orders.rs

1use reqwest::Client;
2use serde::{Deserialize, Serialize};
3use url::Url;
4
5use crate::{
6    error::Result,
7    request::{AuthMode, Request},
8    signer::Signer,
9    types::{Credentials, SignedOrder},
10    wallet::Wallet,
11};
12
13/// Orders namespace for order-related operations
14#[derive(Clone)]
15pub struct Orders {
16    pub(crate) client: Client,
17    pub(crate) base_url: Url,
18    pub(crate) wallet: Wallet,
19    pub(crate) credentials: Credentials,
20    pub(crate) signer: Signer,
21    pub(crate) chain_id: u64,
22}
23
24impl Orders {
25    /// List user's orders
26    pub fn list(&self) -> Request<Vec<OpenOrder>> {
27        Request::get(
28            self.client.clone(),
29            self.base_url.clone(),
30            "/data/orders",
31            AuthMode::L2 {
32                address: self.wallet.address(),
33                credentials: self.credentials.clone(),
34                signer: self.signer.clone(),
35            },
36            self.chain_id,
37        )
38    }
39
40    /// Cancel an order
41    pub fn cancel(&self, order_id: impl Into<String>) -> CancelOrderRequest {
42        CancelOrderRequest {
43            client: self.client.clone(),
44            base_url: self.base_url.clone(),
45            auth: AuthMode::L2 {
46                address: self.wallet.address(),
47                credentials: self.credentials.clone(),
48                signer: self.signer.clone(),
49            },
50            chain_id: self.chain_id,
51            order_id: order_id.into(),
52        }
53    }
54}
55
56/// Request builder for canceling an order
57pub struct CancelOrderRequest {
58    client: Client,
59    base_url: Url,
60    auth: AuthMode,
61    chain_id: u64,
62    order_id: String,
63}
64
65impl CancelOrderRequest {
66    /// Execute the cancel request
67    pub async fn send(self) -> Result<CancelResponse> {
68        #[derive(serde::Serialize)]
69        struct CancelRequest {
70            #[serde(rename = "orderID")]
71            order_id: String,
72        }
73
74        let request = CancelRequest {
75            order_id: self.order_id,
76        };
77
78        Request::delete(
79            self.client,
80            self.base_url,
81            "/order",
82            self.auth,
83            self.chain_id,
84        )
85        .body(&request)?
86        .send()
87        .await
88    }
89}
90
91/// Open order from API
92#[derive(Debug, Clone, Serialize, Deserialize)]
93#[serde(rename_all(deserialize = "camelCase"))]
94pub struct OpenOrder {
95    pub id: String,
96    pub market: String,
97    pub asset_id: String,
98    #[serde(flatten)]
99    pub order: SignedOrder,
100    pub status: String,
101    pub created_at: String,
102    pub updated_at: Option<String>,
103}
104
105/// Response from posting an order
106#[derive(Debug, Clone, Serialize, Deserialize)]
107#[serde(rename_all(deserialize = "camelCase"))]
108pub struct OrderResponse {
109    pub success: bool,
110    pub error_msg: Option<String>,
111    pub order_id: Option<String>,
112    #[serde(default)]
113    pub transaction_hashes: Vec<String>,
114}
115
116/// Response from canceling an order
117#[derive(Debug, Clone, Serialize, Deserialize)]
118#[serde(rename_all(deserialize = "camelCase"))]
119pub struct CancelResponse {
120    pub success: bool,
121    pub error_msg: Option<String>,
122}