Skip to content

Commit 1e0c97f

Browse files
Generalized querier getter (#318)
* show POC of generalized querier getter * update * fix merge and impl for all envs * Doon't verify mockj error anymore * Fixed test * update `QueryHandler` and WasmQuerier functions * fix smart query URL * fix compile * format and clippy --------- Co-authored-by: Kayanski <kowalski.kowalskin@gmail.com>
1 parent 6c59390 commit 1e0c97f

32 files changed

+228
-260
lines changed

cw-orch-daemon/src/queriers.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,19 @@ macro_rules! cosmos_query {
4747
mod authz;
4848
mod bank;
4949
mod cosmwasm;
50+
mod env;
5051
mod feegrant;
5152
mod gov;
5253
mod ibc;
5354
mod node;
5455
mod staking;
5556

5657
pub use authz::Authz;
57-
pub use bank::{cosmrs_to_cosmwasm_coins, Bank};
58-
pub use cosmwasm::CosmWasm;
58+
pub use bank::{cosmrs_to_cosmwasm_coins, Bank, DaemonBankQuerier};
59+
pub use cosmwasm::{CosmWasm, DaemonWasmQuerier};
5960
pub use feegrant::Feegrant;
6061
pub use ibc::Ibc;
61-
pub use node::Node;
62+
pub use node::{DaemonNodeQuerier, Node};
6263

6364
// this two containt structs that are helpers for the queries
6465
pub use gov::*;

cw-orch-daemon/src/queriers/bank.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::{cosmos_modules, error::DaemonError, Daemon};
22
use cosmrs::proto::cosmos::base::{query::v1beta1::PageRequest, v1beta1::Coin};
33
use cosmwasm_std::StdError;
4-
use cw_orch_core::environment::queriers::bank::{BankQuerier, BankQuerierGetter};
4+
use cw_orch_core::environment::{BankQuerier, Querier, QuerierGetter};
55
use tokio::runtime::Handle;
66
use tonic::transport::Channel;
77

@@ -157,17 +157,17 @@ impl DaemonBankQuerier {
157157
}
158158
}
159159

160-
impl BankQuerierGetter<DaemonError> for Daemon {
161-
type Querier = DaemonBankQuerier;
160+
impl Querier for DaemonBankQuerier {
161+
type Error = DaemonError;
162+
}
162163

163-
fn bank_querier(&self) -> Self::Querier {
164+
impl QuerierGetter<DaemonBankQuerier> for Daemon {
165+
fn querier(&self) -> DaemonBankQuerier {
164166
DaemonBankQuerier::new(self)
165167
}
166168
}
167169

168170
impl BankQuerier for DaemonBankQuerier {
169-
type Error = DaemonError;
170-
171171
fn balance(
172172
&self,
173173
address: impl Into<String>,

cw-orch-daemon/src/queriers/cosmwasm.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::{cosmos_modules, error::DaemonError, Daemon};
22
use cosmrs::proto::cosmos::base::query::v1beta1::PageRequest;
33
use cosmwasm_std::{from_json, to_json_binary, CodeInfoResponse, ContractInfoResponse};
4-
use cw_orch_core::environment::queriers::wasm::{WasmQuerier, WasmQuerierGetter};
4+
use cw_orch_core::environment::{Querier, QuerierGetter, WasmQuerier};
55
use tokio::runtime::Handle;
66
use tonic::transport::Channel;
77

@@ -187,17 +187,17 @@ impl DaemonWasmQuerier {
187187
}
188188
}
189189

190-
impl WasmQuerierGetter<DaemonError> for Daemon {
191-
type Querier = DaemonWasmQuerier;
192-
193-
fn wasm_querier(&self) -> Self::Querier {
190+
impl QuerierGetter<DaemonWasmQuerier> for Daemon {
191+
fn querier(&self) -> DaemonWasmQuerier {
194192
DaemonWasmQuerier::new(self)
195193
}
196194
}
197195

198-
impl WasmQuerier for DaemonWasmQuerier {
196+
impl Querier for DaemonWasmQuerier {
199197
type Error = DaemonError;
198+
}
200199

200+
impl WasmQuerier for DaemonWasmQuerier {
201201
fn code_id_hash(&self, code_id: u64) -> Result<String, Self::Error> {
202202
self.rt_handle
203203
.block_on(CosmWasm::new(self.channel.clone()).code_id_hash(code_id))
@@ -228,7 +228,7 @@ impl WasmQuerier for DaemonWasmQuerier {
228228
Ok(c)
229229
}
230230

231-
fn contract_raw_state(
231+
fn raw_query(
232232
&self,
233233
address: impl Into<String>,
234234
query_data: Vec<u8>,
@@ -240,7 +240,7 @@ impl WasmQuerier for DaemonWasmQuerier {
240240
Ok(response.data)
241241
}
242242

243-
fn contract_smart_state<Q: serde::Serialize, T: serde::de::DeserializeOwned>(
243+
fn smart_query<Q: serde::Serialize, T: serde::de::DeserializeOwned>(
244244
&self,
245245
address: impl Into<String>,
246246
query_data: &Q,

cw-orch-daemon/src/queriers/env.rs

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
use cw_orch_core::environment::{EnvironmentInfo, EnvironmentQuerier};
2+
3+
use crate::Daemon;
4+
5+
impl EnvironmentQuerier for Daemon {
6+
fn env_info(&self) -> EnvironmentInfo {
7+
let state = &self.daemon.sender.daemon_state;
8+
EnvironmentInfo {
9+
chain_id: state.chain_data.chain_id.to_string(),
10+
chain_name: state.chain_data.chain_name.clone(),
11+
deployment_id: state.deployment_id.clone(),
12+
}
13+
}
14+
}

cw-orch-daemon/src/queriers/node.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use cosmrs::{
1111
};
1212
use cosmwasm_std::BlockInfo;
1313
use cw_orch_core::{
14-
environment::queriers::node::{NodeQuerier, NodeQuerierGetter},
14+
environment::{NodeQuerier, Querier, QuerierGetter},
1515
log::query_target,
1616
CwOrchEnvVars,
1717
};
@@ -346,17 +346,17 @@ impl DaemonNodeQuerier {
346346
}
347347
}
348348

349-
impl NodeQuerierGetter<DaemonError> for Daemon {
350-
type Querier = DaemonNodeQuerier;
351-
352-
fn node_querier(&self) -> Self::Querier {
349+
impl QuerierGetter<DaemonNodeQuerier> for Daemon {
350+
fn querier(&self) -> DaemonNodeQuerier {
353351
DaemonNodeQuerier::new(self)
354352
}
355353
}
356354

357-
impl NodeQuerier for DaemonNodeQuerier {
355+
impl Querier for DaemonNodeQuerier {
358356
type Error = DaemonError;
357+
}
359358

359+
impl NodeQuerier for DaemonNodeQuerier {
360360
type Response = CosmTxResponse;
361361

362362
fn latest_block(&self) -> Result<cosmwasm_std::BlockInfo, Self::Error> {

cw-orch-daemon/src/sync/core.rs

+6-39
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,14 @@ use std::{fmt::Debug, sync::Arc, time::Duration};
22

33
use super::super::{sender::Wallet, DaemonAsync};
44
use crate::{
5-
queriers::{DaemonQuerier, Node},
5+
queriers::{DaemonBankQuerier, DaemonNodeQuerier, DaemonQuerier, DaemonWasmQuerier, Node},
66
CosmTxResponse, DaemonBuilder, DaemonError, DaemonState,
77
};
88

9-
use cosmrs::tendermint::Time;
109
use cosmwasm_std::{Addr, Coin};
1110
use cw_orch_core::{
1211
contract::{interface_traits::Uploadable, WasmPath},
13-
environment::{
14-
queriers::QueryHandler, ChainState, EnvironmentInfo, EnvironmentQuerier, TxHandler,
15-
},
12+
environment::{ChainState, DefaultQueriers, QueryHandler, TxHandler},
1613
};
1714
use cw_orch_traits::stargate::Stargate;
1815
use serde::Serialize;
@@ -218,40 +215,10 @@ impl QueryHandler for Daemon {
218215
}
219216
Ok(())
220217
}
221-
222-
fn block_info(&self) -> Result<cosmwasm_std::BlockInfo, DaemonError> {
223-
let block = self
224-
.rt_handle
225-
.block_on(self.query_client::<Node>().latest_block())?;
226-
let since_epoch = block.header.time.duration_since(Time::unix_epoch())?;
227-
let time = cosmwasm_std::Timestamp::from_nanos(since_epoch.as_nanos() as u64);
228-
Ok(cosmwasm_std::BlockInfo {
229-
height: block.header.height.value(),
230-
time,
231-
chain_id: block.header.chain_id.to_string(),
232-
})
233-
}
234-
235-
fn query<
236-
Q: serde::Serialize + std::fmt::Debug,
237-
T: serde::Serialize + serde::de::DeserializeOwned,
238-
>(
239-
&self,
240-
query_msg: &Q,
241-
contract_address: &cosmwasm_std::Addr,
242-
) -> Result<T, Self::Error> {
243-
self.rt_handle
244-
.block_on(self.daemon.query(query_msg, contract_address))
245-
}
246218
}
247219

248-
impl EnvironmentQuerier for Daemon {
249-
fn env_info(&self) -> EnvironmentInfo {
250-
let state = &self.daemon.sender.daemon_state;
251-
EnvironmentInfo {
252-
chain_id: state.chain_data.chain_id.to_string(),
253-
chain_name: state.chain_data.chain_name.clone(),
254-
deployment_id: state.deployment_id.clone(),
255-
}
256-
}
220+
impl DefaultQueriers for Daemon {
221+
type B = DaemonBankQuerier;
222+
type W = DaemonWasmQuerier;
223+
type N = DaemonNodeQuerier;
257224
}

cw-orch-daemon/tests/authz.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ mod tests {
1313
bank::v1beta1::MsgSend,
1414
};
1515
use cosmwasm_std::coins;
16-
use cw_orch_core::environment::{BankQuerier, TxHandler};
16+
use cw_orch_core::environment::{BankQuerier, DefaultQueriers, QueryHandler, TxHandler};
1717
use cw_orch_daemon::{queriers::Authz, Daemon};
1818
use cw_orch_networks::networks::LOCAL_JUNO;
1919
use cw_orch_traits::Stargate;
@@ -138,8 +138,9 @@ mod tests {
138138

139139
// the balance of the grantee whould be 6_000_000 or close
140140

141-
let grantee_balance =
142-
daemon.balance(grantee.clone(), Some(LOCAL_JUNO.gas_denom.to_string()))?;
141+
let grantee_balance = daemon
142+
.bank_querier()
143+
.balance(grantee.clone(), Some(LOCAL_JUNO.gas_denom.to_string()))?;
143144

144145
assert_eq!(grantee_balance.first().unwrap().amount.u128(), 6_000_000);
145146

cw-orch/examples/complex_osmosis_test_tube.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@ use counter_contract::{
44
CounterContract, CounterExecuteMsgFns, CounterQueryMsgFns,
55
};
66

7-
use cw_orch::prelude::bank::BankQuerier;
8-
use cw_orch::prelude::bank::BankQuerierGetter;
9-
use cw_orch::prelude::{CallAs, ContractInstance, OsmosisTestTube};
10-
use cw_orch::prelude::{CwOrchExecute, CwOrchInstantiate, CwOrchUpload};
7+
use cw_orch::prelude::*;
118
use cw_orch_traits::Stargate;
129
use osmosis_std::types::{
1310
cosmos::base::v1beta1::Coin,

cw-orch/examples/complex_testnet_daemon.rs

+1-6
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,7 @@ use counter_contract::{
33
msg::{ExecuteMsg, GetCountResponse, InstantiateMsg, QueryMsg},
44
CounterContract, CounterExecuteMsgFns, CounterQueryMsgFns,
55
};
6-
use cw_orch::prelude::bank::BankQuerier;
7-
use cw_orch::prelude::bank::BankQuerierGetter;
8-
use cw_orch::prelude::{
9-
ContractInstance, CwOrchExecute, CwOrchInstantiate, CwOrchQuery, CwOrchUpload, Daemon,
10-
TxHandler,
11-
};
6+
use cw_orch::prelude::*;
127
use cw_orch_traits::Stargate;
138
use osmosis_std::types::{
149
cosmos::base::v1beta1::Coin,

cw-orch/src/osmosis_test_tube/core.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ use crate::contract::WasmPath;
22
use crate::prelude::Uploadable;
33
use cosmwasm_std::Addr;
44

5-
use cw_orch_core::environment::queriers::bank::{BankQuerier, BankQuerierGetter};
6-
use cw_orch_core::environment::BankSetter;
5+
use cw_orch_core::environment::{BankQuerier, BankSetter, DefaultQueriers};
76
use cw_orch_traits::stargate::Stargate;
87

98
use cosmwasm_std::{Binary, Coin, Uint128};
@@ -33,6 +32,8 @@ use crate::mock::MockState;
3332

3433
pub use osmosis_test_tube;
3534

35+
use super::queriers::bank::OsmosisTestTubeBankQuerier;
36+
3637
/// Wrapper around a osmosis-test-tube [`OsmosisTestApp`](osmosis_test_tube::OsmosisTestApp) backend.
3738
///
3839
/// Stores a local state with a mapping of contract_id -> code_id/address
@@ -269,6 +270,8 @@ impl<S: StateInterface> TxHandler for OsmosisTestTube<S> {
269270
}
270271

271272
impl BankSetter for OsmosisTestTube {
273+
type T = OsmosisTestTubeBankQuerier;
274+
272275
/// It's impossible to set the balance of an address directly in OsmosisTestTub
273276
/// So for this implementation, we use a weird algorithm
274277
fn set_balance(
@@ -304,10 +307,7 @@ impl Stargate for OsmosisTestTube {
304307
pub mod tests {
305308
use cosmwasm_std::{coins, ContractInfoResponse};
306309

307-
use cw_orch_core::environment::queriers::{
308-
bank::{BankQuerier, BankQuerierGetter},
309-
wasm::{WasmQuerier, WasmQuerierGetter},
310-
};
310+
use cw_orch_core::environment::*;
311311
use osmosis_test_tube::Account;
312312

313313
use super::OsmosisTestTube;

cw-orch/src/osmosis_test_tube/queriers/bank.rs

+10-11
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ use std::{cell::RefCell, rc::Rc};
33
use cosmwasm_std::coin;
44
use cw_orch_core::{
55
environment::{
6-
queriers::bank::{BankQuerier, BankQuerierGetter},
7-
StateInterface, TxHandler,
6+
Querier, StateInterface, {BankQuerier, QuerierGetter},
87
},
98
CwEnvError,
109
};
@@ -16,29 +15,29 @@ use crate::osmosis_test_tube::{map_err, OsmosisTestTube};
1615
use osmosis_test_tube::osmosis_std::types::cosmos::bank::v1beta1::{
1716
QueryAllBalancesRequest, QueryBalanceRequest,
1817
};
19-
pub struct MockBankQuerier {
18+
pub struct OsmosisTestTubeBankQuerier {
2019
app: Rc<RefCell<OsmosisTestApp>>,
2120
}
2221

23-
impl MockBankQuerier {
22+
impl OsmosisTestTubeBankQuerier {
2423
fn new<S: StateInterface>(mock: &OsmosisTestTube<S>) -> Self {
2524
Self {
2625
app: mock.app.clone(),
2726
}
2827
}
2928
}
3029

31-
impl<S: StateInterface> BankQuerierGetter<<Self as TxHandler>::Error> for OsmosisTestTube<S> {
32-
type Querier = MockBankQuerier;
30+
impl Querier for OsmosisTestTubeBankQuerier {
31+
type Error = CwEnvError;
32+
}
3333

34-
fn bank_querier(&self) -> Self::Querier {
35-
MockBankQuerier::new(self)
34+
impl<S: StateInterface> QuerierGetter<OsmosisTestTubeBankQuerier> for OsmosisTestTube<S> {
35+
fn querier(&self) -> OsmosisTestTubeBankQuerier {
36+
OsmosisTestTubeBankQuerier::new(self)
3637
}
3738
}
3839

39-
impl BankQuerier for MockBankQuerier {
40-
type Error = CwEnvError;
41-
40+
impl BankQuerier for OsmosisTestTubeBankQuerier {
4241
fn balance(
4342
&self,
4443
address: impl Into<String>,

cw-orch/src/osmosis_test_tube/queriers/env.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
use crate::osmosis_test_tube::OsmosisTestTube;
2-
use cw_orch_core::environment::{EnvironmentInfo, EnvironmentQuerier, QueryHandler};
1+
use cw_orch_core::environment::{
2+
EnvironmentInfo, EnvironmentQuerier, QueryHandler, StateInterface,
3+
};
34

4-
impl EnvironmentQuerier for OsmosisTestTube {
5+
use crate::prelude::OsmosisTestTube;
6+
7+
impl<S: StateInterface> EnvironmentQuerier for OsmosisTestTube<S> {
58
fn env_info(&self) -> EnvironmentInfo {
69
let block = self.block_info().unwrap();
710
let chain_id = block.chain_id;

0 commit comments

Comments
 (0)