git.delta.rocks / unique-network / refs/commits / 103f351cae21

difftreelog

fix cargo fmt and warnings

Grigoriy Simonov2023-05-25parent: #7bc3b32.patch.diff
in: master

2 files changed

modifiedpallets/inflation/src/lib.rsdiffbeforeafterboth
--- a/pallets/inflation/src/lib.rs
+++ b/pallets/inflation/src/lib.rs
@@ -41,15 +41,12 @@
 	dispatch::{DispatchResult},
 	traits::{
 		fungible::{Balanced, Inspect, Mutate},
-		Get, Imbalance,
+		Get,
 		tokens::Precision,
 	},
 };
 pub use pallet::*;
-use sp_runtime::{
-	Perbill,
-	traits::{BlockNumberProvider, Zero},
-};
+use sp_runtime::{Perbill, traits::BlockNumberProvider};
 
 use sp_std::convert::TryInto;
 
modifiedpallets/inflation/src/tests.rsdiffbeforeafterboth
before · pallets/inflation/src/tests.rs
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617#![cfg(test)]18#![allow(clippy::from_over_into)]19use crate as pallet_inflation;2021use frame_support::{22	assert_ok, parameter_types,23	traits::{fungible::{Balanced, Inspect}, OnInitialize, Everything, ConstU32, tokens::Precision},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; // 6-second blocks37							 // const YEAR: u64 = 2_629_800; // 12-second blocks38							 // Expected 100-block inflation for year 1 is 100 * 100_000_000 / YEAR = FIRST_YEAR_BLOCK_INFLATION39const 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	type HoldIdentifier = ();57	type FreezeIdentifier = ();58	type MaxHolds = ();59	type MaxFreezes = ();60}6162frame_support::construct_runtime!(63	pub enum Test where64		Block = Block,65		NodeBlock = Block,66		UncheckedExtrinsic = UncheckedExtrinsic,67	{68		Balances: pallet_balances::{Pallet, Call, Storage},69		System: frame_system::{Pallet, Call, Config, Storage, Event<T>},70		Inflation: pallet_inflation::{Pallet, Call, Storage},71	}72);7374parameter_types! {75	pub const BlockHashCount: u64 = 250;76	pub BlockWeights: frame_system::limits::BlockWeights =77		frame_system::limits::BlockWeights::simple_max(Weight::from_ref_time(1024));78	pub const SS58Prefix: u8 = 42;79}8081impl frame_system::Config for Test {82	type BaseCallFilter = Everything;83	type BlockWeights = ();84	type BlockLength = ();85	type DbWeight = ();86	type RuntimeOrigin = RuntimeOrigin;87	type RuntimeCall = RuntimeCall;88	type Index = u64;89	type BlockNumber = u64;90	type Hash = H256;91	type Hashing = BlakeTwo256;92	type AccountId = u64;93	type Lookup = IdentityLookup<Self::AccountId>;94	type Header = Header;95	type RuntimeEvent = ();96	type BlockHashCount = BlockHashCount;97	type Version = ();98	type PalletInfo = PalletInfo;99	type AccountData = pallet_balances::AccountData<u64>;100	type OnNewAccount = ();101	type OnKilledAccount = ();102	type SystemWeightInfo = ();103	type SS58Prefix = SS58Prefix;104	type OnSetCode = ();105	type MaxConsumers = ConstU32<16>;106}107108parameter_types! {109	pub TreasuryAccountId: u64 = 1234;110	pub const InflationBlockInterval: u32 = 100; // every time per how many blocks inflation is applied111	pub static MockBlockNumberProvider: u64 = 0;112}113114impl BlockNumberProvider for MockBlockNumberProvider {115	type BlockNumber = u64;116117	fn current_block_number() -> Self::BlockNumber {118		Self::get()119	}120}121122impl pallet_inflation::Config for Test {123	type Currency = Balances;124	type TreasuryAccountId = TreasuryAccountId;125	type InflationBlockInterval = InflationBlockInterval;126	type BlockNumberProvider = MockBlockNumberProvider;127}128129pub fn new_test_ext() -> sp_io::TestExternalities {130	frame_system::GenesisConfig::default()131		.build_storage::<Test>()132		.unwrap()133		.into()134}135136macro_rules! block_inflation {137	// Block inflation doesn't have any argumets138	() => {139		// Return BlockInflation state variable current value140		<pallet_inflation::BlockInflation<Test>>::get()141	};142}143144#[test]145fn uninitialized_inflation() {146	new_test_ext().execute_with(|| {147		let initial_issuance: u64 = 1_000_000_000;148		let _ = <Balances as Balanced<_>>::deposit(&1234, initial_issuance, Precision::Exact);149		assert_eq!(Balances::free_balance(1234), initial_issuance);150151		// BlockInflation should be set after inflation is started152		// first inflation deposit should be equal to BlockInflation153		MockBlockNumberProvider::set(1);154155		assert_eq!(block_inflation!(), 0);156	});157}158159#[test]160fn inflation_works() {161	new_test_ext().execute_with(|| {162		// Total issuance = 1_000_000_000163		let initial_issuance: u64 = 1_000_000_000;164		let _ = <Balances as Balanced<_>>::deposit(&1234, initial_issuance, Precision::Exact);165		assert_eq!(Balances::free_balance(1234), initial_issuance);166167		// BlockInflation should be set after inflation is started168		// first inflation deposit should be equal to BlockInflation169		MockBlockNumberProvider::set(1);170171		// Start inflation as sudo172		assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));173		assert_eq!(block_inflation!(), FIRST_YEAR_BLOCK_INFLATION);174		assert_eq!(175			Balances::free_balance(1234) - initial_issuance,176			block_inflation!()177		);178179		// Trigger inflation180		MockBlockNumberProvider::set(102);181		Inflation::on_initialize(0);182		assert_eq!(183			Balances::free_balance(1234) - initial_issuance,184			2 * block_inflation!()185		);186	});187}188189#[test]190fn inflation_second_deposit() {191	new_test_ext().execute_with(|| {192		// Total issuance = 1_000_000_000193		let initial_issuance: u64 = 1_000_000_000;194		let _ = <Balances as Balanced<_>>::deposit(&1234, initial_issuance, Precision::Exact);195		assert_eq!(Balances::free_balance(1234), initial_issuance);196		MockBlockNumberProvider::set(1);197198		// Start inflation as sudo199		assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));200201		// Next inflation deposit happens when block is greater then or equal to NextInflationBlock202		let mut block: u64 = 2;203		let balance_before: u64 = Balances::free_balance(1234);204		while block < <pallet_inflation::NextInflationBlock<Test>>::get() {205			MockBlockNumberProvider::set(block as u64);206			Inflation::on_initialize(0);207			block += 1;208		}209		let balance_just_before: u64 = Balances::free_balance(1234);210		assert_eq!(balance_before, balance_just_before);211212		// The block with inflation213		MockBlockNumberProvider::set(block as u64);214		Inflation::on_initialize(0);215		let balance_after: u64 = Balances::free_balance(1234);216		assert_eq!(balance_after - balance_just_before, block_inflation!());217	});218}219220#[test]221fn inflation_in_1_year() {222	new_test_ext().execute_with(|| {223		// Total issuance = 1_000_000_000224		let initial_issuance: u64 = 1_000_000_000;225		let _ = <Balances as Balanced<_>>::deposit(&1234, initial_issuance, Precision::Exact);226		assert_eq!(Balances::free_balance(1234), initial_issuance);227		MockBlockNumberProvider::set(1);228229		// Start inflation as sudo230		assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));231232		// Go through all the block inflations for year 1,233		// total issuance will be updated accordingly234		// Inflation is set to start in block 1, so first iteration is block 101235		for block in (101..YEAR).step_by(100) {236			MockBlockNumberProvider::set(block);237			Inflation::on_initialize(0);238		}239		assert_eq!(240			initial_issuance + (FIRST_YEAR_BLOCK_INFLATION * (YEAR / 100)),241			<Balances as Inspect<_>>::total_issuance()242		);243244		MockBlockNumberProvider::set(YEAR + 1);245		Inflation::on_initialize(0);246		let block_inflation_year_2 = block_inflation!();247		// Expected 100-block inflation for year 2: 100 * 9.33% * initial issuance * 110% / YEAR == 1951248		let expecter_year_2_inflation: u64 = (initial_issuance249			+ FIRST_YEAR_BLOCK_INFLATION * YEAR / 100)250			* 933 * 100 / (10000 * YEAR);251		assert_eq!(block_inflation_year_2 / 10, expecter_year_2_inflation / 10); // divide by 10 for approx. equality252	});253}254255#[test]256fn inflation_start_large_kusama_block() {257	new_test_ext().execute_with(|| {258		// Total issuance = 1_000_000_000259		let initial_issuance: u64 = 1_000_000_000;260		let start_block: u64 = 10457457;261		let _ = <Balances as Balanced<_>>::deposit(&1234, initial_issuance, Precision::Exact);262		assert_eq!(Balances::free_balance(1234), initial_issuance);263		MockBlockNumberProvider::set(start_block);264265		// Start inflation as sudo266		assert_ok!(Inflation::start_inflation(267			RawOrigin::Root.into(),268			start_block269		));270271		// Go through all the block inflations for year 1,272		// total issuance will be updated accordingly273		// Inflation is set to start in block 1, so first iteration is block 101274		for block in (101..YEAR).step_by(100) {275			MockBlockNumberProvider::set(start_block + block);276			Inflation::on_initialize(0);277		}278		assert_eq!(279			initial_issuance + (FIRST_YEAR_BLOCK_INFLATION * (YEAR / 100)),280			<Balances as Inspect<_>>::total_issuance()281		);282283		MockBlockNumberProvider::set(start_block + YEAR + 1);284		Inflation::on_initialize(0);285		let block_inflation_year_2 = block_inflation!();286		// Expected 100-block inflation for year 2: 100 * 9.33% * initial issuance * 110% / YEAR == 1951287		let expecter_year_2_inflation: u64 = (initial_issuance288			+ FIRST_YEAR_BLOCK_INFLATION * YEAR / 100)289			* 933 * 100 / (10000 * YEAR);290		assert_eq!(block_inflation_year_2 / 10, expecter_year_2_inflation / 10); // divide by 10 for approx. equality291	});292}293294#[test]295fn inflation_after_year_10_is_flat() {296	new_test_ext().execute_with(|| {297		// Total issuance = 1_000_000_000298		let initial_issuance: u64 = 1_000_000_000;299		let _ = <Balances as Balanced<_>>::deposit(&1234, initial_issuance, Precision::Exact);300		assert_eq!(Balances::free_balance(1234), initial_issuance);301		MockBlockNumberProvider::set(YEAR * 9 + 1);302303		// Start inflation as sudo304		assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));305306		// Let inflation catch up307		for _year in 1..=9 {308			Inflation::on_initialize(0);309		}310311		for year in 10..=20 {312			let block_inflation_year_before = block_inflation!();313			MockBlockNumberProvider::set(YEAR * year + 1);314			Inflation::on_initialize(0);315			let block_inflation_year_after = block_inflation!();316317			// Assert that next year inflation is equal to previous year inflation318			assert_eq!(block_inflation_year_before, block_inflation_year_after);319		}320	});321}322323#[test]324fn inflation_rate_by_year() {325	new_test_ext().execute_with(|| {326		let payouts: u64 = YEAR / InflationBlockInterval::get() as u64;327328		// Inflation starts at 10% and does down by 2/3% every year until year 9 (included),329		// then it is flat.330		let payout_by_year: [u64; 11] = [1000, 933, 867, 800, 733, 667, 600, 533, 467, 400, 400];331332		// For accuracy total issuance = payout0 * payouts * 10;333		let initial_issuance: u64 = payout_by_year[0] * payouts * 10;334		let _ = <Balances as Balanced<_>>::deposit(&1234, initial_issuance, Precision::Exact);335		assert_eq!(Balances::free_balance(1234), initial_issuance);336337		// Start inflation as sudo338		assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));339340		for year in 0..=10 {341			// Year first block342			MockBlockNumberProvider::set(YEAR * year + 1);343			Inflation::on_initialize(0);344			let mut actual_payout = block_inflation!();345			assert_eq!(actual_payout, payout_by_year[year as usize]);346347			// Year second block348			MockBlockNumberProvider::set(YEAR * year + 2);349			Inflation::on_initialize(0);350			actual_payout = block_inflation!();351			assert_eq!(actual_payout, payout_by_year[year as usize]);352353			// Year middle block354			MockBlockNumberProvider::set(year * YEAR + YEAR / 2);355			Inflation::on_initialize(0);356			actual_payout = block_inflation!();357			assert_eq!(actual_payout, payout_by_year[year as usize]);358359			// Year last block360			MockBlockNumberProvider::set((year + 1) * YEAR);361			Inflation::on_initialize(0);362			actual_payout = block_inflation!();363			assert_eq!(actual_payout, payout_by_year[year as usize]);364		}365	});366}
after · pallets/inflation/src/tests.rs
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617#![cfg(test)]18#![allow(clippy::from_over_into)]19use crate as pallet_inflation;2021use frame_support::{22	assert_ok, parameter_types,23	traits::{24		fungible::{Balanced, Inspect},25		OnInitialize, Everything, ConstU32,26		tokens::Precision,27	},28	weights::Weight,29};30use frame_system::RawOrigin;31use sp_core::H256;32use sp_runtime::{33	traits::{BlakeTwo256, BlockNumberProvider, IdentityLookup},34	testing::Header,35};3637type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;38type Block = frame_system::mocking::MockBlock<Test>;3940const YEAR: u64 = 5_259_600; // 6-second blocks41							 // const YEAR: u64 = 2_629_800; // 12-second blocks42							 // Expected 100-block inflation for year 1 is 100 * 100_000_000 / YEAR = FIRST_YEAR_BLOCK_INFLATION43const FIRST_YEAR_BLOCK_INFLATION: u64 = 1901;4445parameter_types! {46	pub const ExistentialDeposit: u64 = 1;47	pub const MaxLocks: u32 = 50;48}4950impl pallet_balances::Config for Test {51	type AccountStore = System;52	type Balance = u64;53	type DustRemoval = ();54	type RuntimeEvent = ();55	type ExistentialDeposit = ExistentialDeposit;56	type WeightInfo = ();57	type MaxLocks = MaxLocks;58	type MaxReserves = ();59	type ReserveIdentifier = ();60	type HoldIdentifier = ();61	type FreezeIdentifier = ();62	type MaxHolds = ();63	type MaxFreezes = ();64}6566frame_support::construct_runtime!(67	pub enum Test where68		Block = Block,69		NodeBlock = Block,70		UncheckedExtrinsic = UncheckedExtrinsic,71	{72		Balances: pallet_balances::{Pallet, Call, Storage},73		System: frame_system::{Pallet, Call, Config, Storage, Event<T>},74		Inflation: pallet_inflation::{Pallet, Call, Storage},75	}76);7778parameter_types! {79	pub const BlockHashCount: u64 = 250;80	pub BlockWeights: frame_system::limits::BlockWeights =81		frame_system::limits::BlockWeights::simple_max(Weight::from_ref_time(1024));82	pub const SS58Prefix: u8 = 42;83}8485impl frame_system::Config for Test {86	type BaseCallFilter = Everything;87	type BlockWeights = ();88	type BlockLength = ();89	type DbWeight = ();90	type RuntimeOrigin = RuntimeOrigin;91	type RuntimeCall = RuntimeCall;92	type Index = u64;93	type BlockNumber = u64;94	type Hash = H256;95	type Hashing = BlakeTwo256;96	type AccountId = u64;97	type Lookup = IdentityLookup<Self::AccountId>;98	type Header = Header;99	type RuntimeEvent = ();100	type BlockHashCount = BlockHashCount;101	type Version = ();102	type PalletInfo = PalletInfo;103	type AccountData = pallet_balances::AccountData<u64>;104	type OnNewAccount = ();105	type OnKilledAccount = ();106	type SystemWeightInfo = ();107	type SS58Prefix = SS58Prefix;108	type OnSetCode = ();109	type MaxConsumers = ConstU32<16>;110}111112parameter_types! {113	pub TreasuryAccountId: u64 = 1234;114	pub const InflationBlockInterval: u32 = 100; // every time per how many blocks inflation is applied115	pub static MockBlockNumberProvider: u64 = 0;116}117118impl BlockNumberProvider for MockBlockNumberProvider {119	type BlockNumber = u64;120121	fn current_block_number() -> Self::BlockNumber {122		Self::get()123	}124}125126impl pallet_inflation::Config for Test {127	type Currency = Balances;128	type TreasuryAccountId = TreasuryAccountId;129	type InflationBlockInterval = InflationBlockInterval;130	type BlockNumberProvider = MockBlockNumberProvider;131}132133pub fn new_test_ext() -> sp_io::TestExternalities {134	frame_system::GenesisConfig::default()135		.build_storage::<Test>()136		.unwrap()137		.into()138}139140macro_rules! block_inflation {141	// Block inflation doesn't have any argumets142	() => {143		// Return BlockInflation state variable current value144		<pallet_inflation::BlockInflation<Test>>::get()145	};146}147148#[test]149fn uninitialized_inflation() {150	new_test_ext().execute_with(|| {151		let initial_issuance: u64 = 1_000_000_000;152		let _ = <Balances as Balanced<_>>::deposit(&1234, initial_issuance, Precision::Exact);153		assert_eq!(Balances::free_balance(1234), initial_issuance);154155		// BlockInflation should be set after inflation is started156		// first inflation deposit should be equal to BlockInflation157		MockBlockNumberProvider::set(1);158159		assert_eq!(block_inflation!(), 0);160	});161}162163#[test]164fn inflation_works() {165	new_test_ext().execute_with(|| {166		// Total issuance = 1_000_000_000167		let initial_issuance: u64 = 1_000_000_000;168		let _ = <Balances as Balanced<_>>::deposit(&1234, initial_issuance, Precision::Exact);169		assert_eq!(Balances::free_balance(1234), initial_issuance);170171		// BlockInflation should be set after inflation is started172		// first inflation deposit should be equal to BlockInflation173		MockBlockNumberProvider::set(1);174175		// Start inflation as sudo176		assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));177		assert_eq!(block_inflation!(), FIRST_YEAR_BLOCK_INFLATION);178		assert_eq!(179			Balances::free_balance(1234) - initial_issuance,180			block_inflation!()181		);182183		// Trigger inflation184		MockBlockNumberProvider::set(102);185		Inflation::on_initialize(0);186		assert_eq!(187			Balances::free_balance(1234) - initial_issuance,188			2 * block_inflation!()189		);190	});191}192193#[test]194fn inflation_second_deposit() {195	new_test_ext().execute_with(|| {196		// Total issuance = 1_000_000_000197		let initial_issuance: u64 = 1_000_000_000;198		let _ = <Balances as Balanced<_>>::deposit(&1234, initial_issuance, Precision::Exact);199		assert_eq!(Balances::free_balance(1234), initial_issuance);200		MockBlockNumberProvider::set(1);201202		// Start inflation as sudo203		assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));204205		// Next inflation deposit happens when block is greater then or equal to NextInflationBlock206		let mut block: u64 = 2;207		let balance_before: u64 = Balances::free_balance(1234);208		while block < <pallet_inflation::NextInflationBlock<Test>>::get() {209			MockBlockNumberProvider::set(block as u64);210			Inflation::on_initialize(0);211			block += 1;212		}213		let balance_just_before: u64 = Balances::free_balance(1234);214		assert_eq!(balance_before, balance_just_before);215216		// The block with inflation217		MockBlockNumberProvider::set(block as u64);218		Inflation::on_initialize(0);219		let balance_after: u64 = Balances::free_balance(1234);220		assert_eq!(balance_after - balance_just_before, block_inflation!());221	});222}223224#[test]225fn inflation_in_1_year() {226	new_test_ext().execute_with(|| {227		// Total issuance = 1_000_000_000228		let initial_issuance: u64 = 1_000_000_000;229		let _ = <Balances as Balanced<_>>::deposit(&1234, initial_issuance, Precision::Exact);230		assert_eq!(Balances::free_balance(1234), initial_issuance);231		MockBlockNumberProvider::set(1);232233		// Start inflation as sudo234		assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));235236		// Go through all the block inflations for year 1,237		// total issuance will be updated accordingly238		// Inflation is set to start in block 1, so first iteration is block 101239		for block in (101..YEAR).step_by(100) {240			MockBlockNumberProvider::set(block);241			Inflation::on_initialize(0);242		}243		assert_eq!(244			initial_issuance + (FIRST_YEAR_BLOCK_INFLATION * (YEAR / 100)),245			<Balances as Inspect<_>>::total_issuance()246		);247248		MockBlockNumberProvider::set(YEAR + 1);249		Inflation::on_initialize(0);250		let block_inflation_year_2 = block_inflation!();251		// Expected 100-block inflation for year 2: 100 * 9.33% * initial issuance * 110% / YEAR == 1951252		let expecter_year_2_inflation: u64 = (initial_issuance253			+ FIRST_YEAR_BLOCK_INFLATION * YEAR / 100)254			* 933 * 100 / (10000 * YEAR);255		assert_eq!(block_inflation_year_2 / 10, expecter_year_2_inflation / 10); // divide by 10 for approx. equality256	});257}258259#[test]260fn inflation_start_large_kusama_block() {261	new_test_ext().execute_with(|| {262		// Total issuance = 1_000_000_000263		let initial_issuance: u64 = 1_000_000_000;264		let start_block: u64 = 10457457;265		let _ = <Balances as Balanced<_>>::deposit(&1234, initial_issuance, Precision::Exact);266		assert_eq!(Balances::free_balance(1234), initial_issuance);267		MockBlockNumberProvider::set(start_block);268269		// Start inflation as sudo270		assert_ok!(Inflation::start_inflation(271			RawOrigin::Root.into(),272			start_block273		));274275		// Go through all the block inflations for year 1,276		// total issuance will be updated accordingly277		// Inflation is set to start in block 1, so first iteration is block 101278		for block in (101..YEAR).step_by(100) {279			MockBlockNumberProvider::set(start_block + block);280			Inflation::on_initialize(0);281		}282		assert_eq!(283			initial_issuance + (FIRST_YEAR_BLOCK_INFLATION * (YEAR / 100)),284			<Balances as Inspect<_>>::total_issuance()285		);286287		MockBlockNumberProvider::set(start_block + YEAR + 1);288		Inflation::on_initialize(0);289		let block_inflation_year_2 = block_inflation!();290		// Expected 100-block inflation for year 2: 100 * 9.33% * initial issuance * 110% / YEAR == 1951291		let expecter_year_2_inflation: u64 = (initial_issuance292			+ FIRST_YEAR_BLOCK_INFLATION * YEAR / 100)293			* 933 * 100 / (10000 * YEAR);294		assert_eq!(block_inflation_year_2 / 10, expecter_year_2_inflation / 10); // divide by 10 for approx. equality295	});296}297298#[test]299fn inflation_after_year_10_is_flat() {300	new_test_ext().execute_with(|| {301		// Total issuance = 1_000_000_000302		let initial_issuance: u64 = 1_000_000_000;303		let _ = <Balances as Balanced<_>>::deposit(&1234, initial_issuance, Precision::Exact);304		assert_eq!(Balances::free_balance(1234), initial_issuance);305		MockBlockNumberProvider::set(YEAR * 9 + 1);306307		// Start inflation as sudo308		assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));309310		// Let inflation catch up311		for _year in 1..=9 {312			Inflation::on_initialize(0);313		}314315		for year in 10..=20 {316			let block_inflation_year_before = block_inflation!();317			MockBlockNumberProvider::set(YEAR * year + 1);318			Inflation::on_initialize(0);319			let block_inflation_year_after = block_inflation!();320321			// Assert that next year inflation is equal to previous year inflation322			assert_eq!(block_inflation_year_before, block_inflation_year_after);323		}324	});325}326327#[test]328fn inflation_rate_by_year() {329	new_test_ext().execute_with(|| {330		let payouts: u64 = YEAR / InflationBlockInterval::get() as u64;331332		// Inflation starts at 10% and does down by 2/3% every year until year 9 (included),333		// then it is flat.334		let payout_by_year: [u64; 11] = [1000, 933, 867, 800, 733, 667, 600, 533, 467, 400, 400];335336		// For accuracy total issuance = payout0 * payouts * 10;337		let initial_issuance: u64 = payout_by_year[0] * payouts * 10;338		let _ = <Balances as Balanced<_>>::deposit(&1234, initial_issuance, Precision::Exact);339		assert_eq!(Balances::free_balance(1234), initial_issuance);340341		// Start inflation as sudo342		assert_ok!(Inflation::start_inflation(RawOrigin::Root.into(), 1));343344		for year in 0..=10 {345			// Year first block346			MockBlockNumberProvider::set(YEAR * year + 1);347			Inflation::on_initialize(0);348			let mut actual_payout = block_inflation!();349			assert_eq!(actual_payout, payout_by_year[year as usize]);350351			// Year second block352			MockBlockNumberProvider::set(YEAR * year + 2);353			Inflation::on_initialize(0);354			actual_payout = block_inflation!();355			assert_eq!(actual_payout, payout_by_year[year as usize]);356357			// Year middle block358			MockBlockNumberProvider::set(year * YEAR + YEAR / 2);359			Inflation::on_initialize(0);360			actual_payout = block_inflation!();361			assert_eq!(actual_payout, payout_by_year[year as usize]);362363			// Year last block364			MockBlockNumberProvider::set((year + 1) * YEAR);365			Inflation::on_initialize(0);366			actual_payout = block_inflation!();367			assert_eq!(actual_payout, payout_by_year[year as usize]);368		}369	});370}