git.delta.rocks / unique-network / refs/commits / ad2fb5492655

difftreelog

source

pallets/inflation/src/tests.rs7.2 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}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; // every time per how many blocks inflation is applied84}8586impl pallet_inflation::Config for Test {87	type Currency = Balances;88	type TreasuryAccountId = TreasuryAccountId;89	type InflationBlockInterval = InflationBlockInterval;90}9192// Build genesis storage according to the mock runtime.93pub 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		// Total issuance = 1_000_000_000104		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		// BlockInflation should be set after 1st block and109		// first inflation deposit should be equal to BlockInflation110		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		// Total issuance = 1_000_000_000123		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		// Next inflation deposit happens when block is multiple of InflationBlockInterval129		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		// The block with inflation139		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		// Total issuance = 1_000_000_000152		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		// Assert that year 1 inflation is less than year 0162		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		// Total issuance = 1_000_000_000170		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			// Assert that next year inflation is less than previous year inflation181			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		// Total issuance = 1_000_000_000190		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			// Assert that next year inflation is equal to previous year inflation201			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		// Inflation starts at 10% and does down by 2/3% every year until year 9 (included),212		// then it is flat.213		let payout_by_year: [u64; 11] = [1000, 933, 867, 800, 733, 667, 600, 533, 467, 400, 400];214215		// For accuracy total issuance = payout0 * payouts * 10;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			// Year first block222			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			// Year second block227			Inflation::on_initialize(year * YEAR + 1);228			actual_payout = Inflation::block_inflation();229			assert_eq!(actual_payout, payout_by_year[year as usize]);230231			// Year middle block232			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			// Year last block237			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}