Skip to content

Commit 7aa0123

Browse files
Separate Querier and TxHandler (#298)
* Added first queriers * Added bank + Wasm traits * Removed deprecated code * Lint * Format * 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> * Added instantiate2 (#309) * Added instantiate2 * some fixes * Added instantiate2 addr getter * Format * Nits * Merged daemon queriers * Corrected querier in tests * Renamed queriers * fix tests * Fix tests * Renamed trait types * Changed types for osmosis test tube * Feature fix * Removed unused querier traits, adapted all daemon queriers with same structure --------- Co-authored-by: CyberHoward <88450409+CyberHoward@users.noreply.github.com>
1 parent 0570a55 commit 7aa0123

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1958
-946
lines changed

contracts/counter/src/interface.rs

+9-12
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use cw_orch::daemon::queriers::Node;
12
// ANCHOR: custom_interface
23
use cw_orch::{interface, prelude::*};
34

@@ -30,26 +31,22 @@ impl<Chain: CwEnv> Uploadable for CounterContract<Chain> {
3031
// ANCHOR_END: custom_interface
3132

3233
use cw_orch::anyhow::Result;
33-
use cw_orch::prelude::queriers::Node;
3434

3535
// ANCHOR: daemon
3636
impl CounterContract<Daemon> {
3737
/// Deploys the counter contract at a specific block height
3838
pub fn await_launch(&self) -> Result<()> {
3939
let daemon = self.get_chain();
40-
let rt = daemon.rt_handle.clone();
4140

42-
rt.block_on(async {
43-
// Get the node query client, there are a lot of other clients available.
44-
let node = daemon.query_client::<Node>();
45-
let mut latest_block = node.latest_block().await.unwrap();
41+
// Get the node query client, there are a lot of other clients available.
42+
let node: Node = daemon.querier();
43+
let mut latest_block = node.latest_block().unwrap();
4644

47-
while latest_block.header.height.value() < 100 {
48-
// wait for the next block
49-
daemon.next_block().unwrap();
50-
latest_block = node.latest_block().await.unwrap();
51-
}
52-
});
45+
while latest_block.height < 100 {
46+
// wait for the next block
47+
daemon.next_block().unwrap();
48+
latest_block = node.latest_block().unwrap();
49+
}
5350

5451
let contract = CounterContract::new(daemon.clone());
5552

contracts/counter/tests/integration_tests.rs

+4
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ fn count() -> anyhow::Result<()> {
4141
assert_eq!(count1.count, count2.count);
4242
// ANCHOR_END: query
4343

44+
// Or get it manually from the chain
45+
let count3: GetCountResponse = mock.query(&QueryMsg::GetCount {}, &contract.address()?)?;
46+
assert_eq!(count1.count, count3.count);
47+
4448
// Check the count
4549
assert_eq!(count1.count, 2);
4650
// ANCHOR: reset

cw-orch-daemon/src/core.rs

+65-22
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,24 @@
11
use crate::{queriers::CosmWasm, DaemonState};
22

33
use super::{
4-
builder::DaemonAsyncBuilder,
5-
cosmos_modules,
6-
error::DaemonError,
7-
queriers::{DaemonQuerier, Node},
8-
sender::Wallet,
9-
tx_resp::CosmTxResponse,
4+
builder::DaemonAsyncBuilder, cosmos_modules, error::DaemonError, queriers::Node,
5+
sender::Wallet, tx_resp::CosmTxResponse,
106
};
117

128
use cosmrs::{
139
cosmwasm::{MsgExecuteContract, MsgInstantiateContract, MsgMigrateContract},
10+
proto::cosmwasm::wasm::v1::MsgInstantiateContract2,
1411
tendermint::Time,
15-
AccountId, Denom,
12+
AccountId, Any, Denom,
1613
};
17-
use cosmwasm_std::{Addr, Coin};
14+
use cosmwasm_std::{Addr, Binary, Coin};
1815
use cw_orch_core::{
1916
contract::interface_traits::Uploadable,
2017
environment::{ChainState, IndexResponse},
2118
log::transaction_target,
2219
};
2320
use flate2::{write, Compression};
21+
use prost::Message;
2422
use serde::{de::DeserializeOwned, Serialize};
2523
use serde_json::from_str;
2624
use std::{
@@ -78,12 +76,6 @@ impl DaemonAsync {
7876
DaemonAsyncBuilder::default()
7977
}
8078

81-
/// Perform a query with a given query client.
82-
/// See [Querier](crate::queriers) for examples.
83-
pub fn query_client<Querier: DaemonQuerier>(&self) -> Querier {
84-
Querier::new(self.sender.channel())
85-
}
86-
8779
/// Get the channel configured for this DaemonAsync.
8880
pub fn channel(&self) -> Channel {
8981
self.state.grpc_channel.clone()
@@ -162,6 +154,44 @@ impl DaemonAsync {
162154
Ok(result)
163155
}
164156

157+
/// Instantiate a contract.
158+
pub async fn instantiate2<I: Serialize + Debug>(
159+
&self,
160+
code_id: u64,
161+
init_msg: &I,
162+
label: Option<&str>,
163+
admin: Option<&Addr>,
164+
coins: &[Coin],
165+
salt: Binary,
166+
) -> Result<CosmTxResponse, DaemonError> {
167+
let sender = &self.sender;
168+
169+
let init_msg = MsgInstantiateContract2 {
170+
code_id,
171+
label: label.unwrap_or("instantiate_contract").to_string(),
172+
admin: admin.map(Into::into).unwrap_or_default(),
173+
sender: sender.address()?.to_string(),
174+
msg: serde_json::to_vec(&init_msg)?,
175+
funds: proto_parse_cw_coins(coins)?,
176+
salt: salt.to_vec(),
177+
fix_msg: false,
178+
};
179+
180+
let result = sender
181+
.commit_tx_any(
182+
vec![Any {
183+
type_url: "/cosmwasm.wasm.v1.MsgInstantiateContract2".to_string(),
184+
value: init_msg.encode_to_vec(),
185+
}],
186+
None,
187+
)
188+
.await?;
189+
190+
log::info!(target: &transaction_target(), "Instantiation done: {:?}", result.txhash);
191+
192+
Ok(result)
193+
}
194+
165195
/// Query a contract.
166196
pub async fn query<Q: Serialize + Debug, T: Serialize + DeserializeOwned>(
167197
&self,
@@ -198,12 +228,11 @@ impl DaemonAsync {
198228

199229
/// Wait for a given amount of blocks.
200230
pub async fn wait_blocks(&self, amount: u64) -> Result<(), DaemonError> {
201-
let mut last_height = self.query_client::<Node>().block_height().await?;
231+
let mut last_height = Node::new_async(self.channel())._block_height().await?;
202232
let end_height = last_height + amount;
203233

204-
let average_block_speed = self
205-
.query_client::<Node>()
206-
.average_block_speed(Some(0.9))
234+
let average_block_speed = Node::new_async(self.channel())
235+
._average_block_speed(Some(0.9))
207236
.await?;
208237

209238
let wait_time = average_block_speed * amount;
@@ -217,7 +246,7 @@ impl DaemonAsync {
217246
tokio::time::sleep(Duration::from_secs(average_block_speed)).await;
218247

219248
// ping latest block
220-
last_height = self.query_client::<Node>().block_height().await?;
249+
last_height = Node::new_async(self.channel())._block_height().await?;
221250
}
222251
Ok(())
223252
}
@@ -236,7 +265,7 @@ impl DaemonAsync {
236265

237266
/// Get the current block info.
238267
pub async fn block_info(&self) -> Result<cosmwasm_std::BlockInfo, DaemonError> {
239-
let block = self.query_client::<Node>().latest_block().await?;
268+
let block = Node::new_async(self.channel())._latest_block().await?;
240269
let since_epoch = block.header.time.duration_since(Time::unix_epoch())?;
241270
let time = cosmwasm_std::Timestamp::from_nanos(since_epoch.as_nanos() as u64);
242271
Ok(cosmwasm_std::BlockInfo {
@@ -273,8 +302,8 @@ impl DaemonAsync {
273302
let code_id = result.uploaded_code_id().unwrap();
274303

275304
// wait for the node to return the contract information for this upload
276-
let wasm = CosmWasm::new(self.channel());
277-
while wasm.code(code_id).await.is_err() {
305+
let wasm = CosmWasm::new_async(self.channel());
306+
while wasm._code(code_id).await.is_err() {
278307
self.next_block().await?;
279308
}
280309
Ok(result)
@@ -299,3 +328,17 @@ pub(crate) fn parse_cw_coins(
299328
})
300329
.collect::<Result<Vec<_>, DaemonError>>()
301330
}
331+
332+
pub(crate) fn proto_parse_cw_coins(
333+
coins: &[cosmwasm_std::Coin],
334+
) -> Result<Vec<cosmrs::proto::cosmos::base::v1beta1::Coin>, DaemonError> {
335+
coins
336+
.iter()
337+
.map(|cosmwasm_std::Coin { amount, denom }| {
338+
Ok(cosmrs::proto::cosmos::base::v1beta1::Coin {
339+
amount: amount.to_string(),
340+
denom: denom.clone(),
341+
})
342+
})
343+
.collect::<Result<Vec<_>, DaemonError>>()
344+
}

cw-orch-daemon/src/error.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#![allow(missing_docs)]
22

3-
use cosmwasm_std::Coin;
3+
use cosmwasm_std::{Coin, Instantiate2AddressError};
44
use cw_orch_core::CwEnvError;
55
use thiserror::Error;
66

@@ -118,6 +118,10 @@ pub enum DaemonError {
118118
NotEnoughBalance { expected: Coin, current: Coin },
119119
#[error("Can't set the daemon state, it's read-only")]
120120
StateReadOnly,
121+
#[error("You need to pass a runtime to the querier object to do synchronous queries. Use daemon.querier instead")]
122+
QuerierNeedRuntime,
123+
#[error(transparent)]
124+
Instantiate2Error(#[from] Instantiate2AddressError),
121125
}
122126

123127
impl DaemonError {

cw-orch-daemon/src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ pub mod keys;
1818
pub mod live_mock;
1919
mod log;
2020
pub mod queriers;
21-
mod traits;
2221
pub mod tx_broadcaster;
2322
pub mod tx_builder;
2423
pub use self::{builder::*, channel::*, core::*, error::*, state::*, sync::*, tx_resp::*};

cw-orch-daemon/src/live_mock.rs

+28-40
Original file line numberDiff line numberDiff line change
@@ -3,30 +3,29 @@
33
44
use crate::queriers::Bank;
55
use crate::queriers::CosmWasm;
6-
use crate::queriers::DaemonQuerier;
76
use crate::queriers::Staking;
87
use cosmwasm_std::Addr;
98
use cosmwasm_std::AllBalanceResponse;
109
use cosmwasm_std::BalanceResponse;
11-
use cosmwasm_std::Delegation;
12-
use cosmwasm_std::{AllDelegationsResponse, BondedDenomResponse};
13-
1410
use cosmwasm_std::BankQuery;
1511
use cosmwasm_std::Binary;
12+
use cosmwasm_std::Delegation;
1613
use cosmwasm_std::Empty;
1714
use cosmwasm_std::StakingQuery;
15+
use cosmwasm_std::{AllDelegationsResponse, BondedDenomResponse};
16+
use cw_orch_core::environment::BankQuerier;
1817
use ibc_chain_registry::chain::ChainData;
1918
use tokio::runtime::Runtime;
2019
use tonic::transport::Channel;
2120

22-
use std::marker::PhantomData;
23-
use std::str::FromStr;
24-
2521
use cosmwasm_std::testing::{MockApi, MockStorage};
2622
use cosmwasm_std::{
2723
from_json, to_json_binary, Coin, ContractResult, OwnedDeps, Querier, QuerierResult,
2824
QueryRequest, SystemError, SystemResult, Uint128, WasmQuery,
2925
};
26+
use cw_orch_core::environment::WasmQuerier;
27+
use std::marker::PhantomData;
28+
use std::str::FromStr;
3029

3130
use crate::channel::GrpcChannel;
3231

@@ -83,28 +82,28 @@ impl WasmMockQuerier {
8382
pub fn handle_query(&self, request: &QueryRequest<Empty>) -> QuerierResult {
8483
match &request {
8584
QueryRequest::Wasm(x) => {
86-
let querier = CosmWasm::new(self.channel.clone());
85+
let querier = CosmWasm {
86+
channel: self.channel.clone(),
87+
rt_handle: Some(self.runtime.handle().clone()),
88+
};
8789
match x {
8890
WasmQuery::Smart { contract_addr, msg } => {
8991
// We forward the request to the cosmwasm querier
9092

9193
let query_result: Result<Binary, _> = self
9294
.runtime
9395
.block_on(
94-
querier.contract_state(contract_addr.to_string(), msg.to_vec()),
96+
querier._contract_state(contract_addr.to_string(), msg.to_vec()),
9597
)
9698
.map(|query_result| query_result.into());
9799
SystemResult::Ok(ContractResult::from(query_result))
98100
}
99101
WasmQuery::Raw { contract_addr, key } => {
100-
// We forward the request to the cosmwasm querier
102+
// We forward the request to the cosmwasm querie
103+
let query_result = querier
104+
.raw_query(contract_addr.to_string(), key.to_vec())
105+
.map(|query_result| query_result.into());
101106

102-
let query_result = self
103-
.runtime
104-
.block_on(
105-
querier.contract_raw_state(contract_addr.to_string(), key.to_vec()),
106-
)
107-
.map(|query_result| query_result.data.into());
108107
SystemResult::Ok(ContractResult::from(query_result))
109108
}
110109
_ => SystemResult::Err(SystemError::InvalidRequest {
@@ -114,36 +113,25 @@ impl WasmMockQuerier {
114113
}
115114
}
116115
QueryRequest::Bank(x) => {
117-
let querier = Bank::new(self.channel.clone());
116+
let querier = Bank {
117+
channel: self.channel.clone(),
118+
rt_handle: Some(self.runtime.handle().clone()),
119+
};
118120
match x {
119121
BankQuery::Balance { address, denom } => {
120-
let query_result = self
121-
.runtime
122-
.block_on(querier.balance(address, Some(denom.clone())))
123-
.map(|result| {
122+
let query_result =
123+
querier.balance(address, Some(denom.clone())).map(|result| {
124124
to_json_binary(&BalanceResponse {
125-
amount: Coin {
126-
amount: Uint128::from_str(&result[0].amount).unwrap(),
127-
denom: result[0].denom.clone(),
128-
},
125+
amount: result[0].clone(),
129126
})
130127
.unwrap()
131128
});
132129
SystemResult::Ok(ContractResult::from(query_result))
133130
}
134131
BankQuery::AllBalances { address } => {
135-
let query_result = self
136-
.runtime
137-
.block_on(querier.balance(address, None))
138-
.map(|result| AllBalanceResponse {
139-
amount: result
140-
.into_iter()
141-
.map(|c| Coin {
142-
amount: Uint128::from_str(&c.amount).unwrap(),
143-
denom: c.denom,
144-
})
145-
.collect(),
146-
})
132+
let query_result = querier
133+
.balance(address, None)
134+
.map(|result| AllBalanceResponse { amount: result })
147135
.map(|query_result| to_json_binary(&query_result))
148136
.unwrap();
149137
SystemResult::Ok(ContractResult::from(query_result))
@@ -155,12 +143,12 @@ impl WasmMockQuerier {
155143
}
156144
}
157145
QueryRequest::Staking(x) => {
158-
let querier = Staking::new(self.channel.clone());
146+
let querier = Staking::new_async(self.channel.clone());
159147
match x {
160148
StakingQuery::BondedDenom {} => {
161149
let query_result = self
162150
.runtime
163-
.block_on(querier.params())
151+
.block_on(querier._params())
164152
.map(|result| BondedDenomResponse {
165153
denom: result.params.unwrap().bond_denom,
166154
})
@@ -173,7 +161,7 @@ impl WasmMockQuerier {
173161
StakingQuery::AllDelegations { delegator } => {
174162
let query_result = self
175163
.runtime
176-
.block_on(querier.delegator_delegations(delegator, None))
164+
.block_on(querier._delegator_delegations(delegator, None))
177165
.map(|result| AllDelegationsResponse {
178166
delegations: result
179167
.delegation_responses

0 commit comments

Comments
 (0)