nibiru_std/
wasm.rs

1// crate::wasm.rs
2
3use cosmwasm_std::{QueryRequest, StdResult, WasmQuery};
4
5/// Generic helper for constructing WasmQuery::Smart query requests.
6pub 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
16/// Generic helper for constructing WasmQuery::Raw query requests.
17pub 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        // Different when compared in all forms
77        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        // Now they should match
82        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        // Different when compared in all forms
99        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        // Now they should match
104        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}