Skip to main content

polyoxide_clob/api/
account.rs

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