bpx_api_client/routes/
account.rs

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