1use cosmwasm_std::{QueryRequest, StdResult, WasmQuery};
4
5pub fn wasm_query_smart<CosmosMsg>(
7 contract: impl Into<String>,
8 msg: &impl crate::proto::NibiruProstMsg,
9) -> StdResult<QueryRequest<CosmosMsg>> {
10 Ok(QueryRequest::Wasm(WasmQuery::Smart {
11 contract_addr: contract.into(),
12 msg: msg.to_binary(),
13 }))
14}
15
16pub fn wasm_query_raw<CosmosMsg>(
18 contract: impl Into<String>,
19 key: &str,
20) -> StdResult<QueryRequest<CosmosMsg>> {
21 Ok(QueryRequest::Wasm(WasmQuery::Raw {
22 contract_addr: contract.into(),
23 key: key.as_bytes().into(),
24 }))
25}
26
27#[cfg(test)]
28mod tests {
29 use prost::Message;
30
31 use super::*;
32 use crate::proto::{
33 cosmos::{bank, base::v1beta1::Coin},
34 nibiru::{self, perp},
35 NibiruProstMsg,
36 };
37
38 #[test]
39 fn test_wasm_query_smart() -> anyhow::Result<()> {
40 let proto_msg = nibiru::perp::QueryMarketsRequest { versioned: false };
41 let contract: &str = "mock_contract_addr";
42 let query_req =
43 wasm_query_smart::<cosmwasm_std::Empty>(contract, &proto_msg)?;
44
45 match query_req {
46 QueryRequest::Wasm(WasmQuery::Smart {
47 contract_addr,
48 msg: msg_bz,
49 }) => {
50 assert_eq!(contract_addr, contract, "{msg_bz:?}");
51 assert_eq!(msg_bz, proto_msg.to_binary(), "{msg_bz:?}");
52 }
53 _ => return Err(anyhow::anyhow!("failed to parse wasm query")),
54 }
55
56 Ok(())
57 }
58
59 #[test]
60 fn proto_msgs_encode() {
61 let coin = Coin {
62 denom: "nibi".into(),
63 amount: "420".into(),
64 };
65 let mut msg_0a = bank::v1beta1::MsgSend {
66 from_address: "from".into(),
67 to_address: "to".into(),
68 amount: vec![coin.clone()],
69 };
70 let msg_0b = bank::v1beta1::MsgSend {
71 from_address: "from".into(),
72 to_address: "to".into(),
73 amount: vec![],
74 };
75
76 assert_ne!(msg_0a, msg_0b);
78 assert_ne!(msg_0a.encode_to_vec(), msg_0b.encode_to_vec());
79 assert_ne!(msg_0a.to_binary(), msg_0b.to_binary());
80
81 msg_0a.amount = vec![];
83 assert_eq!(msg_0a.to_binary(), msg_0b.to_binary());
84
85 let sender = "sender".to_string();
86 let pair = "pair".to_string();
87 let msg_1a = perp::MsgAddMargin {
88 sender: sender.clone(),
89 pair: pair.clone(),
90 margin: None,
91 };
92 let mut msg_1b = perp::MsgAddMargin {
93 sender,
94 pair,
95 margin: Some(coin),
96 };
97
98 assert_ne!(msg_1a, msg_1b);
100 assert_ne!(msg_1a.encode_to_vec(), msg_1b.encode_to_vec());
101 assert_ne!(msg_1a.to_binary(), msg_1b.to_binary());
102
103 msg_1b.margin = None;
105 assert_eq!(msg_1a.to_binary(), msg_1b.to_binary());
106 }
107
108 #[test]
109 fn test_wasm_query_raw() -> anyhow::Result<()> {
110 let query_req =
111 wasm_query_raw::<cosmwasm_std::Empty>("contract", "key")?;
112 match query_req {
113 QueryRequest::Wasm(WasmQuery::Raw { contract_addr, key }) => {
114 assert_eq!(contract_addr, "contract");
115 assert_eq!(key, "key".as_bytes());
116 }
117 _ => return Err(anyhow::anyhow!("failed to parse wasm query")),
118 }
119 Ok(())
120 }
121}