Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update config extensions #185

Merged
merged 8 commits into from
Sep 19, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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