integration.rs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. static WASM: &[u8] =
  2. include_bytes!("../../../target/wasm32-unknown-unknown/release/cw20_wrapped.wasm");
  3. use cosmwasm_std::{
  4. from_slice,
  5. Binary,
  6. Env,
  7. HandleResponse,
  8. HandleResult,
  9. HumanAddr,
  10. InitResponse,
  11. Uint128,
  12. };
  13. use cosmwasm_storage::to_length_prefixed;
  14. use cosmwasm_vm::{
  15. testing::{
  16. handle,
  17. init,
  18. mock_env,
  19. mock_instance,
  20. query,
  21. MockApi,
  22. MockQuerier,
  23. MockStorage,
  24. },
  25. Api,
  26. Instance,
  27. Storage,
  28. };
  29. use cw20_wrapped::{
  30. msg::{
  31. HandleMsg,
  32. InitMsg,
  33. QueryMsg,
  34. },
  35. state::{
  36. WrappedAssetInfo,
  37. KEY_WRAPPED_ASSET,
  38. },
  39. ContractError,
  40. };
  41. enum TestAddress {
  42. INITIALIZER,
  43. RECIPIENT,
  44. SENDER,
  45. }
  46. impl TestAddress {
  47. fn value(&self) -> HumanAddr {
  48. match self {
  49. TestAddress::INITIALIZER => HumanAddr::from("addr0000"),
  50. TestAddress::RECIPIENT => HumanAddr::from("addr2222"),
  51. TestAddress::SENDER => HumanAddr::from("addr3333"),
  52. }
  53. }
  54. }
  55. fn mock_env_height(signer: &HumanAddr, height: u64, time: u64) -> Env {
  56. let mut env = mock_env(signer, &[]);
  57. env.block.height = height;
  58. env.block.time = time;
  59. env
  60. }
  61. fn get_wrapped_asset_info<S: Storage>(storage: &S) -> WrappedAssetInfo {
  62. let key = to_length_prefixed(KEY_WRAPPED_ASSET);
  63. let data = storage
  64. .get(&key)
  65. .0
  66. .expect("error getting data")
  67. .expect("data should exist");
  68. from_slice(&data).expect("invalid data")
  69. }
  70. fn do_init(height: u64) -> Instance<MockStorage, MockApi, MockQuerier> {
  71. let mut deps = mock_instance(WASM, &[]);
  72. let init_msg = InitMsg {
  73. asset_chain: 1,
  74. asset_address: vec![1; 32].into(),
  75. decimals: 10,
  76. mint: None,
  77. init_hook: None,
  78. };
  79. let env = mock_env_height(&TestAddress::INITIALIZER.value(), height, 0);
  80. let res: InitResponse = init(&mut deps, env, init_msg).unwrap();
  81. assert_eq!(0, res.messages.len());
  82. // query the store directly
  83. let api = deps.api;
  84. deps.with_storage(|storage| {
  85. assert_eq!(
  86. get_wrapped_asset_info(storage),
  87. WrappedAssetInfo {
  88. asset_chain: 1,
  89. asset_address: vec![1; 32].into(),
  90. bridge: api.canonical_address(&TestAddress::INITIALIZER.value()).0?,
  91. }
  92. );
  93. Ok(())
  94. })
  95. .unwrap();
  96. deps
  97. }
  98. fn do_mint(
  99. deps: &mut Instance<MockStorage, MockApi, MockQuerier>,
  100. height: u64,
  101. recipient: &HumanAddr,
  102. amount: &Uint128,
  103. ) {
  104. let mint_msg = HandleMsg::Mint {
  105. recipient: recipient.clone(),
  106. amount: amount.clone(),
  107. };
  108. let env = mock_env_height(&TestAddress::INITIALIZER.value(), height, 0);
  109. let handle_response: HandleResponse = handle(deps, env, mint_msg).unwrap();
  110. assert_eq!(0, handle_response.messages.len());
  111. }
  112. fn do_transfer(
  113. deps: &mut Instance<MockStorage, MockApi, MockQuerier>,
  114. height: u64,
  115. sender: &HumanAddr,
  116. recipient: &HumanAddr,
  117. amount: &Uint128,
  118. ) {
  119. let transfer_msg = HandleMsg::Transfer {
  120. recipient: recipient.clone(),
  121. amount: amount.clone(),
  122. };
  123. let env = mock_env_height(sender, height, 0);
  124. let handle_response: HandleResponse = handle(deps, env, transfer_msg).unwrap();
  125. assert_eq!(0, handle_response.messages.len());
  126. }
  127. fn check_balance(
  128. deps: &mut Instance<MockStorage, MockApi, MockQuerier>,
  129. address: &HumanAddr,
  130. amount: &Uint128,
  131. ) {
  132. let query_response = query(
  133. deps,
  134. QueryMsg::Balance {
  135. address: address.clone(),
  136. },
  137. )
  138. .unwrap();
  139. assert_eq!(
  140. query_response.as_slice(),
  141. format!("{{\"balance\":\"{}\"}}", amount.u128()).as_bytes()
  142. );
  143. }
  144. fn check_token_details(deps: &mut Instance<MockStorage, MockApi, MockQuerier>, supply: &Uint128) {
  145. let query_response = query(deps, QueryMsg::TokenInfo {}).unwrap();
  146. assert_eq!(
  147. query_response.as_slice(),
  148. format!(
  149. "{{\"name\":\"Wormhole Wrapped\",\
  150. \"symbol\":\"WWT\",\
  151. \"decimals\":10,\
  152. \"total_supply\":\"{}\"}}",
  153. supply.u128()
  154. )
  155. .as_bytes()
  156. );
  157. }
  158. #[test]
  159. fn init_works() {
  160. let mut deps = do_init(111);
  161. check_token_details(&mut deps, &Uint128(0));
  162. }
  163. #[test]
  164. fn query_works() {
  165. let mut deps = do_init(111);
  166. let query_response = query(&mut deps, QueryMsg::WrappedAssetInfo {}).unwrap();
  167. assert_eq!(
  168. query_response.as_slice(),
  169. format!(
  170. "{{\"asset_chain\":1,\
  171. \"asset_address\":\"{}\",\
  172. \"bridge\":\"{}\"}}",
  173. Binary::from(vec![1; 32]).to_base64(),
  174. TestAddress::INITIALIZER.value().as_str()
  175. )
  176. .as_bytes()
  177. );
  178. }
  179. #[test]
  180. fn mint_works() {
  181. let mut deps = do_init(111);
  182. do_mint(
  183. &mut deps,
  184. 112,
  185. &TestAddress::RECIPIENT.value(),
  186. &Uint128(123_123_123),
  187. );
  188. check_balance(
  189. &mut deps,
  190. &TestAddress::RECIPIENT.value(),
  191. &Uint128(123_123_123),
  192. );
  193. check_token_details(&mut deps, &Uint128(123_123_123));
  194. }
  195. #[test]
  196. fn others_cannot_mint() {
  197. let mut deps = do_init(111);
  198. let mint_msg = HandleMsg::Mint {
  199. recipient: TestAddress::RECIPIENT.value(),
  200. amount: Uint128(123_123_123),
  201. };
  202. let env = mock_env_height(&TestAddress::RECIPIENT.value(), 112, 0);
  203. let handle_result: HandleResult<HandleResponse> = handle(&mut deps, env, mint_msg);
  204. assert_eq!(
  205. format!("{}", handle_result.unwrap_err()),
  206. format!("{}", ContractError::Unauthorized {})
  207. );
  208. }
  209. #[test]
  210. fn transfer_works() {
  211. let mut deps = do_init(111);
  212. do_mint(
  213. &mut deps,
  214. 112,
  215. &TestAddress::SENDER.value(),
  216. &Uint128(123_123_123),
  217. );
  218. do_transfer(
  219. &mut deps,
  220. 113,
  221. &TestAddress::SENDER.value(),
  222. &TestAddress::RECIPIENT.value(),
  223. &Uint128(123_123_000),
  224. );
  225. check_balance(&mut deps, &TestAddress::SENDER.value(), &Uint128(123));
  226. check_balance(
  227. &mut deps,
  228. &TestAddress::RECIPIENT.value(),
  229. &Uint128(123_123_000),
  230. );
  231. }