diff --git a/frame/staking/src/impls.rs b/frame/staking/src/impls.rs index b87940f3b4..ad746f4c7a 100644 --- a/frame/staking/src/impls.rs +++ b/frame/staking/src/impls.rs @@ -1530,10 +1530,14 @@ where Self::reward_by_ids(vec![(author, 20)]); } - fn note_uncle(author: AccountId, _age: BlockNumberFor) { - Self::reward_by_ids(vec![(>::author(), 2), (author, 1)]); + fn note_uncle(uncle_author: T::AccountId, _age: T::BlockNumber) { + // defensive-only: block author must exist. + if let Some(block_author) = >::author() { + Self::reward_by_ids(vec![(block_author, 2), (uncle_author, 1)]) + } else { + crate::log!(warn, "block author not set, this should never happen"); + } } -} /// Means for interacting with a specialized version of the `session` trait. /// diff --git a/frame/staking/src/mock.rs b/frame/staking/src/mock.rs index 9445358e74..9717d6ec5e 100644 --- a/frame/staking/src/mock.rs +++ b/frame/staking/src/mock.rs @@ -464,7 +464,7 @@ impl ExtBuilder { .assimilate_storage(&mut storage); } - let mut stakers = vec![]; + let mut stakers = Vec::new(); if self.has_stakers { stakers = vec![ @@ -507,7 +507,7 @@ impl ExtBuilder { } let _ = darwinia_staking::GenesisConfig:: { history_depth: 84, - stakers, + stakers: stakers.clone(), validator_count: self.validator_count, minimum_validator_count: self.minimum_validator_count, invulnerables: self.invulnerables, @@ -520,12 +520,15 @@ impl ExtBuilder { .assimilate_storage(&mut storage); let _ = pallet_session::GenesisConfig:: { keys: if self.has_stakers { - // genesis election will overwrite this, no worries. - Default::default() + // set the keys for the first session. + stakers + .into_iter() + .map(|(id, ..)| (id, id, SessionKeys { other: id.into() })) + .collect() } else { // set some dummy validators in genesis. (0..self.validator_count as u64) - .map(|x| (x, x, SessionKeys { other: UintAuthorityId(x as u64) })) + .map(|id| (id, id, SessionKeys { other: id.into() })) .collect() }, } @@ -559,7 +562,7 @@ impl Default for ExtBuilder { nominate: true, validator_count: 2, minimum_validator_count: 0, - invulnerables: vec![], + invulnerables: Vec::new(), has_stakers: true, initialize_first_session: true, min_nominator_bond: ExistentialDeposit::get(), @@ -736,6 +739,11 @@ fn bond(stash: AccountId, controller: AccountId, val: StakingBalanceT) { pub fn bond_validator(stash: AccountId, controller: AccountId, val: StakingBalanceT) { bond(stash, controller, val); assert_ok!(Staking::validate(Origin::signed(controller), ValidatorPrefs::default())); + assert_ok!(Session::set_keys( + Origin::signed(ctrl), + SessionKeys { other: ctrl.into() }, + Vec::new() + )); } pub fn bond_nominator( @@ -902,7 +910,7 @@ pub fn add_slash(who: &AccountId) { on_offence_now( &[OffenceDetails { offender: (who.clone(), Staking::eras_stakers(active_era(), who.clone())), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(10)], ); diff --git a/frame/staking/src/structs.rs b/frame/staking/src/structs.rs index 58ec235c77..b17de7d9e1 100644 --- a/frame/staking/src/structs.rs +++ b/frame/staking/src/structs.rs @@ -30,9 +30,7 @@ impl Convert, Option>> for ExposureOf { } } /// A snapshot of the stake backing a single validator in the system. -#[derive( - Clone, Default, PartialEq, Eq, PartialOrd, Ord, Encode, Decode, RuntimeDebug, TypeInfo, -)] +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Encode, Decode, RuntimeDebug, TypeInfo)] pub struct Exposure where RingBalance: HasCompact, @@ -49,6 +47,20 @@ where /// The portions of nominators stashes that are exposed. pub others: Vec>, } +impl Default for Exposure +where + Balance: HasCompact + Zero, +{ + fn default() -> Self { + Self { + own_ring_balance: Zero::zero(), + own_kton_balance: Zero::zero(), + own_power: 0, + total_power: 0, + others: Vec::new(), + } + } +} /// The amount of exposure (to slashing) than an individual nominator has. #[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Encode, Decode, RuntimeDebug, TypeInfo)] pub struct IndividualExposure @@ -79,7 +91,7 @@ pub struct ActiveEraInfo { } /// The ledger of a (bonded) stash. -#[derive(Clone, Default, PartialEq, Eq, Encode, Decode, RuntimeDebug, TypeInfo)] +#[derive(Clone, PartialEq, Eq, Encode, Decode, RuntimeDebug, TypeInfo)] pub struct StakingLedger where RingBalance: HasCompact, @@ -117,11 +129,25 @@ where impl StakingLedger where - RingBalance: Copy + AtLeast32BitUnsigned + Saturating, - KtonBalance: Copy + AtLeast32BitUnsigned + Saturating, + RingBalance: Copy + AtLeast32BitUnsigned + Saturating + Zero, + KtonBalance: Copy + AtLeast32BitUnsigned + Saturating + Zero, BlockNumber: Copy + PartialOrd, TsInMs: PartialOrd, { + /// Initializes the default object using the given `validator`. + pub fn default_from(stash: AccountId) -> Self { + Self { + stash, + active: Zero::zero(), + active_deposit_ring: Zero::zero(), + active_kton: Zero::zero(), + deposit_items: Vec::new(), + ring_staking_lock: Vec::new(), + kton_staking_lock: Vec::new(), + claimed_rewards: Vec::new(), + } + } + pub fn consolidate_unbondings(&mut self, now: BlockNumber) { self.ring_staking_lock.refresh(now); self.kton_staking_lock.refresh(now); @@ -379,17 +405,22 @@ pub struct Nominations { /// Reward points of an era. Used to split era total payout between validators. /// /// This points will be used to reward validators and their respective nominators. -#[derive(Debug, Default, PartialEq, Encode, Decode, TypeInfo)] +#[derive(Debug, PartialEq, Encode, Decode, TypeInfo)] pub struct EraRewardPoints { /// Total number of points. Equals the sum of reward points for each validator. pub total: RewardPoint, /// The reward points earned by a given validator. pub individual: BTreeMap, } +impl Default for EraRewardPoints { + fn default() -> Self { + EraRewardPoints { total: 0, individual: BTreeMap::new() } + } +} /// Mode of era-forcing. #[derive(Copy, Clone, PartialEq, Eq, Encode, Decode, RuntimeDebug, TypeInfo)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] +#[cfg_attr(feature = "std", derive(Clone, Serialize, Deserialize))] pub enum Forcing { /// Not forcing anything - just let whatever happen. NotForcing, @@ -410,7 +441,7 @@ impl Default for Forcing { /// A pending slash record. The value of the slash has been computed but not applied yet, /// rather deferred for several eras. -#[derive(Default, Encode, Decode, RuntimeDebug, TypeInfo)] +#[derive(Encode, Decode, RuntimeDebug, TypeInfo)] pub struct UnappliedSlash { /// The stash ID of the offending validator. pub validator: AccountId, @@ -423,6 +454,21 @@ pub struct UnappliedSlash { /// The amount of payout. pub payout: slashing::RK, } +impl UnappliedSlash +where + Balance: HasCompact + Zero, +{ + /// Initializes the default object using the given `validator`. + pub fn default_from(validator: AccountId) -> Self { + Self { + validator, + own: Zero::zero(), + others: Vec::new(), + reporters: Vec::new(), + payout: Zero::zero(), + } + } +} // 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. diff --git a/frame/staking/src/substrate_tests.rs b/frame/staking/src/substrate_tests.rs index 303d54f0e4..3d04dcf0c8 100644 --- a/frame/staking/src/substrate_tests.rs +++ b/frame/staking/src/substrate_tests.rs @@ -114,7 +114,7 @@ fn basic_setup_works() { active: 1000, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, ..Default::default() }) @@ -127,7 +127,7 @@ fn basic_setup_works() { active: 1000, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, ..Default::default() }) @@ -152,7 +152,7 @@ fn basic_setup_works() { active: 500, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, ..Default::default() }) @@ -261,6 +261,7 @@ fn rewards_should_work() { let maximum_payout = maximum_payout_for_duration(reward_time_per_era()); start_session(1); + assert_eq_uvec!(Session::validators(), vec![11, 21]); assert_eq!(Ring::free_balance(&10), init_balance_10); assert_eq!(Ring::free_balance(&11), init_balance_11); @@ -268,7 +269,6 @@ fn rewards_should_work() { assert_eq!(Ring::free_balance(&21), init_balance_21); assert_eq!(Ring::free_balance(&100), init_balance_100); assert_eq!(Ring::free_balance(&101), init_balance_101); - assert_eq_uvec!(Session::validators(), vec![11, 21]); assert_eq!( Staking::eras_reward_points(active_era()), EraRewardPoints { @@ -426,7 +426,7 @@ fn staking_should_work() { active: 1500, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, claimed_rewards: vec![0], ..Default::default() @@ -712,7 +712,7 @@ fn nominators_also_get_slashed_pro_rata() { // 11 goes offline on_offence_now( - &[OffenceDetails { offender: (11, initial_exposure.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (11, initial_exposure.clone()), reporters: Vec::new() }], &[slash_percent], ); @@ -1426,7 +1426,7 @@ fn rebond_works() { active: 1000, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, ..Default::default() }) @@ -1468,7 +1468,7 @@ fn rebond_works() { active: 1000, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, ..Default::default() }) @@ -1525,7 +1525,7 @@ fn rebond_works() { active: 1000, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, ..Default::default() }) @@ -1613,7 +1613,7 @@ fn rebond_is_fifo() { active: 1000, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, ..Default::default() }) @@ -1843,7 +1843,7 @@ fn reward_to_stake_works() { own_kton_balance: 0, total_power: ring_power(69), own_power: ring_power(69), - others: vec![], + others: Vec::new(), }, ); @@ -1981,6 +1981,7 @@ fn switching_roles() { 0, )); assert_ok!(Staking::validate(Origin::signed(6), ValidatorPrefs::default())); + assert_ok!(Session::set_keys(Origin::signed(6), SessionKeys { other: 6.into() }, Vec::new())); start_active_era(1); @@ -1989,6 +1990,7 @@ fn switching_roles() { // 2 decides to be a validator. Consequences: assert_ok!(Staking::validate(Origin::signed(2), ValidatorPrefs::default())); + assert_ok!(Session::set_keys(Origin::signed(2), SessionKeys { other: 2.into() }, Vec::new())); // new stakes: // 10: 1000 self vote // 20: 1000 self vote + 250 vote @@ -2088,6 +2090,11 @@ fn bond_with_little_staked_value_bounded() { 0, )); assert_ok!(Staking::validate(Origin::signed(2), ValidatorPrefs::default())); + assert_ok!(Session::set_keys( + Origin::signed(2), + SessionKeys { other: 2.into() }, + Vec::new(), + )); // 1 era worth of reward. BUT, we set the timestamp after on_initialize, so outdated by // one block. @@ -2355,7 +2362,7 @@ fn reward_validator_slashing_validator_does_not_overflow() { own_kton_balance: 0, own_power: ring_power(stake), total_power: ring_power(stake), - others: vec![], + others: Vec::new(), }; let reward = EraRewardPoints:: { total: 1, @@ -2407,7 +2414,7 @@ fn reward_validator_slashing_validator_does_not_overflow() { on_offence_now( &[OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(100)], ); @@ -2422,7 +2429,7 @@ fn reward_from_authorship_event_handler_works() { ExtBuilder::default().build_and_execute(|| { use pallet_authorship::EventHandler; - assert_eq!(>::author(), 11); + assert_eq!(>::author(), Some(11)); Staking::note_author(11); Staking::note_uncle(21, 1); @@ -2514,7 +2521,7 @@ fn offence_forces_new_era() { on_offence_now( &[OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(5)], ); @@ -2532,7 +2539,7 @@ fn offence_ensures_new_era_without_clobbering() { on_offence_now( &[OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(5)], ); @@ -2550,7 +2557,7 @@ fn offence_deselects_validator_even_when_slash_is_zero() { on_offence_now( &[OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(0)], ); @@ -2582,10 +2589,10 @@ fn slashing_performed_according_exposure() { own_ring_balance: 500, own_kton_balance: 0, own_power: 0, - others: vec![], + others: Vec::new(), }, ), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(50)], ); @@ -2606,7 +2613,7 @@ fn slash_in_old_span_does_not_deselect() { on_offence_now( &[OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(0)], ); @@ -2629,7 +2636,7 @@ fn slash_in_old_span_does_not_deselect() { on_offence_in_era( &[OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(0)], 1, @@ -2645,7 +2652,7 @@ fn slash_in_old_span_does_not_deselect() { on_offence_in_era( &[OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }], // NOTE: A 100% slash here would clean up the account, causing de-registration. &[Perbill::from_percent(95)], @@ -2757,11 +2764,11 @@ fn invulnerables_are_not_slashed() { &[ OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }, OffenceDetails { offender: (21, Staking::eras_stakers(active_era(), 21)), - reporters: vec![], + reporters: Vec::new(), }, ], &[Perbill::from_percent(50), Perbill::from_percent(20)], @@ -2792,7 +2799,7 @@ fn do_not_slash_if_fraction_is_zero() { on_offence_now( &[OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(0)], ); @@ -2813,7 +2820,7 @@ fn only_slash_for_max_in_era() { on_offence_now( &[OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(50)], ); @@ -2825,7 +2832,7 @@ fn only_slash_for_max_in_era() { on_offence_now( &[OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(25)], ); @@ -2836,7 +2843,7 @@ fn only_slash_for_max_in_era() { on_offence_now( &[OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(60)], ); @@ -2855,7 +2862,7 @@ fn garbage_collection_after_slashing() { on_offence_now( &[OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(10)], ); @@ -2867,7 +2874,7 @@ fn garbage_collection_after_slashing() { on_offence_now( &[OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(100)], ); @@ -2908,7 +2915,7 @@ fn garbage_collection_on_window_pruning() { let nominated_value = exposure.others.iter().find(|o| o.who == 101).unwrap().ring_balance; on_offence_now( - &[OffenceDetails { offender: (11, Staking::eras_stakers(now, 11)), reporters: vec![] }], + &[OffenceDetails { offender: (11, Staking::eras_stakers(now, 11)), reporters: Vec::new() }], &[Perbill::from_percent(10)], ); @@ -2953,7 +2960,7 @@ fn slashing_nominators_by_span_max() { on_offence_in_era( &[OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(10)], 2, @@ -2980,7 +2987,7 @@ fn slashing_nominators_by_span_max() { on_offence_in_era( &[OffenceDetails { offender: (21, Staking::eras_stakers(active_era(), 21)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(30)], 3, @@ -3002,7 +3009,7 @@ fn slashing_nominators_by_span_max() { on_offence_in_era( &[OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(20)], 2, @@ -3037,7 +3044,7 @@ fn slashes_are_summed_across_spans() { on_offence_now( &[OffenceDetails { offender: (21, Staking::eras_stakers(active_era(), 21)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(10)], ); @@ -3060,7 +3067,7 @@ fn slashes_are_summed_across_spans() { on_offence_now( &[OffenceDetails { offender: (21, Staking::eras_stakers(active_era(), 21)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(10)], ); @@ -3090,7 +3097,7 @@ fn deferred_slashes_are_deferred() { on_offence_now( &[OffenceDetails { offender: (11, Staking::eras_stakers(active_era(), 11)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(10)], ); @@ -3129,7 +3136,7 @@ fn remove_deferred() { let nominated_value = exposure.others.iter().find(|o| o.who == 101).unwrap().ring_balance; on_offence_now( - &[OffenceDetails { offender: (11, exposure.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (11, exposure.clone()), reporters: Vec::new() }], &[Perbill::from_percent(10)], ); @@ -3139,7 +3146,7 @@ fn remove_deferred() { start_active_era(2); on_offence_in_era( - &[OffenceDetails { offender: (11, exposure.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (11, exposure.clone()), reporters: Vec::new() }], &[Perbill::from_percent(15)], 1, DisableStrategy::WhenSlashed, @@ -3147,7 +3154,7 @@ fn remove_deferred() { // fails if empty assert_noop!( - Staking::cancel_deferred_slash(Origin::root(), 1, vec![]), + Staking::cancel_deferred_slash(Origin::root(), 1, Vec::new()), StakingError::EmptyTargets ); @@ -3195,30 +3202,30 @@ fn remove_multi_deferred() { assert_eq!(Ring::free_balance(101), 2000); on_offence_now( - &[OffenceDetails { offender: (11, exposure.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (11, exposure.clone()), reporters: Vec::new() }], &[Perbill::from_percent(10)], ); on_offence_now( &[OffenceDetails { offender: (21, Staking::eras_stakers(active_era(), 21)), - reporters: vec![], + reporters: Vec::new(), }], &[Perbill::from_percent(10)], ); on_offence_now( - &[OffenceDetails { offender: (11, exposure.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (11, exposure.clone()), reporters: Vec::new() }], &[Perbill::from_percent(25)], ); on_offence_now( - &[OffenceDetails { offender: (42, exposure.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (42, exposure.clone()), reporters: Vec::new() }], &[Perbill::from_percent(25)], ); on_offence_now( - &[OffenceDetails { offender: (69, exposure.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (69, exposure.clone()), reporters: Vec::new() }], &[Perbill::from_percent(25)], ); @@ -3267,7 +3274,7 @@ fn slash_kicks_validators_not_nominators_and_disables_nominator_for_kicked_valid assert_eq_error_rate!(exposure_21.total_power, ring_power(1000 + 375), 1); on_offence_now( - &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: Vec::new() }], &[Perbill::from_percent(10)], ); @@ -3319,13 +3326,13 @@ fn non_slashable_offence_doesnt_disable_validator() { // offence with no slash associated on_offence_now( - &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: Vec::new() }], &[Perbill::zero()], ); // offence that slashes 25% of the bond on_offence_now( - &[OffenceDetails { offender: (21, exposure_21.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (21, exposure_21.clone()), reporters: Vec::new() }], &[Perbill::from_percent(25)], ); @@ -3349,7 +3356,7 @@ fn slashing_independent_of_disabling_validator() { // offence with no slash associated, BUT disabling on_offence_in_era( - &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: Vec::new() }], &[Perbill::zero()], now, DisableStrategy::Always, @@ -3357,7 +3364,7 @@ fn slashing_independent_of_disabling_validator() { // offence that slashes 25% of the bond, BUT not disabling on_offence_in_era( - &[OffenceDetails { offender: (21, exposure_21.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (21, exposure_21.clone()), reporters: Vec::new() }], &[Perbill::from_percent(25)], now, DisableStrategy::Never, @@ -3392,21 +3399,21 @@ fn offence_threshold_triggers_new_era() { let exposure_31 = Staking::eras_stakers(Staking::active_era().unwrap().index, &31); on_offence_now( - &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: Vec::new() }], &[Perbill::zero()], ); assert_eq!(ForceEra::::get(), Forcing::NotForcing); on_offence_now( - &[OffenceDetails { offender: (21, exposure_21.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (21, exposure_21.clone()), reporters: Vec::new() }], &[Perbill::zero()], ); assert_eq!(ForceEra::::get(), Forcing::NotForcing); on_offence_now( - &[OffenceDetails { offender: (31, exposure_31.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (31, exposure_31.clone()), reporters: Vec::new() }], &[Perbill::zero()], ); @@ -3428,12 +3435,12 @@ fn disabled_validators_are_kept_disabled_for_whole_era() { let exposure_21 = Staking::eras_stakers(Staking::active_era().unwrap().index, &21); on_offence_now( - &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: Vec::new() }], &[Perbill::zero()], ); on_offence_now( - &[OffenceDetails { offender: (21, exposure_21.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (21, exposure_21.clone()), reporters: Vec::new() }], &[Perbill::from_percent(25)], ); @@ -3450,7 +3457,7 @@ fn disabled_validators_are_kept_disabled_for_whole_era() { // validator 10 should now get disabled on_offence_now( - &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (11, exposure_11.clone()), reporters: Vec::new() }], &[Perbill::from_percent(25)], ); @@ -3565,7 +3572,7 @@ fn zero_slash_keeps_nominators() { assert_eq!(Ring::free_balance(101), 2000); on_offence_now( - &[OffenceDetails { offender: (11, exposure.clone()), reporters: vec![] }], + &[OffenceDetails { offender: (11, exposure.clone()), reporters: Vec::new() }], &[Perbill::from_percent(0)], ); @@ -3748,7 +3755,7 @@ fn test_payout_stakers() { active: 1000, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, claimed_rewards: vec![1], ..Default::default() @@ -3773,7 +3780,7 @@ fn test_payout_stakers() { active: 1000, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, claimed_rewards: (1..=14).collect(), ..Default::default() @@ -3797,7 +3804,7 @@ fn test_payout_stakers() { active: 1000, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, claimed_rewards: vec![15, 98], ..Default::default() @@ -3815,7 +3822,7 @@ fn test_payout_stakers() { active: 1000, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, claimed_rewards: vec![15, 23, 42, 69, 98], ..Default::default() @@ -4028,7 +4035,7 @@ fn bond_during_era_correctly_populates_claimed_rewards() { active: 1000, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, ..Default::default() }) @@ -4042,7 +4049,7 @@ fn bond_during_era_correctly_populates_claimed_rewards() { active: 1000, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, claimed_rewards: (0..5).collect(), ..Default::default() @@ -4057,7 +4064,7 @@ fn bond_during_era_correctly_populates_claimed_rewards() { active: 1000, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, claimed_rewards: (15..99).collect(), ..Default::default() @@ -4092,7 +4099,7 @@ fn offences_weight_calculated_correctly() { i, Staking::eras_stakers(active_era(), i), ), - reporters: vec![], + reporters: Vec::new(), }) .collect(); assert_eq!( @@ -4286,7 +4293,7 @@ fn cannot_rebond_to_lower_than_ed() { active: 10 * 1000, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, ..Default::default() } @@ -4330,7 +4337,7 @@ fn cannot_bond_extra_to_lower_than_ed() { active: 10 * 1000, ring_staking_lock: StakingLock { staking_amount: 0, - unbondings: WeakBoundedVec::force_from(vec![], None) + unbondings: WeakBoundedVec::force_from(Vec::new(), None) }, ..Default::default() } @@ -4686,7 +4693,7 @@ mod election_data_provider { >::insert( 987654321, Nominations { - targets: vec![], + targets: Vec::new(), submitted_in: Default::default(), suppressed: false, }, diff --git a/node/runtime/common/src/impls.rs b/node/runtime/common/src/impls.rs index b5b2f83fbb..193668c933 100644 --- a/node/runtime/common/src/impls.rs +++ b/node/runtime/common/src/impls.rs @@ -53,10 +53,9 @@ where R: darwinia_balances::Config + pallet_authorship::Config, { fn on_nonzero_unbalanced(amount: RingNegativeImbalance) { - >::resolve_creating( - &>::author(), - amount, - ); + if let Some(author) = >::author() { + >::resolve_creating(&author, amount); + } } } diff --git a/node/service/src/chain_spec/pangolin.rs b/node/service/src/chain_spec/pangolin.rs index c8de72e59c..a32110e69a 100644 --- a/node/service/src/chain_spec/pangolin.rs +++ b/node/service/src/chain_spec/pangolin.rs @@ -237,7 +237,7 @@ pub fn genesis_config() -> ChainSpec { treasury: Default::default(), kton_treasury: Default::default(), vesting: Default::default(), - sudo: SudoConfig { key: root }, + sudo: SudoConfig { key: Some(root) }, ethereum_relay: EthereumRelayConfig { genesis_header_parcel: r#"{ "header": { @@ -432,7 +432,7 @@ pub fn development_config() -> ChainSpec { treasury: Default::default(), kton_treasury: Default::default(), vesting: Default::default(), - sudo: SudoConfig { key: root }, + sudo: SudoConfig { key: Some(root) }, ethereum_relay: EthereumRelayConfig { genesis_header_parcel: r#"{ "header": { @@ -625,7 +625,7 @@ pub fn local_testnet_config() -> ChainSpec { treasury: Default::default(), kton_treasury: Default::default(), vesting: Default::default(), - sudo: SudoConfig { key: root }, + sudo: SudoConfig { key: Some(root) }, ethereum_relay: EthereumRelayConfig { genesis_header_parcel: r#"{ "header": { diff --git a/node/service/src/chain_spec/pangoro.rs b/node/service/src/chain_spec/pangoro.rs index 6e197c0571..4000640c9a 100644 --- a/node/service/src/chain_spec/pangoro.rs +++ b/node/service/src/chain_spec/pangoro.rs @@ -188,7 +188,7 @@ pub fn genesis_config() -> ChainSpec { im_online: Default::default(), authority_discovery: Default::default(), treasury: Default::default(), - sudo: SudoConfig { key: root }, + sudo: SudoConfig { key: Some(root) }, substrate_2_substrate_backing: Substrate2SubstrateBackingConfig { secure_limited_period: DAYS, secure_limited_ring_amount: 1_000_000 * COIN, @@ -295,7 +295,7 @@ pub fn development_config() -> ChainSpec { im_online: Default::default(), authority_discovery: Default::default(), treasury: Default::default(), - sudo: SudoConfig { key: root }, + sudo: SudoConfig { key: Some(root) }, substrate_2_substrate_backing: Substrate2SubstrateBackingConfig { secure_limited_period: DAYS, secure_limited_ring_amount: 100_000 * COIN,