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, ConstU32},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 type MaxConsumers = ConstU32<16>;85}8687parameter_types! {88 pub TreasuryAccountId: u64 = 1234;89 pub const InflationBlockInterval: u32 = 100; 90 pub static MockBlockNumberProvider: u64 = 0;91}9293impl BlockNumberProvider for MockBlockNumberProvider {94 type BlockNumber = u64;9596 fn current_block_number() -> Self::BlockNumber {97 Self::get()98 }99}100101impl pallet_inflation::Config for Test {102 type Currency = Balances;103 type TreasuryAccountId = TreasuryAccountId;104 type InflationBlockInterval = InflationBlockInterval;105 type BlockNumberProvider = MockBlockNumberProvider;106}107108pub fn new_test_ext() -> sp_io::TestExternalities {109 frame_system::GenesisConfig::default()110 .build_storage::<Test>()111 .unwrap()112 .into()113}114115macro_rules! block_inflation {116 117 () => {118 119 <pallet_inflation::BlockInflation<Test>>::get()120 };121}122123#[test]124fn uninitialized_inflation() {125 new_test_ext().execute_with(|| {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);129130 131 132 MockBlockNumberProvider::set(1);133134 assert_eq!(block_inflation!(), 0);135 });136}137138#[test]139fn inflation_works() {140 new_test_ext().execute_with(|| {141 142 let initial_issuance: u64 = 1_000_000_000;143 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);144 assert_eq!(Balances::free_balance(1234), initial_issuance);145146 147 148 MockBlockNumberProvider::set(1);149150 151 assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));152 assert_eq!(block_inflation!(), FIRST_YEAR_BLOCK_INFLATION);153 assert_eq!(154 Balances::free_balance(1234) - initial_issuance,155 block_inflation!()156 );157158 159 MockBlockNumberProvider::set(102);160 Inflation::on_initialize(0);161 assert_eq!(162 Balances::free_balance(1234) - initial_issuance,163 2 * block_inflation!()164 );165 });166}167168#[test]169fn inflation_second_deposit() {170 new_test_ext().execute_with(|| {171 172 let initial_issuance: u64 = 1_000_000_000;173 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);174 assert_eq!(Balances::free_balance(1234), initial_issuance);175 MockBlockNumberProvider::set(1);176177 178 assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));179180 181 let mut block: u64 = 2;182 let balance_before: u64 = Balances::free_balance(1234);183 while block < <pallet_inflation::NextInflationBlock<Test>>::get() {184 MockBlockNumberProvider::set(block as u64);185 Inflation::on_initialize(0);186 block += 1;187 }188 let balance_just_before: u64 = Balances::free_balance(1234);189 assert_eq!(balance_before, balance_just_before);190191 192 MockBlockNumberProvider::set(block as u64);193 Inflation::on_initialize(0);194 let balance_after: u64 = Balances::free_balance(1234);195 assert_eq!(balance_after - balance_just_before, block_inflation!());196 });197}198199#[test]200fn inflation_in_1_year() {201 new_test_ext().execute_with(|| {202 203 let initial_issuance: u64 = 1_000_000_000;204 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);205 assert_eq!(Balances::free_balance(1234), initial_issuance);206 MockBlockNumberProvider::set(1);207208 209 assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));210211 212 213 214 for block in (101..YEAR).step_by(100) {215 MockBlockNumberProvider::set(block);216 Inflation::on_initialize(0);217 }218 assert_eq!(219 initial_issuance + (FIRST_YEAR_BLOCK_INFLATION * (YEAR / 100)),220 <Balances as Currency<_>>::total_issuance()221 );222223 MockBlockNumberProvider::set(YEAR + 1);224 Inflation::on_initialize(0);225 let block_inflation_year_2 = block_inflation!();226 227 let expecter_year_2_inflation: u64 = (initial_issuance228 + FIRST_YEAR_BLOCK_INFLATION * YEAR / 100)229 * 933 * 100 / (10000 * YEAR);230 assert_eq!(block_inflation_year_2 / 10, expecter_year_2_inflation / 10); 231 });232}233234#[test]235fn inflation_start_large_kusama_block() {236 new_test_ext().execute_with(|| {237 238 let initial_issuance: u64 = 1_000_000_000;239 let start_block: u64 = 10457457;240 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);241 assert_eq!(Balances::free_balance(1234), initial_issuance);242 MockBlockNumberProvider::set(start_block);243244 245 assert_ok!(Inflation::start_inflation(246 RawOrigin::Root.into(),247 start_block248 ));249250 251 252 253 for block in (101..YEAR).step_by(100) {254 MockBlockNumberProvider::set(start_block + block);255 Inflation::on_initialize(0);256 }257 assert_eq!(258 initial_issuance + (FIRST_YEAR_BLOCK_INFLATION * (YEAR / 100)),259 <Balances as Currency<_>>::total_issuance()260 );261262 MockBlockNumberProvider::set(start_block + YEAR + 1);263 Inflation::on_initialize(0);264 let block_inflation_year_2 = block_inflation!();265 266 let expecter_year_2_inflation: u64 = (initial_issuance267 + FIRST_YEAR_BLOCK_INFLATION * YEAR / 100)268 * 933 * 100 / (10000 * YEAR);269 assert_eq!(block_inflation_year_2 / 10, expecter_year_2_inflation / 10); 270 });271}272273#[test]274fn inflation_after_year_10_is_flat() {275 new_test_ext().execute_with(|| {276 277 let initial_issuance: u64 = 1_000_000_000;278 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);279 assert_eq!(Balances::free_balance(1234), initial_issuance);280 MockBlockNumberProvider::set(YEAR * 9 + 1);281282 283 assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));284285 286 for _year in 1..=9 {287 Inflation::on_initialize(0);288 }289290 for year in 10..=20 {291 let block_inflation_year_before = block_inflation!();292 MockBlockNumberProvider::set(YEAR * year + 1);293 Inflation::on_initialize(0);294 let block_inflation_year_after = block_inflation!();295296 297 assert_eq!(block_inflation_year_before, block_inflation_year_after);298 }299 });300}301302#[test]303fn inflation_rate_by_year() {304 new_test_ext().execute_with(|| {305 let payouts: u64 = YEAR / InflationBlockInterval::get() as u64;306307 308 309 let payout_by_year: [u64; 11] = [1000, 933, 867, 800, 733, 667, 600, 533, 467, 400, 400];310311 312 let initial_issuance: u64 = payout_by_year[0] * payouts * 10;313 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);314 assert_eq!(Balances::free_balance(1234), initial_issuance);315316 317 assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));318319 for year in 0..=10 {320 321 MockBlockNumberProvider::set(YEAR * year + 1);322 Inflation::on_initialize(0);323 let mut actual_payout = block_inflation!();324 assert_eq!(actual_payout, payout_by_year[year as usize]);325326 327 MockBlockNumberProvider::set(YEAR * year + 2);328 Inflation::on_initialize(0);329 actual_payout = block_inflation!();330 assert_eq!(actual_payout, payout_by_year[year as usize]);331332 333 MockBlockNumberProvider::set(year * YEAR + YEAR / 2);334 Inflation::on_initialize(0);335 actual_payout = block_inflation!();336 assert_eq!(actual_payout, payout_by_year[year as usize]);337338 339 MockBlockNumberProvider::set((year + 1) * YEAR);340 Inflation::on_initialize(0);341 actual_payout = block_inflation!();342 assert_eq!(actual_payout, payout_by_year[year as usize]);343 }344 });345}