Skip to main content

bpx_api_client/routes/
vault.rs

1use crate::error::Result;
2
3use bpx_api_types::vault::{
4    Vault, VaultHistory, VaultHistoryParams, VaultMintRequest, VaultRedeem,
5    VaultRedeemCancelRequest, VaultRedeemRequest,
6};
7
8use crate::BpxClient;
9
10#[doc(hidden)]
11pub const API_VAULTS: &str = "/api/v1/vaults";
12#[doc(hidden)]
13pub const API_VAULT_MINT: &str = "/api/v1/vault/mint";
14#[doc(hidden)]
15pub const API_VAULT_REDEEM: &str = "/api/v1/vault/redeem";
16#[doc(hidden)]
17pub const API_VAULT_PENDING_REDEEMS: &str = "/api/v1/vault/redeems/pending";
18#[doc(hidden)]
19pub const API_VAULTS_HISTORY: &str = "/api/v1/vaults/history";
20
21impl BpxClient {
22    /// Fetches information about all available vaults on the exchange.
23    pub async fn get_vaults(&self) -> Result<Vec<Vault>> {
24        let url = self.base_url.join(API_VAULTS)?;
25        let res = self.get(url).await?;
26        res.json().await.map_err(Into::into)
27    }
28
29    /// Mints vault tokens by depositing an asset into a vault.
30    pub async fn vault_mint(&self, request: VaultMintRequest) -> Result<()> {
31        let url = self.base_url.join(API_VAULT_MINT)?;
32        let res = self.post(url, request).await?;
33        let _ = res.bytes().await?;
34        Ok(())
35    }
36
37    /// Submits a request to redeem vault tokens for USDC.
38    pub async fn vault_redeem(&self, request: VaultRedeemRequest) -> Result<()> {
39        let url = self.base_url.join(API_VAULT_REDEEM)?;
40        let res = self.post(url, request).await?;
41        let _ = res.bytes().await?;
42        Ok(())
43    }
44
45    /// Cancels a pending redeem request for a vault.
46    pub async fn vault_redeem_cancel(&self, request: VaultRedeemCancelRequest) -> Result<()> {
47        let url = self.base_url.join(API_VAULT_REDEEM)?;
48        let res = self.delete(url, request).await?;
49        let _ = res.bytes().await?;
50        Ok(())
51    }
52
53    /// Fetches pending redeem requests for a vault.
54    pub async fn get_vault_pending_redeems(&self, vault_id: u32) -> Result<Vec<VaultRedeem>> {
55        let mut url = self.base_url.join(API_VAULT_PENDING_REDEEMS)?;
56        url.query_pairs_mut()
57            .append_pair("vaultId", &vault_id.to_string());
58        let res = self.get(url).await?;
59        res.json().await.map_err(Into::into)
60    }
61
62    /// Fetches historical vault data (NAV, equity, circulating supply).
63    pub async fn get_vault_history(&self, params: VaultHistoryParams) -> Result<Vec<VaultHistory>> {
64        let query_string = serde_qs::to_string(&params)
65            .map_err(|e| crate::error::Error::UrlParseError(e.to_string().into_boxed_str()))?;
66        let mut url = self.base_url.join(API_VAULTS_HISTORY)?;
67        url.set_query(Some(&query_string));
68        let res = self.get(url).await?;
69        res.json().await.map_err(Into::into)
70    }
71}