1#[macro_export]
2macro_rules! contract_helper {
3 ($contract_helper:ident, $contract_helper_unchecked:ident, $execute_msg:ident) => {
4 #[cosmwasm_schema::cw_serde]
5 pub struct $contract_helper(cosmwasm_std::Addr);
6
7 #[cosmwasm_schema::cw_serde]
8 pub struct $contract_helper_unchecked(String);
9
10 impl $contract_helper_unchecked {
11 pub fn new(addr: String) -> Self {
12 Self(addr)
13 }
14
15 pub fn check(
16 &self,
17 api: &dyn cosmwasm_std::Api,
18 ) -> cosmwasm_std::StdResult<$contract_helper> {
19 let addr = api.addr_validate(&self.0)?;
20 Ok($contract_helper(addr))
21 }
22 }
23
24 impl $contract_helper {
25 pub fn addr(&self) -> cosmwasm_std::Addr {
26 self.0.clone()
27 }
28
29 pub fn call(
30 &self,
31 msg: impl Into<$execute_msg>,
32 funds: Vec<cosmwasm_std::Coin>,
33 ) -> cosmwasm_std::StdResult<cosmwasm_std::CosmosMsg> {
34 let msg = cosmwasm_std::to_binary(&msg.into())?;
35 Ok(cosmwasm_std::WasmMsg::Execute {
36 contract_addr: self.addr().into(),
37 msg,
38 funds,
39 }
40 .into())
41 }
42 }
43
44 impl From<$contract_helper> for $contract_helper_unchecked {
45 fn from(h: $contract_helper) -> Self {
46 Self(h.0.to_string())
47 }
48 }
49 };
50}
51
52#[cfg(test)]
53pub mod tests {
54 use cosmwasm_std::testing::MockApi;
55 use cosmwasm_std::Empty;
56
57 contract_helper!(TestHelper, TestHelperUnchecked, Empty);
58
59 const HELPER_ADDR: &str = "test_helper";
60
61 #[test]
62 fn test_new_and_check_for_unchecked() {
63 let api = MockApi::default();
64 let helper = TestHelperUnchecked::new(HELPER_ADDR.to_string());
65
66 let checked_helper = helper.check(&api).unwrap();
67
68 assert_eq!(helper.0, checked_helper.0.to_string())
69 }
70
71 #[test]
72 fn test_from_checked_for_unchecked() {
73 let api = MockApi::default();
74 let helper = TestHelperUnchecked::new(HELPER_ADDR.to_string());
75
76 let checked_helper = helper.check(&api).unwrap();
77
78 assert_eq!(helper, TestHelperUnchecked::from(checked_helper))
79 }
80
81 #[test]
82 fn test_addr_for_checked() {
83 let api = MockApi::default();
84 let helper = TestHelperUnchecked::new(HELPER_ADDR.to_string())
85 .check(&api)
86 .unwrap();
87
88 assert_eq!(helper.addr().to_string(), HELPER_ADDR)
89 }
90}