1use cosmwasm_schema::cw_serde;
2use cosmwasm_std::{Addr, Binary, WasmMsg};
3
4#[cw_serde]
5pub enum Admin {
6 Address { addr: String },
7 Instantiator {},
8}
9
10#[cw_serde]
11pub struct ContractInstantiateInfo {
12 pub code_id: u64,
13 pub msg: Binary,
14 pub admin: Option<Admin>,
15 pub label: String,
16}
17
18impl ContractInstantiateInfo {
19 pub fn into_wasm_msg(self, instantiator: Addr) -> WasmMsg {
20 WasmMsg::Instantiate {
21 admin: self.admin.map(|admin| match admin {
22 Admin::Address { addr } => addr,
23 Admin::Instantiator {} => instantiator.into_string(),
24 }),
25 code_id: self.code_id,
26 msg: self.msg,
27 label: self.label,
28 funds: vec![],
29 }
30 }
31}
32
33#[cfg(test)]
34mod tests {
35 use cosmwasm_std::{to_json_binary, Addr, WasmMsg};
36
37 use super::*;
38
39 #[test]
40 fn test_instantiate_admin_none() {
41 let no_admin = ContractInstantiateInfo {
42 code_id: 42,
43 msg: to_json_binary("foo").unwrap(),
44 admin: None,
45 label: "bar".to_string(),
46 };
47 assert_eq!(
48 no_admin.into_wasm_msg(Addr::unchecked("ekez")),
49 WasmMsg::Instantiate {
50 admin: None,
51 code_id: 42,
52 msg: to_json_binary("foo").unwrap(),
53 funds: vec![],
54 label: "bar".to_string()
55 }
56 )
57 }
58
59 #[test]
60 fn test_instantiate_admin_addr() {
61 let no_admin = ContractInstantiateInfo {
62 code_id: 42,
63 msg: to_json_binary("foo").unwrap(),
64 admin: Some(Admin::Address {
65 addr: "core".to_string(),
66 }),
67 label: "bar".to_string(),
68 };
69 assert_eq!(
70 no_admin.into_wasm_msg(Addr::unchecked("ekez")),
71 WasmMsg::Instantiate {
72 admin: Some("core".to_string()),
73 code_id: 42,
74 msg: to_json_binary("foo").unwrap(),
75 funds: vec![],
76 label: "bar".to_string()
77 }
78 )
79 }
80
81 #[test]
82 fn test_instantiate_instantiator_addr() {
83 let no_admin = ContractInstantiateInfo {
84 code_id: 42,
85 msg: to_json_binary("foo").unwrap(),
86 admin: Some(Admin::Instantiator {}),
87 label: "bar".to_string(),
88 };
89 assert_eq!(
90 no_admin.into_wasm_msg(Addr::unchecked("ekez")),
91 WasmMsg::Instantiate {
92 admin: Some("ekez".to_string()),
93 code_id: 42,
94 msg: to_json_binary("foo").unwrap(),
95 funds: vec![],
96 label: "bar".to_string()
97 }
98 )
99 }
100}