Skip to main content

polyoxide_clob/api/
orders.rs

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