git.delta.rocks / unique-network / refs/commits / 44bd99aa7cbe

difftreelog

source

pallets/inflation/src/tests.rs7.8 KiBsourcehistory
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	type MaxReserves = ();35	type ReserveIdentifier = ();36}3738frame_support::construct_runtime!(39	pub enum Test where40		Block = Block,41		NodeBlock = Block,42		UncheckedExtrinsic = UncheckedExtrinsic,43	{44		Balances: pallet_balances::{Pallet, Call, Storage},45		System: frame_system::{Pallet, Call, Config, Storage, Event<T>},46		Inflation: pallet_inflation::{Pallet, Call, Storage},47	}48);4950parameter_types! {51	pub const BlockHashCount: u64 = 250;52	pub BlockWeights: frame_system::limits::BlockWeights =53		frame_system::limits::BlockWeights::simple_max(1024);54	pub const SS58Prefix: u8 = 42;55}5657impl frame_system::Config for Test {58	type BaseCallFilter = ();59	type BlockWeights = ();60	type BlockLength = ();61	type DbWeight = ();62	type Origin = Origin;63	type Call = Call;64	type Index = u64;65	type BlockNumber = u64;66	type Hash = H256;67	type Hashing = BlakeTwo256;68	type AccountId = u64;69	type Lookup = IdentityLookup<Self::AccountId>;70	type Header = Header;71	type Event = ();72	type BlockHashCount = BlockHashCount;73	type Version = ();74	type PalletInfo = PalletInfo;75	type AccountData = pallet_balances::AccountData<u64>;76	type OnNewAccount = ();77	type OnKilledAccount = ();78	type SystemWeightInfo = ();79	type SS58Prefix = SS58Prefix;80	type OnSetCode = ();81}8283parameter_types! {84	pub TreasuryAccountId: u64 = 1234;85	pub const InflationBlockInterval: u32 = 100; // every time per how many blocks inflation is applied86}8788impl pallet_inflation::Config for Test {89	type Currency = Balances;90	type TreasuryAccountId = TreasuryAccountId;91	type InflationBlockInterval = InflationBlockInterval;92}9394pub fn new_test_ext() -> sp_io::TestExternalities {95	frame_system::GenesisConfig::default()96		.build_storage::<Test>()97		.unwrap()98		.into()99}100101#[test]102fn inflation_works() {103	new_test_ext().execute_with(|| {104		// Total issuance = 1_000_000_000105		let initial_issuance: u64 = 1_000_000_000;106		let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);107		assert_eq!(Balances::free_balance(1234), initial_issuance);108109		// BlockInflation should be set after 1st block and110		// first inflation deposit should be equal to BlockInflation111		Inflation::on_initialize(1);112113		// SBP M2 review: Verify expected block inflation for year 1114		assert_eq!(Inflation::block_inflation(), 1901);115		assert_eq!(116			Balances::free_balance(1234) - initial_issuance,117			Inflation::block_inflation()118		);119	});120}121122#[test]123fn inflation_second_deposit() {124	new_test_ext().execute_with(|| {125		// Total issuance = 1_000_000_000126		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);129		Inflation::on_initialize(1);130131		// Next inflation deposit happens when block is multiple of InflationBlockInterval132		let mut block: u32 = 2;133		let balance_before: u64 = Balances::free_balance(1234);134		while block % InflationBlockInterval::get() != 0 {135			Inflation::on_initialize(block as u64);136			block += 1;137		}138		let balance_just_before: u64 = Balances::free_balance(1234);139		assert_eq!(balance_before, balance_just_before);140141		// The block with inflation142		Inflation::on_initialize(block as u64);143		let balance_after: u64 = Balances::free_balance(1234);144		assert_eq!(145			balance_after - balance_just_before,146			Inflation::block_inflation()147		);148	});149}150151#[test]152fn inflation_in_1_year() {153	new_test_ext().execute_with(|| {154		// Total issuance = 1_000_000_000155		let initial_issuance: u64 = 1_000_000_000;156		let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);157		assert_eq!(Balances::free_balance(1234), initial_issuance);158		Inflation::on_initialize(1);159		let block_inflation_year_0 = Inflation::block_inflation();160161		// SBP M2 review: go through all the block inflations for year 1,162		// total issuance will be updated accordingly163		for block in (100..YEAR).step_by(100) {164			Inflation::on_initialize(block);165		}166		assert_eq!(167			initial_issuance + (1901 * (YEAR / 100)),168			<Balances as Currency<_>>::total_issuance()169		);170171		Inflation::on_initialize(YEAR);172		let block_inflation_year_1 = Inflation::block_inflation();173		// SBP M2 review: Verify expected block inflation for year 2174		assert_eq!(block_inflation_year_1, 1952);175176		// SBP M2 review: this is actually not true177		// Assert that year 1 inflation is less than year 0178		// assert!(block_inflation_year_0 > block_inflation_year_1);179	});180}181182#[test]183fn inflation_in_1_to_9_years() {184	new_test_ext().execute_with(|| {185		// Total issuance = 1_000_000_000186		let initial_issuance: u64 = 1_000_000_000;187		let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);188		assert_eq!(Balances::free_balance(1234), initial_issuance);189		Inflation::on_initialize(1);190191		for year in 1..=9 {192			let block_inflation_year_before = Inflation::block_inflation();193			Inflation::on_initialize(YEAR * year);194			let block_inflation_year_after = Inflation::block_inflation();195196			// SBP M2 review: this is actually not true (not for the first few years)197			// Assert that next year inflation is less than previous year inflation198			assert!(block_inflation_year_before > block_inflation_year_after);199		}200	});201}202203#[test]204fn inflation_after_year_10_is_flat() {205	new_test_ext().execute_with(|| {206		// Total issuance = 1_000_000_000207		let initial_issuance: u64 = 1_000_000_000;208		let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);209		assert_eq!(Balances::free_balance(1234), initial_issuance);210		Inflation::on_initialize(YEAR * 9);211212		for year in 10..=20 {213			let block_inflation_year_before = Inflation::block_inflation();214			Inflation::on_initialize(YEAR * year);215			let block_inflation_year_after = Inflation::block_inflation();216217			// Assert that next year inflation is equal to previous year inflation218			assert_eq!(block_inflation_year_before, block_inflation_year_after);219		}220	});221}222223#[test]224fn inflation_rate_by_year() {225	new_test_ext().execute_with(|| {226		let payouts: u64 = YEAR / InflationBlockInterval::get() as u64;227228		// Inflation starts at 10% and does down by 2/3% every year until year 9 (included),229		// then it is flat.230		let payout_by_year: [u64; 11] = [1000, 933, 867, 800, 733, 667, 600, 533, 467, 400, 400];231232		// For accuracy total issuance = payout0 * payouts * 10;233		let initial_issuance: u64 = payout_by_year[0] * payouts * 10;234		let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);235		assert_eq!(Balances::free_balance(1234), initial_issuance);236237		for year in 0..=10 {238			// Year first block239			Inflation::on_initialize(year * YEAR);240			let mut actual_payout = Inflation::block_inflation();241			assert_eq!(actual_payout, payout_by_year[year as usize]);242243			// Year second block244			Inflation::on_initialize(year * YEAR + 1);245			actual_payout = Inflation::block_inflation();246			assert_eq!(actual_payout, payout_by_year[year as usize]);247248			// Year middle block249			Inflation::on_initialize(year * YEAR + YEAR / 2);250			actual_payout = Inflation::block_inflation();251			assert_eq!(actual_payout, payout_by_year[year as usize]);252253			// Year last block254			Inflation::on_initialize((year + 1) * YEAR - 1);255			actual_payout = Inflation::block_inflation();256			assert_eq!(actual_payout, payout_by_year[year as usize]);257		}258	});259}