Skip to content

Commit

Permalink
Merge pull request #185 from confio/182-update-config
Browse files Browse the repository at this point in the history
UpdateConfig extensions
  • Loading branch information
maurolacy authored Sep 19, 2022
2 parents 5c1ac97 + eab1c2b commit 3b8102a
Show file tree
Hide file tree
Showing 8 changed files with 172 additions and 164 deletions.
81 changes: 66 additions & 15 deletions contracts/tgrade-valset/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ use std::convert::{TryFrom, TryInto};
#[cfg(not(feature = "library"))]
use cosmwasm_std::entry_point;
use cosmwasm_std::{
to_binary, Addr, Binary, BlockInfo, CustomQuery, Decimal, Deps, DepsMut, Env, MessageInfo,
Order, QueryRequest, Reply, StdError, StdResult, Timestamp, WasmMsg,
to_binary, Addr, Binary, BlockInfo, Coin, CustomQuery, Decimal, Deps, DepsMut, Env,
MessageInfo, Order, QueryRequest, Reply, StdError, StdResult, Timestamp, WasmMsg,
};

use cw2::set_contract_version;
Expand All @@ -20,10 +20,9 @@ use tg_bindings::{
Pubkey, TgradeMsg, TgradeQuery, TgradeSudoMsg, ToAddress, ValidatorDiff, ValidatorUpdate,
ValidatorVoteResponse,
};
use tg_utils::{JailingDuration, SlashMsg, ADMIN};
use tg_utils::{Duration, JailingDuration, SlashMsg, ADMIN};

