1#![cfg(test)]2#![allow(clippy::from_over_into)]3use crate as pallet_inflation;45use frame_support::{6 traits::{Currency},7 parameter_types,8};9use frame_support::{traits::OnInitialize};10use sp_core::H256;11use sp_runtime::{12 traits::{BlakeTwo256, IdentityLookup},13 testing::Header,14};1516type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;17type Block = frame_system::mocking::MockBlock<Test>;1819const YEAR: u64 = 5_259_600;2021parameter_types! {22 pub const ExistentialDeposit: u64 = 1;23 pub const MaxLocks: u32 = 50;24}2526impl pallet_balances::Config for Test {27 type AccountStore = System;28 type Balance = u64;29 type DustRemoval = ();30 type Event = ();31 type ExistentialDeposit = ExistentialDeposit;32 type WeightInfo = ();33 type MaxLocks = MaxLocks;34 type MaxReserves = ();35 type ReserveIdentifier = ();36}3738frame_support::construct_runtime!(39 pub enum Test where40 Block = Block,41 NodeBlock = Block,42 UncheckedExtrinsic = UncheckedExtrinsic,43 {44 Balances: pallet_balances::{Pallet, Call, Storage},45 System: frame_system::{Pallet, Call, Config, Storage, Event<T>},46 Inflation: pallet_inflation::{Pallet, Call, Storage},47 }48);4950parameter_types! {51 pub const BlockHashCount: u64 = 250;52 pub BlockWeights: frame_system::limits::BlockWeights =53 frame_system::limits::BlockWeights::simple_max(1024);54 pub const SS58Prefix: u8 = 42;55}5657impl frame_system::Config for Test {58 type BaseCallFilter = ();59 type BlockWeights = ();60 type BlockLength = ();61 type DbWeight = ();62 type Origin = Origin;63 type Call = Call;64 type Index = u64;65 type BlockNumber = u64;66 type Hash = H256;67 type Hashing = BlakeTwo256;68 type AccountId = u64;69 type Lookup = IdentityLookup<Self::AccountId>;70 type Header = Header;71 type Event = ();72 type BlockHashCount = BlockHashCount;73 type Version = ();74 type PalletInfo = PalletInfo;75 type AccountData = pallet_balances::AccountData<u64>;76 type OnNewAccount = ();77 type OnKilledAccount = ();78 type SystemWeightInfo = ();79 type SS58Prefix = SS58Prefix;80 type OnSetCode = ();81}8283parameter_types! {84 pub TreasuryAccountId: u64 = 1234;85 pub const InflationBlockInterval: u32 = 100; 86}8788impl pallet_inflation::Config for Test {89 type Currency = Balances;90 type TreasuryAccountId = TreasuryAccountId;91 type InflationBlockInterval = InflationBlockInterval;92}9394pub fn new_test_ext() -> sp_io::TestExternalities {95 frame_system::GenesisConfig::default()96 .build_storage::<Test>()97 .unwrap()98 .into()99}100101#[test]102fn inflation_works() {103 new_test_ext().execute_with(|| {104 105 let initial_issuance: u64 = 1_000_000_000;106 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);107 assert_eq!(Balances::free_balance(1234), initial_issuance);108109 110 111 Inflation::on_initialize(1);112113 114 assert_eq!(Inflation::block_inflation(), 1901);115 assert_eq!(116 Balances::free_balance(1234) - initial_issuance,117 Inflation::block_inflation()118 );119 });120}121122#[test]123fn inflation_second_deposit() {124 new_test_ext().execute_with(|| {125 126 let initial_issuance: u64 = 1_000_000_000;127 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);128 assert_eq!(Balances::free_balance(1234), initial_issuance);129 Inflation::on_initialize(1);130131 132 let mut block: u32 = 2;133 let balance_before: u64 = Balances::free_balance(1234);134 while block % InflationBlockInterval::get() != 0 {135 Inflation::on_initialize(block as u64);136 block += 1;137 }138 let balance_just_before: u64 = Balances::free_balance(1234);139 assert_eq!(balance_before, balance_just_before);140141 142 Inflation::on_initialize(block as u64);143 let balance_after: u64 = Balances::free_balance(1234);144 assert_eq!(145 balance_after - balance_just_before,146 Inflation::block_inflation()147 );148 });149}150151#[test]152fn inflation_in_1_year() {153 new_test_ext().execute_with(|| {154 155 let initial_issuance: u64 = 1_000_000_000;156 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);157 assert_eq!(Balances::free_balance(1234), initial_issuance);158 Inflation::on_initialize(1);159 let block_inflation_year_0 = Inflation::block_inflation();160161 162 163 for block in (100..YEAR).step_by(100) {164 Inflation::on_initialize(block);165 }166 assert_eq!(167 initial_issuance + (1901 * (YEAR / 100)),168 <Balances as Currency<_>>::total_issuance()169 );170171 Inflation::on_initialize(YEAR);172 let block_inflation_year_1 = Inflation::block_inflation();173 174 assert_eq!(block_inflation_year_1, 1952);175176 177 178 179 });180}181182#[test]183fn inflation_in_1_to_9_years() {184 new_test_ext().execute_with(|| {185 186 let initial_issuance: u64 = 1_000_000_000;187 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);188 assert_eq!(Balances::free_balance(1234), initial_issuance);189 Inflation::on_initialize(1);190191 for year in 1..=9 {192 let block_inflation_year_before = Inflation::block_inflation();193 Inflation::on_initialize(YEAR * year);194 let block_inflation_year_after = Inflation::block_inflation();195196 197 198 assert!(block_inflation_year_before > block_inflation_year_after);199 }200 });201}202203#[test]204fn inflation_after_year_10_is_flat() {205 new_test_ext().execute_with(|| {206 207 let initial_issuance: u64 = 1_000_000_000;208 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);209 assert_eq!(Balances::free_balance(1234), initial_issuance);210 Inflation::on_initialize(YEAR * 9);211212 for year in 10..=20 {213 let block_inflation_year_before = Inflation::block_inflation();214 Inflation::on_initialize(YEAR * year);215 let block_inflation_year_after = Inflation::block_inflation();216217 218 assert_eq!(block_inflation_year_before, block_inflation_year_after);219 }220 });221}222223#[test]224fn inflation_rate_by_year() {225 new_test_ext().execute_with(|| {226 let payouts: u64 = YEAR / InflationBlockInterval::get() as u64;227228 229 230 let payout_by_year: [u64; 11] = [1000, 933, 867, 800, 733, 667, 600, 533, 467, 400, 400];231232 233 let initial_issuance: u64 = payout_by_year[0] * payouts * 10;234 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);235 assert_eq!(Balances::free_balance(1234), initial_issuance);236237 for year in 0..=10 {238 239 Inflation::on_initialize(year * YEAR);240 let mut actual_payout = Inflation::block_inflation();241 assert_eq!(actual_payout, payout_by_year[year as usize]);242243 244 Inflation::on_initialize(year * YEAR + 1);245 actual_payout = Inflation::block_inflation();246 assert_eq!(actual_payout, payout_by_year[year as usize]);247248 249 Inflation::on_initialize(year * YEAR + YEAR / 2);250 actual_payout = Inflation::block_inflation();251 assert_eq!(actual_payout, payout_by_year[year as usize]);252253 254 Inflation::on_initialize((year + 1) * YEAR - 1);255 actual_payout = Inflation::block_inflation();256 assert_eq!(actual_payout, payout_by_year[year as usize]);257 }258 });259}