// This file is part of Bizinikiwi. // Copyright (C) Parity Technologies (UK) Ltd. // SPDX-License-Identifier: Apache-2.0 // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. use crate::VoterBagsListInstance; use pezframe_election_provider_support::VoteWeight; use pezframe_support::{ derive_impl, pezpallet_prelude::*, parameter_types, traits::{ConstU64, Nothing, VariantCountOf}, PalletId, }; use pezsp_runtime::{ traits::{Convert, IdentityLookup}, BuildStorage, FixedU128, Perbill, }; type AccountId = u128; type BlockNumber = u64; type Balance = u128; #[derive_impl(pezframe_system::config_preludes::TestDefaultConfig)] impl pezframe_system::Config for Runtime { type AccountId = AccountId; type Lookup = IdentityLookup; type Block = Block; type AccountData = pezpallet_balances::AccountData; } impl pezpallet_timestamp::Config for Runtime { type Moment = u64; type OnTimestampSet = (); type MinimumPeriod = ConstU64<5>; type WeightInfo = (); } parameter_types! { pub const ExistentialDeposit: Balance = 10; } #[derive_impl(pezpallet_balances::config_preludes::TestDefaultConfig)] impl pezpallet_balances::Config for Runtime { type Balance = Balance; type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; type FreezeIdentifier = RuntimeFreezeReason; type MaxFreezes = VariantCountOf; type RuntimeHoldReason = RuntimeHoldReason; type RuntimeFreezeReason = RuntimeFreezeReason; } pezpallet_staking_reward_curve::build! { const I_NPOS: pezsp_runtime::curve::PiecewiseLinear<'static> = curve!( min_inflation: 0_025_000, max_inflation: 0_100_000, ideal_stake: 0_500_000, falloff: 0_050_000, max_piece_count: 40, test_precision: 0_005_000, ); } parameter_types! { pub const RewardCurve: &'static pezsp_runtime::curve::PiecewiseLinear<'static> = &I_NPOS; } #[derive_impl(pezpallet_staking::config_preludes::TestDefaultConfig)] impl pezpallet_staking::Config for Runtime { type OldCurrency = Balances; type Currency = Balances; type CurrencyBalance = Balance; type UnixTime = pezpallet_timestamp::Pezpallet; type AdminOrigin = pezframe_system::EnsureRoot; type EraPayout = pezpallet_staking::ConvertCurve; type ElectionProvider = pezframe_election_provider_support::NoElection<(AccountId, BlockNumber, Staking, (), ())>; type GenesisElectionProvider = Self::ElectionProvider; type VoterList = VoterList; type TargetList = pezpallet_staking::UseValidatorsMap; type EventListeners = (Pools, DelegatedStaking); } parameter_types! { pub static BagThresholds: &'static [VoteWeight] = &[10, 20, 30, 40, 50, 60, 1_000, 2_000, 10_000]; } impl pezpallet_bags_list::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = (); type BagThresholds = BagThresholds; type ScoreProvider = Staking; type Score = VoteWeight; type MaxAutoRebagPerBlock = (); } pub struct BalanceToU256; impl Convert for BalanceToU256 { fn convert(n: Balance) -> pezsp_core::U256 { n.into() } } pub struct U256ToBalance; impl Convert for U256ToBalance { fn convert(n: pezsp_core::U256) -> Balance { n.try_into().unwrap() } } parameter_types! { pub static PostUnbondingPoolsWindow: u32 = 10; pub const PoolsPalletId: PalletId = PalletId(*b"py/nopls"); pub const MaxPointsToBalance: u8 = 10; } impl pezpallet_nomination_pools::Config for Runtime { type RuntimeEvent = RuntimeEvent; type WeightInfo = (); type Currency = Balances; type RuntimeFreezeReason = RuntimeFreezeReason; type RewardCounter = FixedU128; type BalanceToU256 = BalanceToU256; type U256ToBalance = U256ToBalance; type StakeAdapter = pezpallet_nomination_pools::adapter::DelegateStake; type PostUnbondingPoolsWindow = PostUnbondingPoolsWindow; type MaxMetadataLen = ConstU32<256>; type MaxUnbonding = ConstU32<8>; type PalletId = PoolsPalletId; type MaxPointsToBalance = MaxPointsToBalance; type AdminOrigin = pezframe_system::EnsureRoot; type BlockNumberProvider = System; type Filter = Nothing; } parameter_types! { pub const DelegatedStakingPalletId: PalletId = PalletId(*b"py/dlstk"); pub const SlashRewardFraction: Perbill = Perbill::from_percent(1); } impl pezpallet_delegated_staking::Config for Runtime { type RuntimeEvent = RuntimeEvent; type PalletId = DelegatedStakingPalletId; type Currency = Balances; type OnSlash = (); type SlashRewardFraction = SlashRewardFraction; type RuntimeHoldReason = RuntimeHoldReason; type CoreStaking = Staking; } impl crate::Config for Runtime {} type Block = pezframe_system::mocking::MockBlock; pezframe_support::construct_runtime!( pub enum Runtime { System: pezframe_system, Timestamp: pezpallet_timestamp, Balances: pezpallet_balances, Staking: pezpallet_staking, VoterList: pezpallet_bags_list::, Pools: pezpallet_nomination_pools, DelegatedStaking: pezpallet_delegated_staking, } ); pub fn new_test_ext() -> pezsp_io::TestExternalities { let mut storage = pezframe_system::GenesisConfig::::default().build_storage().unwrap(); let _ = pezpallet_nomination_pools::GenesisConfig:: { min_join_bond: 2, min_create_bond: 2, max_pools: Some(3), max_members_per_pool: Some(3), max_members: Some(3 * 3), global_max_commission: Some(Perbill::from_percent(50)), } .assimilate_storage(&mut storage); pezsp_io::TestExternalities::from(storage) }