use crate::error::ContractError;
use crate::migration::{migrate_jailing_period, migrate_verify_validators};
use crate::msg::{
EpochResponse, ExecuteMsg, InstantiateMsg, InstantiateResponse, JailingEnd, JailingPeriod,
ListActiveValidatorsResponse, ListValidatorResponse, ListValidatorSlashingResponse, MigrateMsg,
Expand All @@ -32,9 +31,9 @@ use crate::msg::{
};
use crate::rewards::pay_block_rewards;
use crate::state::{
export, import, operators, Config, EpochInfo, OperatorInfo, ValidatorInfo, ValidatorSlashing,
ValsetState, BLOCK_SIGNERS, CONFIG, EPOCH, JAIL, VALIDATORS, VALIDATOR_SLASHING,
VALIDATOR_START_HEIGHT,
export, import, operators, Config, DistributionContract, EpochInfo, OperatorInfo,
ValidatorInfo, ValidatorSlashing, ValsetState, BLOCK_SIGNERS, CONFIG, EPOCH, JAIL, VALIDATORS,
VALIDATOR_SLASHING, VALIDATOR_START_HEIGHT,
};

// version info for migration info
Expand Down Expand Up @@ -164,7 +163,28 @@ pub fn execute(
ExecuteMsg::UpdateConfig {
min_points,
max_validators,
} => execute_update_config(deps, info, min_points, max_validators),
scaling,
epoch_reward,
fee_percentage,
auto_unjail,
double_sign_slash_ratio,
distribution_contracts,
verify_validators,
offline_jail_duration,
} => execute_update_config(
deps,
info,
min_points,
max_validators,
scaling,
epoch_reward,
fee_percentage,
auto_unjail,
double_sign_slash_ratio,
distribution_contracts,
verify_validators,
offline_jail_duration,
),

ExecuteMsg::RegisterValidatorKey { pubkey, metadata } => {
execute_register_validator_key(deps, env, info, pubkey, metadata)
Expand All @@ -182,11 +202,20 @@ pub fn execute(
}
}

#[allow(clippy::too_many_arguments)]
fn execute_update_config<Q: CustomQuery>(
deps: DepsMut<Q>,
info: MessageInfo,
min_points: Option<u64>,
max_validators: Option<u32>,
scaling: Option<u32>,
epoch_reward: Option<Coin>,
fee_percentage: Option<Decimal>,
auto_unjail: Option<bool>,
double_sign_slash_ratio: Option<Decimal>,
distribution_contracts: Option<Vec<DistributionContract>>,
verify_validators: Option<bool>,
offline_jail_duration: Option<Duration>,
) -> Result<Response, ContractError> {
ADMIN.assert_admin(deps.as_ref(), &info.sender)?;

Expand All @@ -197,6 +226,30 @@ fn execute_update_config<Q: CustomQuery>(
if let Some(max_validators) = max_validators {
cfg.max_validators = max_validators;
}
if let Some(scaling) = scaling {
cfg.scaling = Option::from(scaling);
}
if let Some(epoch_reward) = epoch_reward {
cfg.epoch_reward = epoch_reward;
}
if let Some(fee_percentage) = fee_percentage {
cfg.fee_percentage = fee_percentage;
}
if let Some(auto_unjail) = auto_unjail {
cfg.auto_unjail = auto_unjail;
}
if let Some(double_sign_slash_ratio) = double_sign_slash_ratio {
cfg.double_sign_slash_ratio = double_sign_slash_ratio;
}
if let Some(distribution_contracts) = distribution_contracts {
cfg.distribution_contracts = distribution_contracts;
}
if let Some(verify_validators) = verify_validators {
cfg.verify_validators = verify_validators;
}
if let Some(offline_jail_duration) = offline_jail_duration {
cfg.offline_jail_duration = offline_jail_duration;
}
Ok(cfg)
})?;

Expand Down Expand Up @@ -929,12 +982,11 @@ fn calculate_diff(

#[cfg_attr(not(feature = "library"), entry_point)]
pub fn migrate(
mut deps: DepsMut<TgradeQuery>,
deps: DepsMut<TgradeQuery>,
_env: Env,
msg: MigrateMsg,
) -> Result<Response, ContractError> {
let original_version =
ensure_from_older_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?;
ensure_from_older_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?;

CONFIG.update::<_, StdError>(deps.storage, |mut cfg| {
if let Some(min_points) = msg.min_points {
Expand All @@ -943,16 +995,15 @@ pub fn migrate(
if let Some(max_validators) = msg.max_validators {
cfg.max_validators = max_validators;
}
if let Some(distribution_contracts) = msg.distribution_contracts {
cfg.distribution_contracts = distribution_contracts;
}
if let Some(verify_validators) = msg.verify_validators {
cfg.verify_validators = verify_validators;
}
Ok(cfg)
})?;

migrate_jailing_period(deps.branch(), &original_version)?;

migrate_verify_validators(deps.branch(), &original_version)?;

Ok(Response::new())
}

Expand Down
1 change: 0 additions & 1 deletion contracts/tgrade-valset/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
pub mod contract;
pub mod error;
mod migration;
pub mod msg;
#[cfg(test)]
mod multitest;
Expand Down
139 changes: 0 additions & 139 deletions contracts/tgrade-valset/src/migration.rs

This file was deleted.

40 changes: 40 additions & 0 deletions contracts/tgrade-valset/src/msg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,8 +135,47 @@ pub enum ExecuteMsg {
},
/// Alter config values
UpdateConfig {
/// minimum points needed by an address in `membership` to be considered for the validator set.
/// 0-point members are always filtered out.
min_points: Option<u64>,
/// The maximum number of validators that can be included in the Tendermint validator set.
/// If there are more validators than slots, we select the top N by membership points
/// descending.
max_validators: Option<u32>,
/// A scaling factor to multiply tg4-engagement points to produce the tendermint validator power
scaling: Option<u32>,
/// Total reward paid out each epoch. This will be split among all validators during the last
/// epoch.
/// (epoch_reward.amount * 86_400 * 30 / epoch_length) is reward tokens to mint each month.
/// Ensure this is sensible in relation to the total token supply.
epoch_reward: Option<Coin>,
/// Percentage of total accumulated fees which is subtracted from tokens minted as a rewards.
/// 50% as default. To disable this feature just set it to 0 (which effectively means that fees
/// doesn't affect the per epoch reward).
fee_percentage: Option<Decimal>,
/// Flag determining if validators should be automatically unjailed after jailing period, false
/// by default.
auto_unjail: Option<bool>,

/// Validators who are caught double signing are jailed forever and their bonded tokens are
/// slashed based on this value.
double_sign_slash_ratio: Option<Decimal>,

/// Addresses where part of the reward for non-validators is sent for further distribution. These are
/// required to handle the `Distribute {}` message (eg. tg4-engagement contract) which would
/// distribute the funds sent with this message.
/// The sum of ratios here has to be in the [0, 1] range. The remainder is sent to validators via the
/// rewards contract.
distribution_contracts: Option<Vec<DistributionContract>>,

/// If this is enabled, signed blocks are watched for, and if a validator fails to sign any blocks
/// in a string of a number of blocks (typically 1000 blocks), they are jailed.
verify_validators: Option<bool>,

/// The duration to jail a validator for in case they don't sign any blocks for a period of time,
/// if `verify_validators` is enabled.
/// After the jailing period, they will be jailed again if not signing blocks, ad infinitum.
offline_jail_duration: Option<Duration>,
},
/// Links info.sender (operator) to this Tendermint consensus key.
/// The operator cannot re-register another key.
Expand Down Expand Up @@ -508,6 +547,7 @@ pub struct InstantiateResponse {
pub struct MigrateMsg {
pub min_points: Option<u64>,
pub max_validators: Option<u32>,
pub distribution_contracts: Option<Vec<DistributionContract>>,
pub verify_validators: Option<bool>,
}

Expand Down
14 changes: 14 additions & 0 deletions contracts/tgrade-valset/src/multitest/migration.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
use super::suite::SuiteBuilder;
use crate::msg::MigrateMsg;
use crate::state::DistributionContract;
use cosmwasm_std::{Addr, Decimal};

#[test]
fn migration_can_alter_cfg() {
Expand All @@ -19,6 +21,10 @@ fn migration_can_alter_cfg() {
&MigrateMsg {
min_points: Some(5),
max_validators: Some(10),
distribution_contracts: Some(vec![DistributionContract {
contract: Addr::unchecked("engagement1".to_string()),
ratio: Decimal::percent(50),
}]),
verify_validators: Some(true),
},
)
Expand All @@ -27,4 +33,12 @@ fn migration_can_alter_cfg() {
let cfg = suite.config().unwrap();
assert_eq!(cfg.max_validators, 10);
assert_eq!(cfg.min_points, 5);
assert!(cfg.verify_validators);
assert_eq!(
cfg.distribution_contracts,
vec![DistributionContract {
contract: Addr::unchecked("engagement1".to_string()),
ratio: Decimal::percent(50),
}]
);
}
Loading

0 comments on commit 3b8102a

Please sign in to comment.