1234567891011121314151617#![cfg(test)]18#![allow(clippy::from_over_into)]19use crate as pallet_inflation;2021use frame_support::{22 assert_ok, parameter_types,23 traits::{Currency, OnInitialize, Everything, ConstU32},24 weights::Weight,25};26use frame_system::RawOrigin;27use sp_core::H256;28use sp_runtime::{29 traits::{BlakeTwo256, BlockNumberProvider, IdentityLookup},30 testing::Header,31};3233type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;34type Block = frame_system::mocking::MockBlock<Test>;3536const YEAR: u64 = 5_259_600; 37 38 39const FIRST_YEAR_BLOCK_INFLATION: u64 = 1901;4041parameter_types! {42 pub const ExistentialDeposit: u64 = 1;43 pub const MaxLocks: u32 = 50;44}4546impl pallet_balances::Config for Test {47 type AccountStore = System;48 type Balance = u64;49 type DustRemoval = ();50 type RuntimeEvent = ();51 type ExistentialDeposit = ExistentialDeposit;52 type WeightInfo = ();53 type MaxLocks = MaxLocks;54 type MaxReserves = ();55 type ReserveIdentifier = ();56}5758frame_support::construct_runtime!(59 pub enum Test where60 Block = Block,61 NodeBlock = Block,62 UncheckedExtrinsic = UncheckedExtrinsic,63 {64 Balances: pallet_balances::{Pallet, Call, Storage},65 System: frame_system::{Pallet, Call, Config, Storage, Event<T>},66 Inflation: pallet_inflation::{Pallet, Call, Storage},67 }68);6970parameter_types! {71 pub const BlockHashCount: u64 = 250;72 pub BlockWeights: frame_system::limits::BlockWeights =73 frame_system::limits::BlockWeights::simple_max(Weight::from_ref_time(1024));74 pub const SS58Prefix: u8 = 42;75}7677impl frame_system::Config for Test {78 type BaseCallFilter = Everything;79 type BlockWeights = ();80 type BlockLength = ();81 type DbWeight = ();82 type RuntimeOrigin = RuntimeOrigin;83 type RuntimeCall = RuntimeCall;84 type Index = u64;85 type BlockNumber = u64;86 type Hash = H256;87 type Hashing = BlakeTwo256;88 type AccountId = u64;89 type Lookup = IdentityLookup<Self::AccountId>;90 type Header = Header;91 type RuntimeEvent = ();92 type BlockHashCount = BlockHashCount;93 type Version = ();94 type PalletInfo = PalletInfo;95 type AccountData = pallet_balances::AccountData<u64>;96 type OnNewAccount = ();97 type OnKilledAccount = ();98 type SystemWeightInfo = ();99 type SS58Prefix = SS58Prefix;100 type OnSetCode = ();101 type MaxConsumers = ConstU32<16>;102}103104parameter_types! {105 pub TreasuryAccountId: u64 = 1234;106 pub const InflationBlockInterval: u32 = 100; 107 pub static MockBlockNumberProvider: u64 = 0;108}109110impl BlockNumberProvider for MockBlockNumberProvider {111 type BlockNumber = u64;112113 fn current_block_number() -> Self::BlockNumber {114 Self::get()115 }116}117118impl pallet_inflation::Config for Test {119 type Currency = Balances;120 type TreasuryAccountId = TreasuryAccountId;121 type InflationBlockInterval = InflationBlockInterval;122 type BlockNumberProvider = MockBlockNumberProvider;123}124125pub fn new_test_ext() -> sp_io::TestExternalities {126 frame_system::GenesisConfig::default()127 .build_storage::<Test>()128 .unwrap()129 .into()130}131132macro_rules! block_inflation {133 134 () => {135 136 <pallet_inflation::BlockInflation<Test>>::get()137 };138}139140#[test]141fn uninitialized_inflation() {142 new_test_ext().execute_with(|| {143 let initial_issuance: u64 = 1_000_000_000;144 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);145 assert_eq!(Balances::free_balance(1234), initial_issuance);146147 148 149 MockBlockNumberProvider::set(1);150151 assert_eq!(block_inflation!(), 0);152 });153}154155#[test]156fn inflation_works() {157 new_test_ext().execute_with(|| {158 159 let initial_issuance: u64 = 1_000_000_000;160 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);161 assert_eq!(Balances::free_balance(1234), initial_issuance);162163 164 165 MockBlockNumberProvider::set(1);166167 168 assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));169 assert_eq!(block_inflation!(), FIRST_YEAR_BLOCK_INFLATION);170 assert_eq!(171 Balances::free_balance(1234) - initial_issuance,172 block_inflation!()173 );174175 176 MockBlockNumberProvider::set(102);177 Inflation::on_initialize(0);178 assert_eq!(179 Balances::free_balance(1234) - initial_issuance,180 2 * block_inflation!()181 );182 });183}184185#[test]186fn inflation_second_deposit() {187 new_test_ext().execute_with(|| {188 189 let initial_issuance: u64 = 1_000_000_000;190 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);191 assert_eq!(Balances::free_balance(1234), initial_issuance);192 MockBlockNumberProvider::set(1);193194 195 assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));196197 198 let mut block: u64 = 2;199 let balance_before: u64 = Balances::free_balance(1234);200 while block < <pallet_inflation::NextInflationBlock<Test>>::get() {201 MockBlockNumberProvider::set(block as u64);202 Inflation::on_initialize(0);203 block += 1;204 }205 let balance_just_before: u64 = Balances::free_balance(1234);206 assert_eq!(balance_before, balance_just_before);207208 209 MockBlockNumberProvider::set(block as u64);210 Inflation::on_initialize(0);211 let balance_after: u64 = Balances::free_balance(1234);212 assert_eq!(balance_after - balance_just_before, block_inflation!());213 });214}215216#[test]217fn inflation_in_1_year() {218 new_test_ext().execute_with(|| {219 220 let initial_issuance: u64 = 1_000_000_000;221 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);222 assert_eq!(Balances::free_balance(1234), initial_issuance);223 MockBlockNumberProvider::set(1);224225 226 assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));227228 229 230 231 for block in (101..YEAR).step_by(100) {232 MockBlockNumberProvider::set(block);233 Inflation::on_initialize(0);234 }235 assert_eq!(236 initial_issuance + (FIRST_YEAR_BLOCK_INFLATION * (YEAR / 100)),237 <Balances as Currency<_>>::total_issuance()238 );239240 MockBlockNumberProvider::set(YEAR + 1);241 Inflation::on_initialize(0);242 let block_inflation_year_2 = block_inflation!();243 244 let expecter_year_2_inflation: u64 = (initial_issuance245 + FIRST_YEAR_BLOCK_INFLATION * YEAR / 100)246 * 933 * 100 / (10000 * YEAR);247 assert_eq!(block_inflation_year_2 / 10, expecter_year_2_inflation / 10); 248 });249}250251#[test]252fn inflation_start_large_kusama_block() {253 new_test_ext().execute_with(|| {254 255 let initial_issuance: u64 = 1_000_000_000;256 let start_block: u64 = 10457457;257 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);258 assert_eq!(Balances::free_balance(1234), initial_issuance);259 MockBlockNumberProvider::set(start_block);260261 262 assert_ok!(Inflation::start_inflation(263 RawOrigin::Root.into(),264 start_block265 ));266267 268 269 270 for block in (101..YEAR).step_by(100) {271 MockBlockNumberProvider::set(start_block + block);272 Inflation::on_initialize(0);273 }274 assert_eq!(275 initial_issuance + (FIRST_YEAR_BLOCK_INFLATION * (YEAR / 100)),276 <Balances as Currency<_>>::total_issuance()277 );278279 MockBlockNumberProvider::set(start_block + YEAR + 1);280 Inflation::on_initialize(0);281 let block_inflation_year_2 = block_inflation!();282 283 let expecter_year_2_inflation: u64 = (initial_issuance284 + FIRST_YEAR_BLOCK_INFLATION * YEAR / 100)285 * 933 * 100 / (10000 * YEAR);286 assert_eq!(block_inflation_year_2 / 10, expecter_year_2_inflation / 10); 287 });288}289290#[test]291fn inflation_after_year_10_is_flat() {292 new_test_ext().execute_with(|| {293 294 let initial_issuance: u64 = 1_000_000_000;295 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);296 assert_eq!(Balances::free_balance(1234), initial_issuance);297 MockBlockNumberProvider::set(YEAR * 9 + 1);298299 300 assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));301302 303 for _year in 1..=9 {304 Inflation::on_initialize(0);305 }306307 for year in 10..=20 {308 let block_inflation_year_before = block_inflation!();309 MockBlockNumberProvider::set(YEAR * year + 1);310 Inflation::on_initialize(0);311 let block_inflation_year_after = block_inflation!();312313 314 assert_eq!(block_inflation_year_before, block_inflation_year_after);315 }316 });317}318319#[test]320fn inflation_rate_by_year() {321 new_test_ext().execute_with(|| {322 let payouts: u64 = YEAR / InflationBlockInterval::get() as u64;323324 325 326 let payout_by_year: [u64; 11] = [1000, 933, 867, 800, 733, 667, 600, 533, 467, 400, 400];327328 329 let initial_issuance: u64 = payout_by_year[0] * payouts * 10;330 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);331 assert_eq!(Balances::free_balance(1234), initial_issuance);332333 334 assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));335336 for year in 0..=10 {337 338 MockBlockNumberProvider::set(YEAR * year + 1);339 Inflation::on_initialize(0);340 let mut actual_payout = block_inflation!();341 assert_eq!(actual_payout, payout_by_year[year as usize]);342343 344 MockBlockNumberProvider::set(YEAR * year + 2);345 Inflation::on_initialize(0);346 actual_payout = block_inflation!();347 assert_eq!(actual_payout, payout_by_year[year as usize]);348349 350 MockBlockNumberProvider::set(year * YEAR + YEAR / 2);351 Inflation::on_initialize(0);352 actual_payout = block_inflation!();353 assert_eq!(actual_payout, payout_by_year[year as usize]);354355 356 MockBlockNumberProvider::set((year + 1) * YEAR);357 Inflation::on_initialize(0);358 actual_payout = block_inflation!();359 assert_eq!(actual_payout, payout_by_year[year as usize]);360 }361 });362}