Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

New Pallet: Root offences #11943

Merged
merged 61 commits into from
Sep 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
88667a5
root-offences pallet
Szegoo Jul 30, 2022
cd95c71
fix errors
Szegoo Jul 31, 2022
a95053c
cleaned up a bit
Szegoo Jul 31, 2022
3b61dd7
remove unwrap()
Szegoo Jul 31, 2022
5355022
new pallet is getting compiled
Szegoo Aug 1, 2022
aa41e2e
remove unnecessary type annotations
Szegoo Aug 1, 2022
e492fda
remove more unnecessary type annotations
Szegoo Aug 1, 2022
4e56c30
addidtional cleaning
Szegoo Aug 1, 2022
0f3caa2
commit
Szegoo Aug 1, 2022
a0ffc68
cleaned up
Szegoo Aug 1, 2022
7e802f2
fix in logic
Szegoo Aug 1, 2022
ab31668
Merge branch 'paritytech:master' into root-offences
Szegoo Aug 1, 2022
9c28dfe
add event
Szegoo Aug 1, 2022
25f99e4
Merge branch 'paritytech:master' into root-offences
Szegoo Aug 5, 2022
310d5fe
removed Clone trait from AccountId
Szegoo Aug 13, 2022
354dcd1
test module
Szegoo Aug 15, 2022
5c01f62
remove unused imports
Szegoo Aug 15, 2022
bb64363
fmt
Szegoo Aug 15, 2022
4467957
Merge branch 'paritytech:master' into root-offences
Szegoo Aug 15, 2022
41dbdd5
fix
Szegoo Aug 15, 2022
0af2881
separate into functions, still messy
Szegoo Aug 15, 2022
c9e93c5
test
Szegoo Aug 15, 2022
f81c50a
first test
Szegoo Aug 15, 2022
b41af4a
fmt
Szegoo Aug 15, 2022
a0a2200
cleaned up a bit
Szegoo Aug 15, 2022
3eda44d
separate into mock.rs and tests.rs
Szegoo Aug 16, 2022
24f34c6
basic docs for now
Szegoo Aug 16, 2022
3c13823
pallet_staking GenesisiConfig
Szegoo Aug 18, 2022
d053088
Merge branch 'paritytech:master' into root-offences
Szegoo Aug 18, 2022
e4f8d75
fix
Szegoo Aug 18, 2022
94a134e
added start_session
Szegoo Aug 18, 2022
99f7f3f
passing tests
Szegoo Aug 18, 2022
a7fd615
impl GenesisConfig for pallet_session
Szegoo Aug 18, 2022
9ec53c8
updated event
Szegoo Aug 19, 2022
aa6ab8d
Update frame/root-offences/src/lib.rs
Szegoo Aug 19, 2022
ee47b01
Update frame/root-offences/src/lib.rs
Szegoo Aug 19, 2022
160aa40
remove <T: Config
Szegoo Aug 19, 2022
ca78672
specifying trait bounds inside Config
Szegoo Aug 19, 2022
0ff7a3e
commit
Szegoo Aug 20, 2022
29a0bdc
active era increases correctly :)
Szegoo Aug 20, 2022
04f7c2d
ExtBuilder
Szegoo Aug 20, 2022
444da16
slashing works
Szegoo Aug 20, 2022
e0bf7c7
new test
Szegoo Aug 20, 2022
d941494
additional test
Szegoo Aug 20, 2022
7627641
commit
Szegoo Aug 20, 2022
84737f0
order
Szegoo Aug 20, 2022
bae19c0
fix?
Szegoo Aug 20, 2022
4cc7538
fix in logic
Szegoo Aug 20, 2022
e2b6029
remove unnecessary
Szegoo Aug 21, 2022
08921d2
Merge branch 'paritytech:master' into root-offences
Szegoo Aug 21, 2022
6b14e12
Merge branch 'paritytech:master' into root-offences
Szegoo Aug 29, 2022
c944db1
wrap comment at 100
Szegoo Aug 29, 2022
4b2526e
fmt
Szegoo Aug 29, 2022
694b56c
Merge branch 'paritytech:master' into root-offences
Szegoo Sep 23, 2022
33f07e9
merge fixes
Szegoo Sep 24, 2022
7b6d8ef
Update frame/root-offences/src/lib.rs
Szegoo Sep 26, 2022
7a79785
Update frame/root-offences/src/lib.rs
Szegoo Sep 26, 2022
4838575
docs
Szegoo Sep 26, 2022
6de5482
Update frame/root-offences/README.md
Szegoo Sep 27, 2022
64ab683
Update frame/root-offences/Cargo.toml
Szegoo Sep 27, 2022
83ff690
license header
Szegoo Sep 27, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ members = [
"frame/staking/reward-fn",
"frame/state-trie-migration",
"frame/sudo",
"frame/root-offences",
"frame/support",
"frame/support/procedural",
"frame/support/procedural/tools",
Expand Down
2 changes: 1 addition & 1 deletion frame/nomination-pools/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2523,7 +2523,7 @@ impl<T: Config> Pallet<T> {
impl<T: Config> OnStakerSlash<T::AccountId, BalanceOf<T>> for Pallet<T> {
fn on_slash(
pool_account: &T::AccountId,
// Bonded balance is always read directly from staking, therefore we need not update
// Bonded balance is always read directly from staking, therefore we don't need to update
// anything here.
slashed_bonded: BalanceOf<T>,
slashed_unlocking: &BTreeMap<EraIndex, BalanceOf<T>>,
Expand Down
51 changes: 51 additions & 0 deletions frame/root-offences/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
[package]
name = "pallet-root-offences"
version = "1.0.0"
authors = ["Parity Technologies <admin@parity.io>"]
edition = "2021"
license = "Apache-2.0"
homepage = "https://substrate.io"
repository = "https://github.com/paritytech/substrate/"
description = "FRAME root offences pallet"

[package.metadata.docs.rs]
targets = ["x86_64-unknown-linux-gnu"]

[dependencies]
codec = { package = "parity-scale-codec", version = "3.0.0", default-features = false, features = ["derive"] }
scale-info = { version = "2.1.1", default-features = false, features = ["derive"] }

pallet-session = { version = "4.0.0-dev", features = [ "historical" ], path = "../../frame/session", default-features = false }
pallet-staking = { version = "4.0.0-dev", default-features = false, path = "../../frame/staking" }
pallet-offences = { version = "4.0.0-dev", default-features = false, path = "../../frame/offences" }

frame-support = { version = "4.0.0-dev", default-features = false, path = "../support" }
frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" }
sp-runtime = { version = "6.0.0", path = "../../primitives/runtime" }
sp-staking = { version = "4.0.0-dev", default-features = false, path = "../../primitives/staking" }

[dev-dependencies]
pallet-balances = { version = "4.0.0-dev", path = "../balances" }
pallet-timestamp = { version = "4.0.0-dev", path = "../timestamp" }
pallet-staking-reward-curve = { version = "4.0.0-dev", path = "../staking/reward-curve" }

sp-core = { version = "6.0.0", path = "../../primitives/core" }
sp-io = { version = "6.0.0", default-features = false, path = "../../primitives/io" }
sp-std = { version = "4.0.0", default-features = false, path = "../../primitives/std" }

frame-election-provider-support = { version = "4.0.0-dev", path = "../election-provider-support" }

[features]
runtime-benchmarks = []
try-runtime = ["frame-support/try-runtime"]
default = ["std"]
std = [
"codec/std",
"frame-support/std",
"frame-system/std",
"pallet-session/std",
"pallet-staking/std",
"pallet-offences/std",
"scale-info/std",
"sp-runtime/std",
]
5 changes: 5 additions & 0 deletions frame/root-offences/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# Sudo Offences Pallet

Pallet that allows the root to create an offence.

NOTE: This pallet should only be used for testing purposes.
131 changes: 131 additions & 0 deletions frame/root-offences/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
// This file is part of Substrate.

// Copyright (C) 2022 Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0

// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

//! # Sudo Offences Pallet
//! Pallet that allows the root to create an offence.
//!
//! NOTE: This pallet should be used for testing purposes.

#![cfg_attr(not(feature = "std"), no_std)]

#[cfg(test)]
mod mock;
#[cfg(test)]
mod tests;

use pallet_session::historical::IdentificationTuple;
use pallet_staking::{BalanceOf, Exposure, ExposureOf, Pallet as Staking};
use sp_runtime::Perbill;
use sp_staking::offence::{DisableStrategy, OnOffenceHandler};

pub use pallet::*;

#[frame_support::pallet]
pub mod pallet {
use super::*;
use frame_support::pallet_prelude::*;
use frame_system::pallet_prelude::*;

#[pallet::config]
pub trait Config:
frame_system::Config
+ pallet_staking::Config
+ pallet_session::Config<ValidatorId = <Self as frame_system::Config>::AccountId>
+ pallet_session::historical::Config<
FullIdentification = Exposure<
<Self as frame_system::Config>::AccountId,
BalanceOf<Self>,
>,
FullIdentificationOf = ExposureOf<Self>,
>
{
type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
}

#[pallet::pallet]
#[pallet::generate_store(pub(super) trait Store)]
pub struct Pallet<T>(_);

#[pallet::event]
#[pallet::generate_deposit(pub(super) fn deposit_event)]
pub enum Event<T: Config> {
/// An offence was created by root.
OffenceCreated { offenders: Vec<(T::AccountId, Perbill)> },
}

#[pallet::error]
pub enum Error<T> {
/// Failed to get the active era from the staking pallet.
FailedToGetActiveEra,
Szegoo marked this conversation as resolved.
Show resolved Hide resolved
}

type OffenceDetails<T> = sp_staking::offence::OffenceDetails<
<T as frame_system::Config>::AccountId,
IdentificationTuple<T>,
>;
Szegoo marked this conversation as resolved.
Show resolved Hide resolved

#[pallet::call]
impl<T: Config> Pallet<T> {
/// Allows the `root`, for example sudo to create an offence.
#[pallet::weight(T::DbWeight::get().reads(2))]
Copy link
Contributor Author

@Szegoo Szegoo Aug 20, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kianenigma Should I write a benchmark for this or would it be possible somehow to add the weight consumed when calling the on_offence function to this?

CC: @KiChjang

pub fn create_offence(
origin: OriginFor<T>,
offenders: Vec<(T::AccountId, Perbill)>,
) -> DispatchResult {
ensure_root(origin)?;

let slash_fraction =
offenders.clone().into_iter().map(|(_, fraction)| fraction).collect::<Vec<_>>();
let offence_details = Self::get_offence_details(offenders.clone())?;

Self::submit_offence(&offence_details, &slash_fraction);
Self::deposit_event(Event::OffenceCreated { offenders });
Ok(())
}
}

impl<T: Config> Pallet<T> {
/// Returns a vector of offenders that are going to be slashed.
fn get_offence_details(
offenders: Vec<(T::AccountId, Perbill)>,
) -> Result<Vec<OffenceDetails<T>>, DispatchError> {
let now = Staking::<T>::active_era()
.map(|e| e.index)
.ok_or(Error::<T>::FailedToGetActiveEra)?;

Ok(offenders
.clone()
.into_iter()
.map(|(o, _)| OffenceDetails::<T> {
offender: (o.clone(), Staking::<T>::eras_stakers(now, o)),
reporters: vec![],
})
.collect())
}

/// Submits the offence by calling the `on_offence` function.
fn submit_offence(offenders: &[OffenceDetails<T>], slash_fraction: &[Perbill]) {
let session_index = <pallet_session::Pallet<T> as frame_support::traits::ValidatorSet<T::AccountId>>::session_index();

<pallet_staking::Pallet<T> as OnOffenceHandler<
T::AccountId,
IdentificationTuple<T>,
Weight,
>>::on_offence(&offenders, &slash_fraction, session_index, DisableStrategy::WhenSlashed);
}
}
}
Loading