diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 5154beb3a966..64a5915d5130 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -1176,7 +1176,7 @@ impl parachains_initializer::Config for Runtime { impl parachains_disputes::Config for Runtime { type Event = Event; - type RewardValidators = (); + type RewardValidators = parachains_reward_points::RewardValidatorsWithEraPoints; type PunishValidators = (); type WeightInfo = weights::runtime_parachains_disputes::WeightInfo; } diff --git a/runtime/parachains/src/reward_points.rs b/runtime/parachains/src/reward_points.rs index a1d4dceba5c5..1d1d8748f1c2 100644 --- a/runtime/parachains/src/reward_points.rs +++ b/runtime/parachains/src/reward_points.rs @@ -22,42 +22,71 @@ //! for the time being, although we will build schemes to do so in the future. use crate::{session_info, shared}; -use frame_support::traits::ValidatorSet; -use primitives::v2::ValidatorIndex; +use frame_support::traits::{Defensive, ValidatorSet}; +use primitives::v2::{SessionIndex, ValidatorIndex}; +use sp_std::collections::btree_set::BTreeSet; /// The amount of era points given by backing a candidate that is included. pub const BACKING_POINTS: u32 = 20; +/// The amount of era points given by dispute voting on a candidate. +pub const DISPUTE_STATEMENT_POINTS: u32 = 20; /// Rewards validators for participating in parachains with era points in pallet-staking. pub struct RewardValidatorsWithEraPoints(sp_std::marker::PhantomData); -impl crate::inclusion::RewardValidators for RewardValidatorsWithEraPoints +impl RewardValidatorsWithEraPoints where - C: pallet_staking::Config + shared::Config + session_info::Config, + C: pallet_staking::Config + session_info::Config, C::ValidatorSet: ValidatorSet, { - fn reward_backing(indices: impl IntoIterator) { - // Fetch the validators from the _session_ because sessions are offset from eras - // and we are rewarding for behavior in current session. - let session_index = shared::Pallet::::session_index(); + /// Reward validators in session with points, but only if they are in the active set. + fn reward_only_active( + session_index: SessionIndex, + indices: impl IntoIterator, + points: u32, + ) { let validators = session_info::Pallet::::account_keys(&session_index); - let validators = match validators { + let validators = match validators + .defensive_proof("account_keys are present for dispute_period sessions") + { Some(validators) => validators, - None => { - // Account keys are missing for the current session. - // This might happen only for the first session after - // `AccountKeys` were introduced via runtime upgrade. - return - }, + None => return, }; + // limit rewards to the active validator set + let active_set: BTreeSet<_> = C::ValidatorSet::validators().into_iter().collect(); let rewards = indices .into_iter() .filter_map(|i| validators.get(i.0 as usize).cloned()) - .map(|v| (v, BACKING_POINTS)); + .filter(|v| active_set.contains(v)) + .map(|v| (v, points)); >::reward_by_ids(rewards); } +} + +impl crate::inclusion::RewardValidators for RewardValidatorsWithEraPoints +where + C: pallet_staking::Config + shared::Config + session_info::Config, + C::ValidatorSet: ValidatorSet, +{ + fn reward_backing(indices: impl IntoIterator) { + let session_index = shared::Pallet::::session_index(); + Self::reward_only_active(session_index, indices, BACKING_POINTS); + } fn reward_bitfields(_validators: impl IntoIterator) {} } + +impl crate::disputes::RewardValidators for RewardValidatorsWithEraPoints +where + C: pallet_staking::Config + session_info::Config, + C::ValidatorSet: ValidatorSet, +{ + fn reward_dispute_statement( + session: SessionIndex, + validators: impl IntoIterator, + ) { + Self::reward_only_active(session, validators, DISPUTE_STATEMENT_POINTS); + } +} diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 8712162b919e..2388f6de99c1 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -944,7 +944,7 @@ impl assigned_slots::Config for Runtime { impl parachains_disputes::Config for Runtime { type Event = Event; - type RewardValidators = (); + type RewardValidators = parachains_reward_points::RewardValidatorsWithEraPoints; type PunishValidators = (); type WeightInfo = weights::runtime_parachains_disputes::WeightInfo; }