use crate::common_setup::{
setup_collection_whitelist::WHITELIST_AMOUNT, setup_minter::common::constants::FOUNDATION,
};
use cosmwasm_std::{coin, coins, Addr, Decimal, Uint128};
use cw_multi_test::{BankSudo, Executor, SudoMsg};
use sg2::{msg::Sg2ExecuteMsg, tests::mock_collection_params};
use sg_std::{GENESIS_MINT_START_TIME, NATIVE_DENOM};
use sg_whitelist::msg::{AddMembersMsg, ExecuteMsg as WhitelistExecuteMsg};
use vending_factory::ContractError;
use vending_minter::msg::ExecuteMsg;
use vending_minter::ContractError as MinterContractError;
use crate::common_setup::{
contract_boxes::custom_mock_app,
setup_accounts_and_block::{setup_accounts, setup_block_time},
setup_collection_whitelist::setup_whitelist_contract,
setup_minter::{
common::constants::MINT_PRICE,
vending_minter::{
mock_params::{mock_create_minter_init_msg, mock_init_extension},
setup::vending_minter_code_ids,
},
},
templates::{vending_minter_template, vending_minter_with_ibc_asset},
};
use crate::common_setup::setup_minter::common::constants::{CREATION_FEE, LIQUIDITY_DAO_ADDRESS};
use crate::common_setup::setup_minter::vending_minter::mock_params::mock_params;
#[test]
fn mint_with_ibc_asset() {
let num_tokens = 7000;
let per_address_limit = 10;
let denom = "ibc/asset";
let vt = vending_minter_with_ibc_asset(num_tokens, per_address_limit, denom);
let (mut router, _, buyer) = (vt.router, vt.accts.creator, vt.accts.buyer);
let minter_addr = vt.collection_response_vec[0].minter.clone().unwrap();
let mint_price = coins(MINT_PRICE, "ibc/asset".to_string());
router
.sudo(SudoMsg::Bank({
BankSudo::Mint {
to_address: buyer.to_string(),
amount: mint_price.clone(),
}
}))
.map_err(|err| println!("{err:?}"))
.ok();
setup_block_time(&mut router, GENESIS_MINT_START_TIME + 1, None);
let mint_msg = ExecuteMsg::Mint {};
let res = router.execute_contract(buyer, minter_addr, &mint_msg, &mint_price);
assert!(res.is_ok());
}
#[test]
fn denom_mismatch_creating_minter() {
let denom = "ibc/asset";
let mut app = custom_mock_app();
let (creator, _) = setup_accounts(&mut app);
let mut init_msg = mock_init_extension(None, None);
init_msg.mint_price = coin(MINT_PRICE, denom);
let code_ids = vending_minter_code_ids(&mut app);
let minter_code_id = code_ids.minter_code_id;
let factory_code_id = code_ids.factory_code_id;
let sg721_code_id = code_ids.sg721_code_id;
let minter_admin = creator;
let mut params = mock_params(None);
params.code_id = minter_code_id;
let factory_addr = app
.instantiate_contract(
factory_code_id,
minter_admin.clone(),
&vending_factory::msg::InstantiateMsg { params },
&[],
"factory",
None,
)
.unwrap();
let mut msg = mock_create_minter_init_msg(mock_collection_params(), init_msg);
msg.collection_params.code_id = sg721_code_id;
msg.collection_params.info.creator = minter_admin.to_string();
let creation_fee = coins(CREATION_FEE, NATIVE_DENOM);
let msg = Sg2ExecuteMsg::CreateMinter(msg);
let err = app
.execute_contract(minter_admin, factory_addr, &msg, &creation_fee)
.unwrap_err();
assert_eq!(
err.source().unwrap().to_string(),
ContractError::DenomMismatch {}.to_string()
);
}
#[test]
fn wl_denom_mismatch() {
let num_tokens = 7000;
let denom = "ibc/asset";
let vt = vending_minter_template(num_tokens);
let (mut router, creator, _) = (vt.router, vt.accts.creator, vt.accts.buyer);
let minter_addr = vt.collection_response_vec[0].minter.clone().unwrap();
let whitelist_addr = setup_whitelist_contract(&mut router, &creator, None, Some(denom));
let set_whitelist_msg = ExecuteMsg::SetWhitelist {
whitelist: whitelist_addr.to_string(),
};
let err = router
.execute_contract(creator.clone(), minter_addr, &set_whitelist_msg, &[])
.unwrap_err();
assert_eq!(
err.source().unwrap().to_string(),
MinterContractError::InvalidDenom {
expected: NATIVE_DENOM.to_string(),
got: denom.to_string(),
}
.to_string()
);
}
#[test]
fn wl_denom_mint() {
let denom = "ibc/asset";
let mut app = custom_mock_app();
let (creator, buyer) = setup_accounts(&mut app);
let mut init_msg = mock_init_extension(None, None);
init_msg.mint_price = coin(MINT_PRICE, denom);
let code_ids = vending_minter_code_ids(&mut app);
let minter_code_id = code_ids.minter_code_id;
let factory_code_id = code_ids.factory_code_id;
let sg721_code_id = code_ids.sg721_code_id;
let minter_admin = creator.clone();
let mut params = mock_params(Some(denom.to_string()));
params.code_id = minter_code_id;
let factory_addr = app
.instantiate_contract(
factory_code_id,
minter_admin.clone(),
&vending_factory::msg::InstantiateMsg { params },
&[],
"factory",
None,
)
.unwrap();
let mut msg = mock_create_minter_init_msg(mock_collection_params(), init_msg);
msg.collection_params.code_id = sg721_code_id;
msg.collection_params.info.creator = minter_admin.to_string();
let creation_fee = coins(CREATION_FEE, NATIVE_DENOM);
let msg = Sg2ExecuteMsg::CreateMinter(msg);
let res = app.execute_contract(minter_admin, factory_addr, &msg, &creation_fee);
assert!(res.is_ok());
let minter_addr = Addr::unchecked("contract1");
let different_denom = "ibc/otherdenom";
let whitelist_addr = setup_whitelist_contract(&mut app, &creator, None, Some(different_denom));
let add_to_whitelist_msg = WhitelistExecuteMsg::AddMembers(AddMembersMsg {
to_add: vec![buyer.to_string()],
});
let res = app.execute_contract(
creator.clone(),
whitelist_addr.clone(),
&add_to_whitelist_msg,
&[],
);
assert!(res.is_ok());
let set_whitelist_msg = ExecuteMsg::SetWhitelist {
whitelist: whitelist_addr.to_string(),
};
let res = app.execute_contract(
creator.clone(),
minter_addr.clone(),
&set_whitelist_msg,
&[],
);
assert!(res.is_err());
let whitelist_addr = setup_whitelist_contract(&mut app, &creator, None, Some(denom));
let add_to_whitelist_msg = WhitelistExecuteMsg::AddMembers(AddMembersMsg {
to_add: vec![buyer.to_string()],
});
let res = app.execute_contract(
creator.clone(),
whitelist_addr.clone(),
&add_to_whitelist_msg,
&[],
);
assert!(res.is_ok());
let set_whitelist_msg = ExecuteMsg::SetWhitelist {
whitelist: whitelist_addr.to_string(),
};
let res = app.execute_contract(
creator.clone(),
minter_addr.clone(),
&set_whitelist_msg,
&[],
);
assert!(res.is_ok());
let wl_mint_price = coin(WHITELIST_AMOUNT, denom);
app.sudo(SudoMsg::Bank({
BankSudo::Mint {
to_address: buyer.to_string(),
amount: vec![wl_mint_price.clone()],
}
}))
.map_err(|err| println!("{err:?}"))
.ok();
setup_block_time(&mut app, GENESIS_MINT_START_TIME + 101, None);
let mint_msg = ExecuteMsg::Mint {};
let res = app.execute_contract(
buyer.clone(),
minter_addr,
&mint_msg,
&[wl_mint_price.clone()],
);
assert!(res.is_ok());
let balance = app.wrap().query_balance(buyer, denom).unwrap();
assert_eq!(balance.amount, Uint128::zero());
let balance = app.wrap().query_balance(creator, denom).unwrap();
assert_eq!(balance.amount, wl_mint_price.amount * Decimal::percent(90));
let balance = app
.wrap()
.query_balance(Addr::unchecked(FOUNDATION), denom)
.unwrap();
assert_eq!(balance.amount, wl_mint_price.amount * Decimal::percent(8));
let balance = app
.wrap()
.query_balance(Addr::unchecked(LIQUIDITY_DAO_ADDRESS), denom)
.unwrap();
assert_eq!(balance.amount, wl_mint_price.amount * Decimal::percent(2));
}