diff --git a/contracts/cw-ibc-queries/src/contract.rs b/contracts/cw-ibc-queries/src/contract.rs index cbeae68..571daeb 100644 --- a/contracts/cw-ibc-queries/src/contract.rs +++ b/contracts/cw-ibc-queries/src/contract.rs @@ -85,9 +85,8 @@ mod tests { use super::*; use cosmwasm_std::testing::{ - mock_dependencies, mock_env, mock_ibc_channel_close_init, mock_ibc_channel_connect_ack, - mock_ibc_channel_open_init, mock_ibc_channel_open_try, mock_ibc_packet_recv, mock_info, - mock_wasmd_attr, MockApi, MockQuerier, MockStorage, + mock_dependencies, mock_env, mock_ibc_channel_connect_ack, mock_ibc_channel_open_init, + mock_ibc_channel_open_try, mock_info, MockApi, MockQuerier, MockStorage, }; use cosmwasm_std::OwnedDeps; use cw_ibc_query::{APP_ORDER, BAD_APP_ORDER, IBC_APP_VERSION}; @@ -142,67 +141,4 @@ mod tests { let res = ibc_channel_connect(deps.as_mut(), mock_env(), handshake_connect).unwrap(); assert_eq!(0, res.messages.len()); } - - //// TODO - // #[test] - // fn handle_ibc_query_packet() { - // let mut deps = setup(); - - // let channel_id = "channel-123"; - // let account = "acct-123"; - - // // receive a packet for an unregistered channel returns app-level error (not Result::Err) - // let msgs_to_dispatch = vec![BankMsg::Send { - // to_address: "my-friend".into(), - // amount: coins(123456789, "uatom"), - // } - // .into()]; - // let ibc_msg = PacketMsg::Dispatch { - // msgs: msgs_to_dispatch.clone(), - // }; - // let msg = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); - // // this returns an error - // ibc_packet_receive(deps.as_mut(), mock_env(), msg).unwrap_err(); - - // // register the channel - // connect(deps.as_mut(), channel_id, account); - - // // receive a packet for an unregistered channel returns app-level error (not Result::Err) - // let msg = mock_ibc_packet_recv(channel_id, &ibc_msg).unwrap(); - // let res = ibc_packet_receive(deps.as_mut(), mock_env(), msg).unwrap(); - - // // assert app-level success - // let ack: StdAck = from_slice(&res.acknowledgement).unwrap(); - // ack.unwrap(); - - // // and we dispatch the BankMsg via submessage - // assert_eq!(1, res.messages.len()); - // assert_eq!(RECEIVE_DISPATCH_ID, res.messages[0].id); - - // // parse the output, ensuring it matches - // if let CosmosMsg::Wasm(WasmMsg::Execute { - // contract_addr, - // msg, - // funds, - // }) = &res.messages[0].msg - // { - // assert_eq!(account, contract_addr.as_str()); - // assert_eq!(0, funds.len()); - // // parse the message - should callback with proper channel_id - // let rmsg: cw1_whitelist::msg::ExecuteMsg = from_slice(msg).unwrap(); - // assert_eq!( - // rmsg, - // cw1_whitelist::msg::ExecuteMsg::Execute { - // msgs: msgs_to_dispatch - // } - // ); - // } else { - // panic!("invalid return message: {:?}", res.messages[0]); - // } - - // // invalid packet format on registered channel also returns error - // let bad_data = InstantiateMsg { cw1_code_id: 12345 }; - // let msg = mock_ibc_packet_recv(channel_id, &bad_data).unwrap(); - // ibc_packet_receive(deps.as_mut(), mock_env(), msg).unwrap_err(); - // } } diff --git a/contracts/cw-ibc-queries/src/ibc.rs b/contracts/cw-ibc-queries/src/ibc.rs index 52fa11b..febd932 100644 --- a/contracts/cw-ibc-queries/src/ibc.rs +++ b/contracts/cw-ibc-queries/src/ibc.rs @@ -1,8 +1,8 @@ use cosmwasm_std::{ - entry_point, from_slice, to_binary, Deps, DepsMut, Empty, Env, Event, Ibc3ChannelOpenResponse, - IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, IbcChannelOpenMsg, - IbcChannelOpenResponse, IbcPacketAckMsg, IbcPacketReceiveMsg, IbcPacketTimeoutMsg, - IbcReceiveResponse, QueryRequest, StdResult, WasmMsg, + entry_point, from_slice, to_binary, Binary, Deps, DepsMut, Empty, Env, Event, + Ibc3ChannelOpenResponse, IbcBasicResponse, IbcChannelCloseMsg, IbcChannelConnectMsg, + IbcChannelOpenMsg, IbcChannelOpenResponse, IbcPacketAckMsg, IbcPacketReceiveMsg, + IbcPacketTimeoutMsg, IbcReceiveResponse, QueryRequest, StdResult, SystemResult, WasmMsg, }; use cw_ibc_query::{ check_order, check_version, IbcQueryResponse, PacketMsg, ReceiveIbcResponseMsg, StdAck, @@ -87,15 +87,18 @@ pub fn ibc_packet_receive( } // Processes IBC query -fn receive_query( +pub fn receive_query( deps: Deps, msgs: Vec>, ) -> Result { - let mut results = vec![]; + let mut results: Vec = vec![]; for query in msgs { - let res = deps.querier.query(&query)?; - results.push(res); + let res = match deps.querier.raw_query(&to_binary(&query)?) { + SystemResult::Ok(res) => res, + SystemResult::Err(err) => cosmwasm_std::ContractResult::Err(err.to_string()), + }; + results.push(to_binary(&res)?); } let response = IbcQueryResponse { results }; @@ -133,14 +136,14 @@ pub fn ibc_packet_timeout( fn acknowledge_query( deps: DepsMut, env: Env, - caller: String, + channel_id: String, callback: Option, msg: IbcPacketAckMsg, ) -> Result { // store IBC response for later querying from the smart contract?? LATEST_QUERIES.save( deps.storage, - &caller, + &channel_id, &IbcQueryResultResponse { last_update_time: env.block.time, response: msg.clone(), @@ -162,3 +165,41 @@ fn acknowledge_query( None => Ok(IbcBasicResponse::new().add_attribute("action", "acknowledge_ibc_query")), } } + +#[cfg(test)] +mod tests { + use cosmwasm_std::{ + testing::{mock_dependencies, mock_env, mock_ibc_packet_ack}, + BankQuery, IbcAcknowledgement, + }; + + use crate::msg::InstantiateMsg; + + use super::*; + + const CHANNEL: &str = "channel-42"; + + #[test] + fn try_receive_query() { + let deps = mock_dependencies(); + + let res = receive_query( + deps.as_ref(), + vec![QueryRequest::::Bank(BankQuery::AllBalances { + address: String::from("test"), + })], + ); + assert!(res.is_ok()); + } + + #[test] + fn try_acknowledge_query() { + let mut deps = mock_dependencies(); + let env = mock_env(); + + 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); + assert!(res.is_ok()); + } +}