1#![cfg(test)]2#![allow(clippy::from_over_into)]3use crate as pallet_inflation;45use frame_support::{6 assert_ok, parameter_types,7 traits::{Currency, OnInitialize, Everything},8};9use frame_system::RawOrigin;10use sp_core::H256;11use sp_runtime::{12 traits::{BlakeTwo256, BlockNumberProvider, 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; 20 21 22const FIRST_YEAR_BLOCK_INFLATION: u64 = 1901;2324parameter_types! {25 pub const ExistentialDeposit: u64 = 1;26 pub const MaxLocks: u32 = 50;27}2829impl pallet_balances::Config for Test {30 type AccountStore = System;31 type Balance = u64;32 type DustRemoval = ();33 type Event = ();34 type ExistentialDeposit = ExistentialDeposit;35 type WeightInfo = ();36 type MaxLocks = MaxLocks;37 type MaxReserves = ();38 type ReserveIdentifier = ();39}4041frame_support::construct_runtime!(42 pub enum Test where43 Block = Block,44 NodeBlock = Block,45 UncheckedExtrinsic = UncheckedExtrinsic,46 {47 Balances: pallet_balances::{Pallet, Call, Storage},48 System: frame_system::{Pallet, Call, Config, Storage, Event<T>},49 Inflation: pallet_inflation::{Pallet, Call, Storage},50 }51);5253parameter_types! {54 pub const BlockHashCount: u64 = 250;55 pub BlockWeights: frame_system::limits::BlockWeights =56 frame_system::limits::BlockWeights::simple_max(1024);57 pub const SS58Prefix: u8 = 42;58}5960impl frame_system::Config for Test {61 type BaseCallFilter = Everything;62 type BlockWeights = ();63 type BlockLength = ();64 type DbWeight = ();65 type Origin = Origin;66 type Call = Call;67 type Index = u64;68 type BlockNumber = u64;69 type Hash = H256;70 type Hashing = BlakeTwo256;71 type AccountId = u64;72 type Lookup = IdentityLookup<Self::AccountId>;73 type Header = Header;74 type Event = ();75 type BlockHashCount = BlockHashCount;76 type Version = ();77 type PalletInfo = PalletInfo;78 type AccountData = pallet_balances::AccountData<u64>;79 type OnNewAccount = ();80 type OnKilledAccount = ();81 type SystemWeightInfo = ();82 type SS58Prefix = SS58Prefix;83 type OnSetCode = ();84}8586parameter_types! {87 pub TreasuryAccountId: u64 = 1234;88 pub const InflationBlockInterval: u32 = 100; 89 pub static MockBlockNumberProvider: u64 = 0;90}9192impl BlockNumberProvider for MockBlockNumberProvider {93 type BlockNumber = u64;9495 fn current_block_number() -> Self::BlockNumber {96 Self::get()97 }98}99100impl pallet_inflation::Config for Test {101 type Currency = Balances;102 type TreasuryAccountId = TreasuryAccountId;103 type InflationBlockInterval = InflationBlockInterval;104 type BlockNumberProvider = MockBlockNumberProvider;105}106107pub fn new_test_ext() -> sp_io::TestExternalities {108 frame_system::GenesisConfig::default()109 .build_storage::<Test>()110 .unwrap()111 .into()112}113114macro_rules! block_inflation {115 116 () => {117 118 <pallet_inflation::BlockInflation<Test>>::get()119 };120}121122#[test]123fn uninitialized_inflation() {124 new_test_ext().execute_with(|| {125 let initial_issuance: u64 = 1_000_000_000;126 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);127 assert_eq!(Balances::free_balance(1234), initial_issuance);128129 130 131 MockBlockNumberProvider::set(1);132133 assert_eq!(block_inflation!(), 0);134 });135}136137#[test]138fn inflation_works() {139 new_test_ext().execute_with(|| {140 141 let initial_issuance: u64 = 1_000_000_000;142 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);143 assert_eq!(Balances::free_balance(1234), initial_issuance);144145 146 147 MockBlockNumberProvider::set(1);148149 150 assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));151 assert_eq!(block_inflation!(), FIRST_YEAR_BLOCK_INFLATION);152 assert_eq!(153 Balances::free_balance(1234) - initial_issuance,154 block_inflation!()155 );156157 158 MockBlockNumberProvider::set(102);159 Inflation::on_initialize(0);160 assert_eq!(161 Balances::free_balance(1234) - initial_issuance,162 2 * block_inflation!()163 );164 });165}166167#[test]168fn inflation_second_deposit() {169 new_test_ext().execute_with(|| {170 171 let initial_issuance: u64 = 1_000_000_000;172 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);173 assert_eq!(Balances::free_balance(1234), initial_issuance);174 MockBlockNumberProvider::set(1);175176 177 assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));178179 180 let mut block: u64 = 2;181 let balance_before: u64 = Balances::free_balance(1234);182 while block < <pallet_inflation::NextInflationBlock<Test>>::get() {183 MockBlockNumberProvider::set(block as u64);184 Inflation::on_initialize(0);185 block += 1;186 }187 let balance_just_before: u64 = Balances::free_balance(1234);188 assert_eq!(balance_before, balance_just_before);189190 191 MockBlockNumberProvider::set(block as u64);192 Inflation::on_initialize(0);193 let balance_after: u64 = Balances::free_balance(1234);194 assert_eq!(balance_after - balance_just_before, block_inflation!());195 });196}197198#[test]199fn inflation_in_1_year() {200 new_test_ext().execute_with(|| {201 202 let initial_issuance: u64 = 1_000_000_000;203 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);204 assert_eq!(Balances::free_balance(1234), initial_issuance);205 MockBlockNumberProvider::set(1);206207 208 assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));209210 211 212 213 for block in (101..YEAR).step_by(100) {214 MockBlockNumberProvider::set(block);215 Inflation::on_initialize(0);216 }217 assert_eq!(218 initial_issuance + (FIRST_YEAR_BLOCK_INFLATION * (YEAR / 100)),219 <Balances as Currency<_>>::total_issuance()220 );221222 MockBlockNumberProvider::set(YEAR + 1);223 Inflation::on_initialize(0);224 let block_inflation_year_2 = block_inflation!();225 226 let expecter_year_2_inflation: u64 = (initial_issuance227 + FIRST_YEAR_BLOCK_INFLATION * YEAR / 100)228 * 933 * 100 / (10000 * YEAR);229 assert_eq!(block_inflation_year_2 / 10, expecter_year_2_inflation / 10); 230 });231}232233#[test]234fn inflation_after_year_10_is_flat() {235 new_test_ext().execute_with(|| {236 237 let initial_issuance: u64 = 1_000_000_000;238 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);239 assert_eq!(Balances::free_balance(1234), initial_issuance);240 MockBlockNumberProvider::set(YEAR * 9 + 1);241242 243 assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));244245 246 for _year in 1..=9 {247 Inflation::on_initialize(0);248 }249250 for year in 10..=20 {251 let block_inflation_year_before = block_inflation!();252 MockBlockNumberProvider::set(YEAR * year + 1);253 Inflation::on_initialize(0);254 let block_inflation_year_after = block_inflation!();255256 257 assert_eq!(block_inflation_year_before, block_inflation_year_after);258 }259 });260}261262#[test]263fn inflation_rate_by_year() {264 new_test_ext().execute_with(|| {265 let payouts: u64 = YEAR / InflationBlockInterval::get() as u64;266267 268 269 let payout_by_year: [u64; 11] = [1000, 933, 867, 800, 733, 667, 600, 533, 467, 400, 400];270271 272 let initial_issuance: u64 = payout_by_year[0] * payouts * 10;273 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);274 assert_eq!(Balances::free_balance(1234), initial_issuance);275276 277 assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));278279 for year in 0..=10 {280 281 MockBlockNumberProvider::set(YEAR * year + 1);282 Inflation::on_initialize(0);283 let mut actual_payout = block_inflation!();284 assert_eq!(actual_payout, payout_by_year[year as usize]);285286 287 MockBlockNumberProvider::set(YEAR * year + 2);288 Inflation::on_initialize(0);289 actual_payout = block_inflation!();290 assert_eq!(actual_payout, payout_by_year[year as usize]);291292 293 MockBlockNumberProvider::set(year * YEAR + YEAR / 2);294 Inflation::on_initialize(0);295 actual_payout = block_inflation!();296 assert_eq!(actual_payout, payout_by_year[year as usize]);297298 299 MockBlockNumberProvider::set((year + 1) * YEAR);300 Inflation::on_initialize(0);301 actual_payout = block_inflation!();302 assert_eq!(actual_payout, payout_by_year[year as usize]);303 }304 });305}