terra_rust_api/client/
staking.rs1use 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 Ok(self
16 .terra
17 .send_cmd::<LCDResult<Validator>>("/staking/validators/", Some(key))
18 .await?)
19 }
20 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 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 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 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 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}