#![cfg(test)]
use cosmwasm_std::{to_json_binary, Empty, Uint128, WasmMsg};
use cw20::{BalanceResponse, MinterResponse};
use cw20_base::msg::QueryMsg;
use cw3::Vote;
use cw_multi_test::{App, Contract, ContractWrapper, Executor};
use cw_utils::{Duration, Threshold};
use crate::contract::{execute, instantiate, query};
use crate::msg::{ExecuteMsg, InstantiateMsg, Voter};
fn mock_app() -> App {
App::default()
}
pub fn contract_cw3_fixed_multisig() -> Box<dyn Contract<Empty>> {
let contract = ContractWrapper::new(execute, instantiate, query);
Box::new(contract)
}
pub fn contract_cw20() -> Box<dyn Contract<Empty>> {
let contract = ContractWrapper::new(
cw20_base::contract::execute,
cw20_base::contract::instantiate,
cw20_base::contract::query,
);
Box::new(contract)
}
#[test]
fn cw3_controls_cw20() {
let mut router = mock_app();
let cw3_id = router.store_code(contract_cw3_fixed_multisig());
let addr1 = router.api().addr_make("addr1");
let addr2 = router.api().addr_make("addr2");
let addr3 = router.api().addr_make("addr3");
let cw3_instantiate_msg = InstantiateMsg {
voters: vec![
Voter {
addr: addr1.to_string(),
weight: 1,
},
Voter {
addr: addr2.to_string(),
weight: 1,
},
Voter {
addr: addr3.to_string(),
weight: 1,
},
],
threshold: Threshold::AbsoluteCount { weight: 2 },
max_voting_period: Duration::Height(3),
};
let multisig_addr = router
.instantiate_contract(
cw3_id,
addr1.clone(),
&cw3_instantiate_msg,
&[],
"Consortium",
None,
)
.unwrap();
let cw20_id = router.store_code(contract_cw20());
let cw20_instantiate_msg = cw20_base::msg::InstantiateMsg {
name: "Consortium Token".parse().unwrap(),
symbol: "CST".parse().unwrap(),
decimals: 6,
initial_balances: vec![],
mint: Some(MinterResponse {
minter: multisig_addr.to_string(),
cap: None,
}),
marketing: None,
};
let cw20_addr = router
.instantiate_contract(
cw20_id,
multisig_addr.clone(),
&cw20_instantiate_msg,
&[],
"Consortium",
None,
)
.unwrap();
let mint_recipient = router.api().addr_make("mint_recipient");
let mint_amount = Uint128::new(1000);
let cw20_mint_msg = cw20_base::msg::ExecuteMsg::Mint {
recipient: mint_recipient.to_string(),
amount: mint_amount,
};
let execute_mint_msg = WasmMsg::Execute {
contract_addr: cw20_addr.to_string(),
msg: to_json_binary(&cw20_mint_msg).unwrap(),
funds: vec![],
};
let propose_msg = ExecuteMsg::Propose {
title: "Mint tokens".to_string(),
description: "Need to mint tokens".to_string(),
msgs: vec![execute_mint_msg.into()],
latest: None,
};
router
.execute_contract(addr1.clone(), multisig_addr.clone(), &propose_msg, &[])
.unwrap();
let vote2_msg = ExecuteMsg::Vote {
proposal_id: 1,
vote: Vote::Yes,
};
router
.execute_contract(addr2, multisig_addr.clone(), &vote2_msg, &[])
.unwrap();
let execute_proposal_msg = ExecuteMsg::Execute { proposal_id: 1 };
router
.execute_contract(addr1, multisig_addr, &execute_proposal_msg, &[])
.unwrap();
let cw20_balance_query = QueryMsg::Balance {
address: mint_recipient.to_string(),
};
let balance: BalanceResponse = router
.wrap()
.query_wasm_smart(&cw20_addr, &cw20_balance_query)
.unwrap();
assert_eq!(balance.balance, mint_amount);
}