bpx_api_client/routes/
account.rs

1use crate::BpxClient;
2use crate::error::{Error, Result};
3use bpx_api_types::account::{
4    AccountMaxBorrow, AccountMaxOrder, AccountMaxWithdrawal, AccountSettings, ConvertDustPayload,
5    MaxOrderQuery, UpdateAccountPayload,
6};
7
8#[doc(hidden)]
9pub const API_ACCOUNT: &str = "/api/v1/account";
10#[doc(hidden)]
11pub const API_ACCOUNT_MAX_BORROW: &str = "/api/v1/account/limits/borrow";
12#[doc(hidden)]
13pub const API_ACCOUNT_MAX_ORDER: &str = "/api/v1/account/limits/order";
14#[doc(hidden)]
15pub const API_ACCOUNT_MAX_WITHDRAWAL: &str = "/api/v1/account/limits/withdrawal";
16#[doc(hidden)]
17pub const API_ACCOUNT_CONVERT_DUST: &str = "/api/v1/account/convertDust";
18
19impl BpxClient {
20    /// Fetches the account's settings.
21    pub async fn get_account(&self) -> Result<AccountSettings> {
22        let url = self.base_url.join(API_ACCOUNT)?;
23        let res = self.get(url).await?;
24        res.json().await.map_err(Into::into)
25    }
26
27    /// Fetches the account's maximum borrow amount for a given symbol.
28    pub async fn get_account_max_borrow(&self, symbol: &str) -> Result<AccountMaxBorrow> {
29        let mut url = self.base_url.join(API_ACCOUNT_MAX_BORROW)?;
30        url.query_pairs_mut().append_pair("symbol", symbol);
31        let res = self.get(url).await?;
32        res.json().await.map_err(Into::into)
33    }
34
35    /// Fetches the account's maximum order amount for a given symbol.
36    pub async fn get_account_max_order(&self, params: MaxOrderQuery) -> Result<AccountMaxOrder> {
37        let mut url = self.base_url.join(API_ACCOUNT_MAX_ORDER)?;
38        let query_string = serde_qs::to_string(&params)
39            .map_err(|e| Error::UrlParseError(e.to_string().into_boxed_str()))?;
40        url.set_query(Some(&query_string));
41        let res = self.get(url).await?;
42        res.json().await.map_err(Into::into)
43    }
44
45    /// Fetches the account's maximum withdrawal amount for a given symbol.
46    pub async fn get_account_max_withdrawal(
47        &self,
48        symbol: &str,
49        auto_borrow: Option<bool>,
50        auto_lend_redeem: Option<bool>,
51    ) -> Result<AccountMaxWithdrawal> {
52        let mut url = self.base_url.join(API_ACCOUNT_MAX_WITHDRAWAL)?;
53        {
54            let mut query = url.query_pairs_mut();
55            query.append_pair("symbol", symbol);
56            if let Some(auto_borrow) = auto_borrow {
57                query.append_pair("autoBorrow", &auto_borrow.to_string());
58            }
59            if let Some(auto_lend_redeem) = auto_lend_redeem {
60                query.append_pair("autoLendRedeem", &auto_lend_redeem.to_string());
61            }
62        }
63        let res = self.get(url).await?;
64        res.json().await.map_err(Into::into)
65    }
66
67    /// Updates the account's settings.
68    pub async fn update_account(&self, payload: UpdateAccountPayload) -> Result<()> {
69        let url = self.base_url.join(API_ACCOUNT)?;
70        self.patch(url, payload).await?;
71
72        Ok(())
73    }
74
75    /// Converts a dust balance to USDC. The balance (including lend) must be less
76    /// than the minimum quantity tradable on the spot order book.
77    pub async fn convert_dust_balance(&self, payload: ConvertDustPayload) -> Result<()> {
78        let url = self.base_url.join(API_ACCOUNT_CONVERT_DUST)?;
79        self.post(url, payload).await?;
80
81        Ok(())
82    }
83}