From 2ee315a738e2962bc14dc7e16e5aa8a99a0c57b2 Mon Sep 17 00:00:00 2001 From: Michal Sivak Date: Mon, 31 Oct 2022 17:17:02 +1100 Subject: [PATCH 1/5] fix factory test --- contracts/factory/src/test.rs | 805 ++++++++++++++++------------------ 1 file changed, 388 insertions(+), 417 deletions(-) diff --git a/contracts/factory/src/test.rs b/contracts/factory/src/test.rs index 6e7cf66..2d986a8 100644 --- a/contracts/factory/src/test.rs +++ b/contracts/factory/src/test.rs @@ -1,440 +1,411 @@ -// use cosmwasm_std::testing::mock_dependencies; -// use cosmwasm_std::testing::mock_env; -// use cosmwasm_std::to_binary; -// use cosmwasm_std::Addr; -// use cosmwasm_std::Deps; -// use cosmwasm_std::DepsMut; -// use cosmwasm_std::Env; -// use cosmwasm_std::{Api, Binary, CanonicalAddr, Querier, StdError, StdResult, Storage}; -// use shadeswap_shared::amm_pair::AMMSettings; -// use shadeswap_shared::core::Fee; -// use shadeswap_shared::core::{ContractInstantiationInfo, ContractLink}; -// use shadeswap_shared::msg::factory::InitMsg; -// pub use shadeswap_shared::{msg::factory::QueryResponse, Pagination}; - -// use crate::state::Config; - -// #[cfg(test)] -// pub mod test_contract { +use cosmwasm_std::testing::mock_dependencies; +use cosmwasm_std::testing::mock_env; +use cosmwasm_std::to_binary; +use cosmwasm_std::Addr; +use cosmwasm_std::Deps; +use cosmwasm_std::DepsMut; +use cosmwasm_std::Env; +use cosmwasm_std::{Api, Binary, CanonicalAddr, Querier, StdError, StdResult, Storage}; +use shadeswap_shared::amm_pair::AMMSettings; +use shadeswap_shared::core::Fee; +use shadeswap_shared::core::{ContractInstantiationInfo, ContractLink}; +use shadeswap_shared::msg::factory::InitMsg; +pub use shadeswap_shared::{msg::factory::QueryResponse, Pagination}; + +use crate::state::Config; + +#[cfg(test)] +pub mod test_contract { + use super::*; + use crate::contract::execute; + use crate::contract::instantiate; + use crate::contract::query; + use crate::operations::create_pair; + use crate::operations::create_signature; + use crate::state::EPHEMERAL_STORAGE_KEY; + use crate::state::NextPairKey; + use crate::state::config_r; + use crate::state::PAGINATION_LIMIT; + use crate::state::config_w; + use crate::state::ephemeral_storage_r; + use crate::state::ephemeral_storage_w; + use cosmwasm_std::from_binary; + use cosmwasm_std::Addr; + use cosmwasm_std::MessageInfo; + use cosmwasm_std::testing::mock_info; + use shadeswap_shared::amm_pair::AMMPair; + use shadeswap_shared::core::TokenPair; + use shadeswap_shared::core::TokenType; + use shadeswap_shared::msg::factory::ExecuteMsg; + use shadeswap_shared::msg::factory::QueryMsg; + pub use shadeswap_shared::{msg::factory::QueryResponse, Pagination}; + + #[test] + fn init_ok() -> StdResult<()> { + let mut deps = mock_dependencies(); + let config = mkconfig(0); + let env = mock_env(); + assert!(instantiate( + deps.as_mut(), + env, + MessageInfo { + sender: Addr::unchecked("admin"), + funds: vec![] + }, + create_init_msg_from_config(&config) + ) + .is_ok()); + assert_eq!(config, config_r(deps.as_ref().storage).load()?); + Ok(()) + } + + #[test] + fn get_set_config_ok() -> StdResult<()> { + let mut deps = mock_dependencies(); + let env = mock_env(); + instantiate( + deps.as_mut(), + env.clone(), + MessageInfo { + sender: Addr::unchecked("admin"), + funds: vec![], + }, + create_init_msg_from_config(&mkconfig(0)), + )?; + + let new_config = mkconfig(5); + execute( + deps.as_mut(), + env, + MessageInfo { + sender: Addr::unchecked("admin"), + funds: vec![], + }, + ExecuteMsg::SetConfig { + pair_contract: Some(new_config.pair_contract.clone()), + amm_settings: Some(new_config.amm_settings.clone()), + lp_token_contract: Some(new_config.lp_token_contract.clone()), + api_key: Some("api_key".to_string()), + }, + ) + .unwrap(); + + let response: QueryResponse = from_binary(&query(deps.as_ref(), mock_env(), QueryMsg::GetConfig {})?)?; + let compare: QueryResponse = create_query_response_from_config(&new_config); + assert_eq!(compare, response); + Ok(()) + } + + #[test] + fn register_amm_pair_ok() -> StdResult<()> { + let mut deps = mock_dependencies(); + let env = mock_env(); + let config = mkconfig(0); + + config_w(deps.as_mut().storage).save(&config)?; + let pair = TokenPair( + TokenType::CustomToken { + contract_addr: Addr::unchecked("token_addr".to_string()), + token_code_hash: "13123adasd".to_string(), + }, + TokenType::NativeToken { + denom: "test1".to_string(), + }, + ); + + let signature = create_signature(&env, &mock_info("admin", &[]))?; + ephemeral_storage_w(&mut deps.storage).save(&NextPairKey { + pair: pair.clone(), + is_verified: true, + key: signature.clone(), + })?; + + execute( + deps.as_mut(), + env, + mock_info("admin", &[]), + ExecuteMsg::RegisterAMMPair { + pair: pair.clone(), + signature, + }, + )?; + + let result = ephemeral_storage_r(&deps.storage).load(); + match result { + Ok(_) => todo!(), + Err(err) => { + assert_eq!("factory::state::NextPairKey not found", &err.to_string()) + }, + } + Ok(()) + } + + #[test] + fn create_pair_ok() -> StdResult<()> { + let ref mut deps = mock_dependencies(); + let env = mock_env(); + let config = mkconfig(0); + assert!(instantiate( + deps.as_mut(), + env, + MessageInfo { + sender: Addr::unchecked("admin"), + funds: vec![] + }, + create_init_msg_from_config(&config) + ) + .is_ok()); + + let pair = TokenPair( + TokenType::CustomToken { + contract_addr: Addr::unchecked("token_addr"), + token_code_hash: "diff".to_string(), + }, + TokenType::CustomToken { + contract_addr: Addr::unchecked("token_addr"), + token_code_hash: "13123adasd".to_string(), + }, + ); + + let result = create_pair( + deps.as_mut(), + mock_env(), + &mock_info("admin", &[]), + pair, + Addr::unchecked("admin"), + to_binary(&"entropy").unwrap(), + None, + None); + + assert!(result.is_ok()); + Ok(()) + } + #[test] + fn add_amm_pairs() { + let ref mut deps = mock_dependencies(); + let config = mkconfig(0); + let env = mock_env(); + + instantiate(deps.as_mut(), env.clone(), MessageInfo { + sender: Addr::unchecked("admin"), + funds: vec![] + }, create_init_msg_from_config(&config)).unwrap(); + + let mut amm_pairs: Vec = vec![]; + + for i in 0..5 { + amm_pairs.push(AMMPair { + pair: TokenPair( + TokenType::CustomToken { + contract_addr: Addr::unchecked(format!("token_0_addr_{}", i)), + token_code_hash: format!("token_0_hash_{}", i), + }, + TokenType::CustomToken { + contract_addr: Addr::unchecked(format!("token_1_addr_{}", i)), + token_code_hash: format!("token_1_hash_{}", i), + }, + ), + address: Addr::unchecked(format!("pair_addr_{}", i)), + enabled: true, + }); + } + + execute( + deps.as_mut(), + env, + MessageInfo { + sender: Addr::unchecked("admin"), + funds: vec![] + }, + ExecuteMsg::AddAMMPairs { + amm_pairs: amm_pairs.clone()[0..].into(), + }, + ) + .unwrap(); + + let result = query( + deps.as_ref(), + mock_env(), + QueryMsg::ListAMMPairs { + pagination: pagination(0, PAGINATION_LIMIT), + }, + ) + .unwrap(); + + let response: QueryResponse = from_binary(&result).unwrap(); + + match response { + QueryResponse::ListAMMPairs { amm_pairs: stored } => { + assert_eq!(amm_pairs, stored) + } + _ => panic!("QueryResponse::ListExchanges"), + } + } +} + +pub fn create_init_msg_from_config(config: &Config) -> InitMsg{ + InitMsg { + pair_contract: config.pair_contract.clone(), + amm_settings: AMMSettings { + lp_fee: Fee::new(28, 10000), + shade_dao_fee: Fee::new(2, 10000), + shade_dao_address: ContractLink { + address: Addr::unchecked("CALLBACKADDR"), + code_hash: "Test".to_string(), + }, + }, + lp_token_contract: config.lp_token_contract.clone(), + prng_seed: to_binary(&"prng").unwrap(), + api_key: "api_key".to_string(), + authenticator: None, + } +} + +pub fn create_query_response_from_config(config: &Config) ->QueryResponse { + QueryResponse::GetConfig { + pair_contract: config.pair_contract.clone(), + amm_settings: config.amm_settings.clone(), + lp_token_contract: config.lp_token_contract.clone(), + authenticator: None, + } +} + + +// pub mod test_state { +// use shadeswap_shared::{amm_pair::AMMPair, core::Canonize}; + // use super::*; -// use crate::contract::execute; -// use crate::contract::instantiate; -// use crate::contract::query; -// use crate::operations::create_pair; -// use crate::state::config_r; -// use crate::state::config_w; -// use crate::state::PAGINATION_LIMIT; -// use cosmwasm_std::from_binary; -// use cosmwasm_std::Addr; -// use cosmwasm_std::MessageInfo; -// use shadeswap_shared::amm_pair::AMMPair; -// use shadeswap_shared::core::TokenPair; -// use shadeswap_shared::core::TokenType; -// use shadeswap_shared::msg::factory::ExecuteMsg; -// use shadeswap_shared::msg::factory::QueryMsg; -// pub use shadeswap_shared::{msg::factory::QueryResponse, Pagination}; -// #[test] -// fn init_ok() -> StdResult<()> { -// let mut deps = mock_dependencies(); -// let config = mkconfig(0); -// let env = mock_env(); -// assert!(instantiate( -// deps.as_mut(), -// env, -// MessageInfo { -// sender: Addr::unchecked("admin"), -// funds: vec![] -// }, -// (&config).into() -// ) -// .is_ok()); -// assert_eq!(config, config_r(deps.as_ref().storage).load()?); -// Ok(()) +// fn swap_pair(pair: &TokenPair) -> TokenPair { +// TokenPair(pair.1.clone(), pair.0.clone()) // } // #[test] -// fn get_set_config_ok() -> StdResult<()> { -// let mut deps = mock_dependencies(); -// let env = mock_env(); -// instantiate( -// deps.as_mut(), -// env.clone(), -// MessageInfo { -// sender: Addr::unchecked("admin"), -// funds: vec![], -// }, -// (&mkconfig(0)).into(), -// )?; +// fn generate_pair_key_ok() -> StdResult<()> { +// fn cmp_pair( +// deps: &Deps, +// pair: TokenPair, +// ) -> StdResult<()> { +// let stored_pair = pair.clone().canonize(&deps.api)?; +// let key = generate_pair_key(&stored_pair); -// let new_config = mkconfig(5); -// execute( -// deps.as_mut(), -// env, -// MessageInfo { -// sender: Addr::unchecked("admin"), -// funds: vec![], -// }, -// ExecuteMsg::SetConfig { -// pair_contract: Some(new_config.pair_contract.clone()), -// amm_settings: Some(new_config.amm_settings.clone()), -// lp_token_contract: Some(new_config.lp_token_contract.clone()), -// }, -// ) -// .unwrap(); - -// let response: QueryResponse = from_binary(&query(deps.as_ref(), mock_env(), QueryMsg::GetConfig {})?)?; -// let compare: QueryResponse = (&new_config).into(); -// assert_eq!(compare, response); -// Ok(()) -// } +// let pair = swap_pair(&pair.clone()); -// // #[test] -// // fn register_amm_pair_ok() -> StdResult<()> { -// // let ref mut deps = mock_dependencies(); -// // let env = mock_env(); -// // let config = mkconfig(0); - -// // config_w(deps.as_mut().storage).save(&config)?; - -// // let signature = create_signature(&env)?; -// // save(&mut deps.storage, EPHEMERAL_STORAGE_KEY, &signature)?; - -// // let pair = TokenPair( -// // TokenType::CustomToken { -// // contract_addr: Addr::unchecked("token_addr".into()), -// // token_code_hash: "13123adasd".into(), -// // }, -// // TokenType::NativeToken { -// // denom: "test1".into(), -// // }, -// // ); - -// // execute( -// // deps, -// // env, -// // MessageInfo { -// // sender: Addr::unchecked("admin"), -// // funds: vec![] -// // }, -// // ExecuteMsg::RegisterAMMPair { -// // pair: pair.clone(), -// // signature, -// // }, -// // )?; - -// // let result: Option = load(&deps.storage, EPHEMERAL_STORAGE_KEY)?; -// // match result { -// // None => {} -// // _ => panic!("Ephemeral storage should be empty!"), -// // } - -// // Ok(()) -// // } +// let stored_pair = pair.canonize(&deps.api)?; +// let swapped_key = generate_pair_key(&stored_pair); -// #[test] -// fn create_pair_ok() -> StdResult<()> { -// let ref mut deps = mock_dependencies(); -// let env = mock_env(); -// let config = mkconfig(0); -// assert!(instantiate( -// deps.as_mut(), -// env, -// MessageInfo { -// sender: Addr::unchecked("admin"), -// funds: vec![] -// }, -// (&config).into() -// ) -// .is_ok()); - -// let pair = TokenPair( -// TokenType::CustomToken { -// contract_addr: Addr::unchecked("token_addr"), -// token_code_hash: "diff".into(), -// }, -// TokenType::CustomToken { -// contract_addr: Addr::unchecked("token_addr"), -// token_code_hash: "13123adasd".into(), -// }, -// ); - -// let result = create_pair(deps.as_mut(), mock_env(), pair, Addr::unchecked("admin"),to_binary(&"entropy").unwrap(), None); -// assert!(result.is_ok()); -// Ok(()) -// } -// #[test] -// fn add_amm_pairs() { -// let ref mut deps = mock_dependencies(); -// let config = mkconfig(0); -// let env = mock_env(); +// assert_eq!(key, swapped_key); -// instantiate(deps.as_mut(), env.clone(), MessageInfo { -// sender: Addr::unchecked("admin"), -// funds: vec![] -// },(&config).into()).unwrap(); +// Ok(()) +// } -// let mut amm_pairs: Vec = vec![]; +// let ref deps = mock_dependencies(); -// for i in 0..5 { -// amm_pairs.push(AMMPair { -// pair: TokenPair( -// TokenType::CustomToken { -// contract_addr: Addr::unchecked(format!("token_0_addr_{}", i)), -// token_code_hash: format!("token_0_hash_{}", i), -// }, -// TokenType::CustomToken { -// contract_addr: Addr::unchecked(format!("token_1_addr_{}", i)), -// token_code_hash: format!("token_1_hash_{}", i), -// }, -// ), -// address: Addr::unchecked(format!("pair_addr_{}", i)), -// enabled: true, -// }); -// } +// cmp_pair( +// deps, +// TokenPair( +// TokenType::CustomToken { +// contract_addr: Addr::unchecked("first_addr".to_string()), +// token_code_hash: "13123adasd".to_string(), +// }, +// TokenType::CustomToken { +// contract_addr: Addr::unchecked("scnd_addr".to_string()), +// token_code_hash: "4534qwerqqw".to_string(), +// }, +// ), +// )?; -// execute( -// deps.as_mut(), -// env, -// MessageInfo { -// sender: Addr::unchecked("admin"), -// funds: vec![] -// }, -// ExecuteMsg::AddAMMPairs { -// amm_pairs: amm_pairs.clone()[0..].into(), -// }, -// ) -// .unwrap(); - -// let result = query( -// deps.as_ref(), -// mock_env(), -// QueryMsg::ListAMMPairs { -// pagination: pagination(0, PAGINATION_LIMIT), -// }, -// ) -// .unwrap(); - -// let response: QueryResponse = from_binary(&result).unwrap(); - -// match response { -// QueryResponse::ListAMMPairs { amm_pairs: stored } => { -// assert_eq!(amm_pairs, stored) -// } -// _ => panic!("QueryResponse::ListExchanges"), -// } -// } +// cmp_pair( +// deps, +// TokenPair( +// TokenType::NativeToken { +// denom: "test1".to_string(), +// }, +// TokenType::NativeToken { +// denom: "test2".to_string(), +// }, +// ), +// )?; -// /* -// #[test] -// fn increment() { -// let mut deps = mock_dependencies(20, &coins(2, "token")); - -// let msg = InitMsg { count: 17 }; -// let env = mock_env("creator", &coins(2, "token")); -// let _res = init(&mut deps, env, msg).unwrap(); - -// // anyone can increment -// let env = mock_env("anyone", &coins(2, "token")); -// let msg = ExecuteMsg::Increment {}; -// let _res = execute(&mut deps, env, msg).unwrap(); - -// // should increase counter by 1 -// let res = query(&deps, QueryMsg::GetCount {}).unwrap(); -// let value: CountResponse = from_binary(&res).unwrap(); -// assert_eq!(18, value.count); +// cmp_pair( +// deps, +// TokenPair( +// TokenType::NativeToken { +// denom: "test3".to_string(), +// }, +// TokenType::CustomToken { +// contract_addr: Addr::unchecked("third_addr".to_string()), +// token_code_hash: "asd21312asd".to_string(), +// }, +// ), +// )?; + +// Ok(()) // } // #[test] -// fn reset() { -// let mut deps = mock_dependencies(20, &coins(2, "token")); - -// let msg = InitMsg { count: 17 }; -// let env = mock_env("creator", &coins(2, "token")); -// let _res = init(&mut deps, env, msg).unwrap(); - -// // not anyone can reset -// let unauth_env = mock_env("anyone", &coins(2, "token")); -// let msg = ExecuteMsg::Reset { count: 5 }; -// let res = execute(&mut deps, unauth_env, msg); -// match res { -// Err(StdError::Unauthorized { .. }) => {} -// _ => panic!("Must return unauthorized error"), -// } - -// // only the original creator can reset the counter -// let auth_env = mock_env("creator", &coins(2, "token")); -// let msg = ExecuteMsg::Reset { count: 5 }; -// let _res = execute(&mut deps, auth_env, msg).unwrap(); - -// // should now be 5 -// let res = query(&deps, QueryMsg::GetCount {}).unwrap(); -// let value: CountResponse = from_binary(&res).unwrap(); -// assert_eq!(5, value.count); -// }*/ -// } +// fn store_and_get_amm_pairs_ok() { +// let ref mut deps = mock_dependencies(); +// let mut amm_pairs: Vec = vec![]; +// amm_pairs.push(AMMPair { +// pair: TokenPair( +// TokenType::CustomToken { +// contract_addr: format!("token_0_addr_{}", 0).to_string(), +// token_code_hash: format!("token_0_hash_{}", 0), +// }, +// TokenType::CustomToken { +// contract_addr: format!("token_1_addr_{}", 0).to_string(), +// token_code_hash: format!("token_1_hash_{}", 0), +// }, +// ), +// address: format!("pair_addr_{}", 0).to_string(), +// }); +// save_amm_pairs(deps, amm_pairs.clone()).unwrap(); +// let result = load_amm_pairs(deps, pagination(0, 1)).unwrap(); -// // pub mod test_state { -// // use shadeswap_shared::{amm_pair::AMMPair, core::Canonize}; - -// // use super::*; - -// // fn swap_pair(pair: &TokenPair) -> TokenPair { -// // TokenPair(pair.1.clone(), pair.0.clone()) -// // } - -// // #[test] -// // fn generate_pair_key_ok() -> StdResult<()> { -// // fn cmp_pair( -// // deps: &Deps, -// // pair: TokenPair, -// // ) -> StdResult<()> { -// // let stored_pair = pair.clone().canonize(&deps.api)?; -// // let key = generate_pair_key(&stored_pair); - -// // let pair = swap_pair(&pair.clone()); - -// // let stored_pair = pair.canonize(&deps.api)?; -// // let swapped_key = generate_pair_key(&stored_pair); - -// // assert_eq!(key, swapped_key); - -// // Ok(()) -// // } - -// // let ref deps = mock_dependencies(); - -// // cmp_pair( -// // deps, -// // TokenPair( -// // TokenType::CustomToken { -// // contract_addr: Addr::unchecked("first_addr".into()), -// // token_code_hash: "13123adasd".into(), -// // }, -// // TokenType::CustomToken { -// // contract_addr: Addr::unchecked("scnd_addr".into()), -// // token_code_hash: "4534qwerqqw".into(), -// // }, -// // ), -// // )?; - -// // cmp_pair( -// // deps, -// // TokenPair( -// // TokenType::NativeToken { -// // denom: "test1".into(), -// // }, -// // TokenType::NativeToken { -// // denom: "test2".into(), -// // }, -// // ), -// // )?; - -// // cmp_pair( -// // deps, -// // TokenPair( -// // TokenType::NativeToken { -// // denom: "test3".into(), -// // }, -// // TokenType::CustomToken { -// // contract_addr: Addr::unchecked("third_addr".into()), -// // token_code_hash: "asd21312asd".into(), -// // }, -// // ), -// // )?; - -// // Ok(()) -// // } - -// // #[test] -// // fn store_and_get_amm_pairs_ok() { -// // let ref mut deps = mock_dependencies(); -// // let mut amm_pairs: Vec = vec![]; -// // amm_pairs.push(AMMPair { -// // pair: TokenPair( -// // TokenType::CustomToken { -// // contract_addr: format!("token_0_addr_{}", 0).into(), -// // token_code_hash: format!("token_0_hash_{}", 0), -// // }, -// // TokenType::CustomToken { -// // contract_addr: format!("token_1_addr_{}", 0).into(), -// // token_code_hash: format!("token_1_hash_{}", 0), -// // }, -// // ), -// // address: format!("pair_addr_{}", 0).into(), -// // }); -// // save_amm_pairs(deps, amm_pairs.clone()).unwrap(); -// // let result = load_amm_pairs(deps, pagination(0, 1)).unwrap(); - -// // //Check Count was updated -// // assert_eq!(1, load_amm_pairs_count(&mut deps.storage).unwrap()); - -// // //Check number of result was returned -// // assert_eq!(1, result.len()); - -// // //Match result -// // assert_eq!(amm_pairs[0], result[0]); -// // } - -// // #[test] -// // fn save_and_load_amm_pairs_count_ok() { -// // let ref mut deps = mock_dependencies(); -// // save_amm_pairs_count(&mut deps.storage, 1).unwrap(); -// // assert_eq!(1, load_amm_pairs_count(&mut deps.storage).unwrap()); -// // assert_ne!(2, load_amm_pairs_count(&mut deps.storage).unwrap()) -// // } -// // } - -// fn mkconfig(id: u64) -> Config { -// Config::from_init_msg(InitMsg { -// pair_contract: ContractInstantiationInfo { -// id, -// code_hash: "2341586789".into(), -// }, -// amm_settings: AMMSettings { -// lp_fee: Fee::new(28, 10000), -// shade_dao_fee: Fee::new(2, 10000), -// shade_dao_address: ContractLink { -// address: Addr::unchecked("CALLBACKADDR"), -// code_hash: "Test".to_string(), -// }, -// }, -// lp_token_contract: ContractInstantiationInfo { -// id, -// code_hash: "123".into(), -// }, -// prng_seed: to_binary(&"prng").unwrap(), -// }) -// } +// //Check Count was updated +// assert_eq!(1, load_amm_pairs_count(&mut deps.storage).unwrap()); -// fn pagination(start: u64, limit: u8) -> Pagination { -// Pagination { start, limit } -// } +// //Check number of result was returned +// assert_eq!(1, result.len()); -// impl Into for &Config { -// fn into(self) -> InitMsg { -// InitMsg { -// pair_contract: self.pair_contract.clone(), -// amm_settings: AMMSettings { -// lp_fee: Fee::new(28, 10000), -// shade_dao_fee: Fee::new(2, 10000), -// shade_dao_address: ContractLink { -// address: Addr::unchecked("CALLBACKADDR"), -// code_hash: "Test".to_string(), -// }, -// }, -// lp_token_contract: self.lp_token_contract.clone(), -// prng_seed: to_binary(&"prng").unwrap(), -// } +// //Match result +// assert_eq!(amm_pairs[0], result[0]); // } -// } -// impl Into for &Config { -// fn into(self) -> QueryResponse { -// QueryResponse::GetConfig { -// pair_contract: self.pair_contract.clone(), -// amm_settings: self.amm_settings.clone(), -// lp_token_contract: self.lp_token_contract.clone(), -// } +// #[test] +// fn save_and_load_amm_pairs_count_ok() { +// let ref mut deps = mock_dependencies(); +// save_amm_pairs_count(&mut deps.storage, 1).unwrap(); +// assert_eq!(1, load_amm_pairs_count(&mut deps.storage).unwrap()); +// assert_ne!(2, load_amm_pairs_count(&mut deps.storage).unwrap()) // } // } + +fn mkconfig(id: u64) -> Config { + Config::from_init_msg(InitMsg { + pair_contract: ContractInstantiationInfo { + id, + code_hash: "2341586789".to_string(), + }, + amm_settings: AMMSettings { + lp_fee: Fee::new(28, 10000), + shade_dao_fee: Fee::new(2, 10000), + shade_dao_address: ContractLink { + address: Addr::unchecked("CALLBACKADDR"), + code_hash: "Test".to_string(), + }, + }, + lp_token_contract: ContractInstantiationInfo { + id, + code_hash: "123".to_string(), + }, + prng_seed: to_binary(&"prng").unwrap(), + api_key: "api_key".to_string(), + authenticator: None, + }) +} + +fn pagination(start: u64, limit: u8) -> Pagination { + Pagination { start, limit } +} From 4889c48ce1c2967f69ea4b2cf1045ab75a4255e2 Mon Sep 17 00:00:00 2001 From: Michal Sivak Date: Mon, 31 Oct 2022 21:50:38 +1100 Subject: [PATCH 2/5] fix factory test --- contracts/factory/src/test.rs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/contracts/factory/src/test.rs b/contracts/factory/src/test.rs index 2d986a8..ce2acf4 100644 --- a/contracts/factory/src/test.rs +++ b/contracts/factory/src/test.rs @@ -6,9 +6,10 @@ use cosmwasm_std::Deps; use cosmwasm_std::DepsMut; use cosmwasm_std::Env; use cosmwasm_std::{Api, Binary, CanonicalAddr, Querier, StdError, StdResult, Storage}; +use shadeswap_shared::utils::asset::Contract; use shadeswap_shared::amm_pair::AMMSettings; use shadeswap_shared::core::Fee; -use shadeswap_shared::core::{ContractInstantiationInfo, ContractLink}; +use shadeswap_shared::core::{ContractInstantiationInfo}; use shadeswap_shared::msg::factory::InitMsg; pub use shadeswap_shared::{msg::factory::QueryResponse, Pagination}; @@ -21,8 +22,7 @@ pub mod test_contract { use crate::contract::instantiate; use crate::contract::query; use crate::operations::create_pair; - use crate::operations::create_signature; - use crate::state::EPHEMERAL_STORAGE_KEY; + use crate::operations::create_signature; use crate::state::NextPairKey; use crate::state::config_r; use crate::state::PAGINATION_LIMIT; @@ -86,6 +86,7 @@ pub mod test_contract { amm_settings: Some(new_config.amm_settings.clone()), lp_token_contract: Some(new_config.lp_token_contract.clone()), api_key: Some("api_key".to_string()), + admin_auth: None, }, ) .unwrap(); @@ -171,8 +172,7 @@ pub mod test_contract { deps.as_mut(), mock_env(), &mock_info("admin", &[]), - pair, - Addr::unchecked("admin"), + pair, to_binary(&"entropy").unwrap(), None, None); @@ -249,7 +249,7 @@ pub fn create_init_msg_from_config(config: &Config) -> InitMsg{ amm_settings: AMMSettings { lp_fee: Fee::new(28, 10000), shade_dao_fee: Fee::new(2, 10000), - shade_dao_address: ContractLink { + shade_dao_address: Contract { address: Addr::unchecked("CALLBACKADDR"), code_hash: "Test".to_string(), }, @@ -258,6 +258,10 @@ pub fn create_init_msg_from_config(config: &Config) -> InitMsg{ prng_seed: to_binary(&"prng").unwrap(), api_key: "api_key".to_string(), authenticator: None, + admin_auth: shadeswap_shared::Contract { + address: Addr::unchecked("admin"), + code_hash: "".to_string() + }, } } @@ -267,6 +271,7 @@ pub fn create_query_response_from_config(config: &Config) ->QueryResponse { amm_settings: config.amm_settings.clone(), lp_token_contract: config.lp_token_contract.clone(), authenticator: None, + admin_auth: config.admin_auth.clone(), } } @@ -391,7 +396,7 @@ fn mkconfig(id: u64) -> Config { amm_settings: AMMSettings { lp_fee: Fee::new(28, 10000), shade_dao_fee: Fee::new(2, 10000), - shade_dao_address: ContractLink { + shade_dao_address: Contract { address: Addr::unchecked("CALLBACKADDR"), code_hash: "Test".to_string(), }, @@ -403,6 +408,7 @@ fn mkconfig(id: u64) -> Config { prng_seed: to_binary(&"prng").unwrap(), api_key: "api_key".to_string(), authenticator: None, + admin_auth: shadeswap_shared::Contract { address: Addr::unchecked("admin"), code_hash: "".to_string() } }) } From 44952dbc9b810781fe14ec13ee5b32cafccb60f0 Mon Sep 17 00:00:00 2001 From: Michal Sivak Date: Tue, 1 Nov 2022 01:58:18 +1100 Subject: [PATCH 3/5] fixing unit & integration testS --- contracts/amm_pair/src/test.rs | 42 +- contracts/amm_pair/tests/integration.rs | 14 +- contracts/factory/src/test.rs | 180 +-- contracts/factory/tests/integration.rs | 67 +- contracts/router/src/contract.rs | 4 +- contracts/router/src/test.rs | 1184 ++++++++--------- contracts/router/tests/integration.rs | 361 +++-- contracts/staking/src/test.rs | 12 +- contracts/staking/tests/integration.rs | 19 +- packages/multi_test/src/admin/admin_lib.rs | 32 + packages/multi_test/src/admin/admin_mock.rs | 54 + packages/multi_test/src/admin/mod.rs | 4 + .../multi_test/src/amm_pair/amm_pair_lib.rs | 50 + .../multi_test/src/amm_pair/amm_pair_mock.rs | 42 +- packages/multi_test/src/amm_pair/mod.rs | 3 +- .../multi_test/src/{ => auth}/auth_query.rs | 3 +- packages/multi_test/src/auth/mod.rs | 2 + .../multi_test/src/factory/factory_mock.rs | 53 +- packages/multi_test/src/help_lib.rs | 73 +- packages/multi_test/src/lib.rs | 6 +- .../network_integration/src/cli_commands.rs | 9 +- packages/network_integration/src/cli_menu.rs | 14 +- 22 files changed, 1119 insertions(+), 1109 deletions(-) create mode 100644 packages/multi_test/src/admin/admin_lib.rs create mode 100644 packages/multi_test/src/admin/admin_mock.rs create mode 100644 packages/multi_test/src/admin/mod.rs create mode 100644 packages/multi_test/src/amm_pair/amm_pair_lib.rs rename packages/multi_test/src/{ => auth}/auth_query.rs (96%) create mode 100644 packages/multi_test/src/auth/mod.rs diff --git a/contracts/amm_pair/src/test.rs b/contracts/amm_pair/src/test.rs index b537b63..49e267e 100644 --- a/contracts/amm_pair/src/test.rs +++ b/contracts/amm_pair/src/test.rs @@ -195,9 +195,7 @@ pub mod tests { mk_custom_token_amount(Uint128::from(1000u128), &token_pair), None )?; - let offer_amount = &native_swap.clone().attributes[2]; - assert_eq!(offer_amount.value, 65420.to_string()); - assert_eq!(native_swap.messages.len(), 3); + assert_eq!(native_swap.messages.len(), 2); Ok(()) } @@ -221,44 +219,10 @@ pub mod tests { mk_custom_token_amount(Uint128::from(1000u128), &token_pair), None )?; - let offer_amount = &native_swap.clone().attributes[2]; - assert_eq!(offer_amount.value, 65420.to_string()); assert_eq!(native_swap.messages.len(), 2); Ok(()) } - #[test] - fn assert_swap_native_snip20_with_router_without_signature_throws_error() -> StdResult<()> { - let mut deps = mock_dependencies(&[]); - let env = mock_custom_env(FACTORY_CONTRACT_ADDRESS); - let token_pair = mk_native_token_pair(); - let config = make_init_config(mk_native_token_pair().clone())?; - let address_a = Addr::unchecked("TESTA".to_string()); - let router_contract = Contract { - address: Addr::unchecked("router".to_string()), - code_hash: "".to_string(), - }; - assert_eq!( - config.factory_contract.address.as_str(), - FACTORY_CONTRACT_ADDRESS.clone() - ); - let native_swap = swap( - deps.as_mut(), - env, - config, - address_a.clone(), - None, - mk_custom_token_amount(Uint128::from(1000u128), &token_pair), - None, - ); - match native_swap.unwrap_err() { - e => assert_eq!(e, StdError::generic_err( - "Callback signature needs to be passed with router contract.", - )), - } - Ok(()) - } - #[test] fn assert_get_estimated_lp_token_with_wrong_token_pair_throws_err() -> StdResult<()> { let mut deps = mock_dependencies(&[]); @@ -560,8 +524,8 @@ pub mod tests_calculation_price_and_fee { Some(Uint128::from(400u128)) ); assert_eq!( - swap_and_test_slippage.unwrap().attributes[2].value, - 1228.to_string()); + swap_and_test_slippage.unwrap().messages.len(), + 2); Ok(()) } diff --git a/contracts/amm_pair/tests/integration.rs b/contracts/amm_pair/tests/integration.rs index 0f06562..a0a90a9 100644 --- a/contracts/amm_pair/tests/integration.rs +++ b/contracts/amm_pair/tests/integration.rs @@ -10,6 +10,7 @@ use shadeswap_shared::c_std::BlockInfo; #[test] pub fn amm_pair_integration_tests_with_custom_token() { use amm_pair::contract::{instantiate, query, execute}; + use multi_test::admin::admin_help::init_admin_contract; use multi_test::help_lib::integration_help_lib::{roll_blockchain, mint_deposit_snip20, increase_allowance, store_init_factory_contract, create_token_pair, convert_to_contract_link, send_snip20_with_msg, get_snip20_balance, set_viewing_key, get_amm_pair_config, get_pair_liquidity_pool_balance}; use cosmwasm_std::{Uint128, Coin, StdError, StdResult, Timestamp, from_binary, Api}; @@ -62,10 +63,10 @@ pub fn amm_pair_integration_tests_with_custom_token() { // MINT AND DEPOSIT FOR LIQUIDITY mint_deposit_snip20(&mut router,&token_0_contract,&owner_addr,Uint128::new(10000000000u128), &owner_addr); mint_deposit_snip20(&mut router,&token_1_contract,&owner_addr,Uint128::new(10000000000u128), &owner_addr); - + let admin_contract = init_admin_contract(&mut router, &owner_addr).unwrap(); let lp_contract_info = router.store_code(snip20_lp_token_contract_store()); let staking_contract_info = router.store_code(staking_contract_store()); - let factory_contract_info = store_init_factory_contract(&mut router).unwrap(); + let factory_contract_info = store_init_factory_contract(&mut router, &convert_to_contract_link(&admin_contract)).unwrap(); let amm_pairs_info = router.store_code(amm_contract_store()); roll_blockchain(&mut router, 1).unwrap(); @@ -89,7 +90,7 @@ pub fn amm_pair_integration_tests_with_custom_token() { factory_info: factory_link.to_owned(), prng_seed: to_binary("seed").unwrap(), entropy: to_binary("seed").unwrap(), - admin_auth: todo!(), + admin_auth: convert_to_contract_link(&admin_contract), staking_contract: Some(StakingContractInit{ contract_info: ContractInstantiationInfo { code_hash: staking_contract_info.code_hash.to_owned(), @@ -321,6 +322,7 @@ pub fn amm_pair_integration_tests_with_custom_token() { #[test] pub fn amm_pair_integration_tests_native_token() { use amm_pair::contract::{instantiate, query, execute}; + use multi_test::admin::admin_help::init_admin_contract; use multi_test::help_lib::integration_help_lib::{roll_blockchain, mint_deposit_snip20, increase_allowance, store_init_factory_contract, create_token_pair, convert_to_contract_link, send_snip20_with_msg, get_snip20_balance, set_viewing_key, get_amm_pair_config, get_pair_liquidity_pool_balance, create_token_pair_with_native}; use cosmwasm_std::{Uint128, Coin, Timestamp}; use multi_test::util_addr::util_addr::{OWNER, STAKER_A, STAKER_B}; @@ -371,10 +373,10 @@ pub fn amm_pair_integration_tests_native_token() { // MINT AND DEPOSIT FOR LIQUIDITY mint_deposit_snip20(&mut router,&token_0_contract,&owner_addr,Uint128::new(10000000000u128), &owner_addr); - + let admin_contract = init_admin_contract(&mut router, &owner_addr).unwrap(); let lp_contract_info = router.store_code(snip20_lp_token_contract_store()); let staking_contract_info = router.store_code(staking_contract_store()); - let factory_contract_info = store_init_factory_contract(&mut router).unwrap(); + let factory_contract_info = store_init_factory_contract(&mut router, &convert_to_contract_link(&admin_contract)).unwrap(); let amm_pairs_info = router.store_code(amm_contract_store()); roll_blockchain(&mut router, 1).unwrap(); @@ -397,7 +399,7 @@ pub fn amm_pair_integration_tests_native_token() { factory_info: factory_link.to_owned(), prng_seed: to_binary("seed").unwrap(), entropy: to_binary("seed").unwrap(), - admin_auth: todo!(), + admin_auth: convert_to_contract_link(&admin_contract), staking_contract: Some(StakingContractInit{ contract_info: ContractInstantiationInfo { code_hash: staking_contract_info.code_hash.to_owned(), diff --git a/contracts/factory/src/test.rs b/contracts/factory/src/test.rs index ce2acf4..5c2b8a3 100644 --- a/contracts/factory/src/test.rs +++ b/contracts/factory/src/test.rs @@ -1,18 +1,27 @@ -use cosmwasm_std::testing::mock_dependencies; +use cosmwasm_std::Coin; +use cosmwasm_std::Empty; +use cosmwasm_std::OwnedDeps; +use cosmwasm_std::QuerierResult; +use cosmwasm_std::QueryRequest; +use cosmwasm_std::WasmQuery; +use cosmwasm_std::from_slice; +use cosmwasm_std::testing::MockApi; +use cosmwasm_std::testing::MockStorage; use cosmwasm_std::testing::mock_env; use cosmwasm_std::to_binary; use cosmwasm_std::Addr; -use cosmwasm_std::Deps; -use cosmwasm_std::DepsMut; -use cosmwasm_std::Env; -use cosmwasm_std::{Api, Binary, CanonicalAddr, Querier, StdError, StdResult, Storage}; +use cosmwasm_std::{DepsMut, Env}; +use shadeswap_shared::contract_interfaces::admin::ValidateAdminPermissionResponse; +use cosmwasm_std::{Querier, StdResult}; +use serde::Deserialize; +use serde::Serialize; use shadeswap_shared::utils::asset::Contract; use shadeswap_shared::amm_pair::AMMSettings; use shadeswap_shared::core::Fee; use shadeswap_shared::core::{ContractInstantiationInfo}; use shadeswap_shared::msg::factory::InitMsg; pub use shadeswap_shared::{msg::factory::QueryResponse, Pagination}; - +use shadeswap_shared::snip20::manager::Balance; use crate::state::Config; #[cfg(test)] @@ -42,7 +51,7 @@ pub mod test_contract { #[test] fn init_ok() -> StdResult<()> { - let mut deps = mock_dependencies(); + let mut deps = mock_dependencies(&[]); let config = mkconfig(0); let env = mock_env(); assert!(instantiate( @@ -61,7 +70,7 @@ pub mod test_contract { #[test] fn get_set_config_ok() -> StdResult<()> { - let mut deps = mock_dependencies(); + let mut deps = mock_dependencies(&[]); let env = mock_env(); instantiate( deps.as_mut(), @@ -99,7 +108,7 @@ pub mod test_contract { #[test] fn register_amm_pair_ok() -> StdResult<()> { - let mut deps = mock_dependencies(); + let mut deps = mock_dependencies(&[]); let env = mock_env(); let config = mkconfig(0); @@ -143,7 +152,7 @@ pub mod test_contract { #[test] fn create_pair_ok() -> StdResult<()> { - let ref mut deps = mock_dependencies(); + let ref mut deps = mock_dependencies(&[]); let env = mock_env(); let config = mkconfig(0); assert!(instantiate( @@ -182,7 +191,7 @@ pub mod test_contract { } #[test] fn add_amm_pairs() { - let ref mut deps = mock_dependencies(); + let ref mut deps = mock_dependencies(&[]); let config = mkconfig(0); let env = mock_env(); @@ -275,117 +284,48 @@ pub fn create_query_response_from_config(config: &Config) ->QueryResponse { } } + pub fn mock_dependencies( + _contract_balance: &[Coin], + ) -> OwnedDeps { + OwnedDeps { + storage: MockStorage::default(), + api: MockApi::default(), + querier: MockQuerier { _portion: 100 }, + custom_query_type: std::marker::PhantomData, + } + } -// pub mod test_state { -// use shadeswap_shared::{amm_pair::AMMPair, core::Canonize}; - -// use super::*; - -// fn swap_pair(pair: &TokenPair) -> TokenPair { -// TokenPair(pair.1.clone(), pair.0.clone()) -// } - -// #[test] -// fn generate_pair_key_ok() -> StdResult<()> { -// fn cmp_pair( -// deps: &Deps, -// pair: TokenPair, -// ) -> StdResult<()> { -// let stored_pair = pair.clone().canonize(&deps.api)?; -// let key = generate_pair_key(&stored_pair); - -// let pair = swap_pair(&pair.clone()); - -// let stored_pair = pair.canonize(&deps.api)?; -// let swapped_key = generate_pair_key(&stored_pair); - -// assert_eq!(key, swapped_key); - -// Ok(()) -// } - -// let ref deps = mock_dependencies(); - -// cmp_pair( -// deps, -// TokenPair( -// TokenType::CustomToken { -// contract_addr: Addr::unchecked("first_addr".to_string()), -// token_code_hash: "13123adasd".to_string(), -// }, -// TokenType::CustomToken { -// contract_addr: Addr::unchecked("scnd_addr".to_string()), -// token_code_hash: "4534qwerqqw".to_string(), -// }, -// ), -// )?; - -// cmp_pair( -// deps, -// TokenPair( -// TokenType::NativeToken { -// denom: "test1".to_string(), -// }, -// TokenType::NativeToken { -// denom: "test2".to_string(), -// }, -// ), -// )?; - -// cmp_pair( -// deps, -// TokenPair( -// TokenType::NativeToken { -// denom: "test3".to_string(), -// }, -// TokenType::CustomToken { -// contract_addr: Addr::unchecked("third_addr".to_string()), -// token_code_hash: "asd21312asd".to_string(), -// }, -// ), -// )?; - -// Ok(()) -// } - -// #[test] -// fn store_and_get_amm_pairs_ok() { -// let ref mut deps = mock_dependencies(); -// let mut amm_pairs: Vec = vec![]; -// amm_pairs.push(AMMPair { -// pair: TokenPair( -// TokenType::CustomToken { -// contract_addr: format!("token_0_addr_{}", 0).to_string(), -// token_code_hash: format!("token_0_hash_{}", 0), -// }, -// TokenType::CustomToken { -// contract_addr: format!("token_1_addr_{}", 0).to_string(), -// token_code_hash: format!("token_1_hash_{}", 0), -// }, -// ), -// address: format!("pair_addr_{}", 0).to_string(), -// }); -// save_amm_pairs(deps, amm_pairs.clone()).unwrap(); -// let result = load_amm_pairs(deps, pagination(0, 1)).unwrap(); - -// //Check Count was updated -// assert_eq!(1, load_amm_pairs_count(&mut deps.storage).unwrap()); - -// //Check number of result was returned -// assert_eq!(1, result.len()); - -// //Match result -// assert_eq!(amm_pairs[0], result[0]); -// } + + #[derive(Serialize, Deserialize)] + struct IntBalanceResponse { + pub balance: Balance, + } -// #[test] -// fn save_and_load_amm_pairs_count_ok() { -// let ref mut deps = mock_dependencies(); -// save_amm_pairs_count(&mut deps.storage, 1).unwrap(); -// assert_eq!(1, load_amm_pairs_count(&mut deps.storage).unwrap()); -// assert_ne!(2, load_amm_pairs_count(&mut deps.storage).unwrap()) -// } -// } + pub struct MockQuerier { + _portion: u128, + } + + impl Querier for MockQuerier { + fn raw_query(&self, bin_request: &[u8]) -> QuerierResult { + let request: QueryRequest = from_slice(bin_request).unwrap(); + match &request { + QueryRequest::Wasm(msg) => match msg { + WasmQuery::Smart { contract_addr, code_hash: _, msg: _} => { + match contract_addr.as_str() { + "admin" => { + QuerierResult::Ok(cosmwasm_std::ContractResult::Ok(to_binary(&ValidateAdminPermissionResponse{ + has_permission: true, + }).unwrap())) + }, + _ => unimplemented!(), + } + } + _ => unimplemented!(), + }, + _ => unimplemented!(), + } + } + } fn mkconfig(id: u64) -> Config { Config::from_init_msg(InitMsg { diff --git a/contracts/factory/tests/integration.rs b/contracts/factory/tests/integration.rs index b8dff3e..0f6019d 100644 --- a/contracts/factory/tests/integration.rs +++ b/contracts/factory/tests/integration.rs @@ -2,14 +2,9 @@ use cosmwasm_std::{ to_binary, Addr, Empty, ContractInfo, StdResult, }; use factory::contract::{execute, instantiate, query}; -use multi_test::help_lib::integration_help_lib::{convert_to_contract_link, roll_blockchain, store_init_amm_pair_contract, generate_snip20_contract}; +use multi_test::{help_lib::integration_help_lib::{convert_to_contract_link, roll_blockchain, generate_snip20_contract, store_init_auth_contract}, amm_pair::amm_pair_lib::amm_pair_lib::store_init_amm_pair_contract}; use secret_multi_test::{App, Contract, ContractWrapper, Executor}; -use shadeswap_shared::{ - core::{ContractInstantiationInfo, }, - factory::{InitMsg, QueryResponse, QueryMsg}, - utils::testing::TestingExt, - Contract as SContract -}; +use shadeswap_shared::{utils::testing::TestingExt, core::{ContractInstantiationInfo, }, factory::{InitMsg, QueryResponse, QueryMsg}, Contract as SContract}; pub fn contract_counter() -> Box> { let contract = ContractWrapper::new_with_empty(execute, instantiate, query); @@ -19,23 +14,20 @@ pub fn contract_counter() -> Box> { #[cfg(not(target_arch = "wasm32"))] #[test] fn factory_integration_tests() { - use multi_test::help_lib::integration_help_lib::{store_init_amm_pair_contract, generate_snip20_contract, snip_20_balance_query, convert_to_contract_link, create_token_pair, amm_pair_contract_store}; + use multi_test::admin::admin_help::init_admin_contract; + use multi_test::amm_pair::amm_pair_lib::amm_pair_lib::amm_pair_contract_store; + use multi_test::help_lib::integration_help_lib::{generate_snip20_contract, snip_20_balance_query, convert_to_contract_link, create_token_pair}; use shadeswap_shared::Pagination; use shadeswap_shared::amm_pair::AMMPair; use shadeswap_shared::factory::ExecuteMsg; use multi_test::help_lib::integration_help_lib::{roll_blockchain, store_init_auth_contract, mint_deposit_snip20, send_snip20_to_stake, snip20_send, increase_allowance, get_current_block_time, send_snip20_to_proxy_stake, set_viewing_key}; - use cosmwasm_std::{Uint128, Coin, StdError, StdResult, Timestamp}; + use cosmwasm_std::{Uint128, Coin, StdError, StdResult, Timestamp, OwnedDeps}; use multi_test::util_addr::util_addr::{OWNER, OWNER_SIGNATURE, OWNER_PUB_KEY, STAKER_A, STAKER_B, PUB_KEY_STAKER_A}; - use multi_test::util_addr::util_blockchain::CHAIN_ID; - use shadeswap_shared::utils::testing::TestingExt; - use shadeswap_shared::{core::{TokenType}}; - use multi_test::help_lib::integration_help_lib::print_events; - - let staker_a_addr = Addr::unchecked(STAKER_A.to_owned()); - let staker_b_addr = Addr::unchecked(STAKER_B.to_owned()); + use shadeswap_shared::utils::testing::TestingExt; + let owner_addr = Addr::unchecked(OWNER); let mut router = App::default(); - + let auth_contract = init_admin_contract(&mut router, &owner_addr).unwrap(); let amm_pair_contract_id = router.store_code(amm_pair_contract_store()); let init_msg = InitMsg { pair_contract: ContractInstantiationInfo { @@ -57,7 +49,7 @@ fn factory_integration_tests() { prng_seed: to_binary(&"".to_string()).unwrap(), api_key: "api_key".to_string(), authenticator: None, - admin_auth: SContract { address: Addr::unchecked(OWNER), code_hash: "".to_string() } + admin_auth: convert_to_contract_link(&auth_contract) }; let factory_contract_id = router.store_code(contract_counter()); let factory_contract = router @@ -75,7 +67,7 @@ fn factory_integration_tests() { roll_blockchain(&mut router, 1).unwrap(); let query: QueryResponse = router.query_test(factory_contract.clone(),to_binary(&QueryMsg::GetConfig { }).unwrap()).unwrap(); match query { - QueryResponse::GetConfig { pair_contract: _, amm_settings, lp_token_contract: _, authenticator: _, admin_auth } => { + QueryResponse::GetConfig { pair_contract: _, amm_settings, lp_token_contract: _, authenticator: _, admin_auth: _} => { assert_eq!(amm_settings.lp_fee, shadeswap_shared::core::Fee { nom: 2, denom: 100 }); assert_eq!(amm_settings.shade_dao_fee, shadeswap_shared::core::Fee { nom: 2, denom: 100 }); }, @@ -83,7 +75,13 @@ fn factory_integration_tests() { } // Assert Add Amm_Pair - let (token_0_contract, token_1_contract, mock_amm_pairs) = setup_create_amm_pairs(&mut router, "ETH", "USDT",&factory_contract).unwrap(); + let (token_0_contract, token_1_contract, mock_amm_pairs) = setup_create_amm_pairs( + &mut router, + "ETH", + "USDT", + &factory_contract, + &owner_addr).unwrap(); + roll_blockchain(&mut router, 1).unwrap(); let pair = create_token_pair( &convert_to_contract_link(&token_0_contract), @@ -116,12 +114,17 @@ fn factory_integration_tests() { QueryResponse::ListAMMPairs { amm_pairs } => { assert_eq!(amm_pairs.len(), 1); }, - QueryResponse::GetConfig { pair_contract, amm_settings, lp_token_contract, authenticator , admin_auth: _} => todo!(), - QueryResponse::GetAMMPairAddress { address } => todo!(), - QueryResponse::AuthorizeApiKey { authorized } => todo!(), + QueryResponse::GetConfig { pair_contract: _, amm_settings: _, lp_token_contract: _, authenticator: _ , admin_auth: _} => todo!(), + QueryResponse::GetAMMPairAddress { address: _ } => todo!(), + QueryResponse::AuthorizeApiKey { authorized: _ } => todo!(), }; - - let (token_0_contract, token_1_contract, mock_amm_pairs) = setup_create_amm_pairs(&mut router, "BTC", "ETH",&factory_contract).unwrap(); + roll_blockchain(&mut router, 1).unwrap(); + let (token_0_contract, token_1_contract, _mock_amm_pair) = setup_create_amm_pairs( + &mut router, + "BTC", + "ETH", + &factory_contract, + &owner_addr).unwrap(); let create_msg = ExecuteMsg::CreateAMMPair { pair: create_token_pair( &convert_to_contract_link(&token_0_contract), @@ -145,26 +148,30 @@ fn factory_integration_tests() { QueryResponse::ListAMMPairs { amm_pairs } => { assert_eq!(amm_pairs.len(), 2); }, - QueryResponse::GetConfig { pair_contract, amm_settings, lp_token_contract, authenticator, admin_auth: _ } => todo!(), - QueryResponse::GetAMMPairAddress { address } => todo!(), - QueryResponse::AuthorizeApiKey { authorized } => todo!(), + QueryResponse::GetConfig { pair_contract: _, amm_settings: _, lp_token_contract:_, authenticator: _, admin_auth: _ } => todo!(), + QueryResponse::GetAMMPairAddress { address: _ } => todo!(), + QueryResponse::AuthorizeApiKey { authorized: _ } => todo!(), _ => {} }; } -pub fn setup_create_amm_pairs(router: &mut App, symbol_0: &str, symbol_1: &str, factory_contract: &ContractInfo) +pub fn setup_create_amm_pairs(router: &mut App, symbol_0: &str, symbol_1: &str, factory_contract: &ContractInfo, sender: &Addr) -> StdResult<(cosmwasm_std::ContractInfo, cosmwasm_std::ContractInfo, cosmwasm_std::ContractInfo)> { let token_0_contract = generate_snip20_contract(router, symbol_0.to_string(), symbol_0.to_string(), 18).unwrap(); roll_blockchain(router, 1).unwrap(); let token_1_contract = generate_snip20_contract(router, symbol_1.to_string(), symbol_1.to_string(), 18).unwrap(); roll_blockchain(router, 1).unwrap(); + // auth contract + let auth_query_contract = store_init_auth_contract(router)?; let mock_amm_pairs = store_init_amm_pair_contract( router, &convert_to_contract_link(&token_0_contract), &convert_to_contract_link(&token_1_contract), - &convert_to_contract_link(factory_contract) + &convert_to_contract_link(factory_contract), + &convert_to_contract_link(&auth_query_contract), + &sender ).unwrap(); let response = (token_0_contract, token_1_contract, mock_amm_pairs); Ok(response) diff --git a/contracts/router/src/contract.rs b/contracts/router/src/contract.rs index dc4eb82..48ad5d6 100644 --- a/contracts/router/src/contract.rs +++ b/contracts/router/src/contract.rs @@ -206,8 +206,8 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { #[entry_point] pub fn reply(deps: DepsMut, env: Env, msg: Reply) -> StdResult { - pad_response_result(match (msg.id) { - (SWAP_REPLY_ID) => { + pad_response_result(match msg.id { + SWAP_REPLY_ID => { let response = Response::new(); Ok(next_swap(deps, env, response)?) }, diff --git a/contracts/router/src/test.rs b/contracts/router/src/test.rs index e36def1..1adc93a 100644 --- a/contracts/router/src/test.rs +++ b/contracts/router/src/test.rs @@ -1,629 +1,575 @@ -// #[cfg(test)] -// pub mod tests { +#[cfg(test)] +pub mod tests { + use crate::contract::SWAP_REPLY_ID; + use crate::contract::execute; + use crate::contract::instantiate; + use crate::state::Config; + use crate::state::CurrentSwapInfo; + use crate::state::config_r; + use crate::state::epheral_storage_r; + use crate::state::epheral_storage_w; + use cosmwasm_std::Addr; + use cosmwasm_std::OwnedDeps; + use cosmwasm_std::Response; + use cosmwasm_std::StdResult; + use cosmwasm_std::SubMsg; + use cosmwasm_std::from_slice; + use cosmwasm_std::testing::mock_env; + use cosmwasm_std::testing::MockApi; + use cosmwasm_std::testing::MockStorage; + use cosmwasm_std::testing::mock_info; + use cosmwasm_std::to_binary; -// use crate::contract::execute; -// use crate::contract::instantiate; -// use crate::state::Config; -// use crate::state::CurrentSwapInfo; -// use crate::state::EPHEMERAL_STORAGE_KEY; -// use crate::state::config_r; -// use crate::state::epheral_storage_r; -// use crate::state::epheral_storage_w; -// use cosmwasm_std::Addr; -// use cosmwasm_std::OwnedDeps; -// use cosmwasm_std::Response; -// use cosmwasm_std::StdResult; -// use cosmwasm_std::SubMsg; -// use cosmwasm_std::from_binary; -// use cosmwasm_std::from_slice; -// use cosmwasm_std::testing::mock_env; -// use cosmwasm_std::testing::MockApi; -// use cosmwasm_std::testing::MockStorage; -// use cosmwasm_std::testing::mock_info; -// use cosmwasm_std::to_binary; -// use cosmwasm_std::to_vec; -// use cosmwasm_std::AllBalanceResponse; -// use serde::Deserialize; -// use serde::Serialize; -// use shadeswap_shared::core::TokenPair; -// use shadeswap_shared::msg::factory::{ QueryResponse as FactoryQueryResponse}; -// use shadeswap_shared::msg::amm_pair::{QueryMsg as AMMPairQueryMsg, QueryMsgResponse as AMMPairQueryMsgResponse}; -// use cosmwasm_std::Api; -// use cosmwasm_std::BalanceResponse; -// use cosmwasm_std::BankQuery; -// use cosmwasm_std::Coin; -// use cosmwasm_std::CosmosMsg; -// use cosmwasm_std::Empty; -// use cosmwasm_std::Env; -// use cosmwasm_std::Querier; -// use cosmwasm_std::QuerierResult; -// use cosmwasm_std::QueryRequest; -// use cosmwasm_std::StdError; -// use cosmwasm_std::Storage; -// use cosmwasm_std::Uint128; -// use cosmwasm_std::WasmMsg; -// use cosmwasm_std::WasmQuery; -// use shadeswap_shared::core::ContractInstantiationInfo; -// use shadeswap_shared::core::Fee; -// use shadeswap_shared::core::TokenAmount; -// use shadeswap_shared::core::TokenType; -// use shadeswap_shared::router::ExecuteMsg; -// use shadeswap_shared::router::InitMsg; -// use shadeswap_shared::router::InvokeMsg; -// use shadeswap_shared::snip20; -// use shadeswap_shared::snip20::manager::Balance; - -// pub const FACTORY_ADDRESS: &str = "FACTORY_ADDRESS"; -// pub const PAIR_CONTRACT_1: &str = "PAIR_CONTRACT_1"; -// pub const PAIR_CONTRACT_2: &str = "PAIR_CONTRACT_2"; -// pub const CUSTOM_TOKEN_1: &str = "CUSTOM_TOKEN_1"; - -// #[test] -// fn ok_init() -> StdResult<()> { -// let ref mut deps = mkdeps(); -// let env = mock_env(); -// let config = mkconfig(env.clone(), 0); -// let mock_info = mock_info("admin", &[]); -// assert!(instantiate(deps.as_mut(), env.clone(),mock_info, (&config).into()).is_ok()); -// assert_eq!(config, config_r(deps.as_mut().storage).load()?); -// Ok(()) -// } - -// #[test] -// fn swap_native_for_snip20_tokens_ok() -> StdResult<()> { -// let (init_result, mut deps) = init_helper(100); -// assert!( -// init_result.is_ok(), -// "Init failed: {}", -// init_result.err().unwrap() -// ); - -// let result = execute( -// deps.as_mut(), -// mock_env(), -// mock_info("admin", &[Coin{ denom: "uscrt".to_string(), amount: Uint128::new(10u128) }]), -// ExecuteMsg::SwapTokensForExact { -// offer: TokenAmount { -// token: TokenType::NativeToken { -// denom: "uscrt".to_string(), -// }, -// amount: Uint128::new(10u128), -// }, -// expected_return: None, -// path: vec![Addr::unchecked("token_addr".to_string())], -// recipient: None, -// }, -// ) -// .unwrap(); - -// assert!(result.messages.len() > 0); -// let result = epheral_storage_r(&deps.storage).load(); -// match result { -// Ok(info) => { -// assert_eq!( -// info.amount, -// TokenAmount { -// token: TokenType::NativeToken { -// denom: "uscrt".to_string(), -// }, -// amount: Uint128::new(10u128), -// } -// ); - -// assert_eq!(info.paths, vec![Addr::unchecked("token_addr".to_string())]); -// } -// Err(_) => panic!("Ephemeral storage should not be empty!"), -// } - -// Ok(()) -// } - -// #[test] -// fn swap_snip20_native_for_tokens_ok() -> StdResult<()> { -// let (init_result, mut deps) = init_helper(100); -// let env = mock_env(); -// let mock_info = mock_info("admin", &[Coin{ denom: "uscrt".to_string(), amount: Uint128::new(10u128) }]); + use serde::Deserialize; + use serde::Serialize; + use shadeswap_shared::admin::ValidateAdminPermissionResponse; + use shadeswap_shared::core::TokenPair; + use shadeswap_shared::msg::amm_pair::{ExecuteMsg as AMMPairExecuteMsg}; + use shadeswap_shared::msg::factory::{ QueryResponse as FactoryQueryResponse}; + use shadeswap_shared::msg::amm_pair::{QueryMsg as AMMPairQueryMsg, QueryMsgResponse as AMMPairQueryMsgResponse}; + use cosmwasm_std::Api; + use cosmwasm_std::Coin; + use cosmwasm_std::CosmosMsg; + use cosmwasm_std::Empty; + use cosmwasm_std::Env; + use cosmwasm_std::Querier; + use cosmwasm_std::QuerierResult; + use shadeswap_shared::utils::asset::Contract; + use cosmwasm_std::QueryRequest; + use cosmwasm_std::StdError; + use cosmwasm_std::Storage; + use cosmwasm_std::Uint128; + use cosmwasm_std::WasmMsg; + use cosmwasm_std::WasmQuery; + use shadeswap_shared::core::ContractInstantiationInfo; + use shadeswap_shared::core::Fee; + use shadeswap_shared::core::TokenAmount; + use shadeswap_shared::core::TokenType; + use shadeswap_shared::router::ExecuteMsg; + use shadeswap_shared::router::Hop; + use shadeswap_shared::router::InitMsg; + use shadeswap_shared::router::InvokeMsg; + use shadeswap_shared::snip20; + use shadeswap_shared::snip20::manager::Balance; + + pub const FACTORY_ADDRESS: &str = "FACTORY_ADDRESS"; + pub const PAIR_CONTRACT_1: &str = "paircontracta"; + pub const PAIR_CONTRACT_2: &str = "paircontractb"; + pub const CUSTOM_TOKEN_1: &str = "CUSTOM_TOKEN_1"; + + #[test] + fn ok_init() -> StdResult<()> { + let ref mut deps = mkdeps(); + let env = mock_env(); + let config = mkconfig(env.clone(), 0); + let mock_info = mock_info("admin", &[]); + assert!(instantiate(deps.as_mut(), env.clone(),mock_info, (&config).into()).is_ok()); + assert_eq!(config, config_r(deps.as_mut().storage).load()?); + Ok(()) + } + + #[test] + fn swap_native_for_snip20_tokens_ok() -> StdResult<()> { + let (init_result, mut deps) = init_helper(); + assert!( + init_result.is_ok(), + "Init failed: {}", + init_result.err().unwrap() + ); + + let result = execute( + deps.as_mut(), + mock_env(), + mock_info("admin", &[Coin{ denom: "uscrt".to_string(), amount: Uint128::new(10u128) }]), + ExecuteMsg::SwapTokensForExact { + offer: TokenAmount { + token: TokenType::NativeToken { + denom: "uscrt".to_string(), + }, + amount: Uint128::new(10u128), + }, + expected_return: None, + path: vec![Hop{ addr: Addr::unchecked(PAIR_CONTRACT_1.to_string()), code_hash: "".to_string()}], + recipient: None, + }, + ) + .unwrap(); + + assert!(result.messages.len() > 0); + let result = epheral_storage_r(&deps.storage).load(); + match result { + Ok(info) => { + assert_eq!( + info.amount, + TokenAmount { + token: TokenType::NativeToken { + denom: "uscrt".to_string(), + }, + amount: Uint128::new(10u128), + } + ); + + assert_eq!(info.path, vec![Hop{ addr: Addr::unchecked(PAIR_CONTRACT_1.to_string()), code_hash: "".to_string()}]); + } + Err(_) => panic!("Ephemeral storage should not be empty!"), + } + + Ok(()) + } + + #[test] + fn swap_snip20_native_for_tokens_ok() -> StdResult<()> { + let (init_result, mut deps) = init_helper(); + let env = mock_env(); + let mock_info = mock_info("admin", &[Coin{ denom: "uscrt".to_string(), amount: Uint128::new(10u128) }]); -// assert!( -// init_result.is_ok(), -// "Init failed: {}", -// init_result.err().unwrap() -// ); - -// let result = execute( -// deps.as_mut(), -// env, -// mock_info, -// ExecuteMsg::SwapTokensForExact { -// offer: TokenAmount { -// token: TokenType::NativeToken { -// denom: "uscrt".to_string(), -// }, -// amount: Uint128::new(10u128), -// }, -// expected_return: None, -// path: vec![Addr::unchecked("token_addr".to_string())], -// recipient: Some(Addr::unchecked("sender_addr")), -// }, -// ) -// .unwrap(); - -// assert!(result.messages.len() > 0); -// let result = epheral_storage_r(&deps.storage).load(); -// match result { -// Ok(info) => { -// assert_eq!( -// info.amount, -// TokenAmount { -// token: TokenType::NativeToken { -// denom: "uscrt".to_string(), -// }, -// amount: Uint128::new(10u128), -// } -// ); -// assert_eq!( -// info.paths, -// vec![Addr::unchecked("token_addr".to_string())] -// ); -// } -// Err(_) => panic!("Ephemeral storage should not be empty!"), -// } - -// Ok(()) -// } - -// #[test] -// fn snip20_swap() -> StdResult<()> { -// let mock_info = mock_info("admin", &[Coin{ denom: "uscrt".to_string(), amount: Uint128::new(1000000000000000u128) }]); -// let (init_result, mut deps) = init_helper(100); -// assert!( -// init_result.is_ok(), -// "Init failed: {}", -// init_result.err().unwrap() -// ); - -// epheral_storage_w(&mut deps.storage).save( &CurrentSwapInfo { -// amount_out_min: Some(Uint128::new(10u128)), -// amount: TokenAmount { -// token: TokenType::NativeToken { -// denom: "uscrt".to_string(), -// }, -// amount: Uint128::new(10u128), -// }, -// path: vec![ -// Addr::unchecked(PAIR_CONTRACT_1.to_string()), -// Addr::unchecked(PAIR_CONTRACT_2.to_string()), -// ], -// next_token_in: TokenType::CustomToken { contract_addr: (), token_code_hash: () }, -// recipient: Addr::unchecked("recipient".to_string()), -// current_index: 0, -// })?; + assert!( + init_result.is_ok(), + "Init failed: {}", + init_result.err().unwrap() + ); + + let result = execute( + deps.as_mut(), + env, + mock_info, + ExecuteMsg::SwapTokensForExact { + offer: TokenAmount { + token: TokenType::NativeToken { + denom: "uscrt".to_string(), + }, + amount: Uint128::new(10u128), + }, + expected_return: None, + path: vec![Hop{addr: Addr::unchecked(PAIR_CONTRACT_1.to_string()), code_hash: "".to_string()}], + recipient: Some("sender_addr".to_string()), + }, + ) + .unwrap(); + + assert!(result.messages.len() > 0); + let result = epheral_storage_r(&deps.storage).load(); + match result { + Ok(info) => { + assert_eq!( + info.amount, + TokenAmount { + token: TokenType::NativeToken { + denom: "uscrt".to_string(), + }, + amount: Uint128::new(10u128), + } + ); + assert_eq!( + info.path, + vec![Hop{ addr: Addr::unchecked(PAIR_CONTRACT_1.to_string()), code_hash: "".to_string()}] + ); + } + Err(_) => panic!("Ephemeral storage should not be empty!"), + } + + Ok(()) + } + + #[test] + fn snip20_swap() -> StdResult<()> { + let mock_info = mock_info("admin", &[Coin{ denom: "uscrt".to_string(), amount: Uint128::new(1000000000000000u128) }]); + let (init_result, mut deps) = init_helper(); + assert!( + init_result.is_ok(), + "Init failed: {}", + init_result.err().unwrap() + ); + + epheral_storage_w(&mut deps.storage).save( &CurrentSwapInfo { + amount_out_min: Some(Uint128::new(10u128)), + amount: TokenAmount { + token: TokenType::NativeToken { + denom: "uscrt".to_string(), + }, + amount: Uint128::new(10u128), + }, + path: vec![ + Hop{ addr: Addr::unchecked(PAIR_CONTRACT_1.to_string()), code_hash: "".to_string()}, + Hop{ addr: Addr::unchecked(PAIR_CONTRACT_2.to_string()), code_hash: "".to_string()}, + ], + next_token_in: TokenType::CustomToken { contract_addr: Addr::unchecked("token_1"), token_code_hash: "".to_string() }, + recipient: Addr::unchecked("recipient".to_string()), + current_index: 0, + })?; -// let result = execute( -// deps.as_mut(), -// mock_env(), -// mock_info, -// ExecuteMsg::Receive { -// from: Addr::unchecked("recipient".to_string()), -// msg: Some( -// to_binary(&InvokeMsg::SwapTokensForExact { -// expected_return: Some(Uint128::new(1000u128)), -// path: vec![Addr::unchecked(PAIR_CONTRACT_1.to_string())], -// recipient: None, -// }) -// .unwrap(), -// ), -// amount: Uint128::new(100u128), -// }, -// ); - -// match result { -// Ok(info) => { -// println!("{:?}", info.messages); -// } -// Err(err) => { -// let test = err.to_string(); -// assert_eq!(StdError::generic_err("No matching token in pair"),err); -// } -// } - -// Ok(()) -// } - -// #[test] -// fn first_swap_callback_with_one_more_unauthorized() -> StdResult<()> { -// let (init_result, mut deps) = init_helper(100); -// let mut env = mock_env(); - -// assert!( -// init_result.is_ok(), -// "Init failed: {}", -// init_result.err().unwrap() -// ); - -// epheral_storage_w(&mut deps.storage).save( &CurrentSwapInfo { -// amount_out_min: Some(Uint128::new(10u128)), -// amount: TokenAmount { -// token: TokenType::NativeToken { -// denom: "uscrt".to_string(), -// }, -// amount: Uint128::new(10u128), -// }, -// path: vec![ -// Addr::unchecked(PAIR_CONTRACT_1.to_string()), -// Addr::unchecked(PAIR_CONTRACT_2.to_string()), -// ], -// recipient: Addr::unchecked("recipient".to_string()), -// current_index: 0, -// next_token_in: todo!(), -// }).unwrap(); - -// let result = execute( -// deps.as_mut(), -// env, -// mock_info("admin", &[]), -// ExecuteMsg::SwapCallBack { -// last_token_out: TokenAmount { -// token: TokenType::NativeToken { -// denom: "uscrt".into(), -// }, -// amount: Uint128::new(100u128), -// }, -// signature: to_binary("wrong signature").unwrap(), -// }, -// ); - -// match result { -// Err(StdError::GenericErr { .. }) => {} -// _ => panic!("Must return unauthorized error"), -// } - -// Ok(()) -// } - -// #[test] -// fn first_swap_callback_with_one_more_ok() -> StdResult<()> { -// let (init_result, mut deps) = init_helper(100); -// let mut env = mock_env(); - -// assert!( -// init_result.is_ok(), -// "Init failed: {}", -// init_result.err().unwrap() -// ); - -// epheral_storage_w(&mut deps.storage).save(&CurrentSwapInfo { -// amount_out_min: Some(Uint128::new(10u128)), -// amount: TokenAmount { -// token: TokenType::NativeToken { -// denom: "uscrt".into(), -// }, -// amount: Uint128::new(10u128), -// }, -// path: vec![ -// Addr::unchecked(PAIR_CONTRACT_1.to_string()), -// Addr::unchecked(PAIR_CONTRACT_2.to_string()), -// ], -// recipient: Addr::unchecked("recipient".to_string()), -// current_index: 0, -// next_token_in: todo!(), -// }); + let result = execute( + deps.as_mut(), + mock_env(), + mock_info, + ExecuteMsg::Receive { + from: "recipient".to_string(), + msg: Some( + to_binary(&InvokeMsg::SwapTokensForExact { + expected_return: Some(Uint128::new(1000u128)), + path: vec![Hop{ addr: Addr::unchecked(PAIR_CONTRACT_1.to_string()), code_hash: "".to_string()}], + recipient: None + }) + .unwrap(), + ), + amount: Uint128::new(100u128), + }, + ); + + match result { + Ok(info) => { + println!("{:?}", info.messages); + } + Err(err) => { + let test = err.to_string(); + assert_eq!(StdError::generic_err("No matching token in pair"),err); + } + } + + Ok(()) + } + + #[test] + fn first_swap_callback_with_one_more_ok() -> StdResult<()> { + let (init_result, mut deps) = init_helper(); + let env = mock_env(); + + assert!( + init_result.is_ok(), + "Init failed: {}", + init_result.err().unwrap() + ); + + epheral_storage_w(&mut deps.storage).save(&CurrentSwapInfo { + amount: TokenAmount { + token: TokenType::NativeToken { + denom: "uscrt".into(), + }, + amount: Uint128::new(10u128), + }, + amount_out_min: Some(Uint128::new(10u128)), + path: vec![ + Hop{ addr: Addr::unchecked(PAIR_CONTRACT_1.to_string()), code_hash: "".to_string()}, + Hop{ addr: Addr::unchecked(PAIR_CONTRACT_2.to_string()), code_hash: "".to_string()}, + ], + recipient: Addr::unchecked("recipient".to_string()), + current_index: 0, + next_token_in: TokenType::NativeToken { + denom: "uscrt".into(), + }, + })?; -// let result = execute( -// deps.as_mut(), -// env, -// mock_info("admin", &[]), -// ExecuteMsg::SwapCallBack { -// last_token_out: TokenAmount { -// token: TokenType::NativeToken { -// denom: "uscrt".into(), -// }, -// amount: Uint128::new(10u128), -// }, -// signature: to_binary("this is signature").unwrap(), -// }, -// ) -// .unwrap(); - -// println!("{:?}", result.messages); - -// Ok(()) -// } - -// #[test] -// fn first_swap_callback_with_no_more_ok() -> StdResult<()> { -// let (init_result, mut deps) = init_helper(100); -// let mut env = mock_env(); - -// assert!( -// init_result.is_ok(), -// "Init failed: {}", -// init_result.err().unwrap() -// ); - -// epheral_storage_w(&mut deps.storage).save( -// &CurrentSwapInfo { -// amount_out_min: Some(Uint128::new(10u128)), -// amount: TokenAmount { -// token: TokenType::NativeToken { -// denom: "uscrt".into(), -// }, -// amount: Uint128::new(10u128), -// }, -// path: vec![Addr::unchecked(PAIR_CONTRACT_1.to_string())], -// recipient: Addr::unchecked("recipient".to_string()), -// current_index: 0, -// next_token_in: todo!(), -// } -// )?; - -// let result = execute( -// deps.as_mut(), -// env.clone(), -// mock_info("admin", &[Coin{ denom: "uscrt".to_string(), amount: Uint128::new(1000000u128)}]), -// ExecuteMsg::SwapCallBack { -// last_token_out: TokenAmount { -// token: TokenType::NativeToken { -// denom: "uscrt".into(), -// }, -// amount: Uint128::new(10u128), -// }, -// signature: to_binary("this is signature").unwrap(), -// }, -// ) -// .unwrap(); - -// assert_eq!(result.messages.len(), 1); - -// println!("{:?}", result.messages[0]); -// let test: CosmosMsg = CosmosMsg::Wasm(WasmMsg::Execute { -// contract_addr: CUSTOM_TOKEN_1.to_string(), -// msg: to_binary(&snip20::ExecuteMsg::Send { -// recipient: "recipient".to_string(), -// amount: Uint128::new(10u128), -// msg: None, -// recipient_code_hash: None, -// memo: None, -// padding: None, -// })?, -// code_hash: "".to_string(), -// funds: vec![], -// }); -// println!("{:?}", test); -// // assert!(result.messages.contains(&CosmosMsg::Wasm(WasmMsg::Execute { -// // contract_addr:Addr::unchecked(CUSTOM_TOKEN_1.to_string()), -// // msg:to_binary(&snip20::ExecuteMsg::Send{recipient:Addr::unchecked("recipient".into()), -// // amount:Uint128::new(10u128),padding:None,msg:None,recipient_code_hash:None,memo:None,})?, -// // code_hash: "".to_string(), -// // funds: &[] }))); -// Ok(()) -// } - -// #[test] -// fn first_swap_callback_with_no_more_not_enough_return() -> StdResult<()> { -// let (init_result, mut deps) = init_helper(100); -// let env = mock_env(); - -// assert!( -// init_result.is_ok(), -// "Init failed: {}", -// init_result.err().unwrap() -// ); - -// epheral_storage_w(&mut deps.storage).save( -// &CurrentSwapInfo { -// amount_out_min: Some(Uint128::new(100)), -// amount: TokenAmount { -// token: TokenType::NativeToken { -// denom: "uscrt".into(), -// }, -// amount: Uint128::new(10), -// }, -// path: vec![Addr::unchecked(PAIR_CONTRACT_1.to_string())], -// recipient: Addr::unchecked("recipient".to_string()), -// current_index: 0, -// next_token_in: todo!(), -// } -// )?; - -// let result = execute( -// deps.as_mut(), -// env.clone(), -// mock_info("admin", &[]), -// ExecuteMsg::SwapCallBack { -// last_token_out: TokenAmount { -// token: TokenType::NativeToken { -// denom: "uscrt".into(), -// }, -// amount: Uint128::new(10), -// }, -// signature: to_binary("this is signature").unwrap(), -// }, -// ); - -// match result { -// Err(StdError::GenericErr { .. }) => {} -// _ => panic!("Must return error"), -// } -// Ok(()) -// } - -// fn mkconfig(env: Env, id: u64) -> Config { -// Config{ -// viewing_key: "SHADE_ROUTER_KEY".to_string(), -// admin_auth: todo!(), -// } -// } -// fn mkdeps() -> OwnedDeps { -// mock_dependencies(&[]) -// } + let result = execute( + deps.as_mut(), + env, + mock_info("admin", &[Coin{denom: "uscrt".to_string(), amount: Uint128::new(10u128) }]), + ExecuteMsg::SwapTokensForExact { + offer: TokenAmount { + token: TokenType::NativeToken { + denom: "uscrt".to_string(), + }, + amount: Uint128::new(10u128), + }, + expected_return: None, + path: vec![Hop{ addr: Addr::unchecked(PAIR_CONTRACT_1.to_string()), code_hash: "".to_string()}], + recipient: None, + } + ) + .unwrap(); + + let msg = to_binary(&AMMPairExecuteMsg::SwapTokens { + expected_return: None, + to: None, + offer: TokenAmount { + token: TokenType::NativeToken { + denom: "uscrt".to_string(), + }, + amount: Uint128::new(10u128), + }, + })?; + + assert_eq!(result.messages[0],SubMsg::reply_always( + WasmMsg::Execute { + contract_addr: PAIR_CONTRACT_1.to_string(), + code_hash: "".to_string(), + msg, + funds: vec![Coin { + denom: "uscrt".to_string(), + amount: Uint128::new(10u128), + }], + }, + SWAP_REPLY_ID, + )); + + Ok(()) + } + + #[test] + fn first_swap_callback_with_no_more_ok() -> StdResult<()> { + let (init_result, mut deps) = init_helper(); + let env = mock_env(); + + assert!( + init_result.is_ok(), + "Init failed: {}", + init_result.err().unwrap() + ); + + epheral_storage_w(&mut deps.storage).save( + &CurrentSwapInfo { + amount_out_min: Some(Uint128::new(10u128)), + amount: TokenAmount { + token: TokenType::NativeToken { + denom: "uscrt".into(), + }, + amount: Uint128::new(10u128), + }, + path: vec![ + Hop{ addr: Addr::unchecked(PAIR_CONTRACT_1.to_string()), code_hash: "".to_string()}, + ], + recipient: Addr::unchecked("recipient".to_string()), + current_index: 0, + next_token_in: TokenType::NativeToken { + denom: "uscrt".into(), + }, + } + )?; + + let result = execute( + deps.as_mut(), + env.clone(), + mock_info("admin", &[Coin{ denom: "uscrt".to_string(), amount: Uint128::new(10u128)}]), + ExecuteMsg::SwapTokensForExact { + offer: TokenAmount { + token: TokenType::NativeToken { + denom: "uscrt".to_string(), + }, + amount: Uint128::new(10u128), + }, + expected_return: None, + path: vec![Hop{ addr: Addr::unchecked(PAIR_CONTRACT_1.to_string()), code_hash: "".to_string()}], + recipient: None, + }, + ) + .unwrap(); + + let msg = to_binary(&AMMPairExecuteMsg::SwapTokens { + expected_return: None, + to: None, + offer: TokenAmount { + token: TokenType::NativeToken { + denom: "uscrt".to_string(), + }, + amount: Uint128::new(10u128), + }, + })?; + assert_eq!(result.messages[0],SubMsg::reply_always( + WasmMsg::Execute { + contract_addr: PAIR_CONTRACT_1.to_string(), + code_hash: "".to_string(), + msg, + funds: vec![Coin { + denom: "uscrt".to_string(), + amount: Uint128::new(10u128), + }], + }, + SWAP_REPLY_ID, + )); + + Ok(()) + } + + #[test] + fn first_swap_callback_with_no_more_not_enough_return() -> StdResult<()> { + let (init_result, mut deps) = init_helper(); + let env = mock_env(); + + assert!( + init_result.is_ok(), + "Init failed: {}", + init_result.err().unwrap() + ); + + epheral_storage_w(&mut deps.storage).save( + &CurrentSwapInfo { + amount_out_min: Some(Uint128::new(100)), + amount: TokenAmount { + token: TokenType::NativeToken { + denom: "uscrt".into(), + }, + amount: Uint128::new(10), + }, + path: vec![ + Hop{ addr: Addr::unchecked(PAIR_CONTRACT_1.to_string()), code_hash: "".to_string()}, + ], + recipient: Addr::unchecked("recipient".to_string()), + current_index: 0, + next_token_in: TokenType::NativeToken { + denom: "uscrt".into(), + }, + } + )?; + + let result = execute( + deps.as_mut(), + env.clone(), + mock_info("admin", &[]), + ExecuteMsg::SwapTokensForExact { + offer: TokenAmount { + token: TokenType::NativeToken { + denom: "uscrt".to_string(), + }, + amount: Uint128::new(10u128), + }, + expected_return: None, + path: vec![Hop{ addr: Addr::unchecked("token_addr".to_string()), code_hash: "".to_string()}], + recipient: None, + }, + ); + + match result { + Err(StdError::GenericErr { .. }) => {} + _ => panic!("Must return error"), + } + Ok(()) + } + + fn mkconfig(env: Env, id: u64) -> Config { + Config{ + viewing_key: "SHADE_ROUTER_KEY".to_string(), + admin_auth: Contract{address: Addr::unchecked("".to_string()), code_hash: "".to_string()}, + } + } + fn mkdeps() -> OwnedDeps { + mock_dependencies(&[]) + } -// impl Into for &Config { -// fn into(self) -> InitMsg { -// InitMsg { -// prng_seed: to_binary(&"prng").unwrap(), -// entropy: to_binary(&"entropy").unwrap(), -// admin_auth: todo!(), -// } -// } -// } - -// fn init_helper( -// contract_bal: u128, -// ) -> ( -// StdResult, -// OwnedDeps, -// ) { -// let mut deps = mock_dependencies(&[]); -// let env = mock_env(); - -// let init_msg = InitMsg { -// prng_seed: to_binary(&"prng").unwrap(), -// entropy: to_binary(&"entropy").unwrap(), -// admin_auth: todo!(), -// }; - -// (instantiate(deps.as_mut(), env, mock_info("admin", &[]), init_msg), deps) -// } - -// pub fn mock_dependencies( -// _contract_balance: &[Coin], -// ) -> OwnedDeps { -// OwnedDeps { -// storage: MockStorage::default(), -// api: MockApi::default(), -// querier: MockQuerier { portion: 100 }, -// custom_query_type: std::marker::PhantomData, -// } -// } + impl Into for &Config { + fn into(self) -> InitMsg { + InitMsg { + prng_seed: to_binary(&"prng").unwrap(), + entropy: to_binary(&"entropy").unwrap(), + admin_auth: Contract{address: Addr::unchecked("".to_string()), code_hash: "".to_string()}, + } + } + } + + fn init_helper( + ) -> ( + StdResult, + OwnedDeps, + ) { + let mut deps = mock_dependencies(&[]); + let env = mock_env(); + + let init_msg = InitMsg { + prng_seed: to_binary(&"prng").unwrap(), + entropy: to_binary(&"entropy").unwrap(), + admin_auth: Contract { + address: Addr::unchecked("admin_auth".to_string()), + code_hash: "".to_string() + }, + }; + + (instantiate(deps.as_mut(), env, mock_info("admin", &[]), init_msg), deps) + } + + pub fn mock_dependencies( + _contract_balance: &[Coin], + ) -> OwnedDeps { + OwnedDeps { + storage: MockStorage::default(), + api: MockApi::default(), + querier: MockQuerier { portion: 100 }, + custom_query_type: std::marker::PhantomData, + } + } -// #[derive(Serialize, Deserialize)] -// struct IntBalanceResponse { -// pub balance: Balance, -// } - -// pub struct MockQuerier { -// portion: u128, -// } + #[derive(Serialize, Deserialize)] + struct IntBalanceResponse { + pub balance: Balance, + } + + pub struct MockQuerier { + portion: u128, + } -// impl Querier for MockQuerier { -// fn raw_query(&self, bin_request: &[u8]) -> QuerierResult { -// let request: QueryRequest = from_slice(bin_request).unwrap(); -// match &request { -// QueryRequest::Wasm(msg) => match msg { -// WasmQuery::Smart { contract_addr, code_hash, msg} => { -// println!("{}", contract_addr); -// match contract_addr.as_str() { -// FACTORY_ADDRESS => { -// QuerierResult::Ok(cosmwasm_std::ContractResult::Ok(to_binary(&FactoryQueryResponse::GetConfig { -// pair_contract: ContractInstantiationInfo { -// code_hash: "".to_string(), -// id: 1, -// }, -// amm_settings: shadeswap_shared::amm_pair::AMMSettings { -// lp_fee: Fee::new(28, 10000), -// shade_dao_fee: Fee::new(2, 10000), -// shade_dao_address: ContractLink { -// address: Addr::unchecked(String::from("DAO")), -// code_hash: "".to_string(), -// }, -// }, -// lp_token_contract: ContractInstantiationInfo { -// code_hash: "".to_string(), -// id: 1, -// }, -// authenticator: None, -// admin_auth: todo!(), -// }).unwrap())) -// } -// PAIR_CONTRACT_1 => -// { -// QuerierResult::Ok(cosmwasm_std::ContractResult::Ok(to_binary( -// &AMMPairQueryMsgResponse::GetPairInfo { -// liquidity_token: ContractLink { -// address: Addr::unchecked("asd"), -// code_hash: "".to_string(), -// }, -// factory: ContractLink { -// address: Addr::unchecked("asd"), -// code_hash: "".to_string(), -// }, -// pair: TokenPair( -// TokenType::CustomToken { -// contract_addr: Addr::unchecked(CUSTOM_TOKEN_1.to_string()), -// token_code_hash: "hash".into(), -// }, -// TokenType::NativeToken { -// denom: "denom".into(), -// }, -// ), -// amount_0: Uint128::new(100), -// amount_1: Uint128::new(101), -// total_liquidity: Uint128::new(100), -// contract_version: 1, -// }, -// ).unwrap())) -// }, -// CUSTOM_TOKEN_1 => QuerierResult::Ok(cosmwasm_std::ContractResult::Ok(to_binary(&IntBalanceResponse { -// balance: Balance(Uint128::new(100)), -// }).unwrap())), -// _ => unimplemented!(), -// } -// } -// _ => unimplemented!(), -// }, -// _ => unimplemented!(), -// } -// } - -// // fn query(&self, request: &QueryRequest) -> StdResult { -// // self.custom_query(request) -// // } - -// // fn custom_query( -// // &self, -// // request: &QueryRequest, -// // ) -> StdResult { -// // let raw = match to_vec(request) { -// // Ok(raw) => raw, -// // Err(e) => { -// // return Err(StdError::generic_err(format!( -// // "Serializing QueryRequest: {}", -// // e -// // ))) -// // } -// // }; -// // match self.raw_query(&raw) { -// // Err(sys) => Err(StdError::generic_err(format!( -// // "Querier system error: {}", -// // sys -// // ))), -// // Ok(Err(err)) => Err(err), -// // // in theory we would process the response, but here it is the same type, so just pass through -// // Ok(Ok(res)) => from_binary(&res), -// // } -// // } - -// // fn query_balance>(&self, address: U, denom: &str) -> StdResult { -// // let request = BankQuery::Balance { -// // address: address.into(), -// // denom: denom.to_string(), -// // } -// // .into(); -// // let res: BalanceResponse = self.query(&request)?; -// // Ok(res.amount) -// // } - -// // fn query_all_balances>(&self, address: U) -> StdResult> { -// // let request = BankQuery::AllBalances { -// // address: address.into(), -// // } -// // .into(); -// // let res: AllBalanceResponse = self.query(&request)?; -// // Ok(res.amount) -// // } -// } -// } + impl Querier for MockQuerier { + fn raw_query(&self, bin_request: &[u8]) -> QuerierResult { + let request: QueryRequest = from_slice(bin_request).unwrap(); + match &request { + QueryRequest::Wasm(msg) => match msg { + WasmQuery::Smart { contract_addr, code_hash, msg} => { + println!("{}", contract_addr); + match contract_addr.as_str() { + FACTORY_ADDRESS => { + QuerierResult::Ok(cosmwasm_std::ContractResult::Ok(to_binary(&FactoryQueryResponse::GetConfig { + pair_contract: ContractInstantiationInfo { + code_hash: "".to_string(), + id: 1, + }, + amm_settings: shadeswap_shared::amm_pair::AMMSettings { + lp_fee: Fee::new(28, 10000), + shade_dao_fee: Fee::new(2, 10000), + shade_dao_address: Contract { + address: Addr::unchecked(String::from("DAO")), + code_hash: "".to_string(), + }, + }, + lp_token_contract: ContractInstantiationInfo { + code_hash: "".to_string(), + id: 1, + }, + authenticator: None, + admin_auth: Contract { address: Addr::unchecked("admin_auth".to_string()), code_hash: "".to_string() }, + }).unwrap())) + } + "admin_auth" => { + QuerierResult::Ok(cosmwasm_std::ContractResult::Ok(to_binary(&ValidateAdminPermissionResponse{ + has_permission: true, + }).unwrap())) + }, + PAIR_CONTRACT_1 => + { + QuerierResult::Ok(cosmwasm_std::ContractResult::Ok(to_binary( + &AMMPairQueryMsgResponse::GetPairInfo { + liquidity_token: Contract { + address: Addr::unchecked("asd"), + code_hash: "".to_string(), + }, + factory: Contract { + address: Addr::unchecked("asd"), + code_hash: "".to_string(), + }, + pair: TokenPair( + TokenType::CustomToken { + contract_addr: Addr::unchecked(CUSTOM_TOKEN_1.to_string()), + token_code_hash: "hash".into(), + }, + TokenType::NativeToken { + denom: "denom".into(), + }, + ), + amount_0: Uint128::new(100), + amount_1: Uint128::new(101), + total_liquidity: Uint128::new(100), + contract_version: 1, + }, + ).unwrap())) + }, + CUSTOM_TOKEN_1 => QuerierResult::Ok(cosmwasm_std::ContractResult::Ok(to_binary(&IntBalanceResponse { + balance: Balance(Uint128::new(100)), + }).unwrap())), + _ => unimplemented!(), + } + } + _ => unimplemented!(), + }, + _ => unimplemented!(), + } + } + } +} diff --git a/contracts/router/tests/integration.rs b/contracts/router/tests/integration.rs index c543844..d6ab232 100644 --- a/contracts/router/tests/integration.rs +++ b/contracts/router/tests/integration.rs @@ -1,194 +1,179 @@ -// use secret_multi_test::{App, Contract, ContractWrapper, Executor}; -// use shadeswap_shared::msg::router::{{InitMsg, ExecuteMsg, QueryMsg, QueryMsgResponse}}; -// use multi_test::help_lib::integration_help_lib::{mk_contract_link, mk_address}; -// use cosmwasm_std::{ -// testing::{mock_env, MockApi}, -// to_binary, Addr, Empty, Binary, ContractInfo, Uint128, -// }; - -// use shadeswap_shared::utils::asset::Contract as AuthContract; - -// #[cfg(not(target_arch = "wasm32"))] -// #[test] -// pub fn router_integration_tests() { -// use router::contract::{instantiate, query, execute}; -// use multi_test::help_lib::integration_help_lib::{roll_blockchain, mint_deposit_snip20, -// send_snip20_to_stake, snip20_send, increase_allowance, -// get_current_block_time, store_init_staking_contract, store_init_factory_contract, -// snip20_contract_store, staking_contract_store, store_init_amm_pair_contract, convert_to_contract_link -// }; -// use cosmwasm_std::{Uint128, Coin, StdError, StdResult, Timestamp, from_binary}; -// use multi_test::util_addr::util_addr::{OWNER, OWNER_SIGNATURE, OWNER_PUB_KEY, STAKER_A, STAKER_B, PUB_KEY_STAKER_A}; -// use multi_test::util_addr::util_blockchain::CHAIN_ID; -// use router::state::Config; -// use schemars::_serde_json::Error; -// use shadeswap_shared::core::{ContractLink, ContractInstantiationInfo, TokenPair, TokenAmount}; -// use shadeswap_shared::msg::amm_pair::InvokeMsg; -// use shadeswap_shared::msg::router::QueryMsgResponse; -// use shadeswap_shared::utils::testing::TestingExt; -// use shadeswap_shared::{core::{TokenType}}; -// use multi_test::help_lib::integration_help_lib::{generate_snip20_contract}; -// use multi_test::help_lib::integration_help_lib::print_events; -// use multi_test::help_lib::integration_help_lib::snip20_lp_token_contract_store; - -// let staker_a_addr = Addr::unchecked(STAKER_A.to_owned()); -// let owner_addr = Addr::unchecked(OWNER); -// let mut router = App::default(); +use secret_multi_test::{App, Contract, ContractWrapper, Executor}; +use shadeswap_shared::msg::router::{{InitMsg, ExecuteMsg, QueryMsg, QueryMsgResponse}}; +use multi_test::help_lib::integration_help_lib::{mk_contract_link, mk_address}; +use cosmwasm_std::{ + testing::{mock_env, MockApi}, + to_binary, Addr, Empty, Binary, ContractInfo, Uint128, +}; + +use shadeswap_shared::utils::asset::Contract as AuthContract; + +#[cfg(not(target_arch = "wasm32"))] +#[test] +pub fn router_integration_tests() { + use multi_test::admin::admin_help::init_admin_contract; + use multi_test::amm_pair::amm_pair_lib::amm_pair_lib::store_init_amm_pair_contract; + use router::contract::{instantiate, query, execute, reply}; + use multi_test::help_lib::integration_help_lib::{roll_blockchain, mint_deposit_snip20, + send_snip20_to_stake, snip20_send, increase_allowance, + get_current_block_time, store_init_staking_contract, store_init_factory_contract, + snip20_contract_store, staking_contract_store, convert_to_contract_link + }; + use cosmwasm_std::{Uint128, Coin, StdError, StdResult, Timestamp, from_binary}; + use multi_test::util_addr::util_addr::{OWNER, OWNER_SIGNATURE, OWNER_PUB_KEY, STAKER_A, STAKER_B, PUB_KEY_STAKER_A}; + use multi_test::util_addr::util_blockchain::CHAIN_ID; + use shadeswap_shared::core::{TokenAmount}; + use shadeswap_shared::msg::amm_pair::InvokeMsg; + use shadeswap_shared::msg::router::QueryMsgResponse; + use shadeswap_shared::router::Hop; + use shadeswap_shared::utils::testing::TestingExt; + use shadeswap_shared::{core::{TokenType}}; + use multi_test::help_lib::integration_help_lib::{generate_snip20_contract}; + use multi_test::help_lib::integration_help_lib::print_events; + + let staker_a_addr = Addr::unchecked(STAKER_A.to_owned()); + let owner_addr = Addr::unchecked(OWNER); + let mut router = App::default(); -// pub fn router_contract_store() -> Box> { -// let contract = ContractWrapper::new_with_empty(execute, instantiate, query); -// Box::new(contract) -// } - -// router.init_modules(|router, _, storage| { -// router -// .bank -// .init_balance(storage, &owner_addr.clone(), vec![Coin{denom: "uscrt".into(), amount: Uint128::new(100000000000000u128)}]) -// .unwrap(); -// }); - -// // GENERATE TOKEN PAIRS -// let token_0_contract = generate_snip20_contract(&mut router, "ETH".to_string(),"ETH".to_string(),18).unwrap(); -// let token_1_contract = generate_snip20_contract(&mut router, "USDT".to_string(),"USDT".to_string(),18).unwrap(); -// let offer = TokenAmount{ -// token: TokenType::CustomToken { -// contract_addr: token_0_contract.address.to_owned(), -// token_code_hash: token_0_contract.code_hash.to_owned() -// }, -// amount: Uint128::new(1000u128) -// }; -// // MINT AND DEPOSIT FOR LIQUIDITY -// mint_deposit_snip20(&mut router,&token_0_contract,&owner_addr,Uint128::new(10000000000), &owner_addr); -// mint_deposit_snip20(&mut router,&token_1_contract,&owner_addr,Uint128::new(10000000000), &owner_addr); -// router.block_info().chain_id = CHAIN_ID.to_string(); -// roll_blockchain(&mut router, 1).unwrap(); -// let factory_contract = store_init_factory_contract(&mut router).unwrap(); -// let amm_pair_contract = store_init_amm_pair_contract( -// &mut router, -// &convert_to_contract_link(&token_0_contract), -// &convert_to_contract_link(&token_1_contract), -// &convert_to_contract_link(&factory_contract) -// ).unwrap(); + pub fn router_contract_store() -> Box> { + let contract = ContractWrapper::new_with_empty(execute, instantiate, query).with_reply(reply); + Box::new(contract) + } + + router.init_modules(|router, _, storage| { + router + .bank + .init_balance(storage, &owner_addr.clone(), vec![Coin{denom: "uscrt".into(), amount: Uint128::new(100000000000000u128)}]) + .unwrap(); + }); + + // GENERATE TOKEN PAIRS + let token_0_contract = generate_snip20_contract(&mut router, "ETH".to_string(),"ETH".to_string(),18).unwrap(); + let token_1_contract = generate_snip20_contract(&mut router, "USDT".to_string(),"USDT".to_string(),18).unwrap(); + let offer = TokenAmount{ + token: TokenType::CustomToken { + contract_addr: token_0_contract.address.to_owned(), + token_code_hash: token_0_contract.code_hash.to_owned() + }, + amount: Uint128::new(1000u128) + }; + // MINT AND DEPOSIT FOR LIQUIDITY + mint_deposit_snip20(&mut router,&token_0_contract,&owner_addr,Uint128::new(10000000000), &owner_addr); + mint_deposit_snip20(&mut router,&token_1_contract,&owner_addr,Uint128::new(10000000000), &owner_addr); + router.block_info().chain_id = CHAIN_ID.to_string(); + roll_blockchain(&mut router, 1).unwrap(); + let admin_contract = init_admin_contract(&mut router, &owner_addr).unwrap(); + let factory_contract = store_init_factory_contract(&mut router, &convert_to_contract_link(&admin_contract)).unwrap(); + let amm_pair_contract = store_init_amm_pair_contract( + &mut router, + &convert_to_contract_link(&token_0_contract), + &convert_to_contract_link(&token_1_contract), + &convert_to_contract_link(&factory_contract), + &convert_to_contract_link(&admin_contract), + &owner_addr + ).unwrap(); -// // Create Router -// let router_contract_info = router.store_code(router_contract_store()); -// roll_blockchain(&mut router, 1).unwrap(); - -// // INIT AMM PAIR -// let init_msg = InitMsg { -// prng_seed: to_binary("password").unwrap(), -// entropy: to_binary("password").unwrap(), -// pair_contract_code_hash: amm_pair_contract.code_hash.to_owned(), -// }; - -// roll_blockchain(&mut router, 1).unwrap(); -// let router_contract = router -// .instantiate_contract( -// router_contract_info, -// owner_addr.to_owned(), -// &init_msg, -// &[], -// "amm_pair", -// Some(OWNER.to_string()), -// ).unwrap(); - -// // Assert AMM PAIR Config -// roll_blockchain(&mut router, 1).unwrap(); - - -// // Register SNIP20 -// let msg = ExecuteMsg::RegisterSNIP20Token { -// token_addr: token_0_contract.address.to_owned() , -// token_code_hash: token_0_contract.code_hash.to_owned() -// }; -// roll_blockchain(&mut router, 1).unwrap(); -// let _ = router.execute_contract( -// owner_addr.to_owned(), -// &router_contract, -// &msg, -// &[]).unwrap(); - -// roll_blockchain(&mut router, 1).unwrap(); -// let swap_query = QueryMsg::SwapSimulation { -// offer: offer.to_owned(), -// path: vec![amm_pair_contract.address.to_owned()] -// }; - -// let query_response:QueryMsgResponse = router.query_test( -// router_contract.to_owned(), -// to_binary(&swap_query).unwrap() -// ).unwrap(); - -// match query_response { -// QueryMsgResponse::SwapSimulation { -// total_fee_amount, -// lp_fee_amount, -// shade_dao_fee_amount, -// result, -// price, -// } => { -// // Verify result not actual amount -// assert_ne!(total_fee_amount, Uint128::zero()); -// assert_ne!(lp_fee_amount, Uint128::zero()); -// assert_ne!(lp_fee_amount, Uint128::zero()); -// assert_ne!(result.return_amount, Uint128::zero()); -// }, -// _ => panic!("Query Responsedoes not match") -// } - -// // Assert Config -// let query: QueryMsgResponse = router.query_test( -// router_contract.to_owned(), -// to_binary(&QueryMsg::GetConfig { }).unwrap() -// ).unwrap(); - -// match query{ -// QueryMsgResponse::GetConfig { pair_contract_code_hash } => { -// assert_eq!(pair_contract_code_hash.to_owned(),amm_pair_contract.code_hash.to_owned()); -// }, -// _ => panic!("Query Responsedoes not match") -// } - -// let invoke_msg = to_binary(&InvokeMsg::SwapTokens { -// expected_return: Some(Uint128::new(1000u128)), -// to: Some(staker_a_addr.to_owned()), -// router_link: None, -// callback_signature: None -// }).unwrap(); + // Create Router + let router_contract_info = router.store_code(router_contract_store()); + roll_blockchain(&mut router, 1).unwrap(); + + // INIT AMM PAIR + let init_msg = InitMsg { + prng_seed: to_binary("password").unwrap(), + entropy: to_binary("password").unwrap(), + admin_auth: convert_to_contract_link(&admin_contract), + }; + + roll_blockchain(&mut router, 1).unwrap(); + let router_contract = router + .instantiate_contract( + router_contract_info, + owner_addr.to_owned(), + &init_msg, + &[], + "router", + Some(OWNER.to_string()), + ).unwrap(); + + roll_blockchain(&mut router, 1).unwrap(); + // Register SNIP20 + let msg = ExecuteMsg::RegisterSNIP20Token { + token_addr: token_0_contract.address.to_string() , + token_code_hash: token_0_contract.code_hash.to_owned() + }; + roll_blockchain(&mut router, 1).unwrap(); + let _ = router.execute_contract( + owner_addr.to_owned(), + &router_contract, + &msg, + &[]).unwrap(); + + roll_blockchain(&mut router, 1).unwrap(); + let swap_query = QueryMsg::SwapSimulation { + offer: offer.to_owned(), + path: vec![Hop{addr: amm_pair_contract.address.to_owned(), code_hash: amm_pair_contract.code_hash.clone()}] + }; + + let query_response:QueryMsgResponse = router.query_test( + router_contract.to_owned(), + to_binary(&swap_query).unwrap() + ).unwrap(); + + match query_response { + QueryMsgResponse::SwapSimulation { + total_fee_amount, + lp_fee_amount, + shade_dao_fee_amount, + result, + price, + } => { + // Verify result not actual amount + assert_ne!(total_fee_amount, Uint128::zero()); + assert_ne!(lp_fee_amount, Uint128::zero()); + assert_ne!(lp_fee_amount, Uint128::zero()); + assert_ne!(result.return_amount, Uint128::zero()); + }, + _ => panic!("Query Responsedoes not match") + } + + let invoke_msg = to_binary(&InvokeMsg::SwapTokens { + expected_return: Some(Uint128::new(1000u128)), + to: Some(staker_a_addr.to_owned()), + }).unwrap(); -// let msg = snip20_reference_impl::msg::ExecuteMsg::Send { -// recipient: amm_pair_contract.address.to_owned(), -// recipient_code_hash: Some(amm_pair_contract.code_hash.clone()), -// amount: Uint128::new(1000u128), -// msg: Some(invoke_msg), -// memo: None, -// padding: None, -// }; - -// let response = router.execute_contract( -// owner_addr.to_owned(), -// &token_0_contract, -// &msg, -// &[], // -// ) -// .unwrap(); - -// print_events(response); -// roll_blockchain(&mut router, 1).unwrap(); -// let execute_swap = ExecuteMsg::SwapTokensForExact { -// offer:offer.to_owned(), -// expected_return: Some(Uint128::new(1000u128)), -// path: vec![amm_pair_contract.address.to_owned()], -// recipient: Some(owner_addr.to_owned()) -// }; - -// let response = router.execute_contract( -// owner_addr.to_owned(), -// &router_contract, -// &execute_swap, -// &[]); - -// } + let msg = snip20_reference_impl::msg::ExecuteMsg::Send { + recipient: amm_pair_contract.address.to_owned(), + recipient_code_hash: Some(amm_pair_contract.code_hash.clone()), + amount: Uint128::new(1000u128), + msg: Some(invoke_msg), + memo: None, + padding: None, + }; + + let response = router.execute_contract( + owner_addr.to_owned(), + &token_0_contract, + &msg, + &[], // + ) + .unwrap(); + + print_events(response); + roll_blockchain(&mut router, 1).unwrap(); + let execute_swap = ExecuteMsg::SwapTokensForExact { + offer:offer.to_owned(), + expected_return: Some(Uint128::new(1000u128)), + path: vec![Hop{addr: amm_pair_contract.address.to_owned(), code_hash: amm_pair_contract.code_hash.clone()}], + recipient: Some(owner_addr.to_string()) + }; + + let response = router.execute_contract( + owner_addr.to_owned(), + &router_contract, + &execute_swap, + &[]); + +} diff --git a/contracts/staking/src/test.rs b/contracts/staking/src/test.rs index 58f48b1..35363ed 100644 --- a/contracts/staking/src/test.rs +++ b/contracts/staking/src/test.rs @@ -20,7 +20,7 @@ pub mod tests { state::{ claim_reward_info_r, proxy_staker_info_r, reward_token_list_r, reward_token_r, staker_index_r, staker_index_w, stakers_r, stakers_vk_r, total_staked_r, - ClaimRewardsInfo, Config, RewardTokenInfo, config_w, + ClaimRewardsInfo, Config, RewardTokenInfo, config_w, total_staked_w, }, test::test_help_lib::{ make_init_config, make_reward_token_contract, mock_custom_env, mock_dependencies, @@ -65,6 +65,7 @@ pub mod tests { let mut deps = mock_dependencies(&[]); let env = mock_custom_env(CONTRACT_ADDRESS, 1571797523, 1524); let _config: Config = make_init_config(deps.as_mut(), env, Uint128::from(100u128))?; + total_staked_w(deps.as_mut().storage).save(&Uint128::new(100u128)).unwrap(); let user_shares = calculate_staker_shares(deps.as_mut().storage, Uint128::from(100u128)).unwrap(); assert_eq!(user_shares, Decimal::one()); @@ -953,7 +954,7 @@ pub mod test_help_lib { use shadeswap_shared::{ core::{TokenType}, snip20::{manager::Balance, QueryAnswer}, - staking::InitMsg, Contract, + staking::InitMsg, Contract, admin::ValidateAdminPermissionResponse, }; use crate::{ @@ -999,7 +1000,7 @@ pub mod test_help_lib { code_hash: "".to_string(), }, authenticator: None, - admin_auth: todo!(), + admin_auth: Contract { address: Addr::unchecked("admin"), code_hash: "".to_string() }, valid_to: Uint128::new(3747905010000u128) }; assert!(instantiate(deps.branch(), env.clone(), info.clone(), msg).is_ok()); @@ -1061,6 +1062,11 @@ pub mod test_help_lib { .unwrap(); QuerierResult::Ok(cosmwasm_std::ContractResult::Ok(balance)) } + "admin" => { + QuerierResult::Ok(cosmwasm_std::ContractResult::Ok(to_binary(&ValidateAdminPermissionResponse{ + has_permission: true, + }).unwrap())) + } _factory_contract_address => { let balance = to_binary(&BalanceResponse { amount: Coin { diff --git a/contracts/staking/tests/integration.rs b/contracts/staking/tests/integration.rs index ec946d1..9a0f217 100644 --- a/contracts/staking/tests/integration.rs +++ b/contracts/staking/tests/integration.rs @@ -2,11 +2,7 @@ use snip20_reference_impl::contract::{ execute as snip20_execute, instantiate as snip20_instantiate, query as snip20_query, }; use staking::contract::{execute, instantiate, query}; -// use lp_token::contract::{execute as lp_execute, instantiate as lp_instantiate, query as lp_query}; - use secret_multi_test::{App, Contract, ContractWrapper, Executor}; -// use multi_test::{auth_query::execute}; - use shadeswap_shared::msg::staking::{{InitMsg, QueryResponse, ExecuteMsg}}; use multi_test::help_lib::integration_help_lib::{mk_contract_link, mk_address}; use cosmwasm_std::{ @@ -26,7 +22,8 @@ use shadeswap_shared::Contract as SContract; #[cfg(not(target_arch = "wasm32"))] #[test] pub fn staking_integration_tests_without_proxy() { - use multi_test::help_lib::integration_help_lib::{roll_blockchain, store_init_auth_contract, mint_deposit_snip20, send_snip20_to_stake, snip20_send, increase_allowance, get_current_block_time}; + use multi_test::admin::admin_help::init_admin_contract; + use multi_test::help_lib::integration_help_lib::{roll_blockchain, store_init_auth_contract, mint_deposit_snip20, send_snip20_to_stake, snip20_send, increase_allowance, get_current_block_time, convert_to_contract_link}; use cosmwasm_std::{Uint128, Coin, StdError, StdResult, Timestamp}; use multi_test::util_addr::util_addr::{OWNER, OWNER_SIGNATURE, OWNER_PUB_KEY, STAKER_A, STAKER_B, PUB_KEY_STAKER_A}; use multi_test::util_addr::util_blockchain::CHAIN_ID; @@ -51,7 +48,7 @@ pub fn staking_integration_tests_without_proxy() { router.block_info().chain_id = CHAIN_ID.to_string(); roll_blockchain(&mut router, 1).unwrap(); - + let admin_contract = init_admin_contract(&mut router, &owner_addr).unwrap(); let reward_contract = generate_snip20_contract(&mut router, "RWD".to_string(),"RWD".to_string(),18).unwrap(); let staking_contract_info = router.store_code(staking_contract_store()); let auth_contract = store_init_auth_contract(&mut router).unwrap(); @@ -66,7 +63,7 @@ pub fn staking_integration_tests_without_proxy() { address: auth_contract.address.to_owned(), code_hash: auth_contract.code_hash.to_owned() }), - admin_auth: todo!(), + admin_auth: convert_to_contract_link(&admin_contract), valid_to: Uint128::new(3747905010000u128) }; @@ -237,7 +234,8 @@ pub fn staking_integration_tests_without_proxy() { #[cfg(not(target_arch = "wasm32"))] #[test] pub fn staking_integration_tests_with_proxy() { - use multi_test::help_lib::integration_help_lib::{roll_blockchain, store_init_auth_contract, mint_deposit_snip20, send_snip20_to_stake, snip20_send, increase_allowance, get_current_block_time, send_snip20_to_proxy_stake, set_viewing_key}; + use multi_test::admin::admin_help::init_admin_contract; + use multi_test::help_lib::integration_help_lib::{roll_blockchain, store_init_auth_contract, mint_deposit_snip20, send_snip20_to_stake, snip20_send, increase_allowance, get_current_block_time, send_snip20_to_proxy_stake, set_viewing_key, convert_to_contract_link}; use cosmwasm_std::{Uint128, Coin, StdError, StdResult, Timestamp}; use multi_test::util_addr::util_addr::{OWNER, OWNER_SIGNATURE, OWNER_PUB_KEY, STAKER_A, STAKER_B, PUB_KEY_STAKER_A}; use multi_test::util_addr::util_blockchain::CHAIN_ID; @@ -262,7 +260,8 @@ pub fn staking_integration_tests_with_proxy() { router.block_info().chain_id = CHAIN_ID.to_string(); roll_blockchain(&mut router, 1).unwrap(); - + let admin_contract = init_admin_contract(&mut router, &owner_addr).unwrap(); + roll_blockchain(&mut router, 1).unwrap(); let reward_contract = generate_snip20_contract(&mut router, "RWD".to_string(),"RWD".to_string(),18).unwrap(); let staking_contract_info = router.store_code(staking_contract_store()); let auth_contract = store_init_auth_contract(&mut router).unwrap(); @@ -277,7 +276,7 @@ pub fn staking_integration_tests_with_proxy() { address: auth_contract.address.to_owned(), code_hash: auth_contract.code_hash.to_owned() }), - admin_auth: todo!(), + admin_auth: convert_to_contract_link(&admin_contract), valid_to: Uint128::new(3747905010000u128) }; diff --git a/packages/multi_test/src/admin/admin_lib.rs b/packages/multi_test/src/admin/admin_lib.rs new file mode 100644 index 0000000..4738b5b --- /dev/null +++ b/packages/multi_test/src/admin/admin_lib.rs @@ -0,0 +1,32 @@ +pub mod admin_help{ + use cosmwasm_std::{Empty, Addr, ContractInfo, StdResult}; + use secret_multi_test::{Contract, ContractWrapper, App, Executor}; + use crate::admin::admin_mock::admin_mock::{execute, query,instantiate, InitMsg}; + + pub fn admin_contract_init_store() -> Box> { + let contract = ContractWrapper::new_with_empty(execute,instantiate, query); + Box::new(contract) + } + + pub fn init_admin_contract( + router: &mut App, + sender: &Addr + ) -> StdResult { + + // ADMIN INIT MSG + let init_msg = InitMsg{ + + }; + + let admin_store_info = router.store_code(admin_contract_init_store()); + let admin_contract = router.instantiate_contract( + admin_store_info, + sender.clone(), + &init_msg, + &[], + "admin", + Some(sender.to_string()), + ).unwrap(); + Ok(admin_contract) + } +} \ No newline at end of file diff --git a/packages/multi_test/src/admin/admin_mock.rs b/packages/multi_test/src/admin/admin_mock.rs new file mode 100644 index 0000000..ee68a09 --- /dev/null +++ b/packages/multi_test/src/admin/admin_mock.rs @@ -0,0 +1,54 @@ +pub mod admin_mock{ + use cosmwasm_std::{Response, StdResult, MessageInfo, DepsMut, Env, entry_point, to_binary, Deps, Binary}; + use schemars::JsonSchema; + use serde::{Serialize, Deserialize}; + use shadeswap_shared::{utils::{pad_query_result, pad_response_result}, admin::{ExecuteMsg, QueryMsg, ValidateAdminPermissionResponse}}; + + pub const BLOCK_SIZE: usize = 256; + + #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] + pub struct InitMsg{ + + } + + #[entry_point] + pub fn instantiate( + _deps: DepsMut, + _env: Env, + _info: MessageInfo, + _msg: InitMsg, + ) -> StdResult { + Ok(Response::new()) + } + + #[entry_point] + pub fn query(_deps: Deps, _env: Env, msg: QueryMsg) -> StdResult { + pad_query_result( + match msg { + QueryMsg::GetConfig { } => to_binary(""), + QueryMsg::GetAdmins { } => to_binary(""), + QueryMsg::GetPermissions { user: _ } => to_binary(""), + QueryMsg::ValidateAdminPermission { permission: _, user:_ } => to_binary(&ValidateAdminPermissionResponse{ + has_permission: true }) + }, + BLOCK_SIZE, + ) + } + + + #[entry_point] + pub fn execute(_deps: DepsMut, _env: Env, _info: MessageInfo, msg: ExecuteMsg) -> StdResult { + pad_response_result( + match msg { + ExecuteMsg::UpdateRegistry { action: _ } => Ok(Response::new()), + ExecuteMsg::UpdateRegistryBulk { actions: _ } => Ok(Response::new()), + ExecuteMsg::TransferSuper { new_super:_ } => Ok(Response::new()), + ExecuteMsg::SelfDestruct { } => Ok(Response::new()), + ExecuteMsg::ToggleStatus { new_status :_ } => Ok(Response::new()), + }, + BLOCK_SIZE, + ) + } +} + + diff --git a/packages/multi_test/src/admin/mod.rs b/packages/multi_test/src/admin/mod.rs new file mode 100644 index 0000000..0ec0853 --- /dev/null +++ b/packages/multi_test/src/admin/mod.rs @@ -0,0 +1,4 @@ +pub use admin_mock::*; +pub mod admin_mock; +pub use admin_lib::*; +pub mod admin_lib; \ No newline at end of file diff --git a/packages/multi_test/src/amm_pair/amm_pair_lib.rs b/packages/multi_test/src/amm_pair/amm_pair_lib.rs new file mode 100644 index 0000000..b49b708 --- /dev/null +++ b/packages/multi_test/src/amm_pair/amm_pair_lib.rs @@ -0,0 +1,50 @@ +pub mod amm_pair_lib{ + use cosmwasm_std::{ContractInfo, StdResult, Addr, to_binary, Empty}; + use secret_multi_test::{App, ContractWrapper, Executor, Contract}; + use shadeswap_shared::{core::ContractInstantiationInfo}; + use shadeswap_shared::msg::amm_pair::InitMsg; + use crate::admin::admin_mock::admin_mock::{execute, instantiate, query}; + use crate::help_lib::integration_help_lib::{snip20_lp_token_contract_store, create_token_pair}; + use shadeswap_shared::utils::asset::Contract as SContract; + + pub fn store_init_amm_pair_contract( + router: &mut App, + token_0: &SContract, + token_1: &SContract, + factory: &SContract, + admin_auth: &SContract, + sender: &Addr + ) -> StdResult + { + let contract_info = router.store_code(amm_pair_contract_store()); + let lp_token_info = router.store_code(snip20_lp_token_contract_store()); + let contract = router.instantiate_contract( + contract_info, + sender.clone(), + &InitMsg{ + pair: create_token_pair(&token_0, &token_1), + lp_token_contract: ContractInstantiationInfo{ + code_hash: lp_token_info.code_hash, + id: lp_token_info.code_id, + }, + factory_info: factory.clone(), + prng_seed: to_binary("seed")?, + entropy: to_binary("seed")?, + admin_auth: admin_auth.clone() , + staking_contract: None, + custom_fee: None, + callback: None, + }, + &[], + "amm_pairs", + Some(sender.to_string()) + ).unwrap(); + Ok(contract) + } + + pub fn amm_pair_contract_store() -> Box> { + let contract = ContractWrapper::new_with_empty(execute, instantiate, query); + Box::new(contract) + } + +} \ No newline at end of file diff --git a/packages/multi_test/src/amm_pair/amm_pair_mock.rs b/packages/multi_test/src/amm_pair/amm_pair_mock.rs index 3fca141..161f0da 100644 --- a/packages/multi_test/src/amm_pair/amm_pair_mock.rs +++ b/packages/multi_test/src/amm_pair/amm_pair_mock.rs @@ -6,7 +6,7 @@ pub mod amm_pair_mock { use cosmwasm_std::{ entry_point, from_binary, to_binary, Addr, BankMsg, Binary, Coin, ContractInfo, CosmosMsg, Deps, DepsMut, Env, MessageInfo, Reply, Response, StdError, StdResult, Storage, SubMsg, - SubMsgResult, Uint128, WasmMsg, + SubMsgResult, Uint128, WasmMsg, QueryRequest, WasmQuery, }; use cosmwasm_storage::{singleton, singleton_read, ReadonlySingleton, Singleton}; use schemars::JsonSchema; @@ -18,8 +18,10 @@ pub mod amm_pair_mock { msg::amm_pair::{ExecuteMsg, InitMsg, QueryMsg, QueryMsgResponse, SwapResult}, snip20::helpers::register_receive, staking::StakingContractInit, - utils::{pad_query_result, pad_response_result}, + utils::{pad_query_result, pad_response_result}, amm_pair::AMMSettings, }; + use shadeswap_shared::msg::factory::{QueryResponse as FactoryQueryResponse, QueryMsg as FactoryQueryMsg}; + pub const BLOCK_SIZE: usize = 256; //use crate::staking::staking_mock::staking_mock::InitMsg as StakingInitMsg; use shadeswap_shared::msg::staking::InitMsg as StakingInitMsg; @@ -32,6 +34,12 @@ pub mod amm_pair_mock { pub static TOKEN_1: &[u8] = b"token_1"; pub static FACTORY: &[u8] = b"factory"; + struct FactoryConfig { + amm_settings: AMMSettings, + authenticator: Option, + admin_auth: Contract + } + #[entry_point] pub fn instantiate( deps: DepsMut, @@ -255,6 +263,8 @@ pub mod amm_pair_mock { None, &lp_token_address.clone(), )?); + + let factory_config = query_factory_config(deps.as_ref(), &config.factory_contract).unwrap(); match config.staking_contract_init { Some(c) => { println!( @@ -279,7 +289,7 @@ pub mod amm_pair_mock { }, authenticator: None, //default to same admin as amm_pair - admin_auth: todo!(), + admin_auth: factory_config.admin_auth, valid_to: Uint128::new(3747905010000u128), })?, code_hash: c.contract_info.code_hash.clone(), @@ -304,6 +314,32 @@ pub mod amm_pair_mock { singleton_read(storage, CONFIG) } + fn query_factory_config(deps: Deps, factory: &Contract) -> StdResult { + let result: FactoryQueryResponse = + deps.querier.query(&QueryRequest::Wasm(WasmQuery::Smart { + contract_addr: factory.address.to_string(), + msg: to_binary(&FactoryQueryMsg::GetConfig {})?, + code_hash: factory.code_hash.to_string(), + }))?; + + match result { + FactoryQueryResponse::GetConfig { + pair_contract: _, + amm_settings, + lp_token_contract: _, + authenticator, + admin_auth + } => Ok(FactoryConfig { + amm_settings, + authenticator, + admin_auth + }), + _ => Err(StdError::generic_err( + "An error occurred while trying to retrieve factory settings.", + )), + } + } + #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] pub struct Config { pub factory_contract: Contract, diff --git a/packages/multi_test/src/amm_pair/mod.rs b/packages/multi_test/src/amm_pair/mod.rs index f0411d2..ea32850 100644 --- a/packages/multi_test/src/amm_pair/mod.rs +++ b/packages/multi_test/src/amm_pair/mod.rs @@ -1 +1,2 @@ -pub mod amm_pair_mock; \ No newline at end of file +pub mod amm_pair_mock; +pub mod amm_pair_lib; \ No newline at end of file diff --git a/packages/multi_test/src/auth_query.rs b/packages/multi_test/src/auth/auth_query.rs similarity index 96% rename from packages/multi_test/src/auth_query.rs rename to packages/multi_test/src/auth/auth_query.rs index 5955ffa..c2122fb 100644 --- a/packages/multi_test/src/auth_query.rs +++ b/packages/multi_test/src/auth/auth_query.rs @@ -1,4 +1,3 @@ - pub mod auth_query{ use cosmwasm_std::{Response, StdResult, MessageInfo, DepsMut, Env, entry_point, to_binary, Deps, Binary, CosmosMsg, BankMsg, Coin, Addr}; use query_authentication::transaction::{PubKey, PubKeyValue}; @@ -32,7 +31,7 @@ pub mod auth_query{ pad_query_result( match msg { QueryMsg::Config { } => to_binary(""), - QueryMsg::ValidateViewingKey { user, key } => to_binary(""), + QueryMsg::ValidateViewingKey { user:_, key:_ } => to_binary(""), QueryMsg::ValidatePermit { permit } => { let pub_key = permit.signature.pub_key.value.clone(); let pub_key_value = PubKeyValue(pub_key); diff --git a/packages/multi_test/src/auth/mod.rs b/packages/multi_test/src/auth/mod.rs new file mode 100644 index 0000000..ce6aed6 --- /dev/null +++ b/packages/multi_test/src/auth/mod.rs @@ -0,0 +1,2 @@ +pub use auth_query::*; +pub mod auth_query; \ No newline at end of file diff --git a/packages/multi_test/src/factory/factory_mock.rs b/packages/multi_test/src/factory/factory_mock.rs index 60f577a..49f722c 100644 --- a/packages/multi_test/src/factory/factory_mock.rs +++ b/packages/multi_test/src/factory/factory_mock.rs @@ -4,20 +4,25 @@ pub mod factory_mock { entry_point, to_binary, Addr, BankMsg, Binary, Coin, CosmosMsg, Deps, DepsMut, Env, MessageInfo, Response, StdResult, }; + use cosmwasm_storage::{singleton, singleton_read}; use schemars::JsonSchema; - use secret_multi_test::Contract; + use shadeswap_shared::utils::asset::Contract; use serde::{Deserialize, Serialize}; use shadeswap_shared::{ amm_pair::AMMSettings, - core::{ContractInstantiationInfo, Fee, TokenType}, + core::{ContractInstantiationInfo, Fee}, factory::{ExecuteMsg, QueryMsg, QueryResponse}, utils::{pad_query_result, pad_response_result}, }; - pub const BLOCK_SIZE: usize = 256; use shadeswap_shared::Contract as sContract; + pub static CONFIG: &[u8] = b"config"; + pub const BLOCK_SIZE: usize = 256; + #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] - pub struct InitMsg {} + pub struct InitMsg { + pub admin_auth: Contract + } #[entry_point] pub fn instantiate( @@ -26,6 +31,7 @@ pub mod factory_mock { _info: MessageInfo, msg: InitMsg, ) -> StdResult { + singleton(deps.storage, CONFIG).save(&msg.admin_auth)?; Ok(Response::new()) } @@ -35,26 +41,29 @@ pub mod factory_mock { match msg { QueryMsg::ListAMMPairs { pagination } => to_binary(""), QueryMsg::GetAMMPairAddress { pair } => to_binary(""), - QueryMsg::GetConfig => to_binary(&QueryResponse::GetConfig { - pair_contract: ContractInstantiationInfo { - code_hash: "".to_string(), - id: 0u64, - }, - amm_settings: AMMSettings { - lp_fee: Fee::new(3, 100), - shade_dao_fee: Fee::new(3, 100), - shade_dao_address: sContract { - address: Addr::unchecked(OWNER), + QueryMsg::GetConfig => { + let admin_auth: Contract = singleton_read(deps.storage, CONFIG).load()?; + to_binary(&QueryResponse::GetConfig { + pair_contract: ContractInstantiationInfo { + code_hash: "".to_string(), + id: 0u64, + }, + amm_settings: AMMSettings { + lp_fee: Fee::new(3, 100), + shade_dao_fee: Fee::new(3, 100), + shade_dao_address: sContract { + address: Addr::unchecked(OWNER), + code_hash: "".to_string(), + }, + }, + lp_token_contract: ContractInstantiationInfo { code_hash: "".to_string(), + id: 0u64, }, - }, - lp_token_contract: ContractInstantiationInfo { - code_hash: "".to_string(), - id: 0u64, - }, - authenticator: None, - admin_auth: todo!(), - }), + authenticator: None, + admin_auth: admin_auth, + }) + }, QueryMsg::AuthorizeApiKey { api_key } => to_binary(""), }, BLOCK_SIZE, diff --git a/packages/multi_test/src/help_lib.rs b/packages/multi_test/src/help_lib.rs index abfaad8..1181740 100644 --- a/packages/multi_test/src/help_lib.rs +++ b/packages/multi_test/src/help_lib.rs @@ -1,40 +1,37 @@ -pub mod integration_help_lib{ - use std::ops::Add; +pub mod integration_help_lib{ use std::time::{SystemTime, UNIX_EPOCH}; - use cosmwasm_std::{CosmosMsg, StdError}; + use cosmwasm_std::{StdError}; use cosmwasm_std::Empty; use query_authentication::permit::Permit; use query_authentication::transaction::PermitSignature; use query_authentication::transaction::PubKey; use secret_multi_test::AppResponse; use secret_multi_test::next_block; - use shadeswap_shared::core::{ContractInstantiationInfo, CustomFee}; - use shadeswap_shared::snip20::{QueryAnswer, QueryMsg}; - use shadeswap_shared::staking; + use shadeswap_shared::core::{ CustomFee}; + use shadeswap_shared::snip20::{QueryAnswer, QueryMsg}; use shadeswap_shared::utils::testing::TestingExt; - use cosmwasm_std::{Addr, ContractInfo, StdResult, Uint128, Coin, Binary, WasmMsg}; + use cosmwasm_std::{Addr, ContractInfo, StdResult, Uint128, Coin, Binary}; use shadeswap_shared::Contract as SContract; use secret_multi_test::Contract; use secret_multi_test::ContractWrapper; use secret_multi_test::{App, Executor}; use shadeswap_shared::{ - msg::staking::{InitMsg, InvokeMsg}, + msg::staking::{InvokeMsg}, core::TokenPair, core::{TokenType}, snip20::{InitConfig, InstantiateMsg, self}, query_auth::PermitData, staking::QueryData }; + use crate::auth::auth_query::auth_query::{execute as auth_execute, InitMsg as AuthInitMsg, instantiate as auth_instantiate, query as auth_query}; + use shadeswap_shared::msg::amm_pair::{QueryMsgResponse as AMMPairQueryResponse, QueryMsg as AMMPairQueryMsg}; use snip20_reference_impl::contract::{execute as snip20_execute, instantiate as snip20_instantiate, query as snip20_query}; use lp_token::contract::{execute as lp_execute, instantiate as lp_instantiate, query as lp_query}; use cosmwasm_std::to_binary; - use shadeswap_shared::msg::amm_pair::{InitMsg as AMMPairInitMsg, QueryMsg as AMMPairQueryMsg, QueryMsgResponse as AMMPairQueryResponse}; - use crate::auth_query::auth_query::{{execute as auth_execute, instantiate as auth_instantiate, query as auth_query, InitMsg as AuthInitMsg}}; use crate::util_addr::util_addr::{OWNER, TOKEN_B, TOKEN_A}; use crate::factory::factory_mock::factory_mock::{execute as factory_execute, query as factory_query,instantiate as factory_instantiate, InitMsg as FactoryInitMsg }; - use crate::amm_pair::amm_pair_mock::amm_pair_mock::{execute as pair_execute, query as pair_query,instantiate as pair_instantiate }; use crate::staking::staking_mock::staking_mock::{execute as staking_execute_mock, query as staking_query_mock,instantiate as staking_instantiate_mock, InitMsg as StakingInitMsg }; type TestPermit = Permit; @@ -61,14 +58,19 @@ pub mod integration_help_lib{ } - pub fn store_init_factory_contract(router: &mut App) + pub fn store_init_factory_contract( + router: &mut App, + admin: &SContract + ) -> StdResult { let contract_info = router.store_code(factory_contract_store()); let contract = router.instantiate_contract( contract_info, mk_address(&OWNER).to_owned(), - &FactoryInitMsg{}, + &FactoryInitMsg{ + admin_auth: admin.clone(), + }, &[], "staking", Some(OWNER.to_string()) @@ -91,39 +93,7 @@ pub mod integration_help_lib{ Ok(contract) } - pub fn store_init_amm_pair_contract( - router: &mut App, - token_0: &SContract, - token_1: &SContract, - factory: &SContract - ) -> StdResult - { - let contract_info = router.store_code(amm_pair_contract_store()); - let lp_token_info = router.store_code(snip20_lp_token_contract_store()); - let contract = router.instantiate_contract( - contract_info, - mk_address(&OWNER).to_owned(), - &AMMPairInitMsg{ - pair: create_token_pair(&token_0, &token_1), - lp_token_contract: ContractInstantiationInfo{ - code_hash: lp_token_info.code_hash, - id: lp_token_info.code_id, - }, - factory_info: factory.clone(), - prng_seed: to_binary("seed")?, - entropy: to_binary("seed")?, - admin_auth: todo!(), - staking_contract: None, - custom_fee: None, - callback: None, - }, - &[], - "amm_pairs", - Some(OWNER.to_string()) - ).unwrap(); - Ok(contract) - } - + pub fn convert_to_contract_link(contract: &ContractInfo) -> SContract { SContract{ address: contract.address.to_owned(), @@ -165,10 +135,7 @@ pub mod integration_help_lib{ Box::new(contract) } - pub fn amm_pair_contract_store() -> Box> { - let contract = ContractWrapper::new_with_empty(pair_execute, pair_instantiate, pair_query); - Box::new(contract) - } + pub fn mk_address(address: &str) -> Addr{ return Addr::unchecked(address.to_string()) @@ -274,9 +241,9 @@ pub mod integration_help_lib{ amount: Uint128, sender: &Addr ) { - let viewing_key_response = set_viewing_key(router, &contract, "seed", sender).unwrap(); - let deposit_resposne = deposit_snip20(router,&contract, amount, &sender).unwrap(); - let mint_response = mint_snip20(router, amount, &recipient,&contract, &sender).unwrap(); + let _viewing_key_response = set_viewing_key(router, &contract, "seed", sender).unwrap(); + let _deposit_resposne = deposit_snip20(router,&contract, amount, &sender).unwrap(); + let _mint_response = mint_snip20(router, amount, &recipient,&contract, &sender).unwrap(); } pub fn increase_allowance( diff --git a/packages/multi_test/src/lib.rs b/packages/multi_test/src/lib.rs index 1496279..6d8cad2 100644 --- a/packages/multi_test/src/lib.rs +++ b/packages/multi_test/src/lib.rs @@ -1,7 +1,7 @@ #[cfg(not(target_arch = "wasm32"))] pub mod help_lib; #[cfg(not(target_arch = "wasm32"))] -pub mod auth_query; +pub mod auth; #[cfg(not(target_arch = "wasm32"))] pub mod util_addr; #[cfg(not(target_arch = "wasm32"))] @@ -9,4 +9,6 @@ pub mod factory; #[cfg(not(target_arch = "wasm32"))] pub mod staking; #[cfg(not(target_arch = "wasm32"))] -pub mod amm_pair; \ No newline at end of file +pub mod amm_pair; +#[cfg(not(target_arch = "wasm32"))] +pub mod admin; \ No newline at end of file diff --git a/packages/network_integration/src/cli_commands.rs b/packages/network_integration/src/cli_commands.rs index aaec0a8..bcf3fc7 100644 --- a/packages/network_integration/src/cli_commands.rs +++ b/packages/network_integration/src/cli_commands.rs @@ -6,7 +6,7 @@ pub mod snip20_lib { secretcli::{handle, query, Report}, }; use snip20_reference_impl::msg::QueryAnswer; - + use shadeswap_shared::utils::asset::Contract; use crate::utils::{init_snip20_cli, InitConfig, GAS}; use cosmwasm_std::Addr; @@ -179,6 +179,7 @@ pub mod factory_lib { account_name: &str, backend: &str, reports: &mut Vec, + admin_contract: &str ) -> io::Result { println!("Creating New Factory"); let lp_token = store_and_return_contract( @@ -215,7 +216,7 @@ pub mod factory_lib { prng_seed: to_binary(&"".to_string()).unwrap(), api_key: API_KEY.to_string(), authenticator: None, - admin_auth: todo!(), + admin_auth: Contract{address: Addr::unchecked(admin_contract.to_string()), code_hash: "".to_string()}, }; let factory_contract = @@ -345,6 +346,7 @@ pub mod router_lib { cli_types::NetContract, secretcli::{handle, init, Report}, }; + use shadeswap_shared::utils::asset::Contract; use shadeswap_shared::{ c_std::{to_binary, Addr}, msg::router::{ExecuteMsg as RouterExecuteMsg, InitMsg as RouterInitMsg}, @@ -362,6 +364,7 @@ pub mod router_lib { account_name: &str, backend: &str, reports: &mut Vec, + admin: &str ) -> io::Result { println!( "Creating New Router Contract with Pair Code Hash {}", @@ -370,7 +373,7 @@ pub mod router_lib { let router_msg = RouterInitMsg { prng_seed: to_binary(&"".to_string()).unwrap(), entropy: to_binary(&"".to_string()).unwrap(), - admin_auth: todo!(), + admin_auth: Contract { address: Addr::unchecked(admin.to_string()), code_hash: "".to_string()}, }; let router_contract = init( diff --git a/packages/network_integration/src/cli_menu.rs b/packages/network_integration/src/cli_menu.rs index 94ab77a..63245f7 100644 --- a/packages/network_integration/src/cli_menu.rs +++ b/packages/network_integration/src/cli_menu.rs @@ -60,18 +60,19 @@ pub fn parse_args(args: &[String], reports: &mut Vec) -> io::Result<()> } if args_command == CMDCREATEFACTORY { - if args.len() != 4 { + if args.len() != 5 { return Err(Error::new(ErrorKind::Other, "Please provide all args")); } let account_name = args[2].clone(); let backend = args[3].clone(); - let factory: NetContract = create_factory_contract(&account_name, &backend, reports)?; + let admin = args[4].clone(); + let factory: NetContract = create_factory_contract(&account_name, &backend, reports, &admin)?; print_contract_details_cli(factory, "Factory".to_string()); } if args_command == CMDCREATEROUTER{ - if args.len() != 6 { + if args.len() != 7 { return Err(Error::new(ErrorKind::Other, "Please provide all args")); } @@ -79,7 +80,8 @@ pub fn parse_args(args: &[String], reports: &mut Vec) -> io::Result<()> let backend = args[3].clone(); let _viewing_key = args[4].clone(); let code_hash = args[5].clone(); - let router: NetContract = create_router_contract(code_hash.clone(), &account_name, &backend, reports)?; + let admin = args[6].clone(); + let router: NetContract = create_router_contract(code_hash.clone(), &account_name, &backend, reports, &admin)?; print_contract_details_cli(router, "Router".to_string()); } @@ -295,8 +297,8 @@ pub fn print_help() -> io::Result<()> let mut handle = stdout.lock(); handle.write_all(b"Welcome to the Shadeswap CLI.")?; handle.write_all(b"\n\t1. Command:: snip20 -- Create new Snip20 Contract")?; - handle.write_all(b"\n\t2. Command:: factory -- Create new Factory Contract")?; - handle.write_all(b"\n\t3. Command:: router -- Create new Router Contract")?; + handle.write_all(b"\n\t2. Command:: factory -- Create new Factory Contract")?; + handle.write_all(b"\n\t3. Command:: router -- Create new Router Contract")?; handle.write_all(b"\n\t4. Command:: store_amm_pair -- Store AMM Pair Contract")?; handle.write_all(b"\n\t5. Command:: reg_snip20 -- Register Snip20 to Router")?; handle.write_all(b"\n\t6. Command:: allow_snip20 -- Increase Allowance for SNIP20")?; From fa83883fd7273a8e321a0cb6a9859575f90ef838 Mon Sep 17 00:00:00 2001 From: Michal Sivak Date: Tue, 1 Nov 2022 23:31:36 +1100 Subject: [PATCH 4/5] fix amm_pairs test --- Cargo.lock | 1 + contracts/amm_pair/src/operations.rs | 1 - contracts/amm_pair/tests/integration.rs | 25 +++++----- contracts/factory/tests/integration.rs | 5 +- contracts/router/tests/integration.rs | 27 ++++------- contracts/staking/src/test.rs | 24 ++++------ contracts/staking/tests/integration.rs | 6 +-- packages/multi_test/Cargo.toml | 3 ++ packages/multi_test/src/amm_pair/mod.rs | 2 - .../amm_pairs_lib.rs} | 4 +- .../amm_pairs_mock.rs} | 47 ++++++++----------- packages/multi_test/src/amm_pairs/mod.rs | 2 + .../multi_test/src/factory/factory_lib.rs | 35 ++++++++++++++ .../multi_test/src/factory/factory_mock.rs | 5 +- packages/multi_test/src/factory/mod.rs | 4 +- packages/multi_test/src/help_lib.rs | 14 ++---- packages/multi_test/src/lib.rs | 2 +- packages/shadeswap-shared/src/core/link.rs | 1 - 18 files changed, 108 insertions(+), 100 deletions(-) delete mode 100644 packages/multi_test/src/amm_pair/mod.rs rename packages/multi_test/src/{amm_pair/amm_pair_lib.rs => amm_pairs/amm_pairs_lib.rs} (94%) rename packages/multi_test/src/{amm_pair/amm_pair_mock.rs => amm_pairs/amm_pairs_mock.rs} (97%) create mode 100644 packages/multi_test/src/amm_pairs/mod.rs create mode 100644 packages/multi_test/src/factory/factory_lib.rs diff --git a/Cargo.lock b/Cargo.lock index 4e12759..06650bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -610,6 +610,7 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cosmwasm-storage", + "factory", "lp-token", "query-authentication", "rand_chacha 0.2.2", diff --git a/contracts/amm_pair/src/operations.rs b/contracts/amm_pair/src/operations.rs index 82b45c7..806a785 100644 --- a/contracts/amm_pair/src/operations.rs +++ b/contracts/amm_pair/src/operations.rs @@ -15,7 +15,6 @@ use shadeswap_shared::{ msg::{ amm_pair::{QueryMsgResponse, SwapInfo, SwapResult, TradeHistory}, factory::{QueryMsg as FactoryQueryMsg, QueryResponse as FactoryQueryResponse}, - router::ExecuteMsg as RouterExecuteMsg, staking::{InitMsg as StakingInitMsg, InvokeMsg as StakingInvokeMsg}, }, snip20::{ diff --git a/contracts/amm_pair/tests/integration.rs b/contracts/amm_pair/tests/integration.rs index a0a90a9..4f8f7bf 100644 --- a/contracts/amm_pair/tests/integration.rs +++ b/contracts/amm_pair/tests/integration.rs @@ -13,9 +13,9 @@ pub fn amm_pair_integration_tests_with_custom_token() { use multi_test::admin::admin_help::init_admin_contract; use multi_test::help_lib::integration_help_lib::{roll_blockchain, mint_deposit_snip20, increase_allowance, store_init_factory_contract, create_token_pair, convert_to_contract_link, send_snip20_with_msg, get_snip20_balance, set_viewing_key, get_amm_pair_config, get_pair_liquidity_pool_balance}; - use cosmwasm_std::{Uint128, Coin, StdError, StdResult, Timestamp, from_binary, Api}; - use multi_test::util_addr::util_addr::{OWNER, OWNER_SIGNATURE, OWNER_PUB_KEY, STAKER_A, STAKER_B, PUB_KEY_STAKER_A}; - use shadeswap_shared::core::{ ContractInstantiationInfo, TokenPair, TokenPairAmount, TokenAmount, CustomFee, Fee}; + use cosmwasm_std::{Uint128, Coin, Timestamp}; + use multi_test::util_addr::util_addr::{OWNER}; + use shadeswap_shared::core::{ ContractInstantiationInfo, TokenPairAmount, TokenAmount, CustomFee, Fee}; use shadeswap_shared::msg::amm_pair::InvokeMsg; use shadeswap_shared::staking::StakingContractInit; use shadeswap_shared::utils::testing::TestingExt; @@ -23,10 +23,8 @@ pub fn amm_pair_integration_tests_with_custom_token() { use multi_test::help_lib::integration_help_lib::{generate_snip20_contract}; use multi_test::help_lib::integration_help_lib::snip20_lp_token_contract_store; use shadeswap_shared::Contract as SContract; - use multi_test::amm_pair::amm_pair_mock::amm_pair_mock::reply; - use staking::contract::{execute as staking_execute, instantiate as staking_instantiate, query as staking_query}; - let staker_a_addr = Addr::unchecked(STAKER_A.to_owned()); - let staker_b_addr = Addr::unchecked(STAKER_B.to_owned()); + use multi_test::amm_pairs::amm_pairs_mock::amm_pairs_mock::reply; + use staking::contract::{execute as staking_execute, instantiate as staking_instantiate, query as staking_query}; let owner_addr = Addr::unchecked(OWNER); let mut router = App::default(); @@ -43,7 +41,7 @@ pub fn amm_pair_integration_tests_with_custom_token() { pub fn amm_contract_store() -> Box> { let contract = ContractWrapper::new_with_empty(execute, instantiate, query) - .with_reply_empty(reply); + .with_reply(reply); Box::new(contract) } @@ -119,7 +117,10 @@ pub fn amm_pair_integration_tests_with_custom_token() { // Assert AMM PAIR Config roll_blockchain(&mut router, 2).unwrap(); - let query: QueryMsgResponse = router.query_test(amm_pair_contract.to_owned(),to_binary(&QueryMsg::GetConfig { }).unwrap()).unwrap(); + let query: QueryMsgResponse = router.query_test( + amm_pair_contract.to_owned(), + to_binary(&QueryMsg::GetConfig { }).unwrap() + ).unwrap(); match query { QueryMsgResponse::GetConfig { factory_contract, @@ -334,11 +335,9 @@ pub fn amm_pair_integration_tests_native_token() { use shadeswap_shared::{core::{TokenType}}; use multi_test::help_lib::integration_help_lib::{generate_snip20_contract}; use multi_test::help_lib::integration_help_lib::snip20_lp_token_contract_store; - use multi_test::amm_pair::amm_pair_mock::amm_pair_mock::reply; + use multi_test::amm_pairs::amm_pairs_mock::amm_pairs_mock::reply; use shadeswap_shared::Contract as SContract; - use staking::contract::{execute as staking_execute, instantiate as staking_instantiate, query as staking_query}; - let staker_a_addr = Addr::unchecked(STAKER_A.to_owned()); - let staker_b_addr = Addr::unchecked(STAKER_B.to_owned()); + use staking::contract::{execute as staking_execute, instantiate as staking_instantiate, query as staking_query}; let owner_addr = Addr::unchecked(OWNER); let mut router = App::default(); diff --git a/contracts/factory/tests/integration.rs b/contracts/factory/tests/integration.rs index 0f6019d..0747e7a 100644 --- a/contracts/factory/tests/integration.rs +++ b/contracts/factory/tests/integration.rs @@ -2,7 +2,8 @@ use cosmwasm_std::{ to_binary, Addr, Empty, ContractInfo, StdResult, }; use factory::contract::{execute, instantiate, query}; -use multi_test::{help_lib::integration_help_lib::{convert_to_contract_link, roll_blockchain, generate_snip20_contract, store_init_auth_contract}, amm_pair::amm_pair_lib::amm_pair_lib::store_init_amm_pair_contract}; +use multi_test::{help_lib::integration_help_lib::{convert_to_contract_link, roll_blockchain, generate_snip20_contract, store_init_auth_contract}, + amm_pairs::amm_pairs_lib::amm_pairs_lib::store_init_amm_pair_contract}; use secret_multi_test::{App, Contract, ContractWrapper, Executor}; use shadeswap_shared::{utils::testing::TestingExt, core::{ContractInstantiationInfo, }, factory::{InitMsg, QueryResponse, QueryMsg}, Contract as SContract}; @@ -15,7 +16,7 @@ pub fn contract_counter() -> Box> { #[test] fn factory_integration_tests() { use multi_test::admin::admin_help::init_admin_contract; - use multi_test::amm_pair::amm_pair_lib::amm_pair_lib::amm_pair_contract_store; + use multi_test::amm_pairs::amm_pairs_lib::amm_pairs_lib::amm_pair_contract_store; use multi_test::help_lib::integration_help_lib::{generate_snip20_contract, snip_20_balance_query, convert_to_contract_link, create_token_pair}; use shadeswap_shared::Pagination; use shadeswap_shared::amm_pair::AMMPair; diff --git a/contracts/router/tests/integration.rs b/contracts/router/tests/integration.rs index d6ab232..8cb07fe 100644 --- a/contracts/router/tests/integration.rs +++ b/contracts/router/tests/integration.rs @@ -1,26 +1,19 @@ use secret_multi_test::{App, Contract, ContractWrapper, Executor}; -use shadeswap_shared::msg::router::{{InitMsg, ExecuteMsg, QueryMsg, QueryMsgResponse}}; -use multi_test::help_lib::integration_help_lib::{mk_contract_link, mk_address}; +use shadeswap_shared::msg::router::{InitMsg, ExecuteMsg, QueryMsg}; use cosmwasm_std::{ - testing::{mock_env, MockApi}, - to_binary, Addr, Empty, Binary, ContractInfo, Uint128, + to_binary, Addr, Empty, }; -use shadeswap_shared::utils::asset::Contract as AuthContract; - #[cfg(not(target_arch = "wasm32"))] #[test] pub fn router_integration_tests() { use multi_test::admin::admin_help::init_admin_contract; - use multi_test::amm_pair::amm_pair_lib::amm_pair_lib::store_init_amm_pair_contract; + use multi_test::amm_pairs::amm_pairs_lib::amm_pairs_lib::store_init_amm_pair_contract; use router::contract::{instantiate, query, execute, reply}; - use multi_test::help_lib::integration_help_lib::{roll_blockchain, mint_deposit_snip20, - send_snip20_to_stake, snip20_send, increase_allowance, - get_current_block_time, store_init_staking_contract, store_init_factory_contract, - snip20_contract_store, staking_contract_store, convert_to_contract_link - }; - use cosmwasm_std::{Uint128, Coin, StdError, StdResult, Timestamp, from_binary}; - use multi_test::util_addr::util_addr::{OWNER, OWNER_SIGNATURE, OWNER_PUB_KEY, STAKER_A, STAKER_B, PUB_KEY_STAKER_A}; + use multi_test::help_lib::integration_help_lib::{roll_blockchain, mint_deposit_snip20, store_init_factory_contract, + convert_to_contract_link}; + use cosmwasm_std::{Uint128, Coin}; + use multi_test::util_addr::util_addr::{OWNER, STAKER_A}; use multi_test::util_addr::util_blockchain::CHAIN_ID; use shadeswap_shared::core::{TokenAmount}; use shadeswap_shared::msg::amm_pair::InvokeMsg; @@ -123,9 +116,9 @@ pub fn router_integration_tests() { QueryMsgResponse::SwapSimulation { total_fee_amount, lp_fee_amount, - shade_dao_fee_amount, + shade_dao_fee_amount:_, result, - price, + price:_, } => { // Verify result not actual amount assert_ne!(total_fee_amount, Uint128::zero()); @@ -167,7 +160,7 @@ pub fn router_integration_tests() { recipient: Some(owner_addr.to_string()) }; - let response = router.execute_contract( + let _response = router.execute_contract( owner_addr.to_owned(), &router_contract, &execute_swap, diff --git a/contracts/staking/src/test.rs b/contracts/staking/src/test.rs index 35363ed..610c5ec 100644 --- a/contracts/staking/src/test.rs +++ b/contracts/staking/src/test.rs @@ -11,7 +11,6 @@ pub const SENDER: &str = "secret12qmz6uuapxgz7t0zed82wckl4mff5pt5czcmy2"; pub mod tests { use super::*; use crate::{ - contract::instantiate, operations::{ calculate_incremental_staking_reward, calculate_staker_shares, claim_rewards, claim_rewards_for_all_stakers, generate_proxy_staking_key, get_total_stakers_count, @@ -19,7 +18,7 @@ pub mod tests { }, state::{ claim_reward_info_r, proxy_staker_info_r, reward_token_list_r, reward_token_r, - staker_index_r, staker_index_w, stakers_r, stakers_vk_r, total_staked_r, + staker_index_r, stakers_r, total_staked_r, ClaimRewardsInfo, Config, RewardTokenInfo, config_w, total_staked_w, }, test::test_help_lib::{ @@ -28,20 +27,14 @@ pub mod tests { }, }; use cosmwasm_std::{ - from_binary, from_slice, - testing::{mock_info, MockApi, MockStorage}, - to_binary, to_vec, Addr, AllBalanceResponse, Api, BalanceResponse, BankQuery, BlockInfo, - Coin, Decimal, Empty, Env, MessageInfo, Querier, QuerierResult, QueryRequest, StdError, - StdResult, Storage, Uint128, WasmQuery, Response, - }; - use secret_multi_test::Contract; - use shadeswap_shared::{msg::factory::{ - QueryMsg as FactoryQueryMsg, QueryResponse as FactoryQueryResponse, - }, utils::testing::assert_error}; + testing::{mock_info, MockApi, MockStorage}, Addr, Decimal, MessageInfo, StdError, + StdResult, Uint128}; + + use shadeswap_shared::{utils::testing::assert_error}; use shadeswap_shared::{ c_std::{CustomQuery, Deps, OwnedDeps}, core::{TokenType}, - msg::staking::{ExecuteMsg, InitMsg, QueryMsg, QueryResponse}, + msg::staking::{InitMsg, QueryResponse}, }; #[test] @@ -214,8 +207,7 @@ pub mod tests { fn assert_unstake_set_claimable_to_zero() -> StdResult<()> { let mut deps = mock_dependencies(&[]); let env = mock_custom_env(CONTRACT_ADDRESS, 1571797523, 1524); - let env_b = mock_custom_env(CONTRACT_ADDRESS, 1571797854, 1534); - let stake_mock_info = mock_info(LP_TOKEN, &[]); + let stake_mock_info = mock_info(LP_TOKEN, &[]); let unstake_mock_info = mock_info(STAKER_A, &[]); let _config: Config = make_init_config(deps.as_mut(), env.clone(), Uint128::from(100u128))?; let mut deps_owned: OwnedDeps = mock_dependencies(&[]); @@ -317,7 +309,7 @@ pub mod tests { let env = mock_custom_env(CONTRACT_ADDRESS, 1571797523, 1524); let mut _config: Config = make_init_config(deps.as_mut(), env.clone(), Uint128::from(100u128))?; _config.reward_token = TokenType::NativeToken { denom:"uscrt".to_string() }; - config_w(&mut deps.storage).save(&_config); + config_w(&mut deps.storage).save(&_config)?; let error_msg = get_config(deps.as_ref()); match error_msg { diff --git a/contracts/staking/tests/integration.rs b/contracts/staking/tests/integration.rs index 9a0f217..ed312e6 100644 --- a/contracts/staking/tests/integration.rs +++ b/contracts/staking/tests/integration.rs @@ -1,13 +1,9 @@ -use snip20_reference_impl::contract::{ - execute as snip20_execute, instantiate as snip20_instantiate, query as snip20_query, -}; use staking::contract::{execute, instantiate, query}; use secret_multi_test::{App, Contract, ContractWrapper, Executor}; use shadeswap_shared::msg::staking::{{InitMsg, QueryResponse, ExecuteMsg}}; use multi_test::help_lib::integration_help_lib::{mk_contract_link, mk_address}; use cosmwasm_std::{ - testing::{mock_env, MockApi}, - to_binary, Addr, Empty, Binary, ContractInfo, Uint128, + to_binary, Addr, Empty, }; use shadeswap_shared::utils::asset::Contract as AuthContract; diff --git a/packages/multi_test/Cargo.toml b/packages/multi_test/Cargo.toml index 3a3ba9a..ea24e97 100644 --- a/packages/multi_test/Cargo.toml +++ b/packages/multi_test/Cargo.toml @@ -36,3 +36,6 @@ chrono = { version = "=0.4.19" } secret-multi-test = { git = "https://github.com/securesecrets/secret-plus-utils", version = "0.13.4" } shadeswap-shared = {path = "../../packages/shadeswap-shared"} query-authentication = { git = "https://github.com/securesecrets/query-authentication", branch = "cosmwasm_v1_upgrade" } + +[dev-dependencies] +factory = {path = "../../contracts/factory"} \ No newline at end of file diff --git a/packages/multi_test/src/amm_pair/mod.rs b/packages/multi_test/src/amm_pair/mod.rs deleted file mode 100644 index ea32850..0000000 --- a/packages/multi_test/src/amm_pair/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod amm_pair_mock; -pub mod amm_pair_lib; \ No newline at end of file diff --git a/packages/multi_test/src/amm_pair/amm_pair_lib.rs b/packages/multi_test/src/amm_pairs/amm_pairs_lib.rs similarity index 94% rename from packages/multi_test/src/amm_pair/amm_pair_lib.rs rename to packages/multi_test/src/amm_pairs/amm_pairs_lib.rs index b49b708..4ea9bf9 100644 --- a/packages/multi_test/src/amm_pair/amm_pair_lib.rs +++ b/packages/multi_test/src/amm_pairs/amm_pairs_lib.rs @@ -1,9 +1,9 @@ -pub mod amm_pair_lib{ +pub mod amm_pairs_lib{ use cosmwasm_std::{ContractInfo, StdResult, Addr, to_binary, Empty}; use secret_multi_test::{App, ContractWrapper, Executor, Contract}; use shadeswap_shared::{core::ContractInstantiationInfo}; use shadeswap_shared::msg::amm_pair::InitMsg; - use crate::admin::admin_mock::admin_mock::{execute, instantiate, query}; + use crate::amm_pairs::amm_pairs_mock::amm_pairs_mock::{execute, instantiate, query}; use crate::help_lib::integration_help_lib::{snip20_lp_token_contract_store, create_token_pair}; use shadeswap_shared::utils::asset::Contract as SContract; diff --git a/packages/multi_test/src/amm_pair/amm_pair_mock.rs b/packages/multi_test/src/amm_pairs/amm_pairs_mock.rs similarity index 97% rename from packages/multi_test/src/amm_pair/amm_pair_mock.rs rename to packages/multi_test/src/amm_pairs/amm_pairs_mock.rs index 161f0da..69b5361 100644 --- a/packages/multi_test/src/amm_pair/amm_pair_mock.rs +++ b/packages/multi_test/src/amm_pairs/amm_pairs_mock.rs @@ -1,15 +1,13 @@ -pub mod amm_pair_mock { +pub mod amm_pairs_mock { use crate::{ - help_lib::integration_help_lib::get_contract_link_from_token_type, - util_addr::util_addr::OWNER, + help_lib::integration_help_lib::get_contract_link_from_token_type }; use cosmwasm_std::{ - entry_point, from_binary, to_binary, Addr, BankMsg, Binary, Coin, ContractInfo, CosmosMsg, + entry_point, to_binary, Addr, Binary, CosmosMsg, Deps, DepsMut, Env, MessageInfo, Reply, Response, StdError, StdResult, Storage, SubMsg, SubMsgResult, Uint128, WasmMsg, QueryRequest, WasmQuery, }; use cosmwasm_storage::{singleton, singleton_read, ReadonlySingleton, Singleton}; - use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use shadeswap_shared::{ core::{ @@ -21,7 +19,6 @@ pub mod amm_pair_mock { utils::{pad_query_result, pad_response_result}, amm_pair::AMMSettings, }; use shadeswap_shared::msg::factory::{QueryResponse as FactoryQueryResponse, QueryMsg as FactoryQueryMsg}; - pub const BLOCK_SIZE: usize = 256; //use crate::staking::staking_mock::staking_mock::InitMsg as StakingInitMsg; use shadeswap_shared::msg::staking::InitMsg as StakingInitMsg; @@ -40,6 +37,19 @@ pub mod amm_pair_mock { admin_auth: Contract } + #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] + pub struct Config { + pub factory_contract: Contract, + pub lp_token: Contract, + pub staking_contract: Option, + pub pair: TokenPair, + pub viewing_key: ViewingKey, + pub custom_fee: Option, + pub staking_contract_init: Option, + pub prng_seed: Binary, + pub admin_auth: Contract + } + #[entry_point] pub fn instantiate( deps: DepsMut, @@ -65,6 +75,7 @@ pub mod amm_pair_mock { staking_contract: None, staking_contract_init: msg.staking_contract, prng_seed: msg.prng_seed, + admin_auth: msg.admin_auth }; singleton(deps.storage, CONFIG).save(&config)?; match msg.callback { @@ -171,7 +182,7 @@ pub mod amm_pair_mock { to: _, msg: _msg, } => Ok(Response::new()), - ExecuteMsg::SetConfig { admin_auth } => todo!(), + ExecuteMsg::SetConfig { admin_auth } => Ok(Response::new()), }, BLOCK_SIZE, ) @@ -338,24 +349,6 @@ pub mod amm_pair_mock { "An error occurred while trying to retrieve factory settings.", )), } - } - - #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] - pub struct Config { - pub factory_contract: Contract, - pub lp_token: Contract, - pub staking_contract: Option, - pub pair: TokenPair, - pub viewing_key: ViewingKey, - pub custom_fee: Option, - pub staking_contract_init: Option, - pub prng_seed: Binary, - } - - #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] - pub enum DirectionType { - Buy, - Sell, - Unknown, - } + } + } diff --git a/packages/multi_test/src/amm_pairs/mod.rs b/packages/multi_test/src/amm_pairs/mod.rs new file mode 100644 index 0000000..f1a7368 --- /dev/null +++ b/packages/multi_test/src/amm_pairs/mod.rs @@ -0,0 +1,2 @@ +pub mod amm_pairs_mock; +pub mod amm_pairs_lib; \ No newline at end of file diff --git a/packages/multi_test/src/factory/factory_lib.rs b/packages/multi_test/src/factory/factory_lib.rs new file mode 100644 index 0000000..c05c7dc --- /dev/null +++ b/packages/multi_test/src/factory/factory_lib.rs @@ -0,0 +1,35 @@ +pub mod factory_lib{ + use cosmwasm_std::{StdResult, ContractInfo, Addr, Empty}; + use secret_multi_test::{App, Executor, Contract, ContractWrapper}; + use shadeswap_shared::utils::asset::Contract as SContract; + use crate::factory::factory_mock::factory_mock::InitMsg; + use crate::factory::factory_mock::factory_mock::{execute, instantiate, query}; + + pub fn store_init_factory_contract( + router: &mut App, + admin: &SContract, + sender: &str + ) + -> StdResult + { + let contract_info = router.store_code(factory_contract_store()); + let contract = router.instantiate_contract( + contract_info, + Addr::unchecked(sender.to_string()), + &InitMsg{ + admin_auth: admin.clone(), + }, + &[], + "staking", + Some(sender.to_string()) + ).unwrap(); + Ok(contract) + } + + pub fn factory_contract_store() -> Box> { + let contract = ContractWrapper::new_with_empty(execute, instantiate, query); + Box::new(contract) + } + + +} \ No newline at end of file diff --git a/packages/multi_test/src/factory/factory_mock.rs b/packages/multi_test/src/factory/factory_mock.rs index 49f722c..f5450bd 100644 --- a/packages/multi_test/src/factory/factory_mock.rs +++ b/packages/multi_test/src/factory/factory_mock.rs @@ -1,7 +1,7 @@ pub mod factory_mock { use crate::util_addr::util_addr::OWNER; use cosmwasm_std::{ - entry_point, to_binary, Addr, BankMsg, Binary, Coin, CosmosMsg, Deps, DepsMut, Env, + entry_point, to_binary, Addr, Binary, Deps, DepsMut, Env, MessageInfo, Response, StdResult, }; use cosmwasm_storage::{singleton, singleton_read}; @@ -42,6 +42,7 @@ pub mod factory_mock { QueryMsg::ListAMMPairs { pagination } => to_binary(""), QueryMsg::GetAMMPairAddress { pair } => to_binary(""), QueryMsg::GetConfig => { + println!("getconfig factory"); let admin_auth: Contract = singleton_read(deps.storage, CONFIG).load()?; to_binary(&QueryResponse::GetConfig { pair_contract: ContractInstantiationInfo { @@ -61,7 +62,7 @@ pub mod factory_mock { id: 0u64, }, authenticator: None, - admin_auth: admin_auth, + admin_auth: admin_auth.clone(), }) }, QueryMsg::AuthorizeApiKey { api_key } => to_binary(""), diff --git a/packages/multi_test/src/factory/mod.rs b/packages/multi_test/src/factory/mod.rs index 0ea8a21..a13ab7d 100644 --- a/packages/multi_test/src/factory/mod.rs +++ b/packages/multi_test/src/factory/mod.rs @@ -1,2 +1,4 @@ pub use factory_mock::*; -pub mod factory_mock; \ No newline at end of file +pub mod factory_mock; +pub mod factory_lib; +pub use factory_lib::*; \ No newline at end of file diff --git a/packages/multi_test/src/help_lib.rs b/packages/multi_test/src/help_lib.rs index 1181740..de47005 100644 --- a/packages/multi_test/src/help_lib.rs +++ b/packages/multi_test/src/help_lib.rs @@ -26,12 +26,13 @@ pub mod integration_help_lib{ staking::QueryData }; use crate::auth::auth_query::auth_query::{execute as auth_execute, InitMsg as AuthInitMsg, instantiate as auth_instantiate, query as auth_query}; + use crate::factory::factory_lib::factory_lib::factory_contract_store; + use crate::factory::factory_mock::factory_mock::InitMsg; use shadeswap_shared::msg::amm_pair::{QueryMsgResponse as AMMPairQueryResponse, QueryMsg as AMMPairQueryMsg}; use snip20_reference_impl::contract::{execute as snip20_execute, instantiate as snip20_instantiate, query as snip20_query}; use lp_token::contract::{execute as lp_execute, instantiate as lp_instantiate, query as lp_query}; use cosmwasm_std::to_binary; - use crate::util_addr::util_addr::{OWNER, TOKEN_B, TOKEN_A}; - use crate::factory::factory_mock::factory_mock::{execute as factory_execute, query as factory_query,instantiate as factory_instantiate, InitMsg as FactoryInitMsg }; + use crate::util_addr::util_addr::{OWNER, TOKEN_B, TOKEN_A}; use crate::staking::staking_mock::staking_mock::{execute as staking_execute_mock, query as staking_query_mock,instantiate as staking_instantiate_mock, InitMsg as StakingInitMsg }; type TestPermit = Permit; @@ -56,7 +57,6 @@ pub mod integration_help_lib{ ).unwrap(); Ok(auth_contract) } - pub fn store_init_factory_contract( router: &mut App, @@ -68,7 +68,7 @@ pub mod integration_help_lib{ let contract = router.instantiate_contract( contract_info, mk_address(&OWNER).to_owned(), - &FactoryInitMsg{ + &InitMsg{ admin_auth: admin.clone(), }, &[], @@ -130,12 +130,6 @@ pub mod integration_help_lib{ Box::new(contract) } - pub fn factory_contract_store() -> Box> { - let contract = ContractWrapper::new_with_empty(factory_execute, factory_instantiate, factory_query); - Box::new(contract) - } - - pub fn mk_address(address: &str) -> Addr{ return Addr::unchecked(address.to_string()) diff --git a/packages/multi_test/src/lib.rs b/packages/multi_test/src/lib.rs index 6d8cad2..3555216 100644 --- a/packages/multi_test/src/lib.rs +++ b/packages/multi_test/src/lib.rs @@ -9,6 +9,6 @@ pub mod factory; #[cfg(not(target_arch = "wasm32"))] pub mod staking; #[cfg(not(target_arch = "wasm32"))] -pub mod amm_pair; +pub mod amm_pairs; #[cfg(not(target_arch = "wasm32"))] pub mod admin; \ No newline at end of file diff --git a/packages/shadeswap-shared/src/core/link.rs b/packages/shadeswap-shared/src/core/link.rs index a6d1d13..6fb1f94 100644 --- a/packages/shadeswap-shared/src/core/link.rs +++ b/packages/shadeswap-shared/src/core/link.rs @@ -1,4 +1,3 @@ -use cosmwasm_std::{Addr, Env}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; pub type CodeId = u64; From a569c4c49d4afe7044e7cd120e2f57a031ca8b6f Mon Sep 17 00:00:00 2001 From: Michal Sivak Date: Wed, 2 Nov 2022 00:49:21 +1100 Subject: [PATCH 5/5] Add get_reward_tokens --- contracts/staking/src/contract.rs | 3 +- contracts/staking/src/operations.rs | 18 +- contracts/staking/src/state.rs | 25 ++- contracts/staking/src/test.rs | 60 +++++-- contracts/staking/tests/integration.rs | 33 ++-- .../network_integration/src/cli_commands.rs | 1 - .../network_integration/src/cli_helpers.rs | 163 +----------------- packages/shadeswap-shared/src/msg.rs | 8 +- .../shadeswap-shared/src/stake_contract.rs | 8 + 9 files changed, 113 insertions(+), 206 deletions(-) diff --git a/contracts/staking/src/contract.rs b/contracts/staking/src/contract.rs index 23e4a37..0478c30 100644 --- a/contracts/staking/src/contract.rs +++ b/contracts/staking/src/contract.rs @@ -15,7 +15,7 @@ use crate::{ operations::{ claim_rewards, get_claim_reward_for_user, get_config, get_staking_stake_lp_token_info, proxy_stake, proxy_unstake, set_reward_token, stake, store_init_reward_token_and_timestamp, - unstake, update_authenticator, + unstake, update_authenticator, get_reward_token_to_list, }, state::{config_r, config_w, prng_seed_w, Config}, }; @@ -223,5 +223,6 @@ pub fn auth_queries(deps: Deps, _env: Env, msg: AuthQuery, user: Addr) -> StdRes match msg { AuthQuery::GetClaimReward { time } => get_claim_reward_for_user(deps, user, time), AuthQuery::GetStakerLpTokenInfo {} => get_staking_stake_lp_token_info(deps, user), + AuthQuery::GetRewardTokens { } => get_reward_token_to_list(deps.storage), } } diff --git a/contracts/staking/src/operations.rs b/contracts/staking/src/operations.rs index 7547fce..63992fa 100644 --- a/contracts/staking/src/operations.rs +++ b/contracts/staking/src/operations.rs @@ -9,17 +9,19 @@ use cosmwasm_std::{ }; use shadeswap_shared::core::TokenType; use shadeswap_shared::snip20; -use shadeswap_shared::stake_contract::ClaimableInfo; +use shadeswap_shared::stake_contract::{ClaimableInfo}; use shadeswap_shared::staking::QueryResponse; use shadeswap_shared::{ msg::amm_pair::InvokeMsg as AmmPairInvokeMsg, Contract, }; +use crate::state::{RewardTokenInfo}; +use shadeswap_shared::stake_contract::RewardTokenInfo as ResponseRewardTokenInfo; use crate::state::{ claim_reward_info_r, claim_reward_info_w, config_r, config_w, proxy_staker_info_r, proxy_staker_info_w, reward_token_list_r, reward_token_list_w, reward_token_r, reward_token_w, staker_index_r, staker_index_w, stakers_r, stakers_w, total_staked_r, total_staked_w, - total_stakers_r, total_stakers_w, ClaimRewardsInfo, ProxyStakingInfo, RewardTokenInfo, + total_stakers_r, total_stakers_w, ClaimRewardsInfo, ProxyStakingInfo, StakingInfo, }; @@ -245,6 +247,18 @@ pub fn get_total_stakers_count(storage: &dyn Storage) -> StdResult { }; } +pub fn get_reward_token_to_list(storage:& dyn Storage) + -> StdResult { + let list: Vec = get_reward_tokens_info(storage)?; + let mut response: Vec = vec![]; + for i in list.iter(){ + response.push(i.to_owned().to_reward_token_response()) + } + to_binary(&QueryResponse::RewardTokens{ + tokens: response + }) +} + pub fn claim_rewards(deps: DepsMut, info: MessageInfo, env: Env) -> StdResult { let receiver = info.sender.clone(); let current_timestamp = Uint128::new((env.block.time.seconds()) as u128); diff --git a/contracts/staking/src/state.rs b/contracts/staking/src/state.rs index 3acce71..52adffa 100644 --- a/contracts/staking/src/state.rs +++ b/contracts/staking/src/state.rs @@ -2,7 +2,7 @@ use cosmwasm_std::{Addr, Uint128, Storage}; use cosmwasm_storage::{singleton, Singleton, ReadonlySingleton, singleton_read, bucket_read, bucket, ReadonlyBucket, Bucket}; use serde::{Serialize, Deserialize}; use shadeswap_shared::{core::{TokenType, ViewingKey}, Contract}; - +use shadeswap_shared::stake_contract::RewardTokenInfo as ResponseRewardTokenInfo; pub static CONFIG: &[u8] = b"CONFIG"; pub static STAKERS: &[u8] = b"LIST_STAKERS"; @@ -28,6 +28,23 @@ pub struct Config { pub admin_auth: Contract } +#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] +pub struct RewardTokenInfo{ + pub reward_token: Contract, + pub daily_reward_amount: Uint128, + pub valid_to: Uint128, +} + + impl RewardTokenInfo{ + pub fn to_reward_token_response(&mut self)-> ResponseRewardTokenInfo{ + ResponseRewardTokenInfo{ + reward_token: self.reward_token.to_owned(), + daily_reward_amount: self.daily_reward_amount, + valid_to: self.valid_to, + } + } + } + #[derive(Serialize, Deserialize, PartialEq, Debug)] pub struct StakingInfo{ pub amount: Uint128, @@ -40,12 +57,6 @@ pub struct ProxyStakingInfo{ pub amount: Uint128 } -#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] -pub struct RewardTokenInfo{ - pub reward_token: Contract, - pub daily_reward_amount: Uint128, - pub valid_to: Uint128, -} #[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] pub struct RewardTokenInfoList{ diff --git a/contracts/staking/src/test.rs b/contracts/staking/src/test.rs index 610c5ec..0c9fdaa 100644 --- a/contracts/staking/src/test.rs +++ b/contracts/staking/src/test.rs @@ -7,8 +7,12 @@ pub const STAKER_B: &str = "secret1pf42ypa2awg0pxkx8lfyyrjvm28vq0qpffa8qx"; pub const STAKER_C: &str = "secret1nulgwu6es24us9urgyvms7y02txyg0s02msgzw"; pub const SENDER: &str = "secret12qmz6uuapxgz7t0zed82wckl4mff5pt5czcmy2"; + #[cfg(test)] pub mod tests { + use shadeswap_shared::{utils::{asset::Contract, Query}, staking::{QueryMsg, AuthQuery, QueryResponse}}; + use shadeswap_shared::stake_contract::RewardTokenInfo as ResponseRewardTokenInfo; + use crate::state::RewardTokenInfo; use super::*; use crate::{ operations::{ @@ -19,22 +23,21 @@ pub mod tests { state::{ claim_reward_info_r, proxy_staker_info_r, reward_token_list_r, reward_token_r, staker_index_r, stakers_r, total_staked_r, - ClaimRewardsInfo, Config, RewardTokenInfo, config_w, total_staked_w, + ClaimRewardsInfo, Config, config_w, total_staked_w, }, test::test_help_lib::{ make_init_config, make_reward_token_contract, mock_custom_env, mock_dependencies, MockQuerier, - }, + }, contract::{execute, query, auth_queries}, }; use cosmwasm_std::{ testing::{mock_info, MockApi, MockStorage}, Addr, Decimal, MessageInfo, StdError, - StdResult, Uint128}; + StdResult, Uint128, from_binary}; use shadeswap_shared::{utils::testing::assert_error}; use shadeswap_shared::{ - c_std::{CustomQuery, Deps, OwnedDeps}, + c_std::{ OwnedDeps}, core::{TokenType}, - msg::staking::{InitMsg, QueryResponse}, }; #[test] @@ -92,6 +95,38 @@ pub mod tests { Ok(()) } + + #[test] + fn assert_get_reward_token_list_success() -> StdResult<()> { + let mut deps = mock_dependencies(&[]); + let env = mock_custom_env(CONTRACT_ADDRESS, 1571797523, 1524); + let _config: Config = make_init_config(deps.as_mut(), env.clone(), Uint128::from(100u128))?; + let msg = shadeswap_shared::staking::ExecuteMsg::SetRewardToken { + reward_token: Contract{ + address: Addr::unchecked("REWARD_TOKEN_0".to_string()), + code_hash: "".to_string() }, + daily_reward_amount: Uint128::new(100000000000u128), + valid_to: Uint128::new(30000000000000u128) + }; + let _ = execute(deps.as_mut(), env.clone(), mock_info(CONTRACT_ADDRESS, &[]), msg); + let auth_query = AuthQuery::GetRewardTokens { }; + let raw_response = auth_queries(deps.as_ref(),env, auth_query,Addr::unchecked("sender"))?; + let query_response: QueryResponse = from_binary(&raw_response)?; + match query_response{ + // QueryResponse::ClaimRewards { claimable_rewards: _ } => todo!(), + // QueryResponse::ContractOwner { address: _ } => todo!(), + // QueryResponse::StakerLpTokenInfo { staked_lp_token: _, total_staked_lp_token:_ } => todo!(), + // QueryResponse::RewardTokenBalance { amount: _, reward_token:_ } => todo!(), + // QueryResponse::StakerRewardTokenBalance { reward_amount: _, total_reward_liquidity:_, reward_token:_ } => todo!(), + // QueryResponse::Config { reward_token: _, lp_token:_, daily_reward_amount:_, amm_pair:_, admin_auth:_ } => todo!(), + QueryResponse::RewardTokens { tokens } => { + assert_eq!(tokens.len(), 1); + }, + _ => todo!() + }; + Ok(()) + } + #[test] fn assert_proxy_stake_calculate_user_share_already_return() -> StdResult<()> { let mut deps: OwnedDeps = mock_dependencies(&[]).into(); @@ -370,10 +405,10 @@ pub mod tests { Ok(()) } + #[test] fn assert_proxy_stake_with_same_staker_address_throws_exception() -> StdResult<()> { let mut deps = mock_dependencies(&[]); - let env = mock_custom_env(CONTRACT_ADDRESS, 1571797523, 1524); - let unstake_mock_info = mock_info(STAKER_A, &[]); + let env = mock_custom_env(CONTRACT_ADDRESS, 1571797523, 1524); let stake_mock_info = mock_info(LP_TOKEN, &[]); let _config: Config = make_init_config(deps.as_mut(), env.clone(), Uint128::from(100u128))?; let _stake_a = proxy_stake( @@ -386,11 +421,12 @@ pub mod tests { ); match _stake_a { Ok(_) => todo!(), - Err(err) => assert_eq!(StdError::not_found("You cannot proxy stake for yourself."),err) + Err(err) => assert_eq!(StdError::generic_err("You cannot proxy stake for yourself."),err) } Ok(()) } + #[test] fn assert_proxy_stake_with_wrong_caller_throws_exception() -> StdResult<()> { let mut deps = mock_dependencies(&[]); let env = mock_custom_env(CONTRACT_ADDRESS, 1571797523, 1524); @@ -406,11 +442,12 @@ pub mod tests { ); match _stake_a { Ok(_) => todo!(), - Err(err) => assert_eq!(StdError::not_found("Token sent is not LP Token."),err) + Err(err) => assert_eq!(StdError::generic_err("Token sent is not LP Token."),err) } Ok(()) } + #[test] fn assert_stake_with_wrong_caller_throws_exception() -> StdResult<()> { let mut deps = mock_dependencies(&[]); let env = mock_custom_env(CONTRACT_ADDRESS, 1571797523, 1524); @@ -425,15 +462,14 @@ pub mod tests { ); match _stake_a { Ok(_) => todo!(), - Err(err) => assert_eq!(StdError::not_found("Token sent is not LP Token."),err) + Err(err) => assert_eq!(StdError::generic_err("Token sent is not LP Token"),err) } Ok(()) } #[test] fn assert_proxy_unstake_set_claimable_to_zero() -> StdResult<()> { let mut deps = mock_dependencies(&[]); - let env = mock_custom_env(CONTRACT_ADDRESS, 1571797523, 1524); - let env_b = mock_custom_env(CONTRACT_ADDRESS, 1571797854, 1534); + let env = mock_custom_env(CONTRACT_ADDRESS, 1571797523, 1524); let stake_mock_info = mock_info(LP_TOKEN, &[]); let unstake_mock_info = mock_info(PROXY_STAKER_A, &[]); let _config: Config = make_init_config(deps.as_mut(), env.clone(), Uint128::from(100u128))?; diff --git a/contracts/staking/tests/integration.rs b/contracts/staking/tests/integration.rs index ed312e6..a25c79e 100644 --- a/contracts/staking/tests/integration.rs +++ b/contracts/staking/tests/integration.rs @@ -1,7 +1,7 @@ use staking::contract::{execute, instantiate, query}; use secret_multi_test::{App, Contract, ContractWrapper, Executor}; use shadeswap_shared::msg::staking::{{InitMsg, QueryResponse, ExecuteMsg}}; -use multi_test::help_lib::integration_help_lib::{mk_contract_link, mk_address}; +use multi_test::help_lib::integration_help_lib::{mk_address}; use cosmwasm_std::{ to_binary, Addr, Empty, }; @@ -19,11 +19,11 @@ use shadeswap_shared::Contract as SContract; #[test] pub fn staking_integration_tests_without_proxy() { use multi_test::admin::admin_help::init_admin_contract; - use multi_test::help_lib::integration_help_lib::{roll_blockchain, store_init_auth_contract, mint_deposit_snip20, send_snip20_to_stake, snip20_send, increase_allowance, get_current_block_time, convert_to_contract_link}; - use cosmwasm_std::{Uint128, Coin, StdError, StdResult, Timestamp}; - use multi_test::util_addr::util_addr::{OWNER, OWNER_SIGNATURE, OWNER_PUB_KEY, STAKER_A, STAKER_B, PUB_KEY_STAKER_A}; + use multi_test::help_lib::integration_help_lib::{roll_blockchain, store_init_auth_contract, mint_deposit_snip20, send_snip20_to_stake, get_current_block_time, convert_to_contract_link}; + use cosmwasm_std::{Uint128, Coin, StdError}; + use multi_test::util_addr::util_addr::{OWNER, OWNER_PUB_KEY, STAKER_A, STAKER_B, PUB_KEY_STAKER_A}; use multi_test::util_addr::util_blockchain::CHAIN_ID; - use shadeswap_shared::staking::{QueryMsg, AuthQuery}; + use shadeswap_shared::staking::{QueryMsg}; use shadeswap_shared::utils::testing::TestingExt; use shadeswap_shared::{core::{TokenType}}; use multi_test::help_lib::integration_help_lib::{generate_snip20_contract}; @@ -31,7 +31,6 @@ pub fn staking_integration_tests_without_proxy() { use crate::staking_help_query::query_claimable_reward; let staker_a_addr = Addr::unchecked(STAKER_A.to_owned()); - let staker_b_addr = Addr::unchecked(STAKER_B.to_owned()); let owner_addr = Addr::unchecked(OWNER); let mut router = App::default(); @@ -197,7 +196,7 @@ pub fn staking_integration_tests_without_proxy() { } // Assert Unstake amount < total amount - roll_blockchain(&mut router, 1000); + roll_blockchain(&mut router, 1000).unwrap(); let unstake_msg = ExecuteMsg::Unstake { amount: Uint128::new(500u128), remove_liqudity: Some(false)}; let _ = router.execute_contract(owner_addr.to_owned(), &staking_contract, &unstake_msg, &[]).unwrap(); @@ -212,7 +211,7 @@ pub fn staking_integration_tests_without_proxy() { _ => panic!("Query Responsedoes not match") } // Assert Unstake the whole amount - roll_blockchain(&mut router, 1); + roll_blockchain(&mut router, 1).unwrap(); let _ = router.execute_contract(owner_addr.to_owned(), &staking_contract, &unstake_msg, &[]).unwrap(); let permit_query = query_claimable_reward(&router, &staking_contract,OWNER_PUB_KEY, OWNER_PUB_KEY, get_current_block_time(&router)).unwrap(); @@ -231,19 +230,17 @@ pub fn staking_integration_tests_without_proxy() { #[test] pub fn staking_integration_tests_with_proxy() { use multi_test::admin::admin_help::init_admin_contract; - use multi_test::help_lib::integration_help_lib::{roll_blockchain, store_init_auth_contract, mint_deposit_snip20, send_snip20_to_stake, snip20_send, increase_allowance, get_current_block_time, send_snip20_to_proxy_stake, set_viewing_key, convert_to_contract_link}; - use cosmwasm_std::{Uint128, Coin, StdError, StdResult, Timestamp}; - use multi_test::util_addr::util_addr::{OWNER, OWNER_SIGNATURE, OWNER_PUB_KEY, STAKER_A, STAKER_B, PUB_KEY_STAKER_A}; + use multi_test::help_lib::integration_help_lib::{roll_blockchain, store_init_auth_contract, mint_deposit_snip20, send_snip20_to_proxy_stake, set_viewing_key, convert_to_contract_link, get_current_block_time}; + use cosmwasm_std::{Uint128, Coin, StdError}; + use multi_test::util_addr::util_addr::{OWNER, OWNER_PUB_KEY, STAKER_A, STAKER_B, PUB_KEY_STAKER_A}; use multi_test::util_addr::util_blockchain::CHAIN_ID; - use shadeswap_shared::staking::{QueryMsg, AuthQuery}; + use shadeswap_shared::staking::{QueryMsg}; use shadeswap_shared::utils::testing::TestingExt; use shadeswap_shared::{core::{TokenType}}; use multi_test::help_lib::integration_help_lib::{generate_snip20_contract, snip_20_balance_query}; - use multi_test::help_lib::integration_help_lib::print_events; use crate::staking_help_query::query_claimable_reward; let staker_a_addr = Addr::unchecked(STAKER_A.to_owned()); - let staker_b_addr = Addr::unchecked(STAKER_B.to_owned()); let owner_addr = Addr::unchecked(OWNER); let mut router = App::default(); @@ -361,17 +358,13 @@ pub fn staking_integration_tests_with_proxy() { _ => panic!("Query Responsedoes not match") } - let reward_token_type = TokenType::CustomToken { - contract_addr: reward_contract.address.to_owned() , - token_code_hash: reward_contract.code_hash.to_owned() - }; set_viewing_key(&mut router, &reward_contract, "password", &staker_a_addr).unwrap(); let balance = snip_20_balance_query(&router, &staker_a_addr,"password",&reward_contract).unwrap(); assert_eq!(balance, Uint128::new(347u128)); // Assert Unstake amount < total amount - roll_blockchain(&mut router, 100); + roll_blockchain(&mut router, 100).unwrap(); let unstake_msg = ExecuteMsg::ProxyUnstake { for_addr: staker_a_addr.to_owned(), amount: Uint128::new(1000u128) }; let _ = router.execute_contract(owner_addr.to_owned(), &staking_contract, &unstake_msg, &[]).unwrap(); // ASSERT Claimable reward @@ -388,7 +381,7 @@ pub fn staking_integration_tests_with_proxy() { pub mod staking_help_query{ use cosmwasm_std::{StdResult, ContractInfo, to_binary, Uint128}; - use multi_test::{util_addr::util_blockchain::CHAIN_ID, help_lib::integration_help_lib::{get_current_timestamp, mk_create_permit_data}}; + use multi_test::{util_addr::util_blockchain::CHAIN_ID, help_lib::integration_help_lib::{ mk_create_permit_data}}; use secret_multi_test::App; use shadeswap_shared::staking::{QueryResponse, QueryMsg, AuthQuery}; use shadeswap_shared::utils::testing::TestingExt; diff --git a/packages/network_integration/src/cli_commands.rs b/packages/network_integration/src/cli_commands.rs index bcf3fc7..45a4a7c 100644 --- a/packages/network_integration/src/cli_commands.rs +++ b/packages/network_integration/src/cli_commands.rs @@ -6,7 +6,6 @@ pub mod snip20_lib { secretcli::{handle, query, Report}, }; use snip20_reference_impl::msg::QueryAnswer; - use shadeswap_shared::utils::asset::Contract; use crate::utils::{init_snip20_cli, InitConfig, GAS}; use cosmwasm_std::Addr; diff --git a/packages/network_integration/src/cli_helpers.rs b/packages/network_integration/src/cli_helpers.rs index 5d4fede..6479b24 100644 --- a/packages/network_integration/src/cli_helpers.rs +++ b/packages/network_integration/src/cli_helpers.rs @@ -1,103 +1,7 @@ use schemars::JsonSchema; -use colored::*; -use rand::{distributions::Alphanumeric, Rng}; -use secretcli::cli_types::StoredContract; -use secretcli::secretcli::{init, handle, Report}; -use secretcli::{cli_types::NetContract, secretcli::query}; -use serde::{Serialize, Deserialize}; -use shadeswap_shared::core::ViewingKey; +use serde::{Deserialize, Serialize}; use shadeswap_shared::snip20::InitialBalance; -use snip20_reference_impl::contract; -use std::fmt::Display; -use std::fs; -use cosmwasm_std::{ - Binary, Addr, Uint128, Env, StdResult, MessageInfo -}; -use shadeswap_shared::{ - amm_pair::{AMMPair}, - msg::{ - amm_pair::{ - ExecuteMsg as AMMPairHandlMsg, - }, - factory::{ - ExecuteMsg as FactoryHandleMsg, QueryMsg as FactoryQueryMsg, - QueryResponse as FactoryQueryResponse, InitMsg as FactoryInitMsg - }, - router::{ - ExecuteMsg as RouterHandleMsg, - }, - }, - stake_contract::StakingContractInit, - Pagination, -}; - -use serde_json::Result; -// Smart contracts -pub const SNIP20_FILE: &str = "../../compiled/snip20.wasm.gz"; -pub const LPTOKEN20_FILE: &str = "../../compiled/lp_token.wasm.gz"; -pub const AMM_PAIR_FILE: &str = "../../compiled/amm_pair.wasm.gz"; -pub const FACTORY_FILE: &str = "../../compiled/factory.wasm.gz"; -pub const ROUTER_FILE: &str = "../../compiled/router.wasm.gz"; -pub const STAKING_FILE: &str = "../../compiled/staking.wasm.gz"; - -pub const STORE_GAS: &str = "10000000"; -pub const GAS: &str = "800000"; -pub const VIEW_KEY: &str = "password"; -pub const ACCOUNT_KEY: &str = "a"; -pub const STAKER_KEY: &str = "b"; -pub const SHADE_DAO_KEY: &str = "c"; - -pub fn generate_label(size: usize) -> String { - rand::thread_rng() - .sample_iter(&Alphanumeric) - .take(size) - .map(char::from) - .collect() -} - -pub fn print_header(header: &str) { - println!("{}", header.on_blue()); -} - -pub fn print_warning(warn: &str) { - println!("{}", warn.on_yellow()); -} - -pub fn print_contract(contract: &NetContract) { - println!( - "\tLabel: {}\n\tID: {}\n\tAddress: {}\n\tHash: {}", - contract.label, contract.id, contract.address, contract.code_hash - ); -} - -pub fn print_stored_contract(contract: &StoredContract) { - println!( - "\tID: {}\n\tHash: {}", - contract.id, contract.code_hash - ); -} - -pub fn print_struct(item: Printable) { - println!("{}", serde_json::to_string_pretty(&item).unwrap()); -} - -pub fn print_vec(prefix: &str, vec: Vec) { - for e in vec.iter().take(1) { - print!("{}{}", prefix, e); - } - for e in vec.iter().skip(1) { - print!(", {}", e); - } - println!(); -} - -pub fn store_struct(path: &str, data: &T) { - fs::write( - path, - serde_json::to_string_pretty(data).expect("Could not serialize data"), - ) - .expect(&format!("Could not store {}", path)); -} +use cosmwasm_std::{Addr, Uint128, Binary }; /// This type represents optional configuration values which can be overridden. /// All values are optional and have defaults which are more private by default, @@ -122,28 +26,6 @@ pub struct InitConfig { pub enable_burn: Option, } -impl InitConfig { - pub fn public_total_supply(&self) -> bool { - self.public_total_supply.unwrap_or(false) - } - - pub fn deposit_enabled(&self) -> bool { - self.enable_deposit.unwrap_or(false) - } - - pub fn redeem_enabled(&self) -> bool { - self.enable_redeem.unwrap_or(false) - } - - pub fn mint_enabled(&self) -> bool { - self.enable_mint.unwrap_or(false) - } - - pub fn burn_enabled(&self) -> bool { - self.enable_burn.unwrap_or(false) - } -} - #[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema)] pub struct InitialAllowance { pub owner: Addr, @@ -168,44 +50,3 @@ impl InitMsg { self.config.clone().unwrap_or_default() } } - - -pub fn init_snip20( - name: String, - symbol: String, - decimals: u8, - config: Option, - reports: &mut Vec, - account_key: &str, - customized_snip20_file: Option<&str>, - backend: &str -) -> Result<(InitMsg, NetContract)> { - - let init_msg = InitMsg { - name: name.to_string(), - admin: None, - symbol: symbol.to_string(), - decimals: decimals, - initial_balances: None, - prng_seed: Default::default(), - config: config - }; - - let snip_20 = init( - &init_msg, - customized_snip20_file.unwrap_or(SNIP20_FILE), - &*generate_label(8), - account_key, - Some(STORE_GAS), - Some(GAS), - Some(backend), - reports, - )?; - Ok((init_msg, snip_20)) -} - - - -pub fn create_viewing_key(env: &Env, msgInfo: &MessageInfo, seed: Binary, entroy: Binary) -> ViewingKey { - ViewingKey::new(&env, &msgInfo, seed.as_slice(), entroy.as_slice()) -} \ No newline at end of file diff --git a/packages/shadeswap-shared/src/msg.rs b/packages/shadeswap-shared/src/msg.rs index 99544b8..f933586 100644 --- a/packages/shadeswap-shared/src/msg.rs +++ b/packages/shadeswap-shared/src/msg.rs @@ -392,7 +392,7 @@ pub mod factory { } pub mod staking { - use crate::{core::TokenType, query_auth::QueryPermit,Contract, stake_contract::ClaimableInfo}; + use crate::{core::TokenType, query_auth::QueryPermit,Contract, stake_contract::{ClaimableInfo, RewardTokenInfo}}; use super::*; use cosmwasm_schema::cw_serde; @@ -457,7 +457,7 @@ pub mod staking { amount: Uint128, to: Addr, msg: Option, - }, + }, } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] @@ -485,6 +485,7 @@ pub mod staking { pub enum AuthQuery { GetStakerLpTokenInfo {}, GetClaimReward { time: Uint128 }, + GetRewardTokens {} } #[derive(Serialize, Deserialize, Debug, Clone, JsonSchema, PartialEq)] @@ -515,6 +516,9 @@ pub mod staking { daily_reward_amount: Uint128, amm_pair: Addr, admin_auth: Contract + }, + RewardTokens{ + tokens: Vec } } } diff --git a/packages/shadeswap-shared/src/stake_contract.rs b/packages/shadeswap-shared/src/stake_contract.rs index be87d88..e6fa59b 100644 --- a/packages/shadeswap-shared/src/stake_contract.rs +++ b/packages/shadeswap-shared/src/stake_contract.rs @@ -1,5 +1,6 @@ use cosmwasm_std::{Uint128, Addr}; use schemars::JsonSchema; +use crate::utils::asset::Contract; use serde::{Deserialize, Serialize}; use crate::{core::{ContractInstantiationInfo, TokenType}}; @@ -16,3 +17,10 @@ pub struct ClaimableInfo{ pub token_address: Addr, pub amount: Uint128 } + +#[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)] +pub struct RewardTokenInfo{ + pub reward_token: Contract, + pub daily_reward_amount: Uint128, + pub valid_to: Uint128, +}