polyte_clob/api/
orders.rs

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