terra_rust_api/client/
staking.rs

1use crate::client::staking_types::{Validator, ValidatorDelegation, ValidatorUnbondingDelegation};
2use crate::errors::TerraRustAPIError;
3use crate::staking_types::ValidatorDelegationsV1Response;
4use crate::{LCDResult, Terra};
5
6pub struct Staking<'a> {
7    terra: &'a Terra,
8}
9impl Staking<'_> {
10    pub fn create(terra: &'_ Terra) -> Staking<'_> {
11        Staking { terra }
12    }
13    pub async fn validator(&self, key: &str) -> Result<LCDResult<Validator>, TerraRustAPIError> {
14        //   let url = self.terra.url.to_owned() + "/staking/validators/" + key;
15        Ok(self
16            .terra
17            .send_cmd::<LCDResult<Validator>>("/staking/validators/", Some(key))
18            .await?)
19    }
20    /// Get list of validators
21    pub async fn validators(&self) -> Result<LCDResult<Vec<Validator>>, TerraRustAPIError> {
22        Ok(self
23            .terra
24            .send_cmd::<LCDResult<Vec<Validator>>>("/staking/validators", None)
25            .await?)
26    }
27    /// Get list of validators at a given height
28    pub async fn validators_at_height(
29        &self,
30        height: u64,
31        limit: Option<u64>,
32    ) -> Result<LCDResult<Vec<Validator>>, TerraRustAPIError> {
33        Ok(self
34            .terra
35            .send_cmd::<LCDResult<Vec<Validator>>>(
36                &format!(
37                    "/staking/validators?height={}&limit={}",
38                    height,
39                    limit.unwrap_or(200u64)
40                ),
41                None,
42            )
43            .await?)
44    }
45    pub async fn validator_by_moniker(
46        &self,
47        moniker: &str,
48    ) -> Result<Option<Validator>, TerraRustAPIError> {
49        let lst = self
50            .terra
51            .send_cmd::<LCDResult<Vec<Validator>>>("/staking/validators", None)
52            .await?
53            .result;
54        match lst.iter().find(|&p| p.description.moniker == moniker) {
55            None => Ok(None),
56            Some(v) => Ok(Some(v.to_owned())),
57        }
58    }
59    /// all delegations for a given validator
60    pub async fn validator_delegations(
61        &self,
62        key: &str,
63    ) -> Result<LCDResult<Vec<ValidatorDelegation>>, TerraRustAPIError> {
64        self.terra
65            .send_cmd::<LCDResult<Vec<ValidatorDelegation>>>(
66                &format!("/staking/validators/{}/delegations", key),
67                None,
68            )
69            .await
70    }
71    /// all delegations for a given validator (limit) (new format)
72    pub async fn validator_delegations_limit(
73        &self,
74        key: &str,
75        limit: u64,
76    ) -> Result<ValidatorDelegationsV1Response, TerraRustAPIError> {
77        self.terra
78            .send_cmd::<ValidatorDelegationsV1Response>(
79                &format!(
80                    "/cosmos/staking/v1beta1/validators/{}/delegations?pagination.limit={}",
81                    key, limit
82                ),
83                None,
84            )
85            .await
86    }
87
88    /// all unbondings for a given validator
89    pub async fn validator_unbonding_delegations(
90        &self,
91        key: &str,
92    ) -> Result<LCDResult<Vec<ValidatorUnbondingDelegation>>, TerraRustAPIError> {
93        self.terra
94            .send_cmd::<LCDResult<Vec<ValidatorUnbondingDelegation>>>(
95                &format!("/staking/validators/{}/unbonding_delegations", key),
96                None,
97            )
98            .await
99    }
100}