kujira_std/
querier.rs

1//!    Custom querier implementation for Kujira's chain core bindings
2
3use cosmwasm_std::{Addr, Binary, Deps, DepsMut, QuerierWrapper, QueryRequest, StdResult};
4
5use crate::{
6    denom::Denom,
7    price::HumanPrice,
8    query::{
9        AccountAddressResponse, BankQuery, ExchangeRateResponse, IbcVerifyQuery, IbcVerifyResponse,
10        IcaQuery, KujiraQuery, OracleQuery, SupplyResponse,
11    },
12};
13
14/// This is a helper wrapper to easily use our custom queries
15pub struct KujiraQuerier<'a> {
16    querier: &'a QuerierWrapper<'a, KujiraQuery>,
17}
18
19impl<'a> KujiraQuerier<'a> {
20    pub fn new(querier: &'a QuerierWrapper<'a, KujiraQuery>) -> Self {
21        KujiraQuerier { querier }
22    }
23
24    /// Queries the oracle module for the exchange rate of the specified denom.
25    /// This returns a `HumanPrice`, which is a wrapper around `Decimal` that
26    /// should be normalized before use in calculations.
27    pub fn query_exchange_rate<T: Into<String>>(&self, denom: T) -> StdResult<HumanPrice> {
28        let query = KujiraQuery::Oracle(OracleQuery::ExchangeRate {
29            denom: denom.into(),
30        });
31        let request: QueryRequest<KujiraQuery> = KujiraQuery::into(query);
32        let result: ExchangeRateResponse = self.querier.query(&request)?;
33
34        Ok(result.rate.into())
35    }
36
37    pub fn query_supply_of(&self, denom: Denom) -> StdResult<SupplyResponse> {
38        let query = KujiraQuery::Bank(BankQuery::Supply { denom });
39        let request: QueryRequest<KujiraQuery> = KujiraQuery::into(query);
40        self.querier.query(&request)
41    }
42
43    pub fn inner(&self) -> &QuerierWrapper<'a, KujiraQuery> {
44        self.querier
45    }
46
47    pub fn query_interchain_address(
48        &self,
49        owner: Addr,
50        connection_id: String,
51        account_id: String,
52    ) -> StdResult<AccountAddressResponse> {
53        let query = KujiraQuery::Ica(IcaQuery::AccountAddress {
54            owner,
55            connection_id,
56            account_id,
57        });
58        let request: QueryRequest<KujiraQuery> = KujiraQuery::into(query);
59        let result: AccountAddressResponse = self.querier.query(&request)?;
60
61        Ok(result)
62    }
63
64    // Query for the membership verification
65    #[allow(clippy::too_many_arguments)]
66    pub fn query_verify_membership(
67        &self,
68        connection: String,
69        revision_number: u64,
70        revision_height: u64,
71        proof: Binary,
72        value: Binary,
73        path_prefix: String,
74        path_key: Binary,
75    ) -> StdResult<IbcVerifyResponse> {
76        let query = KujiraQuery::Ibc(IbcVerifyQuery::VerifyMembership {
77            connection,
78            revision_number,
79            revision_height,
80            proof,
81            value,
82            path_prefix,
83            path_key,
84        });
85        let request: QueryRequest<KujiraQuery> = KujiraQuery::into(query);
86        self.querier.query(&request)
87    }
88    // Query for the non-membership verification
89    pub fn query_verify_non_membership(
90        &self,
91        connection: String,
92        revision_number: u64,
93        revision_height: u64,
94        proof: Binary,
95        path_prefix: String,
96        path_key: Binary,
97    ) -> StdResult<IbcVerifyResponse> {
98        let query = KujiraQuery::Ibc(IbcVerifyQuery::VerifyNonMembership {
99            connection,
100            revision_number,
101            revision_height,
102            proof,
103            path_prefix,
104            path_key,
105        });
106        let request: QueryRequest<KujiraQuery> = KujiraQuery::into(query);
107        self.querier.query(&request)
108    }
109}
110
111impl<'a> From<&'a QuerierWrapper<'a, KujiraQuery>> for KujiraQuerier<'a> {
112    fn from(querier: &'a QuerierWrapper<KujiraQuery>) -> Self {
113        KujiraQuerier::new(querier)
114    }
115}
116
117impl<'a> From<&'a Deps<'a, KujiraQuery>> for KujiraQuerier<'a> {
118    fn from(deps: &'a Deps<KujiraQuery>) -> Self {
119        KujiraQuerier::new(&deps.querier)
120    }
121}
122
123impl<'a> From<&'a DepsMut<'a, KujiraQuery>> for KujiraQuerier<'a> {
124    fn from(deps: &'a DepsMut<KujiraQuery>) -> Self {
125        KujiraQuerier::new(&deps.querier)
126    }
127}