1use 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
14pub 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 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 #[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 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}