polkadot_runtime_parachains/
reward_points.rs1use crate::{session_info, shared};
25use alloc::collections::btree_set::BTreeSet;
26use frame_support::traits::{Defensive, Get, RewardsReporter, ValidatorSet};
27use polkadot_primitives::{SessionIndex, ValidatorIndex};
28
29pub struct RewardValidatorsWithEraPoints<C, R, PointsPerWork>(
40 core::marker::PhantomData<(C, R, PointsPerWork)>,
41);
42
43impl<C, R, PointsPerWork> RewardValidatorsWithEraPoints<C, R, PointsPerWork>
44where
45 C: session_info::Config,
46 C::ValidatorSet: ValidatorSet<C::AccountId, ValidatorId = C::AccountId>,
47 R: RewardsReporter<C::AccountId>,
48 PointsPerWork: Get<u32>,
49{
50 fn reward_only_active(
52 session_index: SessionIndex,
53 indices: impl IntoIterator<Item = ValidatorIndex>,
54 ) {
55 let points = PointsPerWork::get();
56 let validators = session_info::AccountKeys::<C>::get(&session_index);
57 let validators = match validators
58 .defensive_proof("account_keys are present for dispute_period sessions")
59 {
60 Some(validators) => validators,
61 None => return,
62 };
63 let active_set: BTreeSet<_> = C::ValidatorSet::validators().into_iter().collect();
65
66 let rewards = indices
67 .into_iter()
68 .filter_map(|i| validators.get(i.0 as usize).cloned())
69 .filter(|v| active_set.contains(v))
70 .map(|v| (v, points));
71
72 R::reward_by_ids(rewards);
73 }
74}
75
76impl<C, R, PointsPerWork> crate::inclusion::RewardValidators
77 for RewardValidatorsWithEraPoints<C, R, PointsPerWork>
78where
79 C: shared::Config + session_info::Config,
80 C::ValidatorSet: ValidatorSet<C::AccountId, ValidatorId = C::AccountId>,
81 R: RewardsReporter<C::AccountId>,
82 PointsPerWork: Get<u32>,
83{
84 fn reward_backing(indices: impl IntoIterator<Item = ValidatorIndex>) {
85 let session_index = shared::CurrentSessionIndex::<C>::get();
86 Self::reward_only_active(session_index, indices);
87 }
88
89 fn reward_bitfields(_validators: impl IntoIterator<Item = ValidatorIndex>) {}
90}
91
92impl<C, R, PointsPerWork> crate::disputes::RewardValidators
93 for RewardValidatorsWithEraPoints<C, R, PointsPerWork>
94where
95 C: session_info::Config,
96 C::ValidatorSet: ValidatorSet<C::AccountId, ValidatorId = C::AccountId>,
97 R: RewardsReporter<C::AccountId>,
98 PointsPerWork: Get<u32>,
99{
100 fn reward_dispute_statement(
101 session: SessionIndex,
102 validators: impl IntoIterator<Item = ValidatorIndex>,
103 ) {
104 Self::reward_only_active(session, validators);
105 }
106}