use crate::{types::*, weights::*, Config, Internals, Pallet};
use frame_suite::PenalizeAuthors;
use sp_runtime::{Vec, Weight};
use sp_staking::offence::{OffenceDetails, OnOffenceHandler};
impl<T: Config> OnOffenceHandler<OffenceReporter<T>, Offender<T>, Weight> for Pallet<T>
where
AuthorOf<T>: From<<T as pallet_session::Config>::ValidatorId>,
{
fn on_offence(
offenders: &[OffenceDetails<OffenceReporter<T>, Offender<T>>],
slash_fractions: &[PenaltyRatio],
_session: SessionIndex,
) -> Weight {
let mut offenders_list: Vec<(AuthorOf<T>, PenaltyOf<T>)> = Vec::new();
for (i, offender) in offenders.iter().enumerate() {
let details = offender;
let slash_fraction = slash_fractions[i];
let offender_account: AuthorOf<T> = details.offender.0.clone().into();
offenders_list.push((offender_account, slash_fraction));
}
<Internals<T> as PenalizeAuthors<AuthorOf<T>, PenaltyOf<T>>>::penalize_authors(
offenders_list,
);
let offenders_count = offenders.len() as u32;
<T as Config>::WeightInfo::on_offence(offenders_count)
}
}
#[cfg(test)]
mod tests {
use crate::mock::*;
use frame_suite::roles::*;
use frame_support::traits::tokens::Fortitude;
use sp_staking::offence::{OffenceDetails, OnOffenceHandler};
#[test]
fn on_offence_success() {
chain_manager_test_ext().execute_with(|| {
set_user_balance_and_hold(ALICE, 250, 250).unwrap();
set_user_balance_and_hold(BOB, 250, 250).unwrap();
set_user_balance_and_hold(MIKE, 250, 250).unwrap();
set_user_balance_and_hold(CHARLIE, 250, 250).unwrap();
RoleAdapter::enroll(&ALICE, 200, Fortitude::Force).unwrap();
RoleAdapter::enroll(&BOB, 150, Fortitude::Force).unwrap();
System::set_block_number(16);
let offenders = [OffenceDetails {
offender: (ALICE, ALICE),
reporters: vec![CHARLIE, MIKE],
}];
let slash_fraction = [PenaltyRatio::from_percent(5)];
Pallet::on_offence(&offenders, &slash_fraction, 1);
let penalties_of_alice = RoleAdapter::get_penalties_of(&ALICE).unwrap();
let expected_penalties_of_alice = vec![(20, PenaltyRatio::from_percent(5))];
assert_eq!(penalties_of_alice, expected_penalties_of_alice);
})
}
}