mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-14 04:01:10 +00:00
Pools: Add ability to configure commission claiming permissions (#2474)
Addresses #409. This request has been raised by multiple community members - the ability for the nomination pool root role to configure permissionless commission claiming: > Would it be possible to have a claim_commission_other extrinsic for claiming commission of nomination pools permissionless? This PR does not quite introduce this additional call, but amends `do_claim_commission` to check a new `claim_permission` field in the `Commission` struct, configured by an enum: ``` enum CommissionClaimPermission { Permissionless, Account(AccountId), } ``` This can be optionally set in a bonded pool's `commission.claim_permission` field: ``` struct BondedPool { commission: { <snip> claim_permission: Option<CommissionClaimPermission<T::AccountId>>, }, <snip> } ``` This is a new field and requires a migration to add it to existing pools. This will be `None` on pool creation, falling back to the `root` role having sole access to claim commission if it is not set; this is the behaviour as it is today. Once set, the field _can_ be set to `None` again. #### Changes - [x] Add `commision.claim_permission` field. - [x] Add `can_claim_commission` and amend `do_claim_commission`. - [x] Add `set_commission_claim_permission` call. - [x] Test to cover new configs and call. - [x] Add and amend benchmarks. - [x] Generate new weights + slot into call `set_commission_claim_permission`. - [x] Add migration to introduce `commission.claim_permission`, bump storage version. - [x] Update Westend weights. - [x] Migration working. --------- Co-authored-by: command-bot <>
This commit is contained in:
@@ -27,6 +27,15 @@ use sp_runtime::TryRuntimeError;
|
||||
pub mod versioned {
|
||||
use super::*;
|
||||
|
||||
/// v8: Adds commission claim permissions to `BondedPools`.
|
||||
pub type V7ToV8<T> = frame_support::migrations::VersionedMigration<
|
||||
7,
|
||||
8,
|
||||
v8::VersionUncheckedMigrateV7ToV8<T>,
|
||||
crate::pallet::Pallet<T>,
|
||||
<T as frame_system::Config>::DbWeight,
|
||||
>;
|
||||
|
||||
/// Migration V6 to V7 wrapped in a [`frame_support::migrations::VersionedMigration`], ensuring
|
||||
/// the migration is only performed when on-chain version is 6.
|
||||
pub type V6ToV7<T> = frame_support::migrations::VersionedMigration<
|
||||
@@ -47,6 +56,74 @@ pub mod versioned {
|
||||
>;
|
||||
}
|
||||
|
||||
pub mod v8 {
|
||||
use super::*;
|
||||
|
||||
#[derive(Decode)]
|
||||
pub struct OldCommission<T: Config> {
|
||||
pub current: Option<(Perbill, T::AccountId)>,
|
||||
pub max: Option<Perbill>,
|
||||
pub change_rate: Option<CommissionChangeRate<BlockNumberFor<T>>>,
|
||||
pub throttle_from: Option<BlockNumberFor<T>>,
|
||||
}
|
||||
|
||||
#[derive(Decode)]
|
||||
pub struct OldBondedPoolInner<T: Config> {
|
||||
pub commission: OldCommission<T>,
|
||||
pub member_counter: u32,
|
||||
pub points: BalanceOf<T>,
|
||||
pub roles: PoolRoles<T::AccountId>,
|
||||
pub state: PoolState,
|
||||
}
|
||||
|
||||
impl<T: Config> OldBondedPoolInner<T> {
|
||||
fn migrate_to_v8(self) -> BondedPoolInner<T> {
|
||||
BondedPoolInner {
|
||||
commission: Commission {
|
||||
current: self.commission.current,
|
||||
max: self.commission.max,
|
||||
change_rate: self.commission.change_rate,
|
||||
throttle_from: self.commission.throttle_from,
|
||||
// `claim_permission` is a new field.
|
||||
claim_permission: None,
|
||||
},
|
||||
member_counter: self.member_counter,
|
||||
points: self.points,
|
||||
roles: self.roles,
|
||||
state: self.state,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct VersionUncheckedMigrateV7ToV8<T>(sp_std::marker::PhantomData<T>);
|
||||
impl<T: Config> OnRuntimeUpgrade for VersionUncheckedMigrateV7ToV8<T> {
|
||||
#[cfg(feature = "try-runtime")]
|
||||
fn pre_upgrade() -> Result<Vec<u8>, TryRuntimeError> {
|
||||
Ok(Vec::new())
|
||||
}
|
||||
|
||||
fn on_runtime_upgrade() -> Weight {
|
||||
let mut translated = 0u64;
|
||||
BondedPools::<T>::translate::<OldBondedPoolInner<T>, _>(|_key, old_value| {
|
||||
translated.saturating_inc();
|
||||
Some(old_value.migrate_to_v8())
|
||||
});
|
||||
T::DbWeight::get().reads_writes(translated, translated + 1)
|
||||
}
|
||||
|
||||
#[cfg(feature = "try-runtime")]
|
||||
fn post_upgrade(_: Vec<u8>) -> Result<(), TryRuntimeError> {
|
||||
// Check new `claim_permission` field is present.
|
||||
ensure!(
|
||||
BondedPools::<T>::iter()
|
||||
.all(|(_, inner)| inner.commission.claim_permission.is_none()),
|
||||
"`claim_permission` value has not been set correctly."
|
||||
);
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// This migration accumulates and initializes the [`TotalValueLocked`] for all pools.
|
||||
///
|
||||
/// WARNING: This migration works under the assumption that the [`BondedPools`] cannot be inflated
|
||||
|
||||
Reference in New Issue
Block a user