| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- static WASM: &[u8] =
- include_bytes!("../../../target/wasm32-unknown-unknown/release/cw20_wrapped.wasm");
- use cosmwasm_std::{
- from_slice,
- Binary,
- Env,
- HandleResponse,
- HandleResult,
- HumanAddr,
- InitResponse,
- Uint128,
- };
- use cosmwasm_storage::to_length_prefixed;
- use cosmwasm_vm::{
- testing::{
- handle,
- init,
- mock_env,
- mock_instance,
- query,
- MockApi,
- MockQuerier,
- MockStorage,
- },
- Api,
- Instance,
- Storage,
- };
- use cw20_wrapped::{
- msg::{
- HandleMsg,
- InitMsg,
- QueryMsg,
- },
- state::{
- WrappedAssetInfo,
- KEY_WRAPPED_ASSET,
- },
- ContractError,
- };
- enum TestAddress {
- INITIALIZER,
- RECIPIENT,
- SENDER,
- }
- impl TestAddress {
- fn value(&self) -> HumanAddr {
- match self {
- TestAddress::INITIALIZER => HumanAddr::from("addr0000"),
- TestAddress::RECIPIENT => HumanAddr::from("addr2222"),
- TestAddress::SENDER => HumanAddr::from("addr3333"),
- }
- }
- }
- fn mock_env_height(signer: &HumanAddr, height: u64, time: u64) -> Env {
- let mut env = mock_env(signer, &[]);
- env.block.height = height;
- env.block.time = time;
- env
- }
- fn get_wrapped_asset_info<S: Storage>(storage: &S) -> WrappedAssetInfo {
- let key = to_length_prefixed(KEY_WRAPPED_ASSET);
- let data = storage
- .get(&key)
- .0
- .expect("error getting data")
- .expect("data should exist");
- from_slice(&data).expect("invalid data")
- }
- fn do_init(height: u64) -> Instance<MockStorage, MockApi, MockQuerier> {
- let mut deps = mock_instance(WASM, &[]);
- let init_msg = InitMsg {
- asset_chain: 1,
- asset_address: vec![1; 32].into(),
- decimals: 10,
- mint: None,
- init_hook: None,
- };
- let env = mock_env_height(&TestAddress::INITIALIZER.value(), height, 0);
- let res: InitResponse = init(&mut deps, env, init_msg).unwrap();
- assert_eq!(0, res.messages.len());
- // query the store directly
- let api = deps.api;
- deps.with_storage(|storage| {
- assert_eq!(
- get_wrapped_asset_info(storage),
- WrappedAssetInfo {
- asset_chain: 1,
- asset_address: vec![1; 32].into(),
- bridge: api.canonical_address(&TestAddress::INITIALIZER.value()).0?,
- }
- );
- Ok(())
- })
- .unwrap();
- deps
- }
- fn do_mint(
- deps: &mut Instance<MockStorage, MockApi, MockQuerier>,
- height: u64,
- recipient: &HumanAddr,
- amount: &Uint128,
- ) {
- let mint_msg = HandleMsg::Mint {
- recipient: recipient.clone(),
- amount: amount.clone(),
- };
- let env = mock_env_height(&TestAddress::INITIALIZER.value(), height, 0);
- let handle_response: HandleResponse = handle(deps, env, mint_msg).unwrap();
- assert_eq!(0, handle_response.messages.len());
- }
- fn do_transfer(
- deps: &mut Instance<MockStorage, MockApi, MockQuerier>,
- height: u64,
- sender: &HumanAddr,
- recipient: &HumanAddr,
- amount: &Uint128,
- ) {
- let transfer_msg = HandleMsg::Transfer {
- recipient: recipient.clone(),
- amount: amount.clone(),
- };
- let env = mock_env_height(sender, height, 0);
- let handle_response: HandleResponse = handle(deps, env, transfer_msg).unwrap();
- assert_eq!(0, handle_response.messages.len());
- }
- fn check_balance(
- deps: &mut Instance<MockStorage, MockApi, MockQuerier>,
- address: &HumanAddr,
- amount: &Uint128,
- ) {
- let query_response = query(
- deps,
- QueryMsg::Balance {
- address: address.clone(),
- },
- )
- .unwrap();
- assert_eq!(
- query_response.as_slice(),
- format!("{{\"balance\":\"{}\"}}", amount.u128()).as_bytes()
- );
- }
- fn check_token_details(deps: &mut Instance<MockStorage, MockApi, MockQuerier>, supply: &Uint128) {
- let query_response = query(deps, QueryMsg::TokenInfo {}).unwrap();
- assert_eq!(
- query_response.as_slice(),
- format!(
- "{{\"name\":\"Wormhole Wrapped\",\
- \"symbol\":\"WWT\",\
- \"decimals\":10,\
- \"total_supply\":\"{}\"}}",
- supply.u128()
- )
- .as_bytes()
- );
- }
- #[test]
- fn init_works() {
- let mut deps = do_init(111);
- check_token_details(&mut deps, &Uint128(0));
- }
- #[test]
- fn query_works() {
- let mut deps = do_init(111);
- let query_response = query(&mut deps, QueryMsg::WrappedAssetInfo {}).unwrap();
- assert_eq!(
- query_response.as_slice(),
- format!(
- "{{\"asset_chain\":1,\
- \"asset_address\":\"{}\",\
- \"bridge\":\"{}\"}}",
- Binary::from(vec![1; 32]).to_base64(),
- TestAddress::INITIALIZER.value().as_str()
- )
- .as_bytes()
- );
- }
- #[test]
- fn mint_works() {
- let mut deps = do_init(111);
- do_mint(
- &mut deps,
- 112,
- &TestAddress::RECIPIENT.value(),
- &Uint128(123_123_123),
- );
- check_balance(
- &mut deps,
- &TestAddress::RECIPIENT.value(),
- &Uint128(123_123_123),
- );
- check_token_details(&mut deps, &Uint128(123_123_123));
- }
- #[test]
- fn others_cannot_mint() {
- let mut deps = do_init(111);
- let mint_msg = HandleMsg::Mint {
- recipient: TestAddress::RECIPIENT.value(),
- amount: Uint128(123_123_123),
- };
- let env = mock_env_height(&TestAddress::RECIPIENT.value(), 112, 0);
- let handle_result: HandleResult<HandleResponse> = handle(&mut deps, env, mint_msg);
- assert_eq!(
- format!("{}", handle_result.unwrap_err()),
- format!("{}", ContractError::Unauthorized {})
- );
- }
- #[test]
- fn transfer_works() {
- let mut deps = do_init(111);
- do_mint(
- &mut deps,
- 112,
- &TestAddress::SENDER.value(),
- &Uint128(123_123_123),
- );
- do_transfer(
- &mut deps,
- 113,
- &TestAddress::SENDER.value(),
- &TestAddress::RECIPIENT.value(),
- &Uint128(123_123_000),
- );
- check_balance(&mut deps, &TestAddress::SENDER.value(), &Uint128(123));
- check_balance(
- &mut deps,
- &TestAddress::RECIPIENT.value(),
- &Uint128(123_123_000),
- );
- }
|