From a63a94623f80ad0d7a5c3afdddb3e26a116a8e39 Mon Sep 17 00:00:00 2001 From: Drazen Urch Date: Mon, 4 Apr 2022 16:55:46 +0200 Subject: [PATCH] Update and query rewarding validator address (#1193) --- .../mixnet-contract/src/msg.rs | 4 ++ contracts/mixnet/src/contract.rs | 9 +++- .../src/mixnet_contract_settings/queries.rs | 6 +++ .../mixnet_contract_settings/transactions.rs | 51 +++++++++++++++++++ 4 files changed, 69 insertions(+), 1 deletion(-) diff --git a/common/cosmwasm-smart-contracts/mixnet-contract/src/msg.rs b/common/cosmwasm-smart-contracts/mixnet-contract/src/msg.rs index 75a0bc272b..12c20d08fb 100644 --- a/common/cosmwasm-smart-contracts/mixnet-contract/src/msg.rs +++ b/common/cosmwasm-smart-contracts/mixnet-contract/src/msg.rs @@ -15,6 +15,9 @@ pub struct InstantiateMsg { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum ExecuteMsg { + UpdateRewardingValidatorAddress { + address: String, + }, InitEpoch {}, ReconcileDelegations {}, CheckpointMixnodes {}, @@ -101,6 +104,7 @@ pub enum ExecuteMsg { #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)] #[serde(rename_all = "snake_case")] pub enum QueryMsg { + GetRewardingValidatorAddress {}, GetAllDelegationKeys {}, DebugGetAllDelegationValues {}, GetContractVersion {}, diff --git a/contracts/mixnet/src/contract.rs b/contracts/mixnet/src/contract.rs index 7023434db2..a81e0b538a 100644 --- a/contracts/mixnet/src/contract.rs +++ b/contracts/mixnet/src/contract.rs @@ -18,9 +18,10 @@ use crate::interval::queries::{ use crate::interval::transactions::{init_epoch, try_init_epoch}; use crate::mixnet_contract_settings::models::ContractState; use crate::mixnet_contract_settings::queries::{ - query_contract_settings_params, query_contract_version, + query_contract_settings_params, query_contract_version, query_rewarding_validator_address, }; use crate::mixnet_contract_settings::storage as mixnet_params_storage; +use crate::mixnet_contract_settings::transactions::try_update_rewarding_validator_address; use crate::mixnodes::bonding_queries as mixnode_queries; use crate::mixnodes::bonding_queries::query_mixnodes_paged; use crate::mixnodes::layer_queries::query_layer_distribution; @@ -96,6 +97,9 @@ pub fn execute( msg: ExecuteMsg, ) -> Result { match msg { + ExecuteMsg::UpdateRewardingValidatorAddress { address } => { + try_update_rewarding_validator_address(deps, info, address) + } ExecuteMsg::InitEpoch {} => try_init_epoch(info, deps.storage, env), ExecuteMsg::BondMixnode { mix_node, @@ -276,6 +280,9 @@ pub fn execute( #[entry_point] pub fn query(deps: Deps<'_>, env: Env, msg: QueryMsg) -> Result { let query_res = match msg { + QueryMsg::GetRewardingValidatorAddress {} => { + to_binary(&query_rewarding_validator_address(deps)?) + } QueryMsg::GetContractVersion {} => to_binary(&query_contract_version()), QueryMsg::GetMixNodes { start_after, limit } => { to_binary(&query_mixnodes_paged(deps, start_after, limit)?) diff --git a/contracts/mixnet/src/mixnet_contract_settings/queries.rs b/contracts/mixnet/src/mixnet_contract_settings/queries.rs index e36791b947..40c5274e37 100644 --- a/contracts/mixnet/src/mixnet_contract_settings/queries.rs +++ b/contracts/mixnet/src/mixnet_contract_settings/queries.rs @@ -11,6 +11,12 @@ pub(crate) fn query_contract_settings_params(deps: Deps<'_>) -> StdResult) -> StdResult { + storage::CONTRACT_STATE + .load(deps.storage) + .map(|settings| settings.rewarding_validator_address.to_string()) +} + pub(crate) fn query_contract_version() -> MixnetContractVersion { // as per docs // env! macro will expand to the value of the named environment variable at diff --git a/contracts/mixnet/src/mixnet_contract_settings/transactions.rs b/contracts/mixnet/src/mixnet_contract_settings/transactions.rs index 2901270b5b..bf4e7613e6 100644 --- a/contracts/mixnet/src/mixnet_contract_settings/transactions.rs +++ b/contracts/mixnet/src/mixnet_contract_settings/transactions.rs @@ -3,12 +3,30 @@ use super::storage; use crate::error::ContractError; +use cosmwasm_std::Addr; use cosmwasm_std::DepsMut; use cosmwasm_std::MessageInfo; use cosmwasm_std::Response; use mixnet_contract_common::events::new_settings_update_event; use mixnet_contract_common::ContractStateParams; +pub fn try_update_rewarding_validator_address( + deps: DepsMut<'_>, + info: MessageInfo, + address: String, +) -> Result { + let mut state = storage::CONTRACT_STATE.load(deps.storage)?; + + if info.sender != state.owner { + return Err(ContractError::Unauthorized); + } + + state.rewarding_validator_address = Addr::unchecked(address); + storage::CONTRACT_STATE.save(deps.storage, &state)?; + + Ok(Response::default()) +} + pub(crate) fn try_update_contract_settings( deps: DepsMut<'_>, info: MessageInfo, @@ -48,12 +66,45 @@ pub mod tests { use super::*; use crate::contract::{INITIAL_GATEWAY_PLEDGE, INITIAL_MIXNODE_PLEDGE}; use crate::error::ContractError; + use crate::mixnet_contract_settings::queries::query_rewarding_validator_address; use crate::mixnet_contract_settings::transactions::try_update_contract_settings; use crate::support::tests::test_helpers; use cosmwasm_std::testing::mock_info; use cosmwasm_std::Response; use mixnet_contract_common::ContractStateParams; + #[test] + fn update_contract_rewarding_validtor_address() { + let mut deps = test_helpers::init_contract(); + + let info = mock_info("not-the-creator", &[]); + let res = try_update_rewarding_validator_address( + deps.as_mut(), + info, + "not-the-creator".to_string(), + ); + assert_eq!(res, Err(ContractError::Unauthorized)); + + let info = mock_info("creator", &[]); + let res = try_update_rewarding_validator_address( + deps.as_mut(), + info, + "new-good-address".to_string(), + ); + assert_eq!(res, Ok(Response::default())); + + let state = storage::CONTRACT_STATE.load(&deps.storage).unwrap(); + assert_eq!( + state.rewarding_validator_address, + Addr::unchecked("new-good-address") + ); + + assert_eq!( + state.rewarding_validator_address, + query_rewarding_validator_address(deps.as_ref()).unwrap() + ); + } + #[test] fn updating_contract_settings() { let mut deps = test_helpers::init_contract();