diff --git a/README.md b/README.md index 8e3f4b0..d08d272 100644 --- a/README.md +++ b/README.md @@ -120,14 +120,14 @@ open tarpaulin-report.html ``` || Uncovered Lines: || contracts/fiberrouter-base/src/contract.rs: 48 -|| contracts/fundmanager-base/src/contract.rs: 623, 662 +|| contracts/fundmanager-base/src/contract.rs: 659, 698 || Tested/Total Lines: -|| contracts/fiberrouter-base/src/contract.rs: 91/92 +20.65% -|| contracts/fundmanager-base/src/contract.rs: 337/339 +0.00% +|| contracts/fiberrouter-base/src/contract.rs: 91/92 +0.00% +|| contracts/fundmanager-base/src/contract.rs: 356/358 +0.03% || packages/fiberrouter/src/event.rs: 8/8 +0.00% -|| packages/fundmanager/src/event.rs: 55/55 +0.00% +|| packages/fundmanager/src/event.rs: 59/59 +0.00% || packages/fundmanager/src/helpers.rs: 9/9 +0.00% || packages/fundmanager/src/query.rs: 5/5 +0.00% || -99.41% coverage, 505/508 lines covered, +3.74% change in coverage +99.44% coverage, 528/531 lines covered, +0.03% change in coverage ``` diff --git a/contracts/fundmanager-base/src/contract.rs b/contracts/fundmanager-base/src/contract.rs index 73f88c0..75c5a71 100644 --- a/contracts/fundmanager-base/src/contract.rs +++ b/contracts/fundmanager-base/src/contract.rs @@ -7,13 +7,15 @@ use cosmwasm_std::{ use fundmanager::{ AddFoundryAssetEvent, AddLiquidityEvent, AddSignerEvent, BridgeSwapEvent, BridgeWithdrawSignedEvent, Fee, FundManagerExecuteMsg, FundManagerQueryMsg, Liquidity, - MigrateMsg, RemoveFoundryAssetEvent, RemoveLiquidityEvent, RemoveSignerEvent, SetFeeEvent, - TransferOwnershipEvent, WithdrawSignMessage, + MigrateMsg, RemoveFoundryAssetEvent, RemoveLiquidityEvent, RemoveSignerEvent, + SetFeeCollectorEvent, SetFeeEvent, TransferOwnershipEvent, WithdrawSignMessage, }; use crate::error::ContractError; use crate::msg::InstantiateMsg; -use crate::state::{FEE, FOUNDRY_ASSETS, LIQUIDITIES, OWNER, SIGNERS, USED_MESSAGES}; +use crate::state::{ + FEE, FEE_COLLECTOR, FOUNDRY_ASSETS, LIQUIDITIES, OWNER, SIGNERS, USED_MESSAGES, +}; use cw_storage_plus::Bound; use cw_utils::Event; use regex::Regex; @@ -29,6 +31,8 @@ pub fn instantiate( ) -> StdResult { let owner = deps.api.addr_validate(&msg.owner)?; OWNER.save(deps.storage, &owner)?; + let fee_collector = deps.api.addr_validate(&msg.fee_collector)?; + FEE_COLLECTOR.save(deps.storage, &fee_collector)?; Ok(Response::default()) } @@ -51,6 +55,9 @@ pub fn execute( FundManagerExecuteMsg::TransferOwnership { new_owner } => { execute_ownership_transfer(env, new_owner) } + FundManagerExecuteMsg::SetFeeCollector { collector } => { + execute_set_fee_collector(env, collector) + } FundManagerExecuteMsg::SetFee { token, fee } => execute_set_fee(env, token, fee), FundManagerExecuteMsg::AddSigner { signer } => execute_add_signer(env, signer), FundManagerExecuteMsg::RemoveSigner { signer } => execute_remove_signer(env, signer), @@ -99,6 +106,29 @@ pub fn execute_ownership_transfer( Ok(rsp) } +pub fn execute_set_fee_collector( + env: ExecuteEnv, + collector: String, +) -> Result { + let ExecuteEnv { deps, env: _, info } = env; + let collector_addr = deps.api.addr_validate(&collector)?; + + if info.sender != OWNER.load(deps.storage)? { + return Err(ContractError::Unauthorized {}); + } + + let mut rsp = Response::default(); + FEE_COLLECTOR.save(deps.storage, &collector_addr)?; + + let event = SetFeeCollectorEvent { + from: info.sender.as_str(), + collector: collector.as_str(), + }; + event.add_attributes(&mut rsp); + + Ok(rsp) +} + pub fn execute_set_fee( env: ExecuteEnv, token: String, @@ -425,9 +455,9 @@ pub fn execute_swap( let fee_amount = amount * fee / fee_multiplier; if !fee_amount.is_zero() { - let owner = OWNER.load(deps.storage)?; + let fee_collector = FEE_COLLECTOR.load(deps.storage)?; let bank_send_msg = CosmosMsg::Bank(BankMsg::Send { - to_address: owner.to_string(), + to_address: fee_collector.to_string(), amount: coins(fee_amount.u128(), token.to_string()), }); rsp = Response::new().add_message(bank_send_msg); @@ -517,6 +547,7 @@ pub fn query(deps: Deps, _env: Env, msg: FundManagerQueryMsg) -> StdResult to_binary(&query_owner(deps)?), + FundManagerQueryMsg::FeeCollector {} => to_binary(&query_fee_collector(deps)?), FundManagerQueryMsg::Signers { start_after, limit } => { to_binary(&query_signers(deps, start_after, limit)?) } @@ -532,6 +563,11 @@ pub fn query_owner(deps: Deps) -> StdResult { Ok(owner.to_string()) } +pub fn query_fee_collector(deps: Deps) -> StdResult { + let owner = FEE_COLLECTOR.load(deps.storage)?; + Ok(owner.to_string()) +} + pub fn query_fee(deps: Deps, token: String) -> StdResult { let fee = FEE.load(deps.storage, token.as_str())?; Ok(Fee { @@ -693,9 +729,10 @@ mod test { add_used_message, ethereum_address_raw, execute, execute_add_foundry_asset, execute_add_liquidity, execute_add_signer, execute_ownership_transfer, execute_remove_foundry_asset, execute_remove_liquidity, execute_remove_signer, - execute_set_fee, execute_swap, execute_withdraw_signed, get_signer, instantiate, - is_foundry_asset, is_used_message, migrate, query, query_all_liquidity, query_fee, - query_liquidity, query_owner, query_signers, read_foundry_assets, read_signers, ExecuteEnv, + execute_set_fee, execute_set_fee_collector, execute_swap, execute_withdraw_signed, + get_signer, instantiate, is_foundry_asset, is_used_message, migrate, query, + query_all_liquidity, query_fee, query_fee_collector, query_liquidity, query_owner, + query_signers, read_foundry_assets, read_signers, ExecuteEnv, }; use cosmwasm_std::testing::{ @@ -743,6 +780,7 @@ mod test { let info = mock_info(deployer, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -759,6 +797,7 @@ mod test { let mut deps = mock_dependencies(); let msg = InstantiateMsg { owner: "cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym".to_string(), + fee_collector: "cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym".to_string(), }; let env = mock_env(); let info = mock_info("cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym", &[]); @@ -786,6 +825,7 @@ mod test { let mut deps = mock_dependencies(); let msg = InstantiateMsg { owner: "cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym".to_string(), + fee_collector: "cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym".to_string(), }; let env = mock_env(); let info = mock_info("cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym", &[]); @@ -826,6 +866,7 @@ mod test { let mut deps = mock_dependencies(); let msg = InstantiateMsg { owner: "cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym".to_string(), + fee_collector: "cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym".to_string(), }; let env = mock_env(); let info = mock_info("cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym", &[]); @@ -855,6 +896,7 @@ mod test { let mut deps = mock_dependencies(); let msg = InstantiateMsg { owner: "cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym".to_string(), + fee_collector: "cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym".to_string(), }; let env = mock_env(); let info = mock_info("cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym", &[]); @@ -945,6 +987,7 @@ mod test { let mut deps = mock_dependencies(); let msg = InstantiateMsg { owner: "cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym".to_string(), + fee_collector: "cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym".to_string(), }; let env = mock_env(); let info = mock_info("cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym", &[]); @@ -968,6 +1011,7 @@ mod test { let info = mock_info(first_owner, &[]); let msg = InstantiateMsg { owner: first_owner.to_string(), + fee_collector: first_owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1005,6 +1049,7 @@ mod test { let info = mock_info(first_owner, &[]); let msg = InstantiateMsg { owner: first_owner.to_string(), + fee_collector: first_owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1024,6 +1069,72 @@ mod test { ); } + #[test] + fn test_execute_set_fee_collector() { + let owner = "address_to_be_owner"; + let collector = "address_to_be_collector"; + let mut deps = mock_dependencies(); + let env = mock_env(); + let info = mock_info(owner, &[]); + let msg = InstantiateMsg { + owner: owner.to_string(), + fee_collector: owner.to_string(), + }; + + let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); + assert_eq!(res.is_err(), false); + + ///////////////////////////////////////////////////////////// + + let execute_env = ExecuteEnv { + deps: deps.as_mut(), + env: env.clone(), + info: info.clone(), + }; + + let rsp = execute_set_fee_collector(execute_env, collector.to_string()).unwrap(); + assert_eq!( + rsp.attributes, + vec![ + attr("action", "set_fee_collector".to_string()), + attr("collector", collector.to_string()), + attr("from", owner.to_string()) + ] + ); + + let query_res = query_fee_collector(deps.as_ref()).unwrap(); + assert_eq!(query_res, collector.to_string()); + } + + #[test] + fn test_execute_set_fee_collector_catch_err_unauthorized() { + let owner = "address_to_be_owner"; + let collector = "address_to_be_collector"; + let mut deps = mock_dependencies(); + let env = mock_env(); + let info = mock_info(owner, &[]); + let msg = InstantiateMsg { + owner: owner.to_string(), + fee_collector: owner.to_string(), + }; + + let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); + assert_eq!(res.is_err(), false); + + let execute_env = ExecuteEnv { + deps: deps.as_mut(), + env: env.clone(), + info: mock_info("other", &[]), + }; + + assert_eq!( + execute_set_fee_collector(execute_env, collector.to_string(),) + .unwrap_err() + .to_string(), + (ContractError::Unauthorized {}).to_string() + ); + } + #[test] fn test_execute_set_fee() { let owner = "address_to_be_owner"; @@ -1032,6 +1143,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1074,6 +1186,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1105,6 +1218,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1134,6 +1248,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1163,6 +1278,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1233,6 +1349,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1265,6 +1382,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1294,6 +1412,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1378,6 +1497,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1446,6 +1566,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1514,6 +1635,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1569,6 +1691,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1598,6 +1721,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1627,6 +1751,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1695,6 +1820,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1751,6 +1877,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1806,6 +1933,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1861,6 +1989,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1946,6 +2075,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -1982,6 +2112,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -2034,6 +2165,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -2101,6 +2233,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -2132,6 +2265,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -2188,6 +2322,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -2244,6 +2379,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -2300,6 +2436,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -2389,6 +2526,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -2468,6 +2606,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -2547,6 +2686,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -2617,6 +2757,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -2676,6 +2817,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -2758,6 +2900,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -2875,6 +3018,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -2933,6 +3077,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -2985,6 +3130,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); @@ -3034,6 +3180,25 @@ mod test { ] ); + let collector = "address_to_be_collector_2"; + let rsp = execute( + deps.as_mut(), + env.clone(), + info.clone(), + FundManagerExecuteMsg::SetFeeCollector { + collector: collector.to_string(), + }, + ) + .unwrap(); + assert_eq!( + rsp.attributes, + vec![ + attr("action", "set_fee_collector".to_string()), + attr("collector", collector.to_string()), + attr("from", owner.to_string()) + ] + ); + let query_res = query_fee(deps.as_ref(), "token_address".to_string()).unwrap(); assert_eq!(query_res.token, "token_address".to_string()); assert_eq!(query_res.amount, Uint128::from(22u128)); @@ -3379,6 +3544,14 @@ mod test { "eyJ0b2tlbiI6InRva2VuX2FkZHJlc3MiLCJhbW91bnQiOiIyMiJ9" ); + let rsp = query( + deps.as_ref(), + env.clone(), + FundManagerQueryMsg::FeeCollector {}, + ) + .unwrap(); + assert_eq!(rsp.to_string(), "ImFkZHJlc3NfdG9fYmVfY29sbGVjdG9yXzIi"); + let rsp = query_liquidity( deps.as_ref(), "unexist".to_string(), @@ -3438,6 +3611,7 @@ mod test { let info = mock_info(owner, &[]); let msg = InstantiateMsg { owner: owner.to_string(), + fee_collector: owner.to_string(), }; let res = instantiate(deps.as_mut(), env.clone(), info.clone(), msg); diff --git a/contracts/fundmanager-base/src/msg.rs b/contracts/fundmanager-base/src/msg.rs index 494b575..a710a73 100644 --- a/contracts/fundmanager-base/src/msg.rs +++ b/contracts/fundmanager-base/src/msg.rs @@ -4,4 +4,5 @@ use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] pub struct InstantiateMsg { pub owner: String, + pub fee_collector: String, } diff --git a/contracts/fundmanager-base/src/state.rs b/contracts/fundmanager-base/src/state.rs index 7198a25..60aaed9 100644 --- a/contracts/fundmanager-base/src/state.rs +++ b/contracts/fundmanager-base/src/state.rs @@ -4,6 +4,8 @@ use fundmanager::Liquidity; /// Store the owner of the contract to add/remove signers pub const OWNER: Item = Item::new("owner"); +/// Store the fee collector address +pub const FEE_COLLECTOR: Item = Item::new("fee_collector"); /// Store fee configuration pub const FEE: Map<&str, Uint128> = Map::new("fee"); /// Store the liquidities map, `(owner, token) -> liquidity` diff --git a/packages/fundmanager/src/event.rs b/packages/fundmanager/src/event.rs index e7b280e..434a613 100644 --- a/packages/fundmanager/src/event.rs +++ b/packages/fundmanager/src/event.rs @@ -15,6 +15,20 @@ impl<'a> Event for TransferOwnershipEvent<'a> { } } +/// Tracks fee additions +pub struct SetFeeCollectorEvent<'a> { + pub from: &'a str, + pub collector: &'a str, +} + +impl<'a> Event for SetFeeCollectorEvent<'a> { + fn add_attributes(&self, rsp: &mut Response) { + rsp.attributes.push(attr("action", "set_fee_collector")); + rsp.attributes.push(attr("collector", self.collector)); + rsp.attributes.push(attr("from", self.from)); + } +} + /// Tracks fee additions pub struct SetFeeEvent<'a> { pub from: &'a str, diff --git a/packages/fundmanager/src/lib.rs b/packages/fundmanager/src/lib.rs index 2b66bbc..2f982a7 100644 --- a/packages/fundmanager/src/lib.rs +++ b/packages/fundmanager/src/lib.rs @@ -1,7 +1,7 @@ pub use crate::event::{ AddFoundryAssetEvent, AddLiquidityEvent, AddSignerEvent, BridgeSwapEvent, BridgeWithdrawSignedEvent, RemoveFoundryAssetEvent, RemoveLiquidityEvent, RemoveSignerEvent, - SetFeeEvent, TransferOwnershipEvent, + SetFeeCollectorEvent, SetFeeEvent, TransferOwnershipEvent, }; pub use crate::helpers::FundManagerContract; pub use crate::msg::{FundManagerExecuteMsg, MigrateMsg, WithdrawSignMessage}; diff --git a/packages/fundmanager/src/msg.rs b/packages/fundmanager/src/msg.rs index ec0efcd..c29cd5e 100644 --- a/packages/fundmanager/src/msg.rs +++ b/packages/fundmanager/src/msg.rs @@ -9,6 +9,9 @@ pub enum FundManagerExecuteMsg { TransferOwnership { new_owner: String, }, + SetFeeCollector { + collector: String, + }, SetFee { token: String, fee: Uint128, diff --git a/packages/fundmanager/src/query.rs b/packages/fundmanager/src/query.rs index 7a18902..e9b94f6 100644 --- a/packages/fundmanager/src/query.rs +++ b/packages/fundmanager/src/query.rs @@ -14,6 +14,7 @@ pub enum FundManagerQueryMsg { start_after: Option<(String, Addr)>, limit: Option, }, + FeeCollector {}, Owner {}, Signers { start_after: Option, diff --git a/test.sh b/test.sh index 0fe2c2c..8411a8a 100644 --- a/test.sh +++ b/test.sh @@ -4,9 +4,9 @@ # VALIDATOR=$(cudos-noded keys show -a validator --keyring-backend=test) # cudos-noded tx wasm store cw-plus/fundmanager_base.wasm --from=validator --keyring-backend=test --chain-id=test --node http://localhost:26657 --gas=auto --gas-adjustment=1.3 -y # deploy with admin upgradeable -# cudos-noded tx wasm instantiate 1 '{"owner":"'$VALIDATOR'"}' --from=validator --label "FerrumFundManager" --chain-id=test --gas=auto --gas-adjustment=1.3 -b=block --keyring-backend=test --admin=$VALIDATOR -y +# cudos-noded tx wasm instantiate 1 '{"owner":"'$VALIDATOR'","fee_collector":"'$VALIDATOR'"}' --from=validator --label "FerrumFundManager" --chain-id=test --gas=auto --gas-adjustment=1.3 -b=block --keyring-backend=test --admin=$VALIDATOR -y # deploy without admin -# cudos-noded tx wasm instantiate 1 '{"owner":"'$VALIDATOR'"}' --from=validator --label "FerrumFundManager" --chain-id=test --gas=auto --gas-adjustment=1.3 -b=block --keyring-backend=test --no-admin -y +# cudos-noded tx wasm instantiate 1 '{"owner":"'$VALIDATOR'","fee_collector":"'$VALIDATOR'"}' --from=validator --label "FerrumFundManager" --chain-id=test --gas=auto --gas-adjustment=1.3 -b=block --keyring-backend=test --no-admin -y # CONTRACT=cudos14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9strccpl # cudos-noded tx wasm execute $CONTRACT '{"add_foundry_asset":{"token":"stake"}}' --from=validator --gas=auto --gas-adjustment=1.3 --chain-id=test -y --keyring-backend=test # cudos-noded tx wasm execute $CONTRACT '{"remove_foundry_asset":{"token":"stake"}}' --from=validator --gas=auto --gas-adjustment=1.3 --chain-id=test -y --keyring-backend=test @@ -18,7 +18,10 @@ # cudos-noded tx wasm execute $CONTRACT '{"remove_signer":{"signer":"0x0bdb79846e8331a19a65430363f240ec8acc2a52"}}' --amount=1000stake --from=validator --gas=auto --gas-adjustment=1.3 --chain-id=test -y --keyring-backend=test # cudos-noded tx wasm execute $CONTRACT '{"transfer_ownership":{"new_owner":"cudos1nysrj2xxpm77xpkvglne0zcvnxuq0laacc7nrv"}}' --amount=1000stake --from=validator --gas=auto --gas-adjustment=1.3 --chain-id=test -y --keyring-backend=test # cudos-noded tx wasm execute $CONTRACT '{"set_fee":{"token":"stake","fee":"800"}}' --from=validator --gas=auto --gas-adjustment=1.3 --chain-id=test -y --keyring-backend=test +# cudos-noded tx wasm execute $CONTRACT '{"set_fee_collector":{"collector":"cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym"}}' --from=validator --gas=auto --gas-adjustment=1.3 --chain-id=test -y --keyring-backend=test +# cudos-noded query bank balances cudos167mthp8jzz40f2vjz6m8x2m77lkcnp7nxsk5ym +# cudos-noded query wasm contract-state smart $CONTRACT '{"fee_collector":{}}' # cudos-noded query wasm contract-state smart $CONTRACT '{"liquidity":{"owner":"'$VALIDATOR'","token":"stake"}}' # cudos-noded query wasm contract-state smart $CONTRACT '{"all_liquidity":{}}' # cudos-noded query wasm contract-state smart $CONTRACT '{"all_liquidity":{"start_after":["acudos", "cudos1syysfe8ryh7ltnpqe9xvf59thdpyqp8x6aewxh"]}}'