cosmos_client/client/
feegrant.rs

1use crate::error::CosmosClient;
2use crate::error::CosmosClient::{ProstDecodeError, RpcError};
3use cosmos_sdk_proto::cosmos::base::query::v1beta1::PageRequest;
4use cosmos_sdk_proto::cosmos::feegrant::v1beta1::{
5    QueryAllowanceRequest, QueryAllowanceResponse, QueryAllowancesRequest, QueryAllowancesResponse,
6};
7use prost::Message;
8use std::rc::Rc;
9use tendermint::abci::Code;
10use tendermint_rpc::{Client, HttpClient};
11
12pub struct Module {
13    rpc: Rc<HttpClient>,
14}
15
16impl Module {
17    pub fn new(rpc: Rc<HttpClient>) -> Self {
18        Module { rpc }
19    }
20
21    /// # Errors
22    ///
23    /// Will return `Err` if :
24    /// - a prost encode / decode fail
25    /// - the json-rpc return an error code
26    /// - if there is some network error
27    #[allow(clippy::similar_names)]
28    pub async fn allowance(
29        &self,
30        granter: &str,
31        grantee: &str,
32    ) -> Result<QueryAllowanceResponse, CosmosClient> {
33        let query = QueryAllowanceRequest {
34            granter: granter.to_string(),
35            grantee: grantee.to_string(),
36        };
37        let query = self
38            .rpc
39            .abci_query(
40                Some("/cosmos.feegrant.v1beta1.Query/Allowance".to_string()),
41                query.encode_to_vec(),
42                None,
43                false,
44            )
45            .await?;
46
47        if query.code != Code::Ok {
48            return Err(RpcError(query.log));
49        }
50        QueryAllowanceResponse::decode(query.value.as_slice()).map_err(ProstDecodeError)
51    }
52
53    /// # Errors
54    ///
55    /// Will return `Err` if :
56    /// - a prost encode / decode fail
57    /// - the json-rpc return an error code
58    /// - if there is some network error
59    pub async fn allowances(
60        &self,
61        grantee: &str,
62        pagination: Option<PageRequest>,
63    ) -> Result<QueryAllowancesResponse, CosmosClient> {
64        let query = QueryAllowancesRequest {
65            grantee: grantee.to_string(),
66            pagination,
67        };
68        let query = self
69            .rpc
70            .abci_query(
71                Some("/cosmos.feegrant.v1beta1.Query/Allowances".to_string()),
72                query.encode_to_vec(),
73                None,
74                false,
75            )
76            .await?;
77
78        if query.code != Code::Ok {
79            return Err(RpcError(query.log));
80        }
81        QueryAllowancesResponse::decode(query.value.as_slice()).map_err(ProstDecodeError)
82    }
83}