-
Notifications
You must be signed in to change notification settings - Fork 788
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Fix|NominationPools] Only allow apply slash to be executed if the slash amount is atleast ED #6540
Changes from all commits
89fc9f1
195204d
eff1f31
43dd30a
086d7cd
ce55a7f
5407bf4
02a73ae
d076dc1
d8413c2
c3d887a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
# Schema: Polkadot SDK PRDoc Schema (prdoc) v1.0.0 | ||
# See doc at https://raw.githubusercontent.com/paritytech/polkadot-sdk/master/prdoc/schema_user.json | ||
|
||
title: Only allow apply slash to be executed if the slash amount is atleast ED | ||
|
||
doc: | ||
- audience: Runtime User | ||
description: | | ||
This change prevents `pools::apply_slash` from being executed when the pending slash amount of the member is lower | ||
than the ED. With this change, such small slashes will still be applied but only when member funds are withdrawn. | ||
|
||
crates: | ||
- name: pallet-nomination-pools-runtime-api | ||
bump: patch | ||
- name: pallet-nomination-pools | ||
bump: major |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -1944,6 +1944,8 @@ pub mod pallet { | |
NothingToAdjust, | ||
/// No slash pending that can be applied to the member. | ||
NothingToSlash, | ||
/// The slash amount is too low to be applied. | ||
SlashTooLow, | ||
/// The pool or member delegation has already migrated to delegate stake. | ||
AlreadyMigrated, | ||
/// The pool or member delegation has not migrated yet to delegate stake. | ||
|
@@ -2300,7 +2302,7 @@ pub mod pallet { | |
|
||
let slash_weight = | ||
// apply slash if any before withdraw. | ||
match Self::do_apply_slash(&member_account, None) { | ||
match Self::do_apply_slash(&member_account, None, false) { | ||
Ok(_) => T::WeightInfo::apply_slash(), | ||
Err(e) => { | ||
let no_pending_slash: DispatchResult = Err(Error::<T>::NothingToSlash.into()); | ||
|
@@ -2974,8 +2976,10 @@ pub mod pallet { | |
/// Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type: | ||
/// [`adapter::StakeStrategyType::Delegate`]. | ||
/// | ||
/// This call can be dispatched permissionlessly (i.e. by any account). If the member has | ||
/// slash to be applied, caller may be rewarded with the part of the slash. | ||
/// The pending slash amount of the member must be equal or more than `ExistentialDeposit`. | ||
/// This call can be dispatched permissionlessly (i.e. by any account). If the execution | ||
/// is successful, fee is refunded and caller may be rewarded with a part of the slash | ||
/// based on the [`crate::pallet::Config::StakeAdapter`] configuration. | ||
#[pallet::call_index(23)] | ||
#[pallet::weight(T::WeightInfo::apply_slash())] | ||
pub fn apply_slash( | ||
|
@@ -2989,7 +2993,7 @@ pub mod pallet { | |
|
||
let who = ensure_signed(origin)?; | ||
let member_account = T::Lookup::lookup(member_account)?; | ||
Self::do_apply_slash(&member_account, Some(who))?; | ||
Self::do_apply_slash(&member_account, Some(who), true)?; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why do we want to to avoid slashing below the ED here ( |
||
|
||
// If successful, refund the fees. | ||
Ok(Pays::No.into()) | ||
|
@@ -3574,15 +3578,21 @@ impl<T: Config> Pallet<T> { | |
fn do_apply_slash( | ||
member_account: &T::AccountId, | ||
reporter: Option<T::AccountId>, | ||
enforce_min_slash: bool, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nit but in order to prevent spreading enum SlashConfig {
EnforceMinimum,
DoNotEnforceMinimuim
} Not sure about the enum and variant names, but in general // reads better
do_apply_slash(..., SlashConfig::EnforceMinimum);
// than this
do_apply_slash(..., true); |
||
) -> DispatchResult { | ||
let member = PoolMembers::<T>::get(member_account).ok_or(Error::<T>::PoolMemberNotFound)?; | ||
|
||
let pending_slash = | ||
Self::member_pending_slash(Member::from(member_account.clone()), member.clone())?; | ||
|
||
// if nothing to slash, return error. | ||
// ensure there is something to slash. | ||
ensure!(!pending_slash.is_zero(), Error::<T>::NothingToSlash); | ||
|
||
if enforce_min_slash { | ||
// ensure slashed amount is at least the minimum balance. | ||
ensure!(pending_slash >= T::Currency::minimum_balance(), Error::<T>::SlashTooLow); | ||
} | ||
|
||
T::StakeAdapter::member_slash( | ||
Member::from(member_account.clone()), | ||
Pool::from(Pallet::<T>::generate_bonded_account(member.pool_id)), | ||
|
@@ -3946,6 +3956,9 @@ impl<T: Config> Pallet<T> { | |
/// Returns the unapplied slash of a member. | ||
/// | ||
/// Pending slash is only applicable with [`adapter::DelegateStake`] strategy. | ||
/// | ||
/// If pending slash of the member exceeds `ExistentialDeposit`, it can be reported on | ||
/// chain via [`Call::apply_slash`]. | ||
pub fn api_member_pending_slash(who: T::AccountId) -> BalanceOf<T> { | ||
PoolMembers::<T>::get(who.clone()) | ||
.map(|pool_member| { | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My previous comment only made sense when taken with another made to this line, which asked: why don't we want to enforce the ED checks here?
Sorry, I had the GH open for a while, it might have been lost when I refreshed the browser.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
At this point, a gas fee is charged for slashing. Additionally, we need to clean up all bookkeeping before a member withdraws.