Skip to main content

polyoxide_clob/api/
account.rs

1use alloy::primitives::Address;
2use polyoxide_core::QueryBuilder;
3use reqwest::Client;
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6use url::Url;
7
8use crate::{
9    account::{Credentials, Signer, Wallet},
10    request::{AuthMode, Request},
11    types::OrderSide,
12};
13
14/// Account API namespace for account-related operations
15#[derive(Clone)]
16pub struct AccountApi {
17    pub(crate) client: Client,
18    pub(crate) base_url: Url,
19    pub(crate) wallet: Wallet,
20    pub(crate) credentials: Credentials,
21    pub(crate) signer: Signer,
22    pub(crate) chain_id: u64,
23}
24
25impl AccountApi {
26    /// Get balance and allowance for a token
27    pub fn balance_allowance(
28        &self,
29        token_id: impl Into<String>,
30    ) -> Request<BalanceAllowanceResponse> {
31        Request::get(
32            self.client.clone(),
33            self.base_url.clone(),
34            "/balance-allowance",
35            AuthMode::L2 {
36                address: self.wallet.clone().address(),
37                credentials: self.credentials.clone(),
38                signer: self.signer.clone(),
39            },
40            self.chain_id,
41        )
42        .query("token_id", token_id.into())
43    }
44
45    pub fn usdc_balance(&self) -> Request<BalanceAllowanceResponse> {
46        Request::get(
47            self.client.clone(),
48            self.base_url.clone(),
49            "/balance-allowance",
50            AuthMode::L2 {
51                address: self.wallet.clone().address(),
52                credentials: self.credentials.clone(),
53                signer: self.signer.clone(),
54            },
55            self.chain_id,
56        )
57        .query("asset_type", "COLLATERAL")
58        .query("signature_type", 1)
59    }
60
61    /// Get trades
62    pub fn trades(&self) -> Request<Vec<Trade>> {
63        Request::get(
64            self.client.clone(),
65            self.base_url.clone(),
66            "/trades",
67            AuthMode::L2 {
68                address: self.wallet.clone().address(),
69                credentials: self.credentials.clone(),
70                signer: self.signer.clone(),
71            },
72            self.chain_id,
73        )
74    }
75}
76
77/// Trade information
78#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct Trade {
80    pub id: String,
81    pub taker_order_id: String,
82    pub market: String,
83    pub asset_id: String,
84    pub side: OrderSide,
85    pub size: String,
86    pub fee_rate_bps: String,
87    pub price: String,
88    pub status: String,
89    pub match_time: String,
90    #[serde(default)]
91    pub last_update: Option<String>,
92    pub outcome: String,
93    #[serde(default)]
94    pub bucket_index: Option<u32>,
95    pub owner: Address,
96    pub transaction_hash: String,
97}
98
99/// Balance and allowance response
100#[derive(Debug, Clone, Serialize, Deserialize)]
101pub struct BalanceAllowanceResponse {
102    pub balance: String,
103    pub allowances: HashMap<Address, String>,
104}