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}3536frame_support::construct_runtime!(37 pub enum Test where38 Block = Block,39 NodeBlock = Block,40 UncheckedExtrinsic = UncheckedExtrinsic,41 {42 Balances: pallet_balances::{Pallet, Call, Storage},43 System: frame_system::{Pallet, Call, Config, Storage, Event<T>},44 Inflation: pallet_inflation::{Pallet, Call, Storage},45 }46);4748parameter_types! {49 pub const BlockHashCount: u64 = 250;50 pub BlockWeights: frame_system::limits::BlockWeights =51 frame_system::limits::BlockWeights::simple_max(1024);52 pub const SS58Prefix: u8 = 42;53}5455impl frame_system::Config for Test {56 type BaseCallFilter = ();57 type BlockWeights = ();58 type BlockLength = ();59 type DbWeight = ();60 type Origin = Origin;61 type Call = Call;62 type Index = u64;63 type BlockNumber = u64;64 type Hash = H256;65 type Hashing = BlakeTwo256;66 type AccountId = u64;67 type Lookup = IdentityLookup<Self::AccountId>;68 type Header = Header;69 type Event = ();70 type BlockHashCount = BlockHashCount;71 type Version = ();72 type PalletInfo = PalletInfo;73 type AccountData = pallet_balances::AccountData<u64>;74 type OnNewAccount = ();75 type OnKilledAccount = ();76 type SystemWeightInfo = ();77 type SS58Prefix = SS58Prefix;78 type OnSetCode = ();79}8081parameter_types! {82 pub TreasuryAccountId: u64 = 1234;83 pub const InflationBlockInterval: u32 = 100; 84}8586impl pallet_inflation::Config for Test {87 type Currency = Balances;88 type TreasuryAccountId = TreasuryAccountId;89 type InflationBlockInterval = InflationBlockInterval;90}919293pub fn new_test_ext() -> sp_io::TestExternalities {94 frame_system::GenesisConfig::default()95 .build_storage::<Test>()96 .unwrap()97 .into()98}99100#[test]101fn inflation_works() {102 new_test_ext().execute_with(|| {103 104 let initial_issuance: u64 = 1_000_000_000;105 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);106 assert_eq!(Balances::free_balance(1234), initial_issuance);107108 109 110 Inflation::on_initialize(1);111 assert!(Inflation::block_inflation() > 0);112 assert_eq!(113 Balances::free_balance(1234) - initial_issuance,114 Inflation::block_inflation()115 );116 });117}118119#[test]120fn inflation_second_deposit() {121 new_test_ext().execute_with(|| {122 123 let initial_issuance: u64 = 1_000_000_000;124 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);125 assert_eq!(Balances::free_balance(1234), initial_issuance);126 Inflation::on_initialize(1);127128 129 let mut block: u32 = 2;130 let balance_before: u64 = Balances::free_balance(1234);131 while block % InflationBlockInterval::get() != 0 {132 Inflation::on_initialize(block as u64);133 block += 1;134 }135 let balance_just_before: u64 = Balances::free_balance(1234);136 assert_eq!(balance_before, balance_just_before);137138 139 Inflation::on_initialize(block as u64);140 let balance_after: u64 = Balances::free_balance(1234);141 assert_eq!(142 balance_after - balance_just_before,143 Inflation::block_inflation()144 );145 });146}147148#[test]149fn inflation_in_1_year() {150 new_test_ext().execute_with(|| {151 152 let initial_issuance: u64 = 1_000_000_000;153 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);154 assert_eq!(Balances::free_balance(1234), initial_issuance);155 Inflation::on_initialize(1);156 let block_inflation_year_0 = Inflation::block_inflation();157158 Inflation::on_initialize(YEAR);159 let block_inflation_year_1 = Inflation::block_inflation();160161 162 assert!(block_inflation_year_0 > block_inflation_year_1);163 });164}165166#[test]167fn inflation_in_1_to_9_years() {168 new_test_ext().execute_with(|| {169 170 let initial_issuance: u64 = 1_000_000_000;171 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);172 assert_eq!(Balances::free_balance(1234), initial_issuance);173 Inflation::on_initialize(1);174175 for year in 1..=9 {176 let block_inflation_year_before = Inflation::block_inflation();177 Inflation::on_initialize(YEAR * year);178 let block_inflation_year_after = Inflation::block_inflation();179180 181 assert!(block_inflation_year_before > block_inflation_year_after);182 }183 });184}185186#[test]187fn inflation_after_year_10_is_flat() {188 new_test_ext().execute_with(|| {189 190 let initial_issuance: u64 = 1_000_000_000;191 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);192 assert_eq!(Balances::free_balance(1234), initial_issuance);193 Inflation::on_initialize(YEAR * 9);194195 for year in 10..=20 {196 let block_inflation_year_before = Inflation::block_inflation();197 Inflation::on_initialize(YEAR * year);198 let block_inflation_year_after = Inflation::block_inflation();199200 201 assert_eq!(block_inflation_year_before, block_inflation_year_after);202 }203 });204}205206#[test]207fn inflation_rate_by_year() {208 new_test_ext().execute_with(|| {209 let payouts: u64 = YEAR / InflationBlockInterval::get() as u64;210211 212 213 let payout_by_year: [u64; 11] = [1000, 933, 867, 800, 733, 667, 600, 533, 467, 400, 400];214215 216 let initial_issuance: u64 = payout_by_year[0] * payouts * 10;217 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);218 assert_eq!(Balances::free_balance(1234), initial_issuance);219220 for year in 0..=10 {221 222 Inflation::on_initialize(year * YEAR);223 let mut actual_payout = Inflation::block_inflation();224 assert_eq!(actual_payout, payout_by_year[year as usize]);225226 227 Inflation::on_initialize(year * YEAR + 1);228 actual_payout = Inflation::block_inflation();229 assert_eq!(actual_payout, payout_by_year[year as usize]);230231 232 Inflation::on_initialize(year * YEAR + YEAR / 2);233 actual_payout = Inflation::block_inflation();234 assert_eq!(actual_payout, payout_by_year[year as usize]);235236 237 Inflation::on_initialize((year + 1) * YEAR - 1);238 actual_payout = Inflation::block_inflation();239 assert_eq!(actual_payout, payout_by_year[year as usize]);240 }241 });242}