From e8a655bbef58f8abc67f6fc2ef3dc690591faa30 Mon Sep 17 00:00:00 2001 From: Gavin Wood <gavin@parity.io> Date: Thu, 28 Nov 2019 14:45:09 +0000 Subject: [PATCH] Commission is stated as percent of rewards (#4243) --- substrate/frame/staking/src/lib.rs | 20 ++++++++++---------- substrate/frame/staking/src/tests.rs | 7 +++---- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/substrate/frame/staking/src/lib.rs b/substrate/frame/staking/src/lib.rs index aeeda48593b..b2fb0c6e31f 100644 --- a/substrate/frame/staking/src/lib.rs +++ b/substrate/frame/staking/src/lib.rs @@ -187,7 +187,7 @@ //! The validator and its nominator split their reward as following: //! //! The validator can declare an amount, named -//! [`validator_payment`](./struct.ValidatorPrefs.html#structfield.validator_payment), that does not +//! [`commission`](./struct.ValidatorPrefs.html#structfield.commission), that does not //! get shared with the nominators at each reward payout through its //! [`ValidatorPrefs`](./struct.ValidatorPrefs.html). This value gets deducted from the total reward //! that is paid to the validator and its nominators. The remaining portion is split among the @@ -347,19 +347,19 @@ impl Default for RewardDestination { } } -/// Preference of what happens on a slash event. +/// Preference of what happens regarding validation. #[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug)] -pub struct ValidatorPrefs<Balance: HasCompact> { +pub struct ValidatorPrefs { /// Reward that validator takes up-front; only the rest is split between themselves and /// nominators. #[codec(compact)] - pub validator_payment: Balance, + pub commission: Perbill, } -impl<B: Default + HasCompact + Copy> Default for ValidatorPrefs<B> { +impl Default for ValidatorPrefs { fn default() -> Self { ValidatorPrefs { - validator_payment: Default::default(), + commission: Default::default(), } } } @@ -657,7 +657,7 @@ decl_storage! { pub Payee get(fn payee): map T::AccountId => RewardDestination; /// The map from (wannabe) validator stash key to the preferences of that validator. - pub Validators get(fn validators): linked_map T::AccountId => ValidatorPrefs<BalanceOf<T>>; + pub Validators get(fn validators): linked_map T::AccountId => ValidatorPrefs; /// The map from nominator stash key to the set of stash keys of all validators to nominate. /// @@ -982,7 +982,7 @@ decl_module! { /// - Writes are limited to the `origin` account key. /// # </weight> #[weight = SimpleDispatchInfo::FixedNormal(750_000)] - fn validate(origin, prefs: ValidatorPrefs<BalanceOf<T>>) { + fn validate(origin, prefs: ValidatorPrefs) { Self::ensure_storage_upgraded(); let controller = ensure_signed(origin)?; @@ -1252,8 +1252,8 @@ impl<T: Trait> Module<T> { /// nominators' balance, pro-rata based on their exposure, after having removed the validator's /// pre-payout cut. fn reward_validator(stash: &T::AccountId, reward: BalanceOf<T>) -> PositiveImbalanceOf<T> { - let off_the_table = reward.min(Self::validators(stash).validator_payment); - let reward = reward - off_the_table; + let off_the_table = Self::validators(stash).commission * reward; + let reward = reward.saturating_sub(off_the_table); let mut imbalance = <PositiveImbalanceOf<T>>::zero(); let validator_cut = if reward.is_zero() { Zero::zero() diff --git a/substrate/frame/staking/src/tests.rs b/substrate/frame/staking/src/tests.rs index 7e1939e4376..65fcd385079 100644 --- a/substrate/frame/staking/src/tests.rs +++ b/substrate/frame/staking/src/tests.rs @@ -965,7 +965,6 @@ fn validator_payment_prefs_work() { // This test will focus on validator payment. ExtBuilder::default().build().execute_with(|| { // Initial config - let validator_cut = 5; let stash_initial_balance = Balances::total_balance(&11); // check the balance of a validator accounts. @@ -983,7 +982,7 @@ fn validator_payment_prefs_work() { }); <Payee<Test>>::insert(&2, RewardDestination::Stash); <Validators<Test>>::insert(&11, ValidatorPrefs { - validator_payment: validator_cut + commission: Perbill::from_percent(50), }); // Compute total payout now for whole duration as other parameter won't change @@ -994,9 +993,9 @@ fn validator_payment_prefs_work() { start_era(1); // whats left to be shared is the sum of 3 rounds minus the validator's cut. - let shared_cut = total_payout_0 - validator_cut; + let shared_cut = total_payout_0 / 2; // Validator's payee is Staked account, 11, reward will be paid here. - assert_eq!(Balances::total_balance(&11), stash_initial_balance + shared_cut / 2 + validator_cut); + assert_eq!(Balances::total_balance(&11), stash_initial_balance + shared_cut / 2 + shared_cut); // Controller account will not get any reward. assert_eq!(Balances::total_balance(&10), 1); // Rest of the reward will be shared and paid to the nominator in stake. -- GitLab