cosmos_client/client/
upgrade.rs

1use crate::error::CosmosClient;
2use crate::error::CosmosClient::{ProstDecodeError, RpcError};
3use cosmos_sdk_proto::cosmos::upgrade::v1beta1::{
4    QueryAppliedPlanResponse, QueryCurrentPlanRequest, QueryCurrentPlanResponse,
5    QueryModuleVersionsRequest, QueryModuleVersionsResponse, QueryUpgradedConsensusStateRequest,
6    QueryUpgradedConsensusStateResponse,
7};
8use prost::Message;
9use std::rc::Rc;
10use tendermint::abci::Code;
11use tendermint_rpc::{Client, HttpClient};
12
13pub struct Module {
14    rpc: Rc<HttpClient>,
15}
16
17impl Module {
18    pub fn new(rpc: Rc<HttpClient>) -> Self {
19        Module { rpc }
20    }
21
22    /// # Errors
23    ///
24    /// Will return `Err` if :
25    /// - a prost encode / decode fail
26    /// - the json-rpc return an error code
27    /// - if there is some network error
28    pub async fn current_plan(&self) -> Result<QueryCurrentPlanResponse, CosmosClient> {
29        let query = QueryCurrentPlanRequest {};
30        let query = self
31            .rpc
32            .abci_query(
33                Some("/cosmos.upgrade.v1beta1.Query/CurrentPlan".to_string()),
34                query.encode_to_vec(),
35                None,
36                false,
37            )
38            .await?;
39
40        if query.code != Code::Ok {
41            return Err(RpcError(query.log));
42        }
43        QueryCurrentPlanResponse::decode(query.value.as_slice()).map_err(ProstDecodeError)
44    }
45
46    /// # Errors
47    ///
48    /// Will return `Err` if :
49    /// - a prost encode / decode fail
50    /// - the json-rpc return an error code
51    /// - if there is some network error
52    pub async fn applied_plan(
53        &self,
54        height: i64,
55    ) -> Result<QueryAppliedPlanResponse, CosmosClient> {
56        let query = QueryAppliedPlanResponse { height };
57        let query = self
58            .rpc
59            .abci_query(
60                Some("/cosmos.upgrade.v1beta1.Query/AppliedPlan".to_string()),
61                query.encode_to_vec(),
62                None,
63                false,
64            )
65            .await?;
66
67        if query.code != Code::Ok {
68            return Err(RpcError(query.log));
69        }
70        QueryAppliedPlanResponse::decode(query.value.as_slice()).map_err(ProstDecodeError)
71    }
72
73    /// # Errors
74    ///
75    /// Will return `Err` if :
76    /// - a prost encode / decode fail
77    /// - the json-rpc return an error code
78    /// - if there is some network error
79    pub async fn upgrade_consensus_state(
80        &self,
81        last_height: i64,
82    ) -> Result<QueryUpgradedConsensusStateResponse, CosmosClient> {
83        let query = QueryUpgradedConsensusStateRequest { last_height };
84        let query = self
85            .rpc
86            .abci_query(
87                Some("/cosmos.upgrade.v1beta1.Query/UpgradedConsensusState".to_string()),
88                query.encode_to_vec(),
89                None,
90                false,
91            )
92            .await?;
93
94        if query.code != Code::Ok {
95            return Err(RpcError(query.log));
96        }
97        QueryUpgradedConsensusStateResponse::decode(query.value.as_slice())
98            .map_err(ProstDecodeError)
99    }
100
101    /// # Errors
102    ///
103    /// Will return `Err` if :
104    /// - a prost encode / decode fail
105    /// - the json-rpc return an error code
106    /// - if there is some network error
107    pub async fn module_versions(
108        &self,
109        module_name: &str,
110    ) -> Result<QueryModuleVersionsResponse, CosmosClient> {
111        let query = QueryModuleVersionsRequest {
112            module_name: module_name.to_string(),
113        };
114        let query = self
115            .rpc
116            .abci_query(
117                Some("/cosmos.upgrade.v1beta1.Query/ModuleVersions".to_string()),
118                query.encode_to_vec(),
119                None,
120                false,
121            )
122            .await?;
123
124        if query.code != Code::Ok {
125            return Err(RpcError(query.log));
126        }
127        QueryModuleVersionsResponse::decode(query.value.as_slice()).map_err(ProstDecodeError)
128    }
129}