diff --git a/clients/validator/package.json b/clients/validator/package.json index f2d254c477..167c1cfff7 100644 --- a/clients/validator/package.json +++ b/clients/validator/package.json @@ -1,6 +1,6 @@ { "name": "@nymproject/nym-validator-client", - "version": "0.16.0", + "version": "0.17.0", "description": "A TypeScript client for interacting with smart contracts in Nym validators", "repository": "https://github.com/nymtech/nym", "main": "./dist/index.js", diff --git a/clients/validator/src/index.ts b/clients/validator/src/index.ts index 2c49dbe735..c0e2ec4558 100644 --- a/clients/validator/src/index.ts +++ b/clients/validator/src/index.ts @@ -670,6 +670,8 @@ export type StateParams = { minimum_gateway_bond: string, mixnode_bond_reward_rate: string, gateway_bond_reward_rate: string, + mixnode_delegation_reward_rate: string, + gateway_delegation_reward_rate: string, mixnode_active_set_size: number, } diff --git a/common/mixnet-contract/src/types.rs b/common/mixnet-contract/src/types.rs index 3c46334aac..9d0404daf0 100644 --- a/common/mixnet-contract/src/types.rs +++ b/common/mixnet-contract/src/types.rs @@ -34,6 +34,8 @@ pub struct StateParams { pub minimum_gateway_bond: Uint128, // minimum amount a gateway must bond to get into the system pub mixnode_bond_reward_rate: Decimal, // annual reward rate, expressed as a decimal like 1.25 pub gateway_bond_reward_rate: Decimal, // annual reward rate, expressed as a decimal like 1.25 + pub mixnode_delegation_reward_rate: Decimal, // annual reward rate, expressed as a decimal like 1.25 + pub gateway_delegation_reward_rate: Decimal, // annual reward rate, expressed as a decimal like 1.25 pub mixnode_active_set_size: u32, } @@ -45,14 +47,24 @@ impl Display for StateParams { write!(f, "minimum gateway bond: {}; ", self.minimum_gateway_bond)?; write!( f, - "mixnode reward rate: {}; ", + "mixnode bond reward rate: {}; ", self.mixnode_bond_reward_rate )?; write!( f, - "gateway reward rate: {}; ", + "gateway bond reward rate: {}; ", self.gateway_bond_reward_rate )?; + write!( + f, + "mixnode delegation reward rate: {}; ", + self.mixnode_delegation_reward_rate + )?; + write!( + f, + "gateway delegation reward rate: {}; ", + self.gateway_delegation_reward_rate + )?; write!( f, "mixnode active set size: {} ]", diff --git a/contracts/mixnet/src/contract.rs b/contracts/mixnet/src/contract.rs index c7dd2672c2..26f82da9d9 100644 --- a/contracts/mixnet/src/contract.rs +++ b/contracts/mixnet/src/contract.rs @@ -23,12 +23,16 @@ pub const INITIAL_MIXNODE_BOND: Uint128 = Uint128(100_000000); // percentage annual increase. Given starting value of x, we expect to have 1.1x at the end of the year pub const INITIAL_MIXNODE_BOND_REWARD_RATE: u64 = 110; pub const INITIAL_GATEWAY_BOND_REWARD_RATE: u64 = 110; +pub const INITIAL_MIXNODE_DELEGATION_REWARD_RATE: u64 = 110; +pub const INITIAL_GATEWAY_DELEGATION_REWARD_RATE: u64 = 110; pub const INITIAL_MIXNODE_ACTIVE_SET_SIZE: u32 = 100; fn default_initial_state(owner: Addr) -> State { let mixnode_bond_reward_rate = Decimal::percent(INITIAL_MIXNODE_BOND_REWARD_RATE); let gateway_bond_reward_rate = Decimal::percent(INITIAL_GATEWAY_BOND_REWARD_RATE); + let mixnode_delegation_reward_rate = Decimal::percent(INITIAL_MIXNODE_DELEGATION_REWARD_RATE); + let gateway_delegation_reward_rate = Decimal::percent(INITIAL_GATEWAY_DELEGATION_REWARD_RATE); State { owner, @@ -39,6 +43,8 @@ fn default_initial_state(owner: Addr) -> State { minimum_gateway_bond: INITIAL_GATEWAY_BOND, mixnode_bond_reward_rate, gateway_bond_reward_rate, + mixnode_delegation_reward_rate, + gateway_delegation_reward_rate, mixnode_active_set_size: INITIAL_MIXNODE_ACTIVE_SET_SIZE, }, mixnode_epoch_bond_reward: calculate_epoch_reward_rate( diff --git a/contracts/mixnet/src/error.rs b/contracts/mixnet/src/error.rs index b58864ca83..652533d6d0 100644 --- a/contracts/mixnet/src/error.rs +++ b/contracts/mixnet/src/error.rs @@ -51,6 +51,12 @@ pub enum ContractError { #[error("The bond reward rate for gateway was set to be lower than 1")] DecreasingGatewayBondReward, + #[error("The delegation reward rate for mixnode was set to be lower than 1")] + DecreasingMixnodeDelegationReward, + + #[error("The delegation reward rate for gateway was set to be lower than 1")] + DecreasingGatewayDelegationReward, + #[error("The node had uptime larger than 100%")] UnexpectedUptime, diff --git a/contracts/mixnet/src/queries.rs b/contracts/mixnet/src/queries.rs index da0cfee0ea..0152f22e91 100644 --- a/contracts/mixnet/src/queries.rs +++ b/contracts/mixnet/src/queries.rs @@ -546,6 +546,8 @@ mod tests { minimum_gateway_bond: 456u128.into(), mixnode_bond_reward_rate: "1.23".parse().unwrap(), gateway_bond_reward_rate: "4.56".parse().unwrap(), + mixnode_delegation_reward_rate: "7.89".parse().unwrap(), + gateway_delegation_reward_rate: "0.12".parse().unwrap(), mixnode_active_set_size: 1000, }, mixnode_epoch_bond_reward: "1.23".parse().unwrap(), diff --git a/contracts/mixnet/src/transactions.rs b/contracts/mixnet/src/transactions.rs index 4e193d8497..6653aeba82 100644 --- a/contracts/mixnet/src/transactions.rs +++ b/contracts/mixnet/src/transactions.rs @@ -339,6 +339,14 @@ pub(crate) fn try_update_state_params( return Err(ContractError::DecreasingGatewayBondReward); } + if params.mixnode_delegation_reward_rate < Decimal::one() { + return Err(ContractError::DecreasingMixnodeDelegationReward); + } + + if params.gateway_delegation_reward_rate < Decimal::one() { + return Err(ContractError::DecreasingGatewayDelegationReward); + } + // if we're updating epoch length, recalculate rewards for both mixnodes and gateways if state.params.epoch_length != params.epoch_length { state.mixnode_epoch_bond_reward = @@ -682,7 +690,9 @@ pub mod tests { use super::*; use crate::contract::{ execute, query, INITIAL_DEFAULT_EPOCH_LENGTH, INITIAL_GATEWAY_BOND, - INITIAL_GATEWAY_BOND_REWARD_RATE, INITIAL_MIXNODE_BOND, INITIAL_MIXNODE_BOND_REWARD_RATE, + INITIAL_GATEWAY_BOND_REWARD_RATE, INITIAL_GATEWAY_DELEGATION_REWARD_RATE, + INITIAL_MIXNODE_BOND, INITIAL_MIXNODE_BOND_REWARD_RATE, + INITIAL_MIXNODE_DELEGATION_REWARD_RATE, }; use crate::helpers::calculate_epoch_reward_rate; use crate::storage::{ @@ -1543,6 +1553,12 @@ pub mod tests { minimum_gateway_bond: INITIAL_GATEWAY_BOND, mixnode_bond_reward_rate: Decimal::percent(INITIAL_MIXNODE_BOND_REWARD_RATE), gateway_bond_reward_rate: Decimal::percent(INITIAL_GATEWAY_BOND_REWARD_RATE), + mixnode_delegation_reward_rate: Decimal::percent( + INITIAL_MIXNODE_DELEGATION_REWARD_RATE, + ), + gateway_delegation_reward_rate: Decimal::percent( + INITIAL_GATEWAY_DELEGATION_REWARD_RATE, + ), mixnode_active_set_size: 42, // change something };