From 737233ac4ddc44c022b5e5852e29022d139eff8c Mon Sep 17 00:00:00 2001 From: Jake Hartnell Date: Sat, 6 Aug 2022 05:28:49 -0700 Subject: [PATCH] Simplify, implement receiver contract example --- Cargo.lock | 15 +++ contracts/cw-ibc-queries/examples/schema.rs | 5 +- contracts/cw-ibc-queries/src/contract.rs | 31 ++--- contracts/cw-ibc-queries/src/ibc.rs | 55 +++------ contracts/cw-ibc-queries/src/msg.rs | 14 +-- contracts/cw-ibc-queries/src/state.rs | 14 +-- contracts/cw-ibc-query-receiver/.cargo/config | 5 + contracts/cw-ibc-query-receiver/Cargo.toml | 41 +++++++ contracts/cw-ibc-query-receiver/README.md | 7 ++ .../cw-ibc-query-receiver/examples/schema.rs | 21 ++++ .../cw-ibc-query-receiver/src/contract.rs | 72 +++++++++++ contracts/cw-ibc-query-receiver/src/error.rs | 27 +++++ contracts/cw-ibc-query-receiver/src/lib.rs | 4 + contracts/cw-ibc-query-receiver/src/msg.rs | 20 +++ contracts/cw-ibc-query-receiver/src/state.rs | 13 ++ packages/cw-ibc-query/src/ibc_msg.rs | 4 +- packages/cw-ibc-query/src/lib.rs | 4 +- tests/src/cosmwasm.spec.ts | 114 +++++++++--------- 18 files changed, 317 insertions(+), 149 deletions(-) create mode 100644 contracts/cw-ibc-query-receiver/.cargo/config create mode 100644 contracts/cw-ibc-query-receiver/Cargo.toml create mode 100644 contracts/cw-ibc-query-receiver/README.md create mode 100644 contracts/cw-ibc-query-receiver/examples/schema.rs create mode 100644 contracts/cw-ibc-query-receiver/src/contract.rs create mode 100644 contracts/cw-ibc-query-receiver/src/error.rs create mode 100644 contracts/cw-ibc-query-receiver/src/lib.rs create mode 100644 contracts/cw-ibc-query-receiver/src/msg.rs create mode 100644 contracts/cw-ibc-query-receiver/src/state.rs diff --git a/Cargo.lock b/Cargo.lock index b70eb83..716338e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -172,6 +172,21 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cw-ibc-query-receiver" +version = "0.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-ibc-query", + "cw-storage-plus", + "cw-utils", + "cw1-whitelist", + "schemars", + "serde", + "thiserror", +] + [[package]] name = "cw-storage-plus" version = "0.13.4" diff --git a/contracts/cw-ibc-queries/examples/schema.rs b/contracts/cw-ibc-queries/examples/schema.rs index ada609b..8a7180a 100644 --- a/contracts/cw-ibc-queries/examples/schema.rs +++ b/contracts/cw-ibc-queries/examples/schema.rs @@ -3,8 +3,7 @@ use std::fs::create_dir_all; use cosmwasm_schema::{export_schema, remove_schemas, schema_for}; -use cw_ibc_queries::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; -use cw_ibc_queries::state::IbcQueryResultResponse; +use cw_ibc_queries::msg::{ExecuteMsg, InstantiateMsg}; fn main() { let mut out_dir = current_dir().unwrap(); @@ -13,7 +12,5 @@ fn main() { remove_schemas(&out_dir).unwrap(); export_schema(&schema_for!(ExecuteMsg), &out_dir); - export_schema(&schema_for!(IbcQueryResultResponse), &out_dir); export_schema(&schema_for!(InstantiateMsg), &out_dir); - export_schema(&schema_for!(QueryMsg), &out_dir); } diff --git a/contracts/cw-ibc-queries/src/contract.rs b/contracts/cw-ibc-queries/src/contract.rs index 571daeb..54aa1fa 100644 --- a/contracts/cw-ibc-queries/src/contract.rs +++ b/contracts/cw-ibc-queries/src/contract.rs @@ -1,12 +1,11 @@ use cosmwasm_std::{ - entry_point, to_binary, Deps, DepsMut, Empty, Env, IbcMsg, MessageInfo, QueryRequest, - QueryResponse, Response, StdResult, + entry_point, to_binary, DepsMut, Empty, Env, IbcMsg, MessageInfo, QueryRequest, Response, + StdResult, }; use cw_ibc_query::PacketMsg; use crate::error::ContractError; -use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; -use crate::state::{IbcQueryResultResponse, LATEST_QUERIES}; +use crate::msg::{ExecuteMsg, InstantiateMsg}; // TODO: make configurable? /// packets live one hour @@ -41,13 +40,16 @@ pub fn execute( } pub fn execute_ibc_query( - _deps: DepsMut, + deps: DepsMut, env: Env, _info: MessageInfo, channel_id: String, msgs: Vec>, - callback: Option, + callback: String, ) -> Result { + // validate callback address + deps.api.addr_validate(&callback)?; + // construct a packet to send let packet = PacketMsg::IbcQuery { msgs, callback }; let msg = IbcMsg::SendPacket { @@ -62,23 +64,6 @@ pub fn execute_ibc_query( Ok(res) } -#[entry_point] -pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { - match msg { - QueryMsg::LatestQueryResult { channel_id } => { - to_binary(&query_latest_ibc_query_result(deps, channel_id)?) - } - } -} - -fn query_latest_ibc_query_result( - deps: Deps, - channel_id: String, -) -> StdResult { - let results = LATEST_QUERIES.load(deps.storage, &channel_id)?; - Ok(results.into()) -} - #[cfg(test)] mod tests { use crate::ibc::{ibc_channel_connect, ibc_channel_open}; diff --git a/contracts/cw-ibc-queries/src/ibc.rs b/contracts/cw-ibc-queries/src/ibc.rs index febd932..985233e 100644 --- a/contracts/cw-ibc-queries/src/ibc.rs +++ b/contracts/cw-ibc-queries/src/ibc.rs @@ -5,12 +5,12 @@ use cosmwasm_std::{ IbcPacketTimeoutMsg, IbcReceiveResponse, QueryRequest, StdResult, SystemResult, WasmMsg, }; use cw_ibc_query::{ - check_order, check_version, IbcQueryResponse, PacketMsg, ReceiveIbcResponseMsg, StdAck, - IBC_APP_VERSION, + check_order, check_version, IbcQueryResponse, PacketMsg, ReceiveIbcResponseMsg, + ReceiverExecuteMsg, StdAck, IBC_APP_VERSION, }; use crate::error::ContractError; -use crate::state::{IbcQueryResultResponse, LATEST_QUERIES, PENDING}; +use crate::state::PENDING; // TODO: make configurable? /// packets live one hour @@ -114,13 +114,11 @@ pub fn ibc_packet_ack( env: Env, msg: IbcPacketAckMsg, ) -> Result { - // which local channel was this packet send from - let caller = msg.original_packet.src.channel_id.clone(); // we need to parse the ack based on our request let original_packet: PacketMsg = from_slice(&msg.original_packet.data)?; match original_packet { - PacketMsg::IbcQuery { callback, .. } => acknowledge_query(deps, env, caller, callback, msg), + PacketMsg::IbcQuery { callback, .. } => acknowledge_query(deps, env, callback, msg), } } @@ -134,36 +132,23 @@ pub fn ibc_packet_timeout( } fn acknowledge_query( - deps: DepsMut, - env: Env, - channel_id: String, - callback: Option, + _deps: DepsMut, + _env: Env, + callback: String, msg: IbcPacketAckMsg, ) -> Result { - // store IBC response for later querying from the smart contract?? - LATEST_QUERIES.save( - deps.storage, - &channel_id, - &IbcQueryResultResponse { - last_update_time: env.block.time, - response: msg.clone(), - }, - )?; - match callback { - Some(callback) => { - // Send IBC packet ack message to another contract - let msg = WasmMsg::Execute { - contract_addr: callback.clone(), - msg: to_binary(&ReceiveIbcResponseMsg { msg })?, - funds: vec![], - }; - Ok(IbcBasicResponse::new() - .add_attribute("action", "acknowledge_ibc_query") - .add_attribute("callback_address", callback) - .add_message(msg)) - } - None => Ok(IbcBasicResponse::new().add_attribute("action", "acknowledge_ibc_query")), - } + // Send IBC packet ack message to another contract + let msg = WasmMsg::Execute { + contract_addr: callback.clone(), + msg: to_binary(&ReceiverExecuteMsg::ReceiveIbcResponse( + ReceiveIbcResponseMsg { msg }, + ))?, + funds: vec![], + }; + Ok(IbcBasicResponse::new() + .add_attribute("action", "acknowledge_ibc_query") + .add_attribute("callback_address", callback) + .add_message(msg)) } #[cfg(test)] @@ -199,7 +184,7 @@ mod tests { let ack = IbcAcknowledgement::new([]); let ibc_res = mock_ibc_packet_ack(CHANNEL, &InstantiateMsg {}, ack).unwrap(); - let res = acknowledge_query(deps.as_mut(), env, CHANNEL.to_string(), None, ibc_res); + let res = acknowledge_query(deps.as_mut(), env, String::from("test"), ibc_res); assert!(res.is_ok()); } } diff --git a/contracts/cw-ibc-queries/src/msg.rs b/contracts/cw-ibc-queries/src/msg.rs index 27ea2cc..76f1993 100644 --- a/contracts/cw-ibc-queries/src/msg.rs +++ b/contracts/cw-ibc-queries/src/msg.rs @@ -11,17 +11,9 @@ pub struct InstantiateMsg {} pub enum ExecuteMsg { IbcQuery { channel_id: String, + // Queries to be executed msgs: Vec>, - // Optional callback - callback: Option, + // Callback contract address that implements ReceiveIbcResponseMsg + callback: String, }, } - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] -#[serde(rename_all = "snake_case")] -pub enum QueryMsg { - // TODO need a better way of doing this... - // How many query results do we want to store? Zero? Callbacks only? - // Get latest query - LatestQueryResult { channel_id: String }, -} diff --git a/contracts/cw-ibc-queries/src/state.rs b/contracts/cw-ibc-queries/src/state.rs index d5be572..e272e03 100644 --- a/contracts/cw-ibc-queries/src/state.rs +++ b/contracts/cw-ibc-queries/src/state.rs @@ -1,15 +1,3 @@ -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; - -use cosmwasm_std::{IbcPacketAckMsg, Timestamp}; -use cw_storage_plus::{Item, Map}; +use cw_storage_plus::Item; pub const PENDING: Item = Item::new("pending"); - -#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] -pub struct IbcQueryResultResponse { - /// last block balance was updated (0 is never) - pub last_update_time: Timestamp, - pub response: IbcPacketAckMsg, -} -pub const LATEST_QUERIES: Map<&str, IbcQueryResultResponse> = Map::new("queries"); diff --git a/contracts/cw-ibc-query-receiver/.cargo/config b/contracts/cw-ibc-query-receiver/.cargo/config new file mode 100644 index 0000000..7d1a066 --- /dev/null +++ b/contracts/cw-ibc-query-receiver/.cargo/config @@ -0,0 +1,5 @@ +[alias] +wasm = "build --release --target wasm32-unknown-unknown" +wasm-debug = "build --target wasm32-unknown-unknown" +unit-test = "test --lib" +schema = "run --example schema" diff --git a/contracts/cw-ibc-query-receiver/Cargo.toml b/contracts/cw-ibc-query-receiver/Cargo.toml new file mode 100644 index 0000000..32b9250 --- /dev/null +++ b/contracts/cw-ibc-query-receiver/Cargo.toml @@ -0,0 +1,41 @@ +[package] +name = "cw-ibc-query-receiver" +version = "0.1.0" +authors = ["Ethan Frey ", "Jake Hartnell "] +edition = "2021" +publish = false +license = "Apache-2.0" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[lib] +crate-type = ["cdylib", "rlib"] + +[profile.release] +opt-level = 3 +debug = false +rpath = false +lto = true +debug-assertions = false +codegen-units = 1 +panic = 'abort' +incremental = false +overflow-checks = true + +[features] +# for quicker tests, cargo test --lib +# for more explicit tests, cargo test --features=backtraces +backtraces = ["cosmwasm-std/backtraces"] + +[dependencies] +cw-ibc-query = { path = "../../packages/cw-ibc-query"} +cosmwasm-std = { version = "1.0.0", features = ["iterator", "ibc3"] } +cw-storage-plus = { version = "0.13.4" } +cw-utils = { version = "0.13.4" } +cw1-whitelist = { version = "0.13.4", features = ["library"]} +schemars = "0.8.1" +serde = { version = "1.0.103", default-features = false, features = ["derive"] } +thiserror = { version = "1.0.23" } + +[dev-dependencies] +cosmwasm-schema = { version = "1.0.0" } diff --git a/contracts/cw-ibc-query-receiver/README.md b/contracts/cw-ibc-query-receiver/README.md new file mode 100644 index 0000000..0a89ef8 --- /dev/null +++ b/contracts/cw-ibc-query-receiver/README.md @@ -0,0 +1,7 @@ +# CosmWasm IBC Query Receiver + +An example contract illustrating how to recieve and store the result of an IBC query using `ReceiveIbcResponseMsg`. + +## Workflow + +Requires `cw-ibc-queries` contract to be deployed on the same chain from which it will recieve query results. diff --git a/contracts/cw-ibc-query-receiver/examples/schema.rs b/contracts/cw-ibc-query-receiver/examples/schema.rs new file mode 100644 index 0000000..006643e --- /dev/null +++ b/contracts/cw-ibc-query-receiver/examples/schema.rs @@ -0,0 +1,21 @@ +use std::env::current_dir; +use std::fs::create_dir_all; + +use cosmwasm_schema::{export_schema, remove_schemas, schema_for}; + +use cw_ibc_query_receiver::{ + msg::{ExecuteMsg, InstantiateMsg, QueryMsg}, + state::IbcQueryResultResponse, +}; + +fn main() { + let mut out_dir = current_dir().unwrap(); + out_dir.push("schema"); + create_dir_all(&out_dir).unwrap(); + remove_schemas(&out_dir).unwrap(); + + export_schema(&schema_for!(ExecuteMsg), &out_dir); + export_schema(&schema_for!(InstantiateMsg), &out_dir); + export_schema(&schema_for!(QueryMsg), &out_dir); + export_schema(&schema_for!(IbcQueryResultResponse), &out_dir); +} diff --git a/contracts/cw-ibc-query-receiver/src/contract.rs b/contracts/cw-ibc-query-receiver/src/contract.rs new file mode 100644 index 0000000..b843360 --- /dev/null +++ b/contracts/cw-ibc-query-receiver/src/contract.rs @@ -0,0 +1,72 @@ +use cosmwasm_std::{ + entry_point, to_binary, Deps, DepsMut, Env, IbcPacketAckMsg, MessageInfo, QueryResponse, + Response, StdResult, +}; +use cw_ibc_query::ReceiveIbcResponseMsg; + +use crate::error::ContractError; +use crate::msg::{ExecuteMsg, InstantiateMsg, QueryMsg}; +use crate::state::{IbcQueryResultResponse, LATEST_QUERIES}; + +#[entry_point] +pub fn instantiate( + _deps: DepsMut, + _env: Env, + _info: MessageInfo, + _msg: InstantiateMsg, +) -> StdResult { + // Do nothing for now + Ok(Response::new()) +} + +#[entry_point] +pub fn execute( + deps: DepsMut, + env: Env, + info: MessageInfo, + msg: ExecuteMsg, +) -> Result { + cw_utils::nonpayable(&info)?; + match msg { + ExecuteMsg::ReceiveIbcResponse(ReceiveIbcResponseMsg { msg }) => { + execute_receive(deps, env, info, msg) + } + } +} + +pub fn execute_receive( + deps: DepsMut, + env: Env, + _info: MessageInfo, + msg: IbcPacketAckMsg, +) -> Result { + // which local channel was this packet send from + let channel_id = msg.original_packet.src.channel_id.clone(); + // store IBC response for later querying from the smart contract?? + LATEST_QUERIES.save( + deps.storage, + &channel_id, + &IbcQueryResultResponse { + last_update_time: env.block.time, + response: msg, + }, + )?; + Ok(Response::default()) +} + +#[entry_point] +pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { + match msg { + QueryMsg::LatestQueryResult { channel_id } => { + to_binary(&query_latest_ibc_query_result(deps, channel_id)?) + } + } +} + +fn query_latest_ibc_query_result( + deps: Deps, + channel_id: String, +) -> StdResult { + let results = LATEST_QUERIES.load(deps.storage, &channel_id)?; + Ok(results) +} diff --git a/contracts/cw-ibc-query-receiver/src/error.rs b/contracts/cw-ibc-query-receiver/src/error.rs new file mode 100644 index 0000000..973c27f --- /dev/null +++ b/contracts/cw-ibc-query-receiver/src/error.rs @@ -0,0 +1,27 @@ +use thiserror::Error; + +use cosmwasm_std::StdError; +use cw_utils::{ParseReplyError, PaymentError}; + +use cw_ibc_query::SimpleIcaError; + +#[derive(Error, Debug, PartialEq)] +pub enum ContractError { + #[error("{0}")] + Std(#[from] StdError), + + #[error("{0}")] + ParseReply(#[from] ParseReplyError), + + #[error("{0}")] + Payment(#[from] PaymentError), + + #[error("{0}")] + SimpleIca(#[from] SimpleIcaError), + + #[error("Cannot register over an existing channel")] + ChannelAlreadyRegistered, + + #[error("Invalid reply id")] + InvalidReplyId, +} diff --git a/contracts/cw-ibc-query-receiver/src/lib.rs b/contracts/cw-ibc-query-receiver/src/lib.rs new file mode 100644 index 0000000..a5abdbb --- /dev/null +++ b/contracts/cw-ibc-query-receiver/src/lib.rs @@ -0,0 +1,4 @@ +pub mod contract; +pub mod error; +pub mod msg; +pub mod state; diff --git a/contracts/cw-ibc-query-receiver/src/msg.rs b/contracts/cw-ibc-query-receiver/src/msg.rs new file mode 100644 index 0000000..a84ff79 --- /dev/null +++ b/contracts/cw-ibc-query-receiver/src/msg.rs @@ -0,0 +1,20 @@ +use cw_ibc_query::ReceiveIbcResponseMsg; +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +/// Just needs to know the code_id of a reflect contract to spawn sub-accounts +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct InstantiateMsg {} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum ExecuteMsg { + ReceiveIbcResponse(ReceiveIbcResponseMsg), +} + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +#[serde(rename_all = "snake_case")] +pub enum QueryMsg { + // Get latest query + LatestQueryResult { channel_id: String }, +} diff --git a/contracts/cw-ibc-query-receiver/src/state.rs b/contracts/cw-ibc-query-receiver/src/state.rs new file mode 100644 index 0000000..73e9af9 --- /dev/null +++ b/contracts/cw-ibc-query-receiver/src/state.rs @@ -0,0 +1,13 @@ +use schemars::JsonSchema; +use serde::{Deserialize, Serialize}; + +use cosmwasm_std::{IbcPacketAckMsg, Timestamp}; +use cw_storage_plus::Map; + +#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] +pub struct IbcQueryResultResponse { + /// last block balance was updated (0 is never) + pub last_update_time: Timestamp, + pub response: IbcPacketAckMsg, +} +pub const LATEST_QUERIES: Map<&str, IbcQueryResultResponse> = Map::new("queries"); diff --git a/packages/cw-ibc-query/src/ibc_msg.rs b/packages/cw-ibc-query/src/ibc_msg.rs index 17b5a75..451232c 100644 --- a/packages/cw-ibc-query/src/ibc_msg.rs +++ b/packages/cw-ibc-query/src/ibc_msg.rs @@ -12,7 +12,7 @@ use serde::{Deserialize, Serialize}; pub enum PacketMsg { IbcQuery { msgs: Vec>, - callback: Option, + callback: String, }, } @@ -94,7 +94,7 @@ impl ReceiveIbcResponseMsg { /// The actual receiver should include this variant in the larger ExecuteMsg enum #[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)] #[serde(rename_all = "snake_case")] -enum ReceiverExecuteMsg { +pub enum ReceiverExecuteMsg { ReceiveIbcResponse(ReceiveIbcResponseMsg), } diff --git a/packages/cw-ibc-query/src/lib.rs b/packages/cw-ibc-query/src/lib.rs index d6e7017..3d65697 100644 --- a/packages/cw-ibc-query/src/lib.rs +++ b/packages/cw-ibc-query/src/lib.rs @@ -4,7 +4,9 @@ mod ibc_msg; use cosmwasm_std::IbcOrder; pub use crate::checks::{check_order, check_version, SimpleIcaError}; -pub use crate::ibc_msg::{IbcQueryResponse, PacketMsg, ReceiveIbcResponseMsg, StdAck}; +pub use crate::ibc_msg::{ + IbcQueryResponse, PacketMsg, ReceiveIbcResponseMsg, ReceiverExecuteMsg, StdAck, +}; pub const IBC_APP_VERSION: &str = "simple-ica-v1"; pub const APP_ORDER: IbcOrder = IbcOrder::Unordered; diff --git a/tests/src/cosmwasm.spec.ts b/tests/src/cosmwasm.spec.ts index f2f3f91..9fe9123 100644 --- a/tests/src/cosmwasm.spec.ts +++ b/tests/src/cosmwasm.spec.ts @@ -16,14 +16,15 @@ let osmosisIds: Record = {}; test.before(async (t) => { console.debug("Upload contracts to wasmd..."); const wasmContracts = { - controller: "./internal/cw_ibc_queries.wasm", + querier: "./internal/cw_ibc_queries.wasm", + receiver: "./internal/cw_ibc_query_receiver.wasm", }; const wasmSign = await setupWasmClient(); wasmIds = await setupContracts(wasmSign, wasmContracts); console.debug("Upload contracts to osmosis..."); const osmosisContracts = { - host: "./internal/cw_ibc_queries.wasm", + querier: "./internal/cw_ibc_queries.wasm", }; const osmosisSign = await setupOsmosisClient(); osmosisIds = await setupContracts(osmosisSign, osmosisContracts); @@ -36,40 +37,41 @@ test.serial("set up channel with ibc-queries contract", async (t) => { const wasmClient = await setupWasmClient(); const { contractAddress: wasmCont } = await wasmClient.sign.instantiate( wasmClient.senderAddress, - wasmIds.controller, + wasmIds.querier, {}, - "simple controller", + "simple querier", "auto" ); t.truthy(wasmCont); - const { ibcPortId: controllerPort } = await wasmClient.sign.getContract(wasmCont); - t.log(`Controller Port: ${controllerPort}`); - assert(controllerPort); + const { ibcPortId: wasmQuerierPort } = await wasmClient.sign.getContract(wasmCont); + t.log(`Querier Port: ${wasmQuerierPort}`); + assert(wasmQuerierPort); - // instantiate ica host on osmosis + // instantiate ica querier on osmosis const osmoClient = await setupOsmosisClient(); - const { contractAddress: osmoHost } = await osmoClient.sign.instantiate( + const { contractAddress: osmoQuerier } = await osmoClient.sign.instantiate( osmoClient.senderAddress, - osmosisIds.host, + osmosisIds.querier, {}, - "simple host", + "simple querier", "auto" ); - t.truthy(osmoHost); - const { ibcPortId: hostPort } = await osmoClient.sign.getContract(osmoHost); - t.log(`Host Port: ${hostPort}`); - assert(hostPort); + t.truthy(osmoQuerier); + const { ibcPortId: osmoQuerierPort } = await osmoClient.sign.getContract(osmoQuerier); + t.log(`Querier Port: ${osmoQuerierPort}`); + assert(osmoQuerierPort); const [src, dest] = await setup(wasmd, osmosis); const link = await Link.createWithNewConnections(src, dest); - await link.createChannel("A", controllerPort, hostPort, Order.ORDER_UNORDERED, IbcVersion); + await link.createChannel("A", wasmQuerierPort, osmoQuerierPort, Order.ORDER_UNORDERED, IbcVersion); }); interface SetupInfo { wasmClient: CosmWasmSigner; osmoClient: CosmWasmSigner; - wasmController: string; - osmoHost: string; + wasmQuerier: string; + osmoQuerier: string; + wasmQueryReceiver: string; link: Link; ics20: { wasm: string; @@ -82,34 +84,50 @@ interface SetupInfo { } async function demoSetup(): Promise { - // instantiate ica controller on wasmd + // instantiate ica querier on wasmd const wasmClient = await setupWasmClient(); - const { contractAddress: wasmController } = await wasmClient.sign.instantiate( + const { contractAddress: wasmQuerier } = await wasmClient.sign.instantiate( wasmClient.senderAddress, - wasmIds.controller, + wasmIds.querier, {}, "IBC Queries contract", "auto" ); - const { ibcPortId: controllerPort } = await wasmClient.sign.getContract(wasmController); - assert(controllerPort); + const { ibcPortId: wasmQuerierPort } = await wasmClient.sign.getContract(wasmQuerier); + assert(wasmQuerierPort); - // instantiate ica host on osmosis + // instantiate ibc query receiver on wasmd + const { contractAddress: wasmQueryReceiver } = await wasmClient.sign.instantiate( + wasmClient.senderAddress, + wasmIds.receiver, + {}, + "IBC Query receiver contract", + "auto" + ); + assert(wasmQueryReceiver); + + // instantiate ica querier on osmosis const osmoClient = await setupOsmosisClient(); - const { contractAddress: osmoHost } = await osmoClient.sign.instantiate( + const { contractAddress: osmoQuerier } = await osmoClient.sign.instantiate( osmoClient.senderAddress, - osmosisIds.host, + osmosisIds.querier, {}, "IBC Queries contract", "auto" ); - const { ibcPortId: hostPort } = await osmoClient.sign.getContract(osmoHost); - assert(hostPort); + const { ibcPortId: osmoQuerierPort } = await osmoClient.sign.getContract(osmoQuerier); + assert(osmoQuerierPort); // create a connection and channel for simple-ica const [src, dest] = await setup(wasmd, osmosis); const link = await Link.createWithNewConnections(src, dest); - const channelInfo = await link.createChannel("A", controllerPort, hostPort, Order.ORDER_UNORDERED, IbcVersion); + const channelInfo = await link.createChannel( + "A", + wasmQuerierPort, + osmoQuerierPort, + Order.ORDER_UNORDERED, + IbcVersion + ); const channelIds = { wasm: channelInfo.src.channelId, osmo: channelInfo.src.channelId, @@ -126,8 +144,9 @@ async function demoSetup(): Promise { return { wasmClient, osmoClient, - wasmController, - osmoHost, + wasmQuerier, + osmoQuerier, + wasmQueryReceiver, link, ics20, channelIds, @@ -135,12 +154,12 @@ async function demoSetup(): Promise { } test.serial("query remote chain", async (t) => { - const { osmoClient, wasmClient, wasmController, link, channelIds } = await demoSetup(); + const { osmoClient, wasmClient, wasmQuerier, link, channelIds, wasmQueryReceiver } = await demoSetup(); // Use IBC queries to query info from the remote contract const ibcQuery = await wasmClient.sign.execute( wasmClient.senderAddress, - wasmController, + wasmQuerier, { ibc_query: { channel_id: channelIds.wasm, @@ -153,6 +172,7 @@ test.serial("query remote chain", async (t) => { }, }, ], + callback: wasmQueryReceiver, }, }, "auto" @@ -163,9 +183,8 @@ test.serial("query remote chain", async (t) => { const info = await link.relayAll(); console.log(info); console.log(fromUtf8(info.acksFromB[0].acknowledgement)); - // assertPacketsFromA(info1, 1, true); - const result = await wasmClient.sign.queryContractSmart(wasmController, { + const result = await wasmClient.sign.queryContractSmart(wasmQueryReceiver, { latest_query_result: { channel_id: channelIds.wasm, }, @@ -174,29 +193,4 @@ test.serial("query remote chain", async (t) => { console.log(result); console.log(fromUtf8(fromBase64(result.response.acknowledgement.data))); t.truthy(result); - - // // Use IBC queries to query info from the remote contract - // const ibcQuery = await wasmClient.sign.execute( - // wasmClient.senderAddress, - // wasmController, - // { - // ibc_query: { - // channel_id: channelIds.wasm, - // msgs: [ - // { - // wasm: { - // smart: { - // msg: toBase64(toUtf8(JSON.stringify({ latest_query_result: { channel_id: channelIds.osmo } }))), - // contract_addr: osmoHost, - // }, - // }, - // }, - // ], - // }, - // }, - // "auto" - // ); - // // relay this over - // const info = await link.relayAll(); - // assertPacketsFromA(info, 1, true); });