Bound staking storage items (#12230)

* replace pallet level unboundedness to individual storage items

* bound structs

* bounding history depth

* defensive error

* use the era history depth from config

* clean up history depth from storage in v11

* keep the name HistoryDepth for the new configuration value

* use u32 for history depth in node runtime

* improve doc comments

* add HistoryDepth to mock runtimes with pallet-staking

* rustfmt

* refactor and doc improve

* apply re-benchmarked weight for staking

* pr feedback improvements

* test for claimed rewards following the expected bounds

* refactor test to calculate first and last reward era programmatically

* verify previous eras cannot be claimed

* add migration v12

* ".git/.scripts/bench-bot.sh" pallet dev pallet_staking

* fix compiler error

* corrupting history depth does not lead to catastrophic issue

* fix new line

* remove unused import

* fmt

* add test to document scenario where history depth is reduced without migration

* fmt

* Update frame/staking/src/lib.rs

Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>

* Update frame/staking/src/migrations.rs

Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>

* doc for all storage items bounded by HistoryDepth

* Update frame/staking/src/pallet/mod.rs

Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>

* Update frame/staking/src/tests.rs

Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>

* pr feedback fixes

* Update frame/staking/src/tests.rs

Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>

* remove extra checks

* fix merge

* fmt

Co-authored-by: command-bot <>
Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>
Co-authored-by: kianenigma <kian@parity.io>
This commit is contained in:
Ankan
2022-09-21 10:57:02 +02:00
committed by GitHub
parent 86198c5471
commit c6a9abcc68
16 changed files with 669 additions and 483 deletions
+1 -20
View File
@@ -660,25 +660,6 @@ benchmarks! {
assert!(original_bonded < new_bonded);
}
set_history_depth {
let e in 1 .. 100;
HistoryDepth::<T>::put(e);
CurrentEra::<T>::put(e);
let dummy = || -> T::AccountId { codec::Decode::decode(&mut TrailingZeroInput::zeroes()).unwrap() };
for i in 0 .. e {
<ErasStakers<T>>::insert(i, dummy(), Exposure::<T::AccountId, BalanceOf<T>>::default());
<ErasStakersClipped<T>>::insert(i, dummy(), Exposure::<T::AccountId, BalanceOf<T>>::default());
<ErasValidatorPrefs<T>>::insert(i, dummy(), ValidatorPrefs::default());
<ErasValidatorReward<T>>::insert(i, BalanceOf::<T>::one());
<ErasRewardPoints<T>>::insert(i, EraRewardPoints::<T::AccountId>::default());
<ErasTotalStake<T>>::insert(i, BalanceOf::<T>::one());
ErasStartSessionIndex::<T>::insert(i, i);
}
}: _(RawOrigin::Root, EraIndex::zero(), u32::MAX)
verify {
assert_eq!(HistoryDepth::<T>::get(), 0);
}
reap_stash {
let s in 1 .. MAX_SPANS;
// clean up any existing state.
@@ -698,7 +679,7 @@ benchmarks! {
active: T::Currency::minimum_balance() - One::one(),
total: T::Currency::minimum_balance() - One::one(),
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: Default::default(),
};
Ledger::<T>::insert(&controller, l);
+25 -13
View File
@@ -299,12 +299,12 @@ pub mod weights;
mod pallet;
use codec::{Decode, Encode, HasCompact};
use codec::{Decode, Encode, HasCompact, MaxEncodedLen};
use frame_support::{
parameter_types,
traits::{Currency, Defensive, Get},
weights::Weight,
BoundedVec, EqNoBound, PartialEqNoBound, RuntimeDebugNoBound,
BoundedVec, CloneNoBound, EqNoBound, PartialEqNoBound, RuntimeDebugNoBound,
};
use scale_info::TypeInfo;
use sp_runtime::{
@@ -354,7 +354,7 @@ parameter_types! {
}
/// Information regarding the active era (era in used in session).
#[derive(Encode, Decode, RuntimeDebug, TypeInfo)]
#[derive(Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)]
pub struct ActiveEraInfo {
/// Index of era.
pub index: EraIndex,
@@ -395,7 +395,7 @@ pub enum StakerStatus<AccountId> {
}
/// A destination account for payment.
#[derive(PartialEq, Eq, Copy, Clone, Encode, Decode, RuntimeDebug, TypeInfo)]
#[derive(PartialEq, Eq, Copy, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)]
pub enum RewardDestination<AccountId> {
/// Pay into the stash account, increasing the amount at stake accordingly.
Staked,
@@ -416,7 +416,7 @@ impl<AccountId> Default for RewardDestination<AccountId> {
}
/// Preference of what happens regarding validation.
#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, Default)]
#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, Default, MaxEncodedLen)]
pub struct ValidatorPrefs {
/// Reward that validator takes up-front; only the rest is split between themselves and
/// nominators.
@@ -429,8 +429,8 @@ pub struct ValidatorPrefs {
}
/// Just a Balance/BlockNumber tuple to encode when a chunk of funds will be unlocked.
#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)]
pub struct UnlockChunk<Balance: HasCompact> {
#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)]
pub struct UnlockChunk<Balance: HasCompact + MaxEncodedLen> {
/// Amount of funds to be unlocked.
#[codec(compact)]
value: Balance,
@@ -440,7 +440,16 @@ pub struct UnlockChunk<Balance: HasCompact> {
}
/// The ledger of a (bonded) stash.
#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebugNoBound, TypeInfo)]
#[derive(
PartialEqNoBound,
EqNoBound,
CloneNoBound,
Encode,
Decode,
RuntimeDebugNoBound,
TypeInfo,
MaxEncodedLen,
)]
#[scale_info(skip_type_params(T))]
pub struct StakingLedger<T: Config> {
/// The stash account whose balance is actually locked and at stake.
@@ -459,7 +468,7 @@ pub struct StakingLedger<T: Config> {
pub unlocking: BoundedVec<UnlockChunk<BalanceOf<T>>, MaxUnlockingChunks>,
/// List of eras for which the stakers behind a validator have claimed rewards. Only updated
/// for validators.
pub claimed_rewards: Vec<EraIndex>,
pub claimed_rewards: BoundedVec<EraIndex, T::HistoryDepth>,
}
impl<T: Config> StakingLedger<T> {
@@ -470,7 +479,7 @@ impl<T: Config> StakingLedger<T> {
total: Zero::zero(),
active: Zero::zero(),
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: Default::default(),
}
}
@@ -676,7 +685,9 @@ impl<T: Config> StakingLedger<T> {
}
/// A record of the nominations made by a specific account.
#[derive(PartialEqNoBound, EqNoBound, Clone, Encode, Decode, RuntimeDebugNoBound, TypeInfo)]
#[derive(
PartialEqNoBound, EqNoBound, Clone, Encode, Decode, RuntimeDebugNoBound, TypeInfo, MaxEncodedLen,
)]
#[codec(mel_bound())]
#[scale_info(skip_type_params(T))]
pub struct Nominations<T: Config> {
@@ -850,7 +861,7 @@ impl<Balance: AtLeast32BitUnsigned + Clone, T: Get<&'static PiecewiseLinear<'sta
}
/// Mode of era-forcing.
#[derive(Copy, Clone, PartialEq, Eq, Encode, Decode, RuntimeDebug, TypeInfo)]
#[derive(Copy, Clone, PartialEq, Eq, Encode, Decode, RuntimeDebug, TypeInfo, MaxEncodedLen)]
#[cfg_attr(feature = "std", derive(serde::Serialize, serde::Deserialize))]
pub enum Forcing {
/// Not forcing anything - just let whatever happen.
@@ -874,7 +885,7 @@ impl Default for Forcing {
// A value placed in storage that represents the current version of the Staking storage. This value
// is used by the `on_runtime_upgrade` logic to determine whether we run storage migration logic.
// This should match directly with the semantic versions of the Rust crate.
#[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo)]
#[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo, MaxEncodedLen)]
enum Releases {
V1_0_0Ancient,
V2_0_0,
@@ -887,6 +898,7 @@ enum Releases {
V9_0_0, // inject validators into `VoterList` as well.
V10_0_0, // remove `EarliestUnappliedSlash`.
V11_0_0, // Move pallet storage prefix, e.g. BagsList -> VoterBagsList
V12_0_0, // remove `HistoryDepth`.
}
impl Default for Releases {
+47 -5
View File
@@ -20,6 +20,53 @@ use super::*;
use frame_election_provider_support::SortedListProvider;
use frame_support::traits::OnRuntimeUpgrade;
pub mod v12 {
use super::*;
use frame_support::{pallet_prelude::ValueQuery, storage_alias};
#[storage_alias]
type HistoryDepth<T: Config> = StorageValue<Pallet<T>, u32, ValueQuery>;
/// Clean up `HistoryDepth` from storage.
///
/// We will be depending on the configurable value of `HistoryDepth` post
/// this release.
pub struct MigrateToV12<T>(sp_std::marker::PhantomData<T>);
impl<T: Config> OnRuntimeUpgrade for MigrateToV12<T> {
#[cfg(feature = "try-runtime")]
fn pre_upgrade() -> Result<Vec<u8>, &'static str> {
frame_support::ensure!(
T::HistoryDepth::get() == HistoryDepth::<T>::get(),
"Provided value of HistoryDepth should be same as the existing storage value"
);
Ok(Default::default())
}
fn on_runtime_upgrade() -> frame_support::weights::Weight {
if StorageVersion::<T>::get() == Releases::V11_0_0 {
HistoryDepth::<T>::kill();
StorageVersion::<T>::put(Releases::V12_0_0);
log!(info, "v12 applied successfully");
T::DbWeight::get().reads_writes(1, 2)
} else {
log!(warn, "Skipping v12, should be removed");
T::DbWeight::get().reads(1)
}
}
#[cfg(feature = "try-runtime")]
fn post_upgrade(_state: Vec<u8>) -> Result<(), &'static str> {
frame_support::ensure!(
StorageVersion::<T>::get() == crate::Releases::V12_0_0,
"v12 not applied"
);
Ok(())
}
}
}
pub mod v11 {
use super::*;
use frame_support::{
@@ -82,11 +129,6 @@ pub mod v11 {
#[cfg(feature = "try-runtime")]
fn post_upgrade(_state: Vec<u8>) -> Result<(), &'static str> {
frame_support::ensure!(
StorageVersion::<T>::get() == crate::Releases::V11_0_0,
"wrong version after the upgrade"
);
let old_pallet_name = N::get();
let new_pallet_name = <P as PalletInfoAccess>::name();
+2
View File
@@ -236,6 +236,7 @@ const THRESHOLDS: [sp_npos_elections::VoteWeight; 9] =
parameter_types! {
pub static BagThresholds: &'static [sp_npos_elections::VoteWeight] = &THRESHOLDS;
pub static MaxNominations: u32 = 16;
pub static HistoryDepth: u32 = 80;
pub static RewardOnUnbalanceWasCalled: bool = false;
pub static LedgerSlashPerEra: (BalanceOf<Test>, BTreeMap<EraIndex, BalanceOf<Test>>) = (Zero::zero(), BTreeMap::new());
}
@@ -301,6 +302,7 @@ impl crate::pallet::pallet::Config for Test {
type VoterList = VoterBagsList;
type TargetList = UseValidatorsMap<Self>;
type MaxUnlockingChunks = ConstU32<32>;
type HistoryDepth = HistoryDepth;
type OnStakerSlash = OnStakerSlashMock<Test>;
type BenchmarkingConfig = TestBenchmarkingConfig;
type WeightInfo = ();
+16 -9
View File
@@ -25,8 +25,8 @@ use frame_support::{
dispatch::WithPostDispatchInfo,
pallet_prelude::*,
traits::{
Currency, CurrencyToVote, Defensive, EstimateNextNewSession, Get, Imbalance,
LockableCurrency, OnUnbalanced, UnixTime, WithdrawReasons,
Currency, CurrencyToVote, Defensive, DefensiveResult, EstimateNextNewSession, Get,
Imbalance, LockableCurrency, OnUnbalanced, UnixTime, WithdrawReasons,
},
weights::Weight,
};
@@ -101,7 +101,7 @@ impl<T: Config> Pallet<T> {
Error::<T>::InvalidEraToReward
.with_weight(T::WeightInfo::payout_stakers_alive_staked(0))
})?;
let history_depth = Self::history_depth();
let history_depth = T::HistoryDepth::get();
ensure!(
era <= current_era && era >= current_era.saturating_sub(history_depth),
Error::<T>::InvalidEraToReward
@@ -123,11 +123,18 @@ impl<T: Config> Pallet<T> {
ledger
.claimed_rewards
.retain(|&x| x >= current_era.saturating_sub(history_depth));
match ledger.claimed_rewards.binary_search(&era) {
Ok(_) =>
return Err(Error::<T>::AlreadyClaimed
.with_weight(T::WeightInfo::payout_stakers_alive_staked(0))),
Err(pos) => ledger.claimed_rewards.insert(pos, era),
Err(pos) => ledger
.claimed_rewards
.try_insert(pos, era)
// Since we retain era entries in `claimed_rewards` only upto
// `HistoryDepth`, following bound is always expected to be
// satisfied.
.defensive_map_err(|_| Error::<T>::BoundNotMet)?,
}
let exposure = <ErasStakersClipped<T>>::get(&era, &ledger.stash);
@@ -417,7 +424,7 @@ impl<T: Config> Pallet<T> {
ErasStartSessionIndex::<T>::insert(&new_planned_era, &start_session_index);
// Clean old era information.
if let Some(old_era) = new_planned_era.checked_sub(Self::history_depth() + 1) {
if let Some(old_era) = new_planned_era.checked_sub(T::HistoryDepth::get() + 1) {
Self::clear_era_information(old_era);
}
@@ -966,7 +973,7 @@ impl<T: Config> ElectionDataProvider for Pallet<T> {
active: stake,
total: stake,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: Default::default(),
},
);
@@ -984,7 +991,7 @@ impl<T: Config> ElectionDataProvider for Pallet<T> {
active: stake,
total: stake,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: Default::default(),
},
);
Self::do_add_validator(
@@ -1025,7 +1032,7 @@ impl<T: Config> ElectionDataProvider for Pallet<T> {
active: stake,
total: stake,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: Default::default(),
},
);
Self::do_add_validator(
@@ -1046,7 +1053,7 @@ impl<T: Config> ElectionDataProvider for Pallet<T> {
active: stake,
total: stake,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: Default::default(),
},
);
Self::do_add_nominator(
+43 -66
View File
@@ -22,10 +22,12 @@ use frame_support::{
dispatch::Codec,
pallet_prelude::*,
traits::{
Currency, CurrencyToVote, Defensive, DefensiveSaturating, EnsureOrigin,
EstimateNextNewSession, Get, LockIdentifier, LockableCurrency, OnUnbalanced, UnixTime,
Currency, CurrencyToVote, Defensive, DefensiveResult, DefensiveSaturating, EnsureOrigin,
EstimateNextNewSession, Get, LockIdentifier, LockableCurrency, OnUnbalanced, TryCollect,
UnixTime,
},
weights::Weight,
BoundedVec,
};
use frame_system::{ensure_root, ensure_signed, pallet_prelude::*};
use sp_runtime::{
@@ -58,7 +60,6 @@ pub mod pallet {
#[pallet::pallet]
#[pallet::generate_store(pub(crate) trait Store)]
#[pallet::without_storage_info]
pub struct Pallet<T>(_);
/// Possible operations on the configuration values of this pallet.
@@ -124,6 +125,28 @@ pub mod pallet {
#[pallet::constant]
type MaxNominations: Get<u32>;
/// Number of eras to keep in history.
///
/// Following information is kept for eras in `[current_era -
/// HistoryDepth, current_era]`: `ErasStakers`, `ErasStakersClipped`,
/// `ErasValidatorPrefs`, `ErasValidatorReward`, `ErasRewardPoints`,
/// `ErasTotalStake`, `ErasStartSessionIndex`,
/// `StakingLedger.claimed_rewards`.
///
/// Must be more than the number of eras delayed by session.
/// I.e. active era must always be in history. I.e. `active_era >
/// current_era - history_depth` must be guaranteed.
///
/// If migrating an existing pallet from storage value to config value,
/// this should be set to same value or greater as in storage.
///
/// Note: `HistoryDepth` is used as the upper bound for the `BoundedVec`
/// item `StakingLedger.claimed_rewards`. Setting this value lower than
/// the existing value can lead to inconsistencies and will need to be
/// handled properly in a migration.
#[pallet::constant]
type HistoryDepth: Get<u32>;
/// Tokens have been minted and are unused for validator-reward.
/// See [Era payout](./index.html#era-payout).
type RewardRemainder: OnUnbalanced<NegativeImbalanceOf<Self>>;
@@ -230,22 +253,6 @@ pub mod pallet {
type WeightInfo: WeightInfo;
}
#[pallet::type_value]
pub(crate) fn HistoryDepthOnEmpty() -> u32 {
84u32
}
/// Number of eras to keep in history.
///
/// Information is kept for eras in `[current_era - history_depth; current_era]`.
///
/// Must be more than the number of eras delayed by session otherwise. I.e. active era must
/// always be in history. I.e. `active_era > current_era - history_depth` must be
/// guaranteed.
#[pallet::storage]
#[pallet::getter(fn history_depth)]
pub(crate) type HistoryDepth<T> = StorageValue<_, u32, ValueQuery, HistoryDepthOnEmpty>;
/// The ideal number of staking participants.
#[pallet::storage]
#[pallet::getter(fn validator_count)]
@@ -261,6 +268,7 @@ pub mod pallet {
/// invulnerables) and restricted to testnets.
#[pallet::storage]
#[pallet::getter(fn invulnerables)]
#[pallet::unbounded]
pub type Invulnerables<T: Config> = StorageValue<_, Vec<T::AccountId>, ValueQuery>;
/// Map from all locked "stash" accounts to the controller account.
@@ -364,6 +372,7 @@ pub mod pallet {
/// If stakers hasn't been set or has been removed then empty exposure is returned.
#[pallet::storage]
#[pallet::getter(fn eras_stakers)]
#[pallet::unbounded]
pub type ErasStakers<T: Config> = StorageDoubleMap<
_,
Twox64Concat,
@@ -386,6 +395,7 @@ pub mod pallet {
/// Is it removed after `HISTORY_DEPTH` eras.
/// If stakers hasn't been set or has been removed then empty exposure is returned.
#[pallet::storage]
#[pallet::unbounded]
#[pallet::getter(fn eras_stakers_clipped)]
pub type ErasStakersClipped<T: Config> = StorageDoubleMap<
_,
@@ -425,6 +435,7 @@ pub mod pallet {
/// Rewards for the last `HISTORY_DEPTH` eras.
/// If reward hasn't been set or has been removed then 0 reward is returned.
#[pallet::storage]
#[pallet::unbounded]
#[pallet::getter(fn eras_reward_points)]
pub type ErasRewardPoints<T: Config> =
StorageMap<_, Twox64Concat, EraIndex, EraRewardPoints<T::AccountId>, ValueQuery>;
@@ -456,6 +467,7 @@ pub mod pallet {
/// All unapplied slashes that are queued for later.
#[pallet::storage]
#[pallet::unbounded]
pub type UnappliedSlashes<T: Config> = StorageMap<
_,
Twox64Concat,
@@ -469,6 +481,7 @@ pub mod pallet {
/// Must contains information for eras for the range:
/// `[active_era - bounding_duration; active_era]`
#[pallet::storage]
#[pallet::unbounded]
pub(crate) type BondedEras<T: Config> =
StorageValue<_, Vec<(EraIndex, SessionIndex)>, ValueQuery>;
@@ -491,6 +504,7 @@ pub mod pallet {
/// Slashing spans for stash accounts.
#[pallet::storage]
#[pallet::unbounded]
pub(crate) type SlashingSpans<T: Config> =
StorageMap<_, Twox64Concat, T::AccountId, slashing::SlashingSpans>;
@@ -522,6 +536,7 @@ pub mod pallet {
/// whether a given validator has previously offended using binary search. It gets cleared when
/// the era ends.
#[pallet::storage]
#[pallet::unbounded]
#[pallet::getter(fn offending_validators)]
pub type OffendingValidators<T: Config> = StorageValue<_, Vec<(u32, bool)>, ValueQuery>;
@@ -540,7 +555,6 @@ pub mod pallet {
#[pallet::genesis_config]
pub struct GenesisConfig<T: Config> {
pub history_depth: u32,
pub validator_count: u32,
pub minimum_validator_count: u32,
pub invulnerables: Vec<T::AccountId>,
@@ -559,7 +573,6 @@ pub mod pallet {
impl<T: Config> Default for GenesisConfig<T> {
fn default() -> Self {
GenesisConfig {
history_depth: 84u32,
validator_count: Default::default(),
minimum_validator_count: Default::default(),
invulnerables: Default::default(),
@@ -578,7 +591,6 @@ pub mod pallet {
#[pallet::genesis_build]
impl<T: Config> GenesisBuild<T> for GenesisConfig<T> {
fn build(&self) {
HistoryDepth::<T>::put(self.history_depth);
ValidatorCount::<T>::put(self.validator_count);
MinimumValidatorCount::<T>::put(self.minimum_validator_count);
Invulnerables::<T>::put(&self.invulnerables);
@@ -729,6 +741,8 @@ pub mod pallet {
TooManyValidators,
/// Commission is too low. Must be at least `MinCommission`.
CommissionTooLow,
/// Some bound is not met.
BoundNotMet,
}
#[pallet::hooks]
@@ -830,7 +844,7 @@ pub mod pallet {
<Payee<T>>::insert(&stash, payee);
let current_era = CurrentEra::<T>::get().unwrap_or(0);
let history_depth = Self::history_depth();
let history_depth = T::HistoryDepth::get();
let last_reward_era = current_era.saturating_sub(history_depth);
let stash_balance = T::Currency::free_balance(&stash);
@@ -841,7 +855,12 @@ pub mod pallet {
total: value,
active: value,
unlocking: Default::default(),
claimed_rewards: (last_reward_era..current_era).collect(),
claimed_rewards: (last_reward_era..current_era)
.try_collect()
// Since last_reward_era is calculated as `current_era -
// HistoryDepth`, following bound is always expected to be
// satisfied.
.defensive_map_err(|_| Error::<T>::BoundNotMet)?,
};
Self::update_ledger(&controller, &item);
Ok(())
@@ -1466,48 +1485,6 @@ pub mod pallet {
Ok(Some(T::WeightInfo::rebond(removed_chunks)).into())
}
/// Set `HistoryDepth` value. This function will delete any history information
/// when `HistoryDepth` is reduced.
///
/// Parameters:
/// - `new_history_depth`: The new history depth you would like to set.
/// - `era_items_deleted`: The number of items that will be deleted by this dispatch. This
/// should report all the storage items that will be deleted by clearing old era history.
/// Needed to report an accurate weight for the dispatch. Trusted by `Root` to report an
/// accurate number.
///
/// RuntimeOrigin must be root.
///
/// # <weight>
/// - E: Number of history depths removed, i.e. 10 -> 7 = 3
/// - Weight: O(E)
/// - DB Weight:
/// - Reads: Current Era, History Depth
/// - Writes: History Depth
/// - Clear Prefix Each: Era Stakers, EraStakersClipped, ErasValidatorPrefs
/// - Writes Each: ErasValidatorReward, ErasRewardPoints, ErasTotalStake,
/// ErasStartSessionIndex
/// # </weight>
#[pallet::weight(T::WeightInfo::set_history_depth(*_era_items_deleted))]
pub fn set_history_depth(
origin: OriginFor<T>,
#[pallet::compact] new_history_depth: EraIndex,
#[pallet::compact] _era_items_deleted: u32,
) -> DispatchResult {
ensure_root(origin)?;
if let Some(current_era) = Self::current_era() {
HistoryDepth::<T>::mutate(|history_depth| {
let last_kept = current_era.saturating_sub(*history_depth);
let new_last_kept = current_era.saturating_sub(new_history_depth);
for era_index in last_kept..new_last_kept {
Self::clear_era_information(era_index);
}
*history_depth = new_history_depth
})
}
Ok(())
}
/// Remove all data structures concerning a staker/stash once it is at a state where it can
/// be considered `dust` in the staking system. The requirements are:
///
+2 -2
View File
@@ -53,7 +53,7 @@ use crate::{
BalanceOf, Config, Error, Exposure, NegativeImbalanceOf, Pallet, Perbill, SessionInterface,
Store, UnappliedSlash,
};
use codec::{Decode, Encode};
use codec::{Decode, Encode, MaxEncodedLen};
use frame_support::{
ensure,
traits::{Currency, Defensive, Get, Imbalance, OnUnbalanced},
@@ -182,7 +182,7 @@ impl SlashingSpans {
}
/// A slashing-span record for a particular stash.
#[derive(Encode, Decode, Default, TypeInfo)]
#[derive(Encode, Decode, Default, TypeInfo, MaxEncodedLen)]
pub(crate) struct SpanRecord<Balance> {
slashed: Balance,
paid_out: Balance,
+256 -92
View File
@@ -148,14 +148,14 @@ fn basic_setup_works() {
// Account 10 controls the stash from account 11, which is 100 * balance_factor units
assert_eq!(
Staking::ledger(&10),
Some(StakingLedger {
Staking::ledger(&10).unwrap(),
StakingLedger {
stash: 11,
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: vec![]
})
claimed_rewards: bounded_vec![],
}
);
// Account 20 controls the stash from account 21, which is 200 * balance_factor units
assert_eq!(
@@ -165,7 +165,7 @@ fn basic_setup_works() {
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: vec![]
claimed_rewards: bounded_vec![],
})
);
// Account 1 does not control any stash
@@ -188,7 +188,7 @@ fn basic_setup_works() {
total: 500,
active: 500,
unlocking: Default::default(),
claimed_rewards: vec![]
claimed_rewards: bounded_vec![],
})
);
assert_eq!(Staking::nominators(101).unwrap().targets, vec![11, 21]);
@@ -433,7 +433,7 @@ fn staking_should_work() {
total: 1500,
active: 1500,
unlocking: Default::default(),
claimed_rewards: vec![0],
claimed_rewards: bounded_vec![0],
})
);
// e.g. it cannot reserve more than 500 that it has free from the total 2000
@@ -1022,7 +1022,7 @@ fn reward_destination_works() {
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
@@ -1045,7 +1045,7 @@ fn reward_destination_works() {
total: 1000 + total_payout_0,
active: 1000 + total_payout_0,
unlocking: Default::default(),
claimed_rewards: vec![0],
claimed_rewards: bounded_vec![0],
})
);
@@ -1073,7 +1073,7 @@ fn reward_destination_works() {
total: 1000 + total_payout_0,
active: 1000 + total_payout_0,
unlocking: Default::default(),
claimed_rewards: vec![0, 1],
claimed_rewards: bounded_vec![0, 1],
})
);
@@ -1102,7 +1102,7 @@ fn reward_destination_works() {
total: 1000 + total_payout_0,
active: 1000 + total_payout_0,
unlocking: Default::default(),
claimed_rewards: vec![0, 1, 2],
claimed_rewards: bounded_vec![0, 1, 2],
})
);
// Check that amount in staked account is NOT increased.
@@ -1164,7 +1164,7 @@ fn bond_extra_works() {
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
@@ -1181,7 +1181,7 @@ fn bond_extra_works() {
total: 1000 + 100,
active: 1000 + 100,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
@@ -1195,7 +1195,7 @@ fn bond_extra_works() {
total: 1000000,
active: 1000000,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
});
@@ -1233,7 +1233,7 @@ fn bond_extra_and_withdraw_unbonded_works() {
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
assert_eq!(
@@ -1251,7 +1251,7 @@ fn bond_extra_and_withdraw_unbonded_works() {
total: 1000 + 100,
active: 1000 + 100,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
// Exposure is a snapshot! only updated after the next era update.
@@ -1272,7 +1272,7 @@ fn bond_extra_and_withdraw_unbonded_works() {
total: 1000 + 100,
active: 1000 + 100,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
// Exposure is now updated.
@@ -1290,7 +1290,7 @@ fn bond_extra_and_withdraw_unbonded_works() {
total: 1000 + 100,
active: 100,
unlocking: bounded_vec![UnlockChunk { value: 1000, era: 2 + 3 }],
claimed_rewards: vec![]
claimed_rewards: bounded_vec![],
}),
);
@@ -1303,7 +1303,7 @@ fn bond_extra_and_withdraw_unbonded_works() {
total: 1000 + 100,
active: 100,
unlocking: bounded_vec![UnlockChunk { value: 1000, era: 2 + 3 }],
claimed_rewards: vec![]
claimed_rewards: bounded_vec![],
}),
);
@@ -1319,7 +1319,7 @@ fn bond_extra_and_withdraw_unbonded_works() {
total: 1000 + 100,
active: 100,
unlocking: bounded_vec![UnlockChunk { value: 1000, era: 2 + 3 }],
claimed_rewards: vec![]
claimed_rewards: bounded_vec![],
}),
);
@@ -1335,7 +1335,7 @@ fn bond_extra_and_withdraw_unbonded_works() {
total: 100,
active: 100,
unlocking: Default::default(),
claimed_rewards: vec![]
claimed_rewards: bounded_vec![],
}),
);
})
@@ -1405,7 +1405,7 @@ fn rebond_works() {
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
@@ -1424,7 +1424,7 @@ fn rebond_works() {
total: 1000,
active: 100,
unlocking: bounded_vec![UnlockChunk { value: 900, era: 2 + 3 }],
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
@@ -1437,7 +1437,7 @@ fn rebond_works() {
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
@@ -1450,7 +1450,7 @@ fn rebond_works() {
total: 1000,
active: 100,
unlocking: bounded_vec![UnlockChunk { value: 900, era: 5 }],
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
@@ -1463,7 +1463,7 @@ fn rebond_works() {
total: 1000,
active: 600,
unlocking: bounded_vec![UnlockChunk { value: 400, era: 5 }],
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
@@ -1476,7 +1476,7 @@ fn rebond_works() {
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
@@ -1491,7 +1491,7 @@ fn rebond_works() {
total: 1000,
active: 100,
unlocking: bounded_vec![UnlockChunk { value: 900, era: 5 }],
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
@@ -1504,7 +1504,7 @@ fn rebond_works() {
total: 1000,
active: 600,
unlocking: bounded_vec![UnlockChunk { value: 400, era: 5 }],
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
})
@@ -1531,7 +1531,7 @@ fn rebond_is_fifo() {
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
@@ -1546,7 +1546,7 @@ fn rebond_is_fifo() {
total: 1000,
active: 600,
unlocking: bounded_vec![UnlockChunk { value: 400, era: 2 + 3 }],
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
@@ -1564,7 +1564,7 @@ fn rebond_is_fifo() {
UnlockChunk { value: 400, era: 2 + 3 },
UnlockChunk { value: 300, era: 3 + 3 },
],
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
@@ -1583,7 +1583,7 @@ fn rebond_is_fifo() {
UnlockChunk { value: 300, era: 3 + 3 },
UnlockChunk { value: 200, era: 4 + 3 },
],
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
@@ -1599,7 +1599,7 @@ fn rebond_is_fifo() {
UnlockChunk { value: 400, era: 2 + 3 },
UnlockChunk { value: 100, era: 3 + 3 },
],
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
})
@@ -1628,7 +1628,7 @@ fn rebond_emits_right_value_in_event() {
total: 1000,
active: 100,
unlocking: bounded_vec![UnlockChunk { value: 900, era: 1 + 3 }],
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
@@ -1641,7 +1641,7 @@ fn rebond_emits_right_value_in_event() {
total: 1000,
active: 200,
unlocking: bounded_vec![UnlockChunk { value: 800, era: 1 + 3 }],
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
// Event emitted should be correct
@@ -1656,7 +1656,7 @@ fn rebond_emits_right_value_in_event() {
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
// Event emitted should be correct, only 800
@@ -1692,7 +1692,7 @@ fn reward_to_stake_works() {
total: 69,
active: 69,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
},
);
@@ -1756,7 +1756,7 @@ fn reap_stash_works() {
total: 5,
active: 5,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
},
);
@@ -1891,7 +1891,7 @@ fn bond_with_no_staked_value() {
active: 0,
total: 5,
unlocking: bounded_vec![UnlockChunk { value: 5, era: 3 }],
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
@@ -2990,7 +2990,7 @@ fn staker_cannot_bail_deferred_slash() {
active: 0,
total: 500,
stash: 101,
claimed_rewards: Default::default(),
claimed_rewards: bounded_vec![],
unlocking: bounded_vec![UnlockChunk { era: 4u32, value: 500 }],
}
);
@@ -3397,7 +3397,7 @@ fn claim_reward_at_the_last_era_and_no_double_claim_and_invalid_claim() {
// * double claim of one era fails
ExtBuilder::default().nominate(true).build_and_execute(|| {
// Consumed weight for all payout_stakers dispatches that fail
let err_weight = weights::SubstrateWeight::<Test>::payout_stakers_alive_staked(0);
let err_weight = <Test as Config>::WeightInfo::payout_stakers_alive_staked(0);
let init_balance_10 = Balances::total_balance(&10);
let init_balance_100 = Balances::total_balance(&100);
@@ -3432,7 +3432,7 @@ fn claim_reward_at_the_last_era_and_no_double_claim_and_invalid_claim() {
assert!(total_payout_2 != total_payout_0);
assert!(total_payout_2 != total_payout_1);
mock::start_active_era(Staking::history_depth() + 1);
mock::start_active_era(HistoryDepth::get() + 1);
let active_era = active_era();
@@ -3440,7 +3440,7 @@ fn claim_reward_at_the_last_era_and_no_double_claim_and_invalid_claim() {
let current_era = Staking::current_era().unwrap();
// Last kept is 1:
assert!(current_era - Staking::history_depth() == 1);
assert!(current_era - HistoryDepth::get() == 1);
assert_noop!(
Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 0),
// Fail: Era out of history
@@ -3604,25 +3604,6 @@ fn test_max_nominator_rewarded_per_validator_and_cant_steal_someone_else_reward(
});
}
#[test]
fn set_history_depth_works() {
ExtBuilder::default().build_and_execute(|| {
mock::start_active_era(10);
Staking::set_history_depth(RuntimeOrigin::root(), 20, 0).unwrap();
assert!(<Staking as Store>::ErasTotalStake::contains_key(10 - 4));
assert!(<Staking as Store>::ErasTotalStake::contains_key(10 - 5));
Staking::set_history_depth(RuntimeOrigin::root(), 4, 0).unwrap();
assert!(<Staking as Store>::ErasTotalStake::contains_key(10 - 4));
assert!(!<Staking as Store>::ErasTotalStake::contains_key(10 - 5));
Staking::set_history_depth(RuntimeOrigin::root(), 3, 0).unwrap();
assert!(!<Staking as Store>::ErasTotalStake::contains_key(10 - 4));
assert!(!<Staking as Store>::ErasTotalStake::contains_key(10 - 5));
Staking::set_history_depth(RuntimeOrigin::root(), 8, 0).unwrap();
assert!(!<Staking as Store>::ErasTotalStake::contains_key(10 - 4));
assert!(!<Staking as Store>::ErasTotalStake::contains_key(10 - 5));
});
}
#[test]
fn test_payout_stakers() {
// Test that payout_stakers work in general, including that only the top
@@ -3686,7 +3667,7 @@ fn test_payout_stakers() {
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: vec![1]
claimed_rewards: bounded_vec![1]
})
);
@@ -3717,11 +3698,15 @@ fn test_payout_stakers() {
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: (1..=14).collect()
claimed_rewards: (1..=14).collect::<Vec<_>>().try_into().unwrap()
})
);
for i in 16..100 {
let last_era = 99;
let history_depth = HistoryDepth::get();
let expected_last_reward_era = last_era - 1;
let expected_start_reward_era = last_era - history_depth;
for i in 16..=last_era {
Staking::reward_by_ids(vec![(11, 1)]);
// compute and ensure the reward amount is greater than zero.
let _ = current_total_payout_for_duration(reward_time_per_era());
@@ -3729,8 +3714,16 @@ fn test_payout_stakers() {
}
// We clean it up as history passes
assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 15));
assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 98));
assert_ok!(Staking::payout_stakers(
RuntimeOrigin::signed(1337),
11,
expected_start_reward_era
));
assert_ok!(Staking::payout_stakers(
RuntimeOrigin::signed(1337),
11,
expected_last_reward_era
));
assert_eq!(
Staking::ledger(&10),
Some(StakingLedger {
@@ -3738,7 +3731,7 @@ fn test_payout_stakers() {
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: vec![15, 98]
claimed_rewards: bounded_vec![expected_start_reward_era, expected_last_reward_era]
})
);
@@ -3753,7 +3746,13 @@ fn test_payout_stakers() {
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: vec![15, 23, 42, 69, 98]
claimed_rewards: bounded_vec![
expected_start_reward_era,
23,
42,
69,
expected_last_reward_era
]
})
);
});
@@ -3764,7 +3763,7 @@ fn payout_stakers_handles_basic_errors() {
// Here we will test payouts handle all errors.
ExtBuilder::default().has_stakers(false).build_and_execute(|| {
// Consumed weight for all payout_stakers dispatches that fail
let err_weight = weights::SubstrateWeight::<Test>::payout_stakers_alive_staked(0);
let err_weight = <Test as Config>::WeightInfo::payout_stakers_alive_staked(0);
// Same setup as the test above
let balance = 1000;
@@ -3794,32 +3793,47 @@ fn payout_stakers_handles_basic_errors() {
Error::<Test>::NotStash.with_weight(err_weight)
);
for i in 3..100 {
let last_era = 99;
for i in 3..=last_era {
Staking::reward_by_ids(vec![(11, 1)]);
// compute and ensure the reward amount is greater than zero.
let _ = current_total_payout_for_duration(reward_time_per_era());
mock::start_active_era(i);
}
// We are at era 99, with history depth of 84
// We should be able to payout era 15 through 98 (84 total eras), but not 14 or 99.
let history_depth = HistoryDepth::get();
let expected_last_reward_era = last_era - 1;
let expected_start_reward_era = last_era - history_depth;
// We are at era last_era=99. Given history_depth=80, we should be able
// to payout era starting from expected_start_reward_era=19 through
// expected_last_reward_era=98 (80 total eras), but not 18 or 99.
assert_noop!(
Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 14),
Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, expected_start_reward_era - 1),
Error::<Test>::InvalidEraToReward.with_weight(err_weight)
);
assert_noop!(
Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 99),
Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, expected_last_reward_era + 1),
Error::<Test>::InvalidEraToReward.with_weight(err_weight)
);
assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 15));
assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 98));
assert_ok!(Staking::payout_stakers(
RuntimeOrigin::signed(1337),
11,
expected_start_reward_era
));
assert_ok!(Staking::payout_stakers(
RuntimeOrigin::signed(1337),
11,
expected_last_reward_era
));
// Can't claim again
assert_noop!(
Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 15),
Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, expected_start_reward_era),
Error::<Test>::AlreadyClaimed.with_weight(err_weight)
);
assert_noop!(
Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, 98),
Staking::payout_stakers(RuntimeOrigin::signed(1337), 11, expected_last_reward_era),
Error::<Test>::AlreadyClaimed.with_weight(err_weight)
);
});
@@ -3944,7 +3958,7 @@ fn bond_during_era_correctly_populates_claimed_rewards() {
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
})
);
mock::start_active_era(5);
@@ -3956,10 +3970,14 @@ fn bond_during_era_correctly_populates_claimed_rewards() {
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: (0..5).collect(),
claimed_rewards: (0..5).collect::<Vec<_>>().try_into().unwrap(),
})
);
mock::start_active_era(99);
// make sure only era upto history depth is stored
let current_era = 99;
let last_reward_era = 99 - HistoryDepth::get();
mock::start_active_era(current_era);
bond_validator(13, 12, 1000);
assert_eq!(
Staking::ledger(&12),
@@ -3968,7 +3986,10 @@ fn bond_during_era_correctly_populates_claimed_rewards() {
total: 1000,
active: 1000,
unlocking: Default::default(),
claimed_rewards: (15..99).collect(),
claimed_rewards: (last_reward_era..current_era)
.collect::<Vec<_>>()
.try_into()
.unwrap(),
})
);
});
@@ -4213,7 +4234,7 @@ fn cannot_rebond_to_lower_than_ed() {
total: 10 * 1000,
active: 10 * 1000,
unlocking: Default::default(),
claimed_rewards: vec![]
claimed_rewards: bounded_vec![],
}
);
@@ -4227,7 +4248,7 @@ fn cannot_rebond_to_lower_than_ed() {
total: 10 * 1000,
active: 0,
unlocking: bounded_vec![UnlockChunk { value: 10 * 1000, era: 3 }],
claimed_rewards: vec![]
claimed_rewards: bounded_vec![],
}
);
@@ -4253,7 +4274,7 @@ fn cannot_bond_extra_to_lower_than_ed() {
total: 10 * 1000,
active: 10 * 1000,
unlocking: Default::default(),
claimed_rewards: vec![]
claimed_rewards: bounded_vec![],
}
);
@@ -4267,7 +4288,7 @@ fn cannot_bond_extra_to_lower_than_ed() {
total: 10 * 1000,
active: 0,
unlocking: bounded_vec![UnlockChunk { value: 10 * 1000, era: 3 }],
claimed_rewards: vec![]
claimed_rewards: bounded_vec![],
}
);
@@ -4294,7 +4315,7 @@ fn do_not_die_when_active_is_ed() {
total: 1000 * ed,
active: 1000 * ed,
unlocking: Default::default(),
claimed_rewards: vec![]
claimed_rewards: bounded_vec![],
}
);
@@ -4311,7 +4332,7 @@ fn do_not_die_when_active_is_ed() {
total: ed,
active: ed,
unlocking: Default::default(),
claimed_rewards: vec![]
claimed_rewards: bounded_vec![],
}
);
})
@@ -5162,7 +5183,7 @@ fn proportional_slash_stop_slashing_if_remaining_zero() {
active: 20,
// we have some chunks, but they are not affected.
unlocking: bounded_vec![c(1, 10), c(2, 10)],
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
};
assert_eq!(BondingDuration::get(), 3);
@@ -5180,7 +5201,7 @@ fn proportional_ledger_slash_works() {
total: 10,
active: 10,
unlocking: bounded_vec![],
claimed_rewards: vec![],
claimed_rewards: bounded_vec![],
};
assert_eq!(BondingDuration::get(), 3);
@@ -5396,3 +5417,146 @@ fn proportional_ledger_slash_works() {
BTreeMap::from([(4, 0), (5, value_slashed), (6, 0), (7, 0)])
);
}
#[test]
fn pre_bonding_era_cannot_be_claimed() {
// Verifies initial conditions of mock
ExtBuilder::default().nominate(false).build_and_execute(|| {
let history_depth = HistoryDepth::get();
// jump to some era above history_depth
let mut current_era = history_depth + 10;
let last_reward_era = current_era - 1;
let start_reward_era = current_era - history_depth;
// put some money in stash=3 and controller=4.
for i in 3..5 {
let _ = Balances::make_free_balance_be(&i, 2000);
}
mock::start_active_era(current_era);
// add a new candidate for being a validator. account 3 controlled by 4.
assert_ok!(Staking::bond(RuntimeOrigin::signed(3), 4, 1500, RewardDestination::Controller));
let claimed_rewards: BoundedVec<_, _> =
(start_reward_era..=last_reward_era).collect::<Vec<_>>().try_into().unwrap();
assert_eq!(
Staking::ledger(&4).unwrap(),
StakingLedger {
stash: 3,
total: 1500,
active: 1500,
unlocking: Default::default(),
claimed_rewards,
}
);
// start next era
current_era = current_era + 1;
mock::start_active_era(current_era);
// claiming reward for last era in which validator was active works
assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(4), 3, current_era - 1));
// consumed weight for all payout_stakers dispatches that fail
let err_weight = <Test as Config>::WeightInfo::payout_stakers_alive_staked(0);
// cannot claim rewards for an era before bonding occured as it is
// already marked as claimed.
assert_noop!(
Staking::payout_stakers(RuntimeOrigin::signed(4), 3, current_era - 2),
Error::<Test>::AlreadyClaimed.with_weight(err_weight)
);
// decoding will fail now since Staking Ledger is in corrupt state
HistoryDepth::set(history_depth - 1);
assert_eq!(Staking::ledger(&4), None);
// make sure stakers still cannot claim rewards that they are not meant to
assert_noop!(
Staking::payout_stakers(RuntimeOrigin::signed(4), 3, current_era - 2),
Error::<Test>::NotController
);
// fix the corrupted state for post conditions check
HistoryDepth::set(history_depth);
});
}
#[test]
fn reducing_history_depth_without_migration() {
// Verifies initial conditions of mock
ExtBuilder::default().nominate(false).build_and_execute(|| {
let original_history_depth = HistoryDepth::get();
let mut current_era = original_history_depth + 10;
let last_reward_era = current_era - 1;
let start_reward_era = current_era - original_history_depth;
// put some money in (stash, controller)=(3,4),(5,6).
for i in 3..7 {
let _ = Balances::make_free_balance_be(&i, 2000);
}
// start current era
mock::start_active_era(current_era);
// add a new candidate for being a staker. account 3 controlled by 4.
assert_ok!(Staking::bond(RuntimeOrigin::signed(3), 4, 1500, RewardDestination::Controller));
// all previous era before the bonding action should be marked as
// claimed.
let claimed_rewards: BoundedVec<_, _> =
(start_reward_era..=last_reward_era).collect::<Vec<_>>().try_into().unwrap();
assert_eq!(
Staking::ledger(&4).unwrap(),
StakingLedger {
stash: 3,
total: 1500,
active: 1500,
unlocking: Default::default(),
claimed_rewards,
}
);
// next era
current_era = current_era + 1;
mock::start_active_era(current_era);
// claiming reward for last era in which validator was active works
assert_ok!(Staking::payout_stakers(RuntimeOrigin::signed(4), 3, current_era - 1));
// next era
current_era = current_era + 1;
mock::start_active_era(current_era);
// history_depth reduced without migration
let history_depth = original_history_depth - 1;
HistoryDepth::set(history_depth);
// claiming reward does not work anymore
assert_noop!(
Staking::payout_stakers(RuntimeOrigin::signed(4), 3, current_era - 1),
Error::<Test>::NotController
);
// new stakers can still bond
assert_ok!(Staking::bond(RuntimeOrigin::signed(5), 6, 1200, RewardDestination::Controller));
// new staking ledgers created will be bounded by the current history depth
let last_reward_era = current_era - 1;
let start_reward_era = current_era - history_depth;
let claimed_rewards: BoundedVec<_, _> =
(start_reward_era..=last_reward_era).collect::<Vec<_>>().try_into().unwrap();
assert_eq!(
Staking::ledger(&6).unwrap(),
StakingLedger {
stash: 5,
total: 1200,
active: 1200,
unlocking: Default::default(),
claimed_rewards,
}
);
// fix the corrupted state for post conditions check
HistoryDepth::set(original_history_depth);
});
}
+269 -276
View File
@@ -18,22 +18,24 @@
//! Autogenerated weights for pallet_staking
//!
//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
//! DATE: 2022-05-24, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! DATE: 2022-09-19, STEPS: `50`, REPEAT: 20, LOW RANGE: `[]`, HIGH RANGE: `[]`
//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz`
//! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024
// Executed Command:
// ./target/production/substrate
// /home/benchbot/cargo_target_dir/production/substrate
// benchmark
// pallet
// --chain=dev
// --steps=50
// --repeat=20
// --pallet=pallet_staking
// --extrinsic=*
// --execution=wasm
// --wasm-execution=compiled
// --template=./.maintain/frame-weight-template.hbs
// --heap-pages=4096
// --pallet=pallet_staking
// --chain=dev
// --output=./frame/staking/src/weights.rs
// --template=./.maintain/frame-weight-template.hbs
#![cfg_attr(rustfmt, rustfmt_skip)]
#![allow(unused_parens)]
@@ -65,7 +67,6 @@ pub trait WeightInfo {
fn payout_stakers_dead_controller(n: u32, ) -> Weight;
fn payout_stakers_alive_staked(n: u32, ) -> Weight;
fn rebond(l: u32, ) -> Weight;
fn set_history_depth(e: u32, ) -> Weight;
fn reap_stash(s: u32, ) -> Weight;
fn new_era(v: u32, n: u32, ) -> Weight;
fn get_npos_voters(v: u32, n: u32, s: u32, ) -> Weight;
@@ -82,21 +83,20 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Staking Bonded (r:1 w:1)
// Storage: Staking Ledger (r:1 w:1)
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Staking HistoryDepth (r:1 w:0)
// Storage: Balances Locks (r:1 w:1)
// Storage: Staking Payee (r:0 w:1)
fn bond() -> Weight {
Weight::from_ref_time(43_992_000 as u64)
.saturating_add(T::DbWeight::get().reads(5 as u64))
Weight::from_ref_time(52_281_000 as u64)
.saturating_add(T::DbWeight::get().reads(4 as u64))
.saturating_add(T::DbWeight::get().writes(4 as u64))
}
// Storage: Staking Bonded (r:1 w:0)
// Storage: Staking Ledger (r:1 w:1)
// Storage: Balances Locks (r:1 w:1)
// Storage: BagsList ListNodes (r:3 w:3)
// Storage: BagsList ListBags (r:2 w:2)
// Storage: VoterBagsList ListNodes (r:3 w:3)
// Storage: VoterBagsList ListBags (r:2 w:2)
fn bond_extra() -> Weight {
Weight::from_ref_time(75_827_000 as u64)
Weight::from_ref_time(89_748_000 as u64)
.saturating_add(T::DbWeight::get().reads(8 as u64))
.saturating_add(T::DbWeight::get().writes(7 as u64))
}
@@ -106,11 +106,11 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Balances Locks (r:1 w:1)
// Storage: System Account (r:1 w:1)
// Storage: BagsList ListNodes (r:3 w:3)
// Storage: VoterBagsList ListNodes (r:3 w:3)
// Storage: Staking Bonded (r:1 w:0)
// Storage: BagsList ListBags (r:2 w:2)
// Storage: VoterBagsList ListBags (r:2 w:2)
fn unbond() -> Weight {
Weight::from_ref_time(81_075_000 as u64)
Weight::from_ref_time(94_782_000 as u64)
.saturating_add(T::DbWeight::get().reads(12 as u64))
.saturating_add(T::DbWeight::get().writes(8 as u64))
}
@@ -118,10 +118,11 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Balances Locks (r:1 w:1)
// Storage: System Account (r:1 w:1)
/// The range of component `s` is `[0, 100]`.
fn withdraw_unbonded_update(s: u32, ) -> Weight {
Weight::from_ref_time(35_763_000 as u64)
// Standard Error: 0
.saturating_add(Weight::from_ref_time(57_000 as u64).saturating_mul(s as u64))
Weight::from_ref_time(44_499_000 as u64)
// Standard Error: 387
.saturating_add(Weight::from_ref_time(72_726 as u64).saturating_mul(s as u64))
.saturating_add(T::DbWeight::get().reads(4 as u64))
.saturating_add(T::DbWeight::get().writes(3 as u64))
}
@@ -132,14 +133,17 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Staking Validators (r:1 w:0)
// Storage: Staking Nominators (r:1 w:1)
// Storage: Staking CounterForNominators (r:1 w:1)
// Storage: BagsList ListNodes (r:2 w:2)
// Storage: BagsList ListBags (r:1 w:1)
// Storage: BagsList CounterForListNodes (r:1 w:1)
// Storage: VoterBagsList ListNodes (r:2 w:2)
// Storage: VoterBagsList ListBags (r:1 w:1)
// Storage: VoterBagsList CounterForListNodes (r:1 w:1)
// Storage: System Account (r:1 w:1)
// Storage: Balances Locks (r:1 w:1)
// Storage: Staking Payee (r:0 w:1)
fn withdraw_unbonded_kill(_s: u32, ) -> Weight {
Weight::from_ref_time(66_938_000 as u64)
/// The range of component `s` is `[0, 100]`.
fn withdraw_unbonded_kill(s: u32, ) -> Weight {
Weight::from_ref_time(83_230_000 as u64)
// Standard Error: 612
.saturating_add(Weight::from_ref_time(10_289 as u64).saturating_mul(s as u64))
.saturating_add(T::DbWeight::get().reads(13 as u64))
.saturating_add(T::DbWeight::get().writes(11 as u64))
}
@@ -150,23 +154,25 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Staking MaxValidatorsCount (r:1 w:0)
// Storage: Staking Nominators (r:1 w:0)
// Storage: Staking Bonded (r:1 w:0)
// Storage: BagsList ListNodes (r:1 w:1)
// Storage: BagsList ListBags (r:1 w:1)
// Storage: BagsList CounterForListNodes (r:1 w:1)
// Storage: VoterBagsList ListNodes (r:1 w:1)
// Storage: VoterBagsList ListBags (r:1 w:1)
// Storage: VoterBagsList CounterForListNodes (r:1 w:1)
// Storage: Staking CounterForValidators (r:1 w:1)
fn validate() -> Weight {
Weight::from_ref_time(52_943_000 as u64)
Weight::from_ref_time(64_430_000 as u64)
.saturating_add(T::DbWeight::get().reads(11 as u64))
.saturating_add(T::DbWeight::get().writes(5 as u64))
}
// Storage: Staking Ledger (r:1 w:0)
// Storage: Staking Nominators (r:1 w:1)
/// The range of component `k` is `[1, 128]`.
fn kick(k: u32, ) -> Weight {
Weight::from_ref_time(23_264_000 as u64)
// Standard Error: 11_000
.saturating_add(Weight::from_ref_time(8_006_000 as u64).saturating_mul(k as u64))
.saturating_add(T::DbWeight::get().reads(1 as u64))
Weight::from_ref_time(42_030_000 as u64)
// Standard Error: 5_873
.saturating_add(Weight::from_ref_time(6_747_156 as u64).saturating_mul(k as u64))
.saturating_add(T::DbWeight::get().reads(2 as u64))
.saturating_add(T::DbWeight::get().reads((1 as u64).saturating_mul(k as u64)))
.saturating_add(T::DbWeight::get().writes(1 as u64))
.saturating_add(T::DbWeight::get().writes((1 as u64).saturating_mul(k as u64)))
}
// Storage: Staking Ledger (r:1 w:0)
@@ -176,15 +182,16 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Staking Validators (r:2 w:0)
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Staking Bonded (r:1 w:0)
// Storage: BagsList ListNodes (r:2 w:2)
// Storage: BagsList ListBags (r:1 w:1)
// Storage: BagsList CounterForListNodes (r:1 w:1)
// Storage: VoterBagsList ListNodes (r:2 w:2)
// Storage: VoterBagsList ListBags (r:1 w:1)
// Storage: VoterBagsList CounterForListNodes (r:1 w:1)
// Storage: Staking CounterForNominators (r:1 w:1)
/// The range of component `n` is `[1, 16]`.
fn nominate(n: u32, ) -> Weight {
Weight::from_ref_time(56_596_000 as u64)
// Standard Error: 14_000
.saturating_add(Weight::from_ref_time(3_644_000 as u64).saturating_mul(n as u64))
.saturating_add(T::DbWeight::get().reads(12 as u64))
Weight::from_ref_time(70_834_000 as u64)
// Standard Error: 4_405
.saturating_add(Weight::from_ref_time(2_583_120 as u64).saturating_mul(n as u64))
.saturating_add(T::DbWeight::get().reads(13 as u64))
.saturating_add(T::DbWeight::get().reads((1 as u64).saturating_mul(n as u64)))
.saturating_add(T::DbWeight::get().writes(6 as u64))
}
@@ -192,53 +199,54 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Staking Validators (r:1 w:0)
// Storage: Staking Nominators (r:1 w:1)
// Storage: Staking CounterForNominators (r:1 w:1)
// Storage: BagsList ListNodes (r:2 w:2)
// Storage: BagsList ListBags (r:1 w:1)
// Storage: BagsList CounterForListNodes (r:1 w:1)
// Storage: VoterBagsList ListNodes (r:2 w:2)
// Storage: VoterBagsList ListBags (r:1 w:1)
// Storage: VoterBagsList CounterForListNodes (r:1 w:1)
fn chill() -> Weight {
Weight::from_ref_time(51_117_000 as u64)
Weight::from_ref_time(63_328_000 as u64)
.saturating_add(T::DbWeight::get().reads(8 as u64))
.saturating_add(T::DbWeight::get().writes(6 as u64))
}
// Storage: Staking Ledger (r:1 w:0)
// Storage: Staking Payee (r:0 w:1)
fn set_payee() -> Weight {
Weight::from_ref_time(11_223_000 as u64)
Weight::from_ref_time(17_763_000 as u64)
.saturating_add(T::DbWeight::get().reads(1 as u64))
.saturating_add(T::DbWeight::get().writes(1 as u64))
}
// Storage: Staking Bonded (r:1 w:1)
// Storage: Staking Ledger (r:2 w:2)
fn set_controller() -> Weight {
Weight::from_ref_time(19_826_000 as u64)
Weight::from_ref_time(26_163_000 as u64)
.saturating_add(T::DbWeight::get().reads(3 as u64))
.saturating_add(T::DbWeight::get().writes(3 as u64))
}
// Storage: Staking ValidatorCount (r:0 w:1)
fn set_validator_count() -> Weight {
Weight::from_ref_time(3_789_000 as u64)
Weight::from_ref_time(4_842_000 as u64)
.saturating_add(T::DbWeight::get().writes(1 as u64))
}
// Storage: Staking ForceEra (r:0 w:1)
fn force_no_eras() -> Weight {
Weight::from_ref_time(3_793_000 as u64)
Weight::from_ref_time(4_974_000 as u64)
.saturating_add(T::DbWeight::get().writes(1 as u64))
}
// Storage: Staking ForceEra (r:0 w:1)
fn force_new_era() -> Weight {
Weight::from_ref_time(3_802_000 as u64)
Weight::from_ref_time(5_039_000 as u64)
.saturating_add(T::DbWeight::get().writes(1 as u64))
}
// Storage: Staking ForceEra (r:0 w:1)
fn force_new_era_always() -> Weight {
Weight::from_ref_time(3_762_000 as u64)
Weight::from_ref_time(4_950_000 as u64)
.saturating_add(T::DbWeight::get().writes(1 as u64))
}
// Storage: Staking Invulnerables (r:0 w:1)
/// The range of component `v` is `[0, 1000]`.
fn set_invulnerables(v: u32, ) -> Weight {
Weight::from_ref_time(4_318_000 as u64)
// Standard Error: 0
.saturating_add(Weight::from_ref_time(10_000 as u64).saturating_mul(v as u64))
Weight::from_ref_time(5_150_000 as u64)
// Standard Error: 30
.saturating_add(Weight::from_ref_time(10_540 as u64).saturating_mul(v as u64))
.saturating_add(T::DbWeight::get().writes(1 as u64))
}
// Storage: Staking Bonded (r:1 w:1)
@@ -246,32 +254,33 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Staking Validators (r:1 w:0)
// Storage: Staking Nominators (r:1 w:1)
// Storage: Staking CounterForNominators (r:1 w:1)
// Storage: BagsList ListNodes (r:2 w:2)
// Storage: BagsList ListBags (r:1 w:1)
// Storage: BagsList CounterForListNodes (r:1 w:1)
// Storage: VoterBagsList ListNodes (r:2 w:2)
// Storage: VoterBagsList ListBags (r:1 w:1)
// Storage: VoterBagsList CounterForListNodes (r:1 w:1)
// Storage: System Account (r:1 w:1)
// Storage: Balances Locks (r:1 w:1)
// Storage: Staking Ledger (r:0 w:1)
// Storage: Staking Payee (r:0 w:1)
// Storage: Staking SpanSlash (r:0 w:2)
/// The range of component `s` is `[0, 100]`.
fn force_unstake(s: u32, ) -> Weight {
Weight::from_ref_time(65_265_000 as u64)
// Standard Error: 1_000
.saturating_add(Weight::from_ref_time(1_029_000 as u64).saturating_mul(s as u64))
Weight::from_ref_time(76_282_000 as u64)
// Standard Error: 2_397
.saturating_add(Weight::from_ref_time(1_137_934 as u64).saturating_mul(s as u64))
.saturating_add(T::DbWeight::get().reads(11 as u64))
.saturating_add(T::DbWeight::get().writes(12 as u64))
.saturating_add(T::DbWeight::get().writes(11 as u64))
.saturating_add(T::DbWeight::get().writes((1 as u64).saturating_mul(s as u64)))
}
// Storage: Staking UnappliedSlashes (r:1 w:1)
/// The range of component `s` is `[1, 1000]`.
fn cancel_deferred_slash(s: u32, ) -> Weight {
Weight::from_ref_time(903_312_000 as u64)
// Standard Error: 56_000
.saturating_add(Weight::from_ref_time(4_968_000 as u64).saturating_mul(s as u64))
Weight::from_ref_time(93_690_000 as u64)
// Standard Error: 43_203
.saturating_add(Weight::from_ref_time(6_149_862 as u64).saturating_mul(s as u64))
.saturating_add(T::DbWeight::get().reads(1 as u64))
.saturating_add(T::DbWeight::get().writes(1 as u64))
}
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Staking HistoryDepth (r:1 w:0)
// Storage: Staking ErasValidatorReward (r:1 w:0)
// Storage: Staking Bonded (r:2 w:0)
// Storage: Staking Ledger (r:1 w:1)
@@ -280,17 +289,17 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Staking ErasValidatorPrefs (r:1 w:0)
// Storage: Staking Payee (r:2 w:0)
// Storage: System Account (r:2 w:2)
/// The range of component `n` is `[1, 256]`.
fn payout_stakers_dead_controller(n: u32, ) -> Weight {
Weight::from_ref_time(87_569_000 as u64)
// Standard Error: 14_000
.saturating_add(Weight::from_ref_time(24_232_000 as u64).saturating_mul(n as u64))
.saturating_add(T::DbWeight::get().reads(10 as u64))
Weight::from_ref_time(151_647_000 as u64)
// Standard Error: 8_237
.saturating_add(Weight::from_ref_time(21_296_415 as u64).saturating_mul(n as u64))
.saturating_add(T::DbWeight::get().reads(12 as u64))
.saturating_add(T::DbWeight::get().reads((3 as u64).saturating_mul(n as u64)))
.saturating_add(T::DbWeight::get().writes(2 as u64))
.saturating_add(T::DbWeight::get().writes(3 as u64))
.saturating_add(T::DbWeight::get().writes((1 as u64).saturating_mul(n as u64)))
}
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Staking HistoryDepth (r:1 w:0)
// Storage: Staking ErasValidatorReward (r:1 w:0)
// Storage: Staking Bonded (r:2 w:0)
// Storage: Staking Ledger (r:2 w:2)
@@ -300,45 +309,30 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Staking Payee (r:2 w:0)
// Storage: System Account (r:2 w:2)
// Storage: Balances Locks (r:2 w:2)
/// The range of component `n` is `[1, 256]`.
fn payout_stakers_alive_staked(n: u32, ) -> Weight {
Weight::from_ref_time(98_839_000 as u64)
// Standard Error: 21_000
.saturating_add(Weight::from_ref_time(34_480_000 as u64).saturating_mul(n as u64))
.saturating_add(T::DbWeight::get().reads(11 as u64))
Weight::from_ref_time(197_310_000 as u64)
// Standard Error: 13_818
.saturating_add(Weight::from_ref_time(30_053_043 as u64).saturating_mul(n as u64))
.saturating_add(T::DbWeight::get().reads(15 as u64))
.saturating_add(T::DbWeight::get().reads((5 as u64).saturating_mul(n as u64)))
.saturating_add(T::DbWeight::get().writes(3 as u64))
.saturating_add(T::DbWeight::get().writes(6 as u64))
.saturating_add(T::DbWeight::get().writes((3 as u64).saturating_mul(n as u64)))
}
// Storage: Staking Ledger (r:1 w:1)
// Storage: Balances Locks (r:1 w:1)
// Storage: System Account (r:1 w:1)
// Storage: BagsList ListNodes (r:3 w:3)
// Storage: VoterBagsList ListNodes (r:3 w:3)
// Storage: Staking Bonded (r:1 w:0)
// Storage: BagsList ListBags (r:2 w:2)
// Storage: VoterBagsList ListBags (r:2 w:2)
/// The range of component `l` is `[1, 32]`.
fn rebond(l: u32, ) -> Weight {
Weight::from_ref_time(74_865_000 as u64)
// Standard Error: 3_000
.saturating_add(Weight::from_ref_time(64_000 as u64).saturating_mul(l as u64))
Weight::from_ref_time(89_469_000 as u64)
// Standard Error: 1_197
.saturating_add(Weight::from_ref_time(74_212 as u64).saturating_mul(l as u64))
.saturating_add(T::DbWeight::get().reads(9 as u64))
.saturating_add(T::DbWeight::get().writes(8 as u64))
}
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Staking HistoryDepth (r:1 w:1)
// Storage: Staking ErasStakersClipped (r:0 w:2)
// Storage: Staking ErasValidatorPrefs (r:0 w:2)
// Storage: Staking ErasValidatorReward (r:0 w:1)
// Storage: Staking ErasRewardPoints (r:0 w:1)
// Storage: Staking ErasStakers (r:0 w:2)
// Storage: Staking ErasTotalStake (r:0 w:1)
// Storage: Staking ErasStartSessionIndex (r:0 w:1)
fn set_history_depth(e: u32, ) -> Weight {
Weight::from_ref_time(0 as u64)
// Standard Error: 62_000
.saturating_add(Weight::from_ref_time(22_829_000 as u64).saturating_mul(e as u64))
.saturating_add(T::DbWeight::get().reads(2 as u64))
.saturating_add(T::DbWeight::get().writes(4 as u64))
.saturating_add(T::DbWeight::get().writes((7 as u64).saturating_mul(e as u64)))
}
// Storage: System Account (r:1 w:1)
// Storage: Staking Bonded (r:1 w:1)
// Storage: Staking Ledger (r:1 w:1)
@@ -346,24 +340,25 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Staking Validators (r:1 w:0)
// Storage: Staking Nominators (r:1 w:1)
// Storage: Staking CounterForNominators (r:1 w:1)
// Storage: BagsList ListNodes (r:2 w:2)
// Storage: BagsList ListBags (r:1 w:1)
// Storage: BagsList CounterForListNodes (r:1 w:1)
// Storage: VoterBagsList ListNodes (r:2 w:2)
// Storage: VoterBagsList ListBags (r:1 w:1)
// Storage: VoterBagsList CounterForListNodes (r:1 w:1)
// Storage: Balances Locks (r:1 w:1)
// Storage: Staking Payee (r:0 w:1)
// Storage: Staking SpanSlash (r:0 w:1)
/// The range of component `s` is `[1, 100]`.
fn reap_stash(s: u32, ) -> Weight {
Weight::from_ref_time(70_933_000 as u64)
// Standard Error: 1_000
.saturating_add(Weight::from_ref_time(1_021_000 as u64).saturating_mul(s as u64))
Weight::from_ref_time(88_333_000 as u64)
// Standard Error: 1_567
.saturating_add(Weight::from_ref_time(1_101_099 as u64).saturating_mul(s as u64))
.saturating_add(T::DbWeight::get().reads(12 as u64))
.saturating_add(T::DbWeight::get().writes(12 as u64))
.saturating_add(T::DbWeight::get().writes(13 as u64))
.saturating_add(T::DbWeight::get().writes((1 as u64).saturating_mul(s as u64)))
}
// Storage: BagsList CounterForListNodes (r:1 w:0)
// Storage: VoterBagsList CounterForListNodes (r:1 w:0)
// Storage: Staking SlashingSpans (r:1 w:0)
// Storage: BagsList ListBags (r:200 w:0)
// Storage: BagsList ListNodes (r:101 w:0)
// Storage: VoterBagsList ListBags (r:200 w:0)
// Storage: VoterBagsList ListNodes (r:101 w:0)
// Storage: Staking Nominators (r:101 w:0)
// Storage: Staking Validators (r:2 w:0)
// Storage: Staking Bonded (r:101 w:0)
@@ -372,52 +367,54 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Staking ValidatorCount (r:1 w:0)
// Storage: Staking MinimumValidatorCount (r:1 w:0)
// Storage: Staking CurrentEra (r:1 w:1)
// Storage: Staking HistoryDepth (r:1 w:0)
// Storage: Staking ErasStakersClipped (r:0 w:1)
// Storage: Staking ErasValidatorPrefs (r:0 w:1)
// Storage: Staking ErasStakers (r:0 w:1)
// Storage: Staking ErasTotalStake (r:0 w:1)
// Storage: Staking ErasStartSessionIndex (r:0 w:1)
/// The range of component `v` is `[1, 10]`.
/// The range of component `n` is `[1, 100]`.
fn new_era(v: u32, n: u32, ) -> Weight {
Weight::from_ref_time(0 as u64)
// Standard Error: 897_000
.saturating_add(Weight::from_ref_time(213_100_000 as u64).saturating_mul(v as u64))
// Standard Error: 45_000
.saturating_add(Weight::from_ref_time(31_123_000 as u64).saturating_mul(n as u64))
.saturating_add(T::DbWeight::get().reads(208 as u64))
.saturating_add(T::DbWeight::get().reads((5 as u64).saturating_mul(v as u64)))
Weight::from_ref_time(572_530_000 as u64)
// Standard Error: 3_166_542
.saturating_add(Weight::from_ref_time(101_354_358 as u64).saturating_mul(v as u64))
// Standard Error: 315_238
.saturating_add(Weight::from_ref_time(15_565_319 as u64).saturating_mul(n as u64))
.saturating_add(T::DbWeight::get().reads(261 as u64))
.saturating_add(T::DbWeight::get().reads((1 as u64).saturating_mul(v as u64)))
.saturating_add(T::DbWeight::get().reads((4 as u64).saturating_mul(n as u64)))
.saturating_add(T::DbWeight::get().writes(3 as u64))
.saturating_add(T::DbWeight::get().writes(6 as u64))
.saturating_add(T::DbWeight::get().writes((3 as u64).saturating_mul(v as u64)))
}
// Storage: BagsList CounterForListNodes (r:1 w:0)
// Storage: VoterBagsList CounterForListNodes (r:1 w:0)
// Storage: Staking SlashingSpans (r:21 w:0)
// Storage: BagsList ListBags (r:200 w:0)
// Storage: BagsList ListNodes (r:1500 w:0)
// Storage: VoterBagsList ListBags (r:200 w:0)
// Storage: VoterBagsList ListNodes (r:1500 w:0)
// Storage: Staking Nominators (r:1500 w:0)
// Storage: Staking Validators (r:500 w:0)
// Storage: Staking Bonded (r:1500 w:0)
// Storage: Staking Ledger (r:1500 w:0)
fn get_npos_voters(v: u32, n: u32, s: u32, ) -> Weight {
Weight::from_ref_time(0 as u64)
// Standard Error: 116_000
.saturating_add(Weight::from_ref_time(23_745_000 as u64).saturating_mul(v as u64))
// Standard Error: 116_000
.saturating_add(Weight::from_ref_time(22_497_000 as u64).saturating_mul(n as u64))
// Standard Error: 3_968_000
.saturating_add(Weight::from_ref_time(20_676_000 as u64).saturating_mul(s as u64))
.saturating_add(T::DbWeight::get().reads(202 as u64))
.saturating_add(T::DbWeight::get().reads((5 as u64).saturating_mul(v as u64)))
.saturating_add(T::DbWeight::get().reads((4 as u64).saturating_mul(n as u64)))
.saturating_add(T::DbWeight::get().reads((1 as u64).saturating_mul(s as u64)))
/// The range of component `v` is `[500, 1000]`.
/// The range of component `n` is `[500, 1000]`.
/// The range of component `s` is `[1, 20]`.
fn get_npos_voters(v: u32, n: u32, _s: u32, ) -> Weight {
Weight::from_ref_time(24_930_788_000 as u64)
// Standard Error: 266_386
.saturating_add(Weight::from_ref_time(6_687_552 as u64).saturating_mul(v as u64))
// Standard Error: 266_386
.saturating_add(Weight::from_ref_time(6_839_134 as u64).saturating_mul(n as u64))
.saturating_add(T::DbWeight::get().reads(6722 as u64))
.saturating_add(T::DbWeight::get().reads((2 as u64).saturating_mul(v as u64)))
.saturating_add(T::DbWeight::get().reads((1 as u64).saturating_mul(n as u64)))
}
// Storage: Staking CounterForValidators (r:1 w:0)
// Storage: Staking Validators (r:501 w:0)
/// The range of component `v` is `[500, 1000]`.
fn get_npos_targets(v: u32, ) -> Weight {
Weight::from_ref_time(0 as u64)
// Standard Error: 36_000
.saturating_add(Weight::from_ref_time(8_097_000 as u64).saturating_mul(v as u64))
.saturating_add(T::DbWeight::get().reads(1 as u64))
.saturating_add(T::DbWeight::get().reads((1 as u64).saturating_mul(v as u64)))
Weight::from_ref_time(4_864_727_000 as u64)
// Standard Error: 54_240
.saturating_add(Weight::from_ref_time(3_319_738 as u64).saturating_mul(v as u64))
.saturating_add(T::DbWeight::get().reads(502 as u64))
}
// Storage: Staking MinCommission (r:0 w:1)
// Storage: Staking MinValidatorBond (r:0 w:1)
@@ -426,7 +423,7 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Staking MaxNominatorsCount (r:0 w:1)
// Storage: Staking MinNominatorBond (r:0 w:1)
fn set_staking_configs_all_set() -> Weight {
Weight::from_ref_time(7_041_000 as u64)
Weight::from_ref_time(10_141_000 as u64)
.saturating_add(T::DbWeight::get().writes(6 as u64))
}
// Storage: Staking MinCommission (r:0 w:1)
@@ -436,7 +433,7 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Staking MaxNominatorsCount (r:0 w:1)
// Storage: Staking MinNominatorBond (r:0 w:1)
fn set_staking_configs_all_remove() -> Weight {
Weight::from_ref_time(6_495_000 as u64)
Weight::from_ref_time(8_993_000 as u64)
.saturating_add(T::DbWeight::get().writes(6 as u64))
}
// Storage: Staking Ledger (r:1 w:0)
@@ -446,18 +443,18 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> {
// Storage: Staking CounterForNominators (r:1 w:1)
// Storage: Staking MinNominatorBond (r:1 w:0)
// Storage: Staking Validators (r:1 w:0)
// Storage: BagsList ListNodes (r:2 w:2)
// Storage: BagsList ListBags (r:1 w:1)
// Storage: BagsList CounterForListNodes (r:1 w:1)
// Storage: VoterBagsList ListNodes (r:2 w:2)
// Storage: VoterBagsList ListBags (r:1 w:1)
// Storage: VoterBagsList CounterForListNodes (r:1 w:1)
fn chill_other() -> Weight {
Weight::from_ref_time(62_014_000 as u64)
Weight::from_ref_time(79_082_000 as u64)
.saturating_add(T::DbWeight::get().reads(11 as u64))
.saturating_add(T::DbWeight::get().writes(6 as u64))
}
// Storage: Staking MinCommission (r:1 w:0)
// Storage: Staking Validators (r:1 w:1)
fn force_apply_min_commission() -> Weight {
Weight::from_ref_time(12_814_000 as u64)
Weight::from_ref_time(19_265_000 as u64)
.saturating_add(T::DbWeight::get().reads(2 as u64))
.saturating_add(T::DbWeight::get().writes(1 as u64))
}
@@ -468,21 +465,20 @@ impl WeightInfo for () {
// Storage: Staking Bonded (r:1 w:1)
// Storage: Staking Ledger (r:1 w:1)
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Staking HistoryDepth (r:1 w:0)
// Storage: Balances Locks (r:1 w:1)
// Storage: Staking Payee (r:0 w:1)
fn bond() -> Weight {
Weight::from_ref_time(43_992_000 as u64)
.saturating_add(RocksDbWeight::get().reads(5 as u64))
Weight::from_ref_time(52_281_000 as u64)
.saturating_add(RocksDbWeight::get().reads(4 as u64))
.saturating_add(RocksDbWeight::get().writes(4 as u64))
}
// Storage: Staking Bonded (r:1 w:0)
// Storage: Staking Ledger (r:1 w:1)
// Storage: Balances Locks (r:1 w:1)
// Storage: BagsList ListNodes (r:3 w:3)
// Storage: BagsList ListBags (r:2 w:2)
// Storage: VoterBagsList ListNodes (r:3 w:3)
// Storage: VoterBagsList ListBags (r:2 w:2)
fn bond_extra() -> Weight {
Weight::from_ref_time(75_827_000 as u64)
Weight::from_ref_time(89_748_000 as u64)
.saturating_add(RocksDbWeight::get().reads(8 as u64))
.saturating_add(RocksDbWeight::get().writes(7 as u64))
}
@@ -492,11 +488,11 @@ impl WeightInfo for () {
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Balances Locks (r:1 w:1)
// Storage: System Account (r:1 w:1)
// Storage: BagsList ListNodes (r:3 w:3)
// Storage: VoterBagsList ListNodes (r:3 w:3)
// Storage: Staking Bonded (r:1 w:0)
// Storage: BagsList ListBags (r:2 w:2)
// Storage: VoterBagsList ListBags (r:2 w:2)
fn unbond() -> Weight {
Weight::from_ref_time(81_075_000 as u64)
Weight::from_ref_time(94_782_000 as u64)
.saturating_add(RocksDbWeight::get().reads(12 as u64))
.saturating_add(RocksDbWeight::get().writes(8 as u64))
}
@@ -504,10 +500,11 @@ impl WeightInfo for () {
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Balances Locks (r:1 w:1)
// Storage: System Account (r:1 w:1)
/// The range of component `s` is `[0, 100]`.
fn withdraw_unbonded_update(s: u32, ) -> Weight {
Weight::from_ref_time(35_763_000 as u64)
// Standard Error: 0
.saturating_add(Weight::from_ref_time(57_000 as u64).saturating_mul(s as u64))
Weight::from_ref_time(44_499_000 as u64)
// Standard Error: 387
.saturating_add(Weight::from_ref_time(72_726 as u64).saturating_mul(s as u64))
.saturating_add(RocksDbWeight::get().reads(4 as u64))
.saturating_add(RocksDbWeight::get().writes(3 as u64))
}
@@ -518,14 +515,17 @@ impl WeightInfo for () {
// Storage: Staking Validators (r:1 w:0)
// Storage: Staking Nominators (r:1 w:1)
// Storage: Staking CounterForNominators (r:1 w:1)
// Storage: BagsList ListNodes (r:2 w:2)
// Storage: BagsList ListBags (r:1 w:1)
// Storage: BagsList CounterForListNodes (r:1 w:1)
// Storage: VoterBagsList ListNodes (r:2 w:2)
// Storage: VoterBagsList ListBags (r:1 w:1)
// Storage: VoterBagsList CounterForListNodes (r:1 w:1)
// Storage: System Account (r:1 w:1)
// Storage: Balances Locks (r:1 w:1)
// Storage: Staking Payee (r:0 w:1)
fn withdraw_unbonded_kill(_s: u32, ) -> Weight {
Weight::from_ref_time(66_938_000 as u64)
/// The range of component `s` is `[0, 100]`.
fn withdraw_unbonded_kill(s: u32, ) -> Weight {
Weight::from_ref_time(83_230_000 as u64)
// Standard Error: 612
.saturating_add(Weight::from_ref_time(10_289 as u64).saturating_mul(s as u64))
.saturating_add(RocksDbWeight::get().reads(13 as u64))
.saturating_add(RocksDbWeight::get().writes(11 as u64))
}
@@ -536,23 +536,25 @@ impl WeightInfo for () {
// Storage: Staking MaxValidatorsCount (r:1 w:0)
// Storage: Staking Nominators (r:1 w:0)
// Storage: Staking Bonded (r:1 w:0)
// Storage: BagsList ListNodes (r:1 w:1)
// Storage: BagsList ListBags (r:1 w:1)
// Storage: BagsList CounterForListNodes (r:1 w:1)
// Storage: VoterBagsList ListNodes (r:1 w:1)
// Storage: VoterBagsList ListBags (r:1 w:1)
// Storage: VoterBagsList CounterForListNodes (r:1 w:1)
// Storage: Staking CounterForValidators (r:1 w:1)
fn validate() -> Weight {
Weight::from_ref_time(52_943_000 as u64)
Weight::from_ref_time(64_430_000 as u64)
.saturating_add(RocksDbWeight::get().reads(11 as u64))
.saturating_add(RocksDbWeight::get().writes(5 as u64))
}
// Storage: Staking Ledger (r:1 w:0)
// Storage: Staking Nominators (r:1 w:1)
/// The range of component `k` is `[1, 128]`.
fn kick(k: u32, ) -> Weight {
Weight::from_ref_time(23_264_000 as u64)
// Standard Error: 11_000
.saturating_add(Weight::from_ref_time(8_006_000 as u64).saturating_mul(k as u64))
.saturating_add(RocksDbWeight::get().reads(1 as u64))
Weight::from_ref_time(42_030_000 as u64)
// Standard Error: 5_873
.saturating_add(Weight::from_ref_time(6_747_156 as u64).saturating_mul(k as u64))
.saturating_add(RocksDbWeight::get().reads(2 as u64))
.saturating_add(RocksDbWeight::get().reads((1 as u64).saturating_mul(k as u64)))
.saturating_add(RocksDbWeight::get().writes(1 as u64))
.saturating_add(RocksDbWeight::get().writes((1 as u64).saturating_mul(k as u64)))
}
// Storage: Staking Ledger (r:1 w:0)
@@ -562,15 +564,16 @@ impl WeightInfo for () {
// Storage: Staking Validators (r:2 w:0)
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Staking Bonded (r:1 w:0)
// Storage: BagsList ListNodes (r:2 w:2)
// Storage: BagsList ListBags (r:1 w:1)
// Storage: BagsList CounterForListNodes (r:1 w:1)
// Storage: VoterBagsList ListNodes (r:2 w:2)
// Storage: VoterBagsList ListBags (r:1 w:1)
// Storage: VoterBagsList CounterForListNodes (r:1 w:1)
// Storage: Staking CounterForNominators (r:1 w:1)
/// The range of component `n` is `[1, 16]`.
fn nominate(n: u32, ) -> Weight {
Weight::from_ref_time(56_596_000 as u64)
// Standard Error: 14_000
.saturating_add(Weight::from_ref_time(3_644_000 as u64).saturating_mul(n as u64))
.saturating_add(RocksDbWeight::get().reads(12 as u64))
Weight::from_ref_time(70_834_000 as u64)
// Standard Error: 4_405
.saturating_add(Weight::from_ref_time(2_583_120 as u64).saturating_mul(n as u64))
.saturating_add(RocksDbWeight::get().reads(13 as u64))
.saturating_add(RocksDbWeight::get().reads((1 as u64).saturating_mul(n as u64)))
.saturating_add(RocksDbWeight::get().writes(6 as u64))
}
@@ -578,53 +581,54 @@ impl WeightInfo for () {
// Storage: Staking Validators (r:1 w:0)
// Storage: Staking Nominators (r:1 w:1)
// Storage: Staking CounterForNominators (r:1 w:1)
// Storage: BagsList ListNodes (r:2 w:2)
// Storage: BagsList ListBags (r:1 w:1)
// Storage: BagsList CounterForListNodes (r:1 w:1)
// Storage: VoterBagsList ListNodes (r:2 w:2)
// Storage: VoterBagsList ListBags (r:1 w:1)
// Storage: VoterBagsList CounterForListNodes (r:1 w:1)
fn chill() -> Weight {
Weight::from_ref_time(51_117_000 as u64)
Weight::from_ref_time(63_328_000 as u64)
.saturating_add(RocksDbWeight::get().reads(8 as u64))
.saturating_add(RocksDbWeight::get().writes(6 as u64))
}
// Storage: Staking Ledger (r:1 w:0)
// Storage: Staking Payee (r:0 w:1)
fn set_payee() -> Weight {
Weight::from_ref_time(11_223_000 as u64)
Weight::from_ref_time(17_763_000 as u64)
.saturating_add(RocksDbWeight::get().reads(1 as u64))
.saturating_add(RocksDbWeight::get().writes(1 as u64))
}
// Storage: Staking Bonded (r:1 w:1)
// Storage: Staking Ledger (r:2 w:2)
fn set_controller() -> Weight {
Weight::from_ref_time(19_826_000 as u64)
Weight::from_ref_time(26_163_000 as u64)
.saturating_add(RocksDbWeight::get().reads(3 as u64))
.saturating_add(RocksDbWeight::get().writes(3 as u64))
}
// Storage: Staking ValidatorCount (r:0 w:1)
fn set_validator_count() -> Weight {
Weight::from_ref_time(3_789_000 as u64)
Weight::from_ref_time(4_842_000 as u64)
.saturating_add(RocksDbWeight::get().writes(1 as u64))
}
// Storage: Staking ForceEra (r:0 w:1)
fn force_no_eras() -> Weight {
Weight::from_ref_time(3_793_000 as u64)
Weight::from_ref_time(4_974_000 as u64)
.saturating_add(RocksDbWeight::get().writes(1 as u64))
}
// Storage: Staking ForceEra (r:0 w:1)
fn force_new_era() -> Weight {
Weight::from_ref_time(3_802_000 as u64)
Weight::from_ref_time(5_039_000 as u64)
.saturating_add(RocksDbWeight::get().writes(1 as u64))
}
// Storage: Staking ForceEra (r:0 w:1)
fn force_new_era_always() -> Weight {
Weight::from_ref_time(3_762_000 as u64)
Weight::from_ref_time(4_950_000 as u64)
.saturating_add(RocksDbWeight::get().writes(1 as u64))
}
// Storage: Staking Invulnerables (r:0 w:1)
/// The range of component `v` is `[0, 1000]`.
fn set_invulnerables(v: u32, ) -> Weight {
Weight::from_ref_time(4_318_000 as u64)
// Standard Error: 0
.saturating_add(Weight::from_ref_time(10_000 as u64).saturating_mul(v as u64))
Weight::from_ref_time(5_150_000 as u64)
// Standard Error: 30
.saturating_add(Weight::from_ref_time(10_540 as u64).saturating_mul(v as u64))
.saturating_add(RocksDbWeight::get().writes(1 as u64))
}
// Storage: Staking Bonded (r:1 w:1)
@@ -632,32 +636,33 @@ impl WeightInfo for () {
// Storage: Staking Validators (r:1 w:0)
// Storage: Staking Nominators (r:1 w:1)
// Storage: Staking CounterForNominators (r:1 w:1)
// Storage: BagsList ListNodes (r:2 w:2)
// Storage: BagsList ListBags (r:1 w:1)
// Storage: BagsList CounterForListNodes (r:1 w:1)
// Storage: VoterBagsList ListNodes (r:2 w:2)
// Storage: VoterBagsList ListBags (r:1 w:1)
// Storage: VoterBagsList CounterForListNodes (r:1 w:1)
// Storage: System Account (r:1 w:1)
// Storage: Balances Locks (r:1 w:1)
// Storage: Staking Ledger (r:0 w:1)
// Storage: Staking Payee (r:0 w:1)
// Storage: Staking SpanSlash (r:0 w:2)
/// The range of component `s` is `[0, 100]`.
fn force_unstake(s: u32, ) -> Weight {
Weight::from_ref_time(65_265_000 as u64)
// Standard Error: 1_000
.saturating_add(Weight::from_ref_time(1_029_000 as u64).saturating_mul(s as u64))
Weight::from_ref_time(76_282_000 as u64)
// Standard Error: 2_397
.saturating_add(Weight::from_ref_time(1_137_934 as u64).saturating_mul(s as u64))
.saturating_add(RocksDbWeight::get().reads(11 as u64))
.saturating_add(RocksDbWeight::get().writes(12 as u64))
.saturating_add(RocksDbWeight::get().writes(11 as u64))
.saturating_add(RocksDbWeight::get().writes((1 as u64).saturating_mul(s as u64)))
}
// Storage: Staking UnappliedSlashes (r:1 w:1)
/// The range of component `s` is `[1, 1000]`.
fn cancel_deferred_slash(s: u32, ) -> Weight {
Weight::from_ref_time(903_312_000 as u64)
// Standard Error: 56_000
.saturating_add(Weight::from_ref_time(4_968_000 as u64).saturating_mul(s as u64))
Weight::from_ref_time(93_690_000 as u64)
// Standard Error: 43_203
.saturating_add(Weight::from_ref_time(6_149_862 as u64).saturating_mul(s as u64))
.saturating_add(RocksDbWeight::get().reads(1 as u64))
.saturating_add(RocksDbWeight::get().writes(1 as u64))
}
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Staking HistoryDepth (r:1 w:0)
// Storage: Staking ErasValidatorReward (r:1 w:0)
// Storage: Staking Bonded (r:2 w:0)
// Storage: Staking Ledger (r:1 w:1)
@@ -666,17 +671,17 @@ impl WeightInfo for () {
// Storage: Staking ErasValidatorPrefs (r:1 w:0)
// Storage: Staking Payee (r:2 w:0)
// Storage: System Account (r:2 w:2)
/// The range of component `n` is `[1, 256]`.
fn payout_stakers_dead_controller(n: u32, ) -> Weight {
Weight::from_ref_time(87_569_000 as u64)
// Standard Error: 14_000
.saturating_add(Weight::from_ref_time(24_232_000 as u64).saturating_mul(n as u64))
.saturating_add(RocksDbWeight::get().reads(10 as u64))
Weight::from_ref_time(151_647_000 as u64)
// Standard Error: 8_237
.saturating_add(Weight::from_ref_time(21_296_415 as u64).saturating_mul(n as u64))
.saturating_add(RocksDbWeight::get().reads(12 as u64))
.saturating_add(RocksDbWeight::get().reads((3 as u64).saturating_mul(n as u64)))
.saturating_add(RocksDbWeight::get().writes(2 as u64))
.saturating_add(RocksDbWeight::get().writes(3 as u64))
.saturating_add(RocksDbWeight::get().writes((1 as u64).saturating_mul(n as u64)))
}
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Staking HistoryDepth (r:1 w:0)
// Storage: Staking ErasValidatorReward (r:1 w:0)
// Storage: Staking Bonded (r:2 w:0)
// Storage: Staking Ledger (r:2 w:2)
@@ -686,45 +691,30 @@ impl WeightInfo for () {
// Storage: Staking Payee (r:2 w:0)
// Storage: System Account (r:2 w:2)
// Storage: Balances Locks (r:2 w:2)
/// The range of component `n` is `[1, 256]`.
fn payout_stakers_alive_staked(n: u32, ) -> Weight {
Weight::from_ref_time(98_839_000 as u64)
// Standard Error: 21_000
.saturating_add(Weight::from_ref_time(34_480_000 as u64).saturating_mul(n as u64))
.saturating_add(RocksDbWeight::get().reads(11 as u64))
Weight::from_ref_time(197_310_000 as u64)
// Standard Error: 13_818
.saturating_add(Weight::from_ref_time(30_053_043 as u64).saturating_mul(n as u64))
.saturating_add(RocksDbWeight::get().reads(15 as u64))
.saturating_add(RocksDbWeight::get().reads((5 as u64).saturating_mul(n as u64)))
.saturating_add(RocksDbWeight::get().writes(3 as u64))
.saturating_add(RocksDbWeight::get().writes(6 as u64))
.saturating_add(RocksDbWeight::get().writes((3 as u64).saturating_mul(n as u64)))
}
// Storage: Staking Ledger (r:1 w:1)
// Storage: Balances Locks (r:1 w:1)
// Storage: System Account (r:1 w:1)
// Storage: BagsList ListNodes (r:3 w:3)
// Storage: VoterBagsList ListNodes (r:3 w:3)
// Storage: Staking Bonded (r:1 w:0)
// Storage: BagsList ListBags (r:2 w:2)
// Storage: VoterBagsList ListBags (r:2 w:2)
/// The range of component `l` is `[1, 32]`.
fn rebond(l: u32, ) -> Weight {
Weight::from_ref_time(74_865_000 as u64)
// Standard Error: 3_000
.saturating_add(Weight::from_ref_time(64_000 as u64).saturating_mul(l as u64))
Weight::from_ref_time(89_469_000 as u64)
// Standard Error: 1_197
.saturating_add(Weight::from_ref_time(74_212 as u64).saturating_mul(l as u64))
.saturating_add(RocksDbWeight::get().reads(9 as u64))
.saturating_add(RocksDbWeight::get().writes(8 as u64))
}
// Storage: Staking CurrentEra (r:1 w:0)
// Storage: Staking HistoryDepth (r:1 w:1)
// Storage: Staking ErasStakersClipped (r:0 w:2)
// Storage: Staking ErasValidatorPrefs (r:0 w:2)
// Storage: Staking ErasValidatorReward (r:0 w:1)
// Storage: Staking ErasRewardPoints (r:0 w:1)
// Storage: Staking ErasStakers (r:0 w:2)
// Storage: Staking ErasTotalStake (r:0 w:1)
// Storage: Staking ErasStartSessionIndex (r:0 w:1)
fn set_history_depth(e: u32, ) -> Weight {
Weight::from_ref_time(0 as u64)
// Standard Error: 62_000
.saturating_add(Weight::from_ref_time(22_829_000 as u64).saturating_mul(e as u64))
.saturating_add(RocksDbWeight::get().reads(2 as u64))
.saturating_add(RocksDbWeight::get().writes(4 as u64))
.saturating_add(RocksDbWeight::get().writes((7 as u64).saturating_mul(e as u64)))
}
// Storage: System Account (r:1 w:1)
// Storage: Staking Bonded (r:1 w:1)
// Storage: Staking Ledger (r:1 w:1)
@@ -732,24 +722,25 @@ impl WeightInfo for () {
// Storage: Staking Validators (r:1 w:0)
// Storage: Staking Nominators (r:1 w:1)
// Storage: Staking CounterForNominators (r:1 w:1)
// Storage: BagsList ListNodes (r:2 w:2)
// Storage: BagsList ListBags (r:1 w:1)
// Storage: BagsList CounterForListNodes (r:1 w:1)
// Storage: VoterBagsList ListNodes (r:2 w:2)
// Storage: VoterBagsList ListBags (r:1 w:1)
// Storage: VoterBagsList CounterForListNodes (r:1 w:1)
// Storage: Balances Locks (r:1 w:1)
// Storage: Staking Payee (r:0 w:1)
// Storage: Staking SpanSlash (r:0 w:1)
/// The range of component `s` is `[1, 100]`.
fn reap_stash(s: u32, ) -> Weight {
Weight::from_ref_time(70_933_000 as u64)
// Standard Error: 1_000
.saturating_add(Weight::from_ref_time(1_021_000 as u64).saturating_mul(s as u64))
Weight::from_ref_time(88_333_000 as u64)
// Standard Error: 1_567
.saturating_add(Weight::from_ref_time(1_101_099 as u64).saturating_mul(s as u64))
.saturating_add(RocksDbWeight::get().reads(12 as u64))
.saturating_add(RocksDbWeight::get().writes(12 as u64))
.saturating_add(RocksDbWeight::get().writes(13 as u64))
.saturating_add(RocksDbWeight::get().writes((1 as u64).saturating_mul(s as u64)))
}
// Storage: BagsList CounterForListNodes (r:1 w:0)
// Storage: VoterBagsList CounterForListNodes (r:1 w:0)
// Storage: Staking SlashingSpans (r:1 w:0)
// Storage: BagsList ListBags (r:200 w:0)
// Storage: BagsList ListNodes (r:101 w:0)
// Storage: VoterBagsList ListBags (r:200 w:0)
// Storage: VoterBagsList ListNodes (r:101 w:0)
// Storage: Staking Nominators (r:101 w:0)
// Storage: Staking Validators (r:2 w:0)
// Storage: Staking Bonded (r:101 w:0)
@@ -758,52 +749,54 @@ impl WeightInfo for () {
// Storage: Staking ValidatorCount (r:1 w:0)
// Storage: Staking MinimumValidatorCount (r:1 w:0)
// Storage: Staking CurrentEra (r:1 w:1)
// Storage: Staking HistoryDepth (r:1 w:0)
// Storage: Staking ErasStakersClipped (r:0 w:1)
// Storage: Staking ErasValidatorPrefs (r:0 w:1)
// Storage: Staking ErasStakers (r:0 w:1)
// Storage: Staking ErasTotalStake (r:0 w:1)
// Storage: Staking ErasStartSessionIndex (r:0 w:1)
/// The range of component `v` is `[1, 10]`.
/// The range of component `n` is `[1, 100]`.
fn new_era(v: u32, n: u32, ) -> Weight {
Weight::from_ref_time(0 as u64)
// Standard Error: 897_000
.saturating_add(Weight::from_ref_time(213_100_000 as u64).saturating_mul(v as u64))
// Standard Error: 45_000
.saturating_add(Weight::from_ref_time(31_123_000 as u64).saturating_mul(n as u64))
.saturating_add(RocksDbWeight::get().reads(208 as u64))
.saturating_add(RocksDbWeight::get().reads((5 as u64).saturating_mul(v as u64)))
Weight::from_ref_time(572_530_000 as u64)
// Standard Error: 3_166_542
.saturating_add(Weight::from_ref_time(101_354_358 as u64).saturating_mul(v as u64))
// Standard Error: 315_238
.saturating_add(Weight::from_ref_time(15_565_319 as u64).saturating_mul(n as u64))
.saturating_add(RocksDbWeight::get().reads(261 as u64))
.saturating_add(RocksDbWeight::get().reads((1 as u64).saturating_mul(v as u64)))
.saturating_add(RocksDbWeight::get().reads((4 as u64).saturating_mul(n as u64)))
.saturating_add(RocksDbWeight::get().writes(3 as u64))
.saturating_add(RocksDbWeight::get().writes(6 as u64))
.saturating_add(RocksDbWeight::get().writes((3 as u64).saturating_mul(v as u64)))
}
// Storage: BagsList CounterForListNodes (r:1 w:0)
// Storage: VoterBagsList CounterForListNodes (r:1 w:0)
// Storage: Staking SlashingSpans (r:21 w:0)
// Storage: BagsList ListBags (r:200 w:0)
// Storage: BagsList ListNodes (r:1500 w:0)
// Storage: VoterBagsList ListBags (r:200 w:0)
// Storage: VoterBagsList ListNodes (r:1500 w:0)
// Storage: Staking Nominators (r:1500 w:0)
// Storage: Staking Validators (r:500 w:0)
// Storage: Staking Bonded (r:1500 w:0)
// Storage: Staking Ledger (r:1500 w:0)
fn get_npos_voters(v: u32, n: u32, s: u32, ) -> Weight {
Weight::from_ref_time(0 as u64)
// Standard Error: 116_000
.saturating_add(Weight::from_ref_time(23_745_000 as u64).saturating_mul(v as u64))
// Standard Error: 116_000
.saturating_add(Weight::from_ref_time(22_497_000 as u64).saturating_mul(n as u64))
// Standard Error: 3_968_000
.saturating_add(Weight::from_ref_time(20_676_000 as u64).saturating_mul(s as u64))
.saturating_add(RocksDbWeight::get().reads(202 as u64))
.saturating_add(RocksDbWeight::get().reads((5 as u64).saturating_mul(v as u64)))
.saturating_add(RocksDbWeight::get().reads((4 as u64).saturating_mul(n as u64)))
.saturating_add(RocksDbWeight::get().reads((1 as u64).saturating_mul(s as u64)))
/// The range of component `v` is `[500, 1000]`.
/// The range of component `n` is `[500, 1000]`.
/// The range of component `s` is `[1, 20]`.
fn get_npos_voters(v: u32, n: u32, _s: u32, ) -> Weight {
Weight::from_ref_time(24_930_788_000 as u64)
// Standard Error: 266_386
.saturating_add(Weight::from_ref_time(6_687_552 as u64).saturating_mul(v as u64))
// Standard Error: 266_386
.saturating_add(Weight::from_ref_time(6_839_134 as u64).saturating_mul(n as u64))
.saturating_add(RocksDbWeight::get().reads(6722 as u64))
.saturating_add(RocksDbWeight::get().reads((2 as u64).saturating_mul(v as u64)))
.saturating_add(RocksDbWeight::get().reads((1 as u64).saturating_mul(n as u64)))
}
// Storage: Staking CounterForValidators (r:1 w:0)
// Storage: Staking Validators (r:501 w:0)
/// The range of component `v` is `[500, 1000]`.
fn get_npos_targets(v: u32, ) -> Weight {
Weight::from_ref_time(0 as u64)
// Standard Error: 36_000
.saturating_add(Weight::from_ref_time(8_097_000 as u64).saturating_mul(v as u64))
.saturating_add(RocksDbWeight::get().reads(1 as u64))
.saturating_add(RocksDbWeight::get().reads((1 as u64).saturating_mul(v as u64)))
Weight::from_ref_time(4_864_727_000 as u64)
// Standard Error: 54_240
.saturating_add(Weight::from_ref_time(3_319_738 as u64).saturating_mul(v as u64))
.saturating_add(RocksDbWeight::get().reads(502 as u64))
}
// Storage: Staking MinCommission (r:0 w:1)
// Storage: Staking MinValidatorBond (r:0 w:1)
@@ -812,7 +805,7 @@ impl WeightInfo for () {
// Storage: Staking MaxNominatorsCount (r:0 w:1)
// Storage: Staking MinNominatorBond (r:0 w:1)
fn set_staking_configs_all_set() -> Weight {
Weight::from_ref_time(7_041_000 as u64)
Weight::from_ref_time(10_141_000 as u64)
.saturating_add(RocksDbWeight::get().writes(6 as u64))
}
// Storage: Staking MinCommission (r:0 w:1)
@@ -822,7 +815,7 @@ impl WeightInfo for () {
// Storage: Staking MaxNominatorsCount (r:0 w:1)
// Storage: Staking MinNominatorBond (r:0 w:1)
fn set_staking_configs_all_remove() -> Weight {
Weight::from_ref_time(6_495_000 as u64)
Weight::from_ref_time(8_993_000 as u64)
.saturating_add(RocksDbWeight::get().writes(6 as u64))
}
// Storage: Staking Ledger (r:1 w:0)
@@ -832,18 +825,18 @@ impl WeightInfo for () {
// Storage: Staking CounterForNominators (r:1 w:1)
// Storage: Staking MinNominatorBond (r:1 w:0)
// Storage: Staking Validators (r:1 w:0)
// Storage: BagsList ListNodes (r:2 w:2)
// Storage: BagsList ListBags (r:1 w:1)
// Storage: BagsList CounterForListNodes (r:1 w:1)
// Storage: VoterBagsList ListNodes (r:2 w:2)
// Storage: VoterBagsList ListBags (r:1 w:1)
// Storage: VoterBagsList CounterForListNodes (r:1 w:1)
fn chill_other() -> Weight {
Weight::from_ref_time(62_014_000 as u64)
Weight::from_ref_time(79_082_000 as u64)
.saturating_add(RocksDbWeight::get().reads(11 as u64))
.saturating_add(RocksDbWeight::get().writes(6 as u64))
}
// Storage: Staking MinCommission (r:1 w:0)
// Storage: Staking Validators (r:1 w:1)
fn force_apply_min_commission() -> Weight {
Weight::from_ref_time(12_814_000 as u64)
Weight::from_ref_time(19_265_000 as u64)
.saturating_add(RocksDbWeight::get().reads(2 as u64))
.saturating_add(RocksDbWeight::get().writes(1 as u64))
}