use cosmwasm_schema::cw_serde;
use cosmwasm_std::{Addr, Binary, Coin, CosmosMsg, WasmMsg};
#[cw_serde]
pub struct Config {
pub name: String,
pub description: String,
pub image_url: Option<String>,
pub automatically_add_cw20s: bool,
pub automatically_add_cw721s: bool,
pub dao_uri: Option<String>,
}
#[cw_serde]
pub struct ProposalModule {
pub address: Addr,
pub prefix: String,
pub status: ProposalModuleStatus,
}
#[cw_serde]
pub enum ProposalModuleStatus {
Enabled,
Disabled,
}
#[cw_serde]
pub enum Admin {
Address { addr: String },
CoreModule {},
}
#[cw_serde]
pub struct ModuleInstantiateInfo {
pub code_id: u64,
pub msg: Binary,
pub admin: Option<Admin>,
pub funds: Vec<Coin>,
pub label: String,
}
impl ModuleInstantiateInfo {
pub fn into_wasm_msg(self, dao: Addr) -> WasmMsg {
WasmMsg::Instantiate {
admin: self.admin.map(|admin| match admin {
Admin::Address { addr } => addr,
Admin::CoreModule {} => dao.into_string(),
}),
code_id: self.code_id,
msg: self.msg,
funds: self.funds,
label: self.label,
}
}
}
#[cw_serde]
pub struct ModuleInstantiateCallback {
pub msgs: Vec<CosmosMsg>,
}
#[cfg(test)]
mod tests {
use super::*;
use cosmwasm_std::{to_json_binary, Addr, WasmMsg};
#[test]
fn test_module_instantiate_admin_none() {
let no_admin = ModuleInstantiateInfo {
code_id: 42,
msg: to_json_binary("foo").unwrap(),
admin: None,
label: "bar".to_string(),
funds: vec![],
};
assert_eq!(
no_admin.into_wasm_msg(Addr::unchecked("ekez")),
WasmMsg::Instantiate {
admin: None,
code_id: 42,
msg: to_json_binary("foo").unwrap(),
funds: vec![],
label: "bar".to_string()
}
)
}
#[test]
fn test_module_instantiate_admin_addr() {
let no_admin = ModuleInstantiateInfo {
code_id: 42,
msg: to_json_binary("foo").unwrap(),
admin: Some(Admin::Address {
addr: "core".to_string(),
}),
label: "bar".to_string(),
funds: vec![],
};
assert_eq!(
no_admin.into_wasm_msg(Addr::unchecked("ekez")),
WasmMsg::Instantiate {
admin: Some("core".to_string()),
code_id: 42,
msg: to_json_binary("foo").unwrap(),
funds: vec![],
label: "bar".to_string()
}
)
}
#[test]
fn test_module_instantiate_instantiator_addr() {
let no_admin = ModuleInstantiateInfo {
code_id: 42,
msg: to_json_binary("foo").unwrap(),
admin: Some(Admin::CoreModule {}),
label: "bar".to_string(),
funds: vec![],
};
assert_eq!(
no_admin.into_wasm_msg(Addr::unchecked("ekez")),
WasmMsg::Instantiate {
admin: Some("ekez".to_string()),
code_id: 42,
msg: to_json_binary("foo").unwrap(),
funds: vec![],
label: "bar".to_string()
}
)
}
}