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::{10 traits::{OnInitialize, Everything},11};12use sp_core::H256;13use sp_runtime::{14 traits::{BlakeTwo256, IdentityLookup},15 testing::Header,16};1718type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;19type Block = frame_system::mocking::MockBlock<Test>;2021const YEAR: u64 = 5_259_600;2223parameter_types! {24 pub const ExistentialDeposit: u64 = 1;25 pub const MaxLocks: u32 = 50;26}2728impl pallet_balances::Config for Test {29 type AccountStore = System;30 type Balance = u64;31 type DustRemoval = ();32 type Event = ();33 type ExistentialDeposit = ExistentialDeposit;34 type WeightInfo = ();35 type MaxLocks = MaxLocks;36 type MaxReserves = ();37 type ReserveIdentifier = ();38}3940frame_support::construct_runtime!(41 pub enum Test where42 Block = Block,43 NodeBlock = Block,44 UncheckedExtrinsic = UncheckedExtrinsic,45 {46 Balances: pallet_balances::{Pallet, Call, Storage},47 System: frame_system::{Pallet, Call, Config, Storage, Event<T>},48 Inflation: pallet_inflation::{Pallet, Call, Storage},49 }50);5152parameter_types! {53 pub const BlockHashCount: u64 = 250;54 pub BlockWeights: frame_system::limits::BlockWeights =55 frame_system::limits::BlockWeights::simple_max(1024);56 pub const SS58Prefix: u8 = 42;57}5859impl frame_system::Config for Test {60 type BaseCallFilter = Everything;61 type BlockWeights = ();62 type BlockLength = ();63 type DbWeight = ();64 type Origin = Origin;65 type Call = Call;66 type Index = u64;67 type BlockNumber = u64;68 type Hash = H256;69 type Hashing = BlakeTwo256;70 type AccountId = u64;71 type Lookup = IdentityLookup<Self::AccountId>;72 type Header = Header;73 type Event = ();74 type BlockHashCount = BlockHashCount;75 type Version = ();76 type PalletInfo = PalletInfo;77 type AccountData = pallet_balances::AccountData<u64>;78 type OnNewAccount = ();79 type OnKilledAccount = ();80 type SystemWeightInfo = ();81 type SS58Prefix = SS58Prefix;82 type OnSetCode = ();83}8485parameter_types! {86 pub TreasuryAccountId: u64 = 1234;87 pub const InflationBlockInterval: u32 = 100; 88}8990impl pallet_inflation::Config for Test {91 type Currency = Balances;92 type TreasuryAccountId = TreasuryAccountId;93 type InflationBlockInterval = InflationBlockInterval;94}9596pub fn new_test_ext() -> sp_io::TestExternalities {97 frame_system::GenesisConfig::default()98 .build_storage::<Test>()99 .unwrap()100 .into()101}102103#[test]104fn inflation_works() {105 new_test_ext().execute_with(|| {106 107 let initial_issuance: u64 = 1_000_000_000;108 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);109 assert_eq!(Balances::free_balance(1234), initial_issuance);110111 112 113 Inflation::on_initialize(1);114115 116 assert_eq!(Inflation::block_inflation(), 1901);117 assert_eq!(118 Balances::free_balance(1234) - initial_issuance,119 Inflation::block_inflation()120 );121 });122}123124#[test]125fn inflation_second_deposit() {126 new_test_ext().execute_with(|| {127 128 let initial_issuance: u64 = 1_000_000_000;129 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);130 assert_eq!(Balances::free_balance(1234), initial_issuance);131 Inflation::on_initialize(1);132133 134 let mut block: u32 = 2;135 let balance_before: u64 = Balances::free_balance(1234);136 while block % InflationBlockInterval::get() != 0 {137 Inflation::on_initialize(block as u64);138 block += 1;139 }140 let balance_just_before: u64 = Balances::free_balance(1234);141 assert_eq!(balance_before, balance_just_before);142143 144 Inflation::on_initialize(block as u64);145 let balance_after: u64 = Balances::free_balance(1234);146 assert_eq!(147 balance_after - balance_just_before,148 Inflation::block_inflation()149 );150 });151}152153#[test]154fn inflation_in_1_year() {155 new_test_ext().execute_with(|| {156 157 let initial_issuance: u64 = 1_000_000_000;158 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);159 assert_eq!(Balances::free_balance(1234), initial_issuance);160 Inflation::on_initialize(1);161 let block_inflation_year_0 = Inflation::block_inflation();162163 164 165 for block in (100..YEAR).step_by(100) {166 Inflation::on_initialize(block);167 }168 assert_eq!(169 initial_issuance + (1901 * (YEAR / 100)),170 <Balances as Currency<_>>::total_issuance()171 );172173 Inflation::on_initialize(YEAR);174 let block_inflation_year_1 = Inflation::block_inflation();175 176 assert_eq!(block_inflation_year_1, 1952);177178 179 180 181 });182}183184#[test]185fn inflation_in_1_to_9_years() {186 new_test_ext().execute_with(|| {187 188 let initial_issuance: u64 = 1_000_000_000;189 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);190 assert_eq!(Balances::free_balance(1234), initial_issuance);191 Inflation::on_initialize(1);192193 for year in 1..=9 {194 let block_inflation_year_before = Inflation::block_inflation();195 Inflation::on_initialize(YEAR * year);196 let block_inflation_year_after = Inflation::block_inflation();197198 199 200 assert!(block_inflation_year_before > block_inflation_year_after);201 }202 });203}204205#[test]206fn inflation_after_year_10_is_flat() {207 new_test_ext().execute_with(|| {208 209 let initial_issuance: u64 = 1_000_000_000;210 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);211 assert_eq!(Balances::free_balance(1234), initial_issuance);212 Inflation::on_initialize(YEAR * 9);213214 for year in 10..=20 {215 let block_inflation_year_before = Inflation::block_inflation();216 Inflation::on_initialize(YEAR * year);217 let block_inflation_year_after = Inflation::block_inflation();218219 220 assert_eq!(block_inflation_year_before, block_inflation_year_after);221 }222 });223}224225#[test]226fn inflation_rate_by_year() {227 new_test_ext().execute_with(|| {228 let payouts: u64 = YEAR / InflationBlockInterval::get() as u64;229230 231 232 let payout_by_year: [u64; 11] = [1000, 933, 867, 800, 733, 667, 600, 533, 467, 400, 400];233234 235 let initial_issuance: u64 = payout_by_year[0] * payouts * 10;236 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);237 assert_eq!(Balances::free_balance(1234), initial_issuance);238239 for year in 0..=10 {240 241 Inflation::on_initialize(year * YEAR);242 let mut actual_payout = Inflation::block_inflation();243 assert_eq!(actual_payout, payout_by_year[year as usize]);244245 246 Inflation::on_initialize(year * YEAR + 1);247 actual_payout = Inflation::block_inflation();248 assert_eq!(actual_payout, payout_by_year[year as usize]);249250 251 Inflation::on_initialize(year * YEAR + YEAR / 2);252 actual_payout = Inflation::block_inflation();253 assert_eq!(actual_payout, payout_by_year[year as usize]);254255 256 Inflation::on_initialize((year + 1) * YEAR - 1);257 actual_payout = Inflation::block_inflation();258 assert_eq!(actual_payout, payout_by_year[year as usize]);259 }260 });261}