git.delta.rocks / unique-network / refs/commits / 94b124f78550

difftreelog

Inflation pallet block provider added. Setted up to relay chain.

str-mv2021-12-02parent: #30c3834.patch.diff
in: master

3 files changed

modifiedpallets/inflation/src/lib.rsdiffbeforeafterboth
--- a/pallets/inflation/src/lib.rs
+++ b/pallets/inflation/src/lib.rs
@@ -36,7 +36,7 @@
 
 use sp_runtime::{
 	Perbill,
-	traits::{Zero},
+	traits::{BlockNumberProvider, Zero},
 };
 use sp_std::convert::TryInto;
 
@@ -56,6 +56,9 @@
 	type Currency: Currency<Self::AccountId>;
 	type TreasuryAccountId: Get<Self::AccountId>;
 	type InflationBlockInterval: Get<Self::BlockNumber>;
+
+	// The block number provider
+	type BlockNumberProvider: BlockNumberProvider<BlockNumber = Self::BlockNumber>;
 }
 
 decl_storage! {
@@ -75,7 +78,7 @@
 	{
 		const InflationBlockInterval: T::BlockNumber = T::InflationBlockInterval::get();
 
-		fn on_initialize(now: T::BlockNumber) -> Weight
+		fn on_initialize() -> Weight
 		{
 			let mut consumed_weight = 0;
 			let mut add_weight = |reads, writes, weight| {
@@ -84,13 +87,11 @@
 			};
 
 			let block_interval: u32 = T::InflationBlockInterval::get().try_into().unwrap_or(0);
-
-			// TODO: Rewrite inflation to use block timestamp instead of block number
-			// let _now = <timestamp::Module<T>>::get();
+			let _now = T::BlockNumberProvider::current_block_number();
 
 			// Recalculate inflation on the first block of the year (or if it is not initialized yet)
-			if (now % T::BlockNumber::from(YEAR)).is_zero() || <BlockInflation<T>>::get().is_zero() {
-				let current_year: u32 = (now / T::BlockNumber::from(YEAR)).try_into().unwrap_or(0);
+			if (_now % T::BlockNumber::from(YEAR)).is_zero() || <BlockInflation<T>>::get().is_zero() {
+				let current_year: u32 = (_now / T::BlockNumber::from(YEAR)).try_into().unwrap_or(0);
 
 				let one_percent = Perbill::from_percent(1);
 
@@ -117,7 +118,7 @@
 			}
 
 			// Apply inflation every InflationBlockInterval blocks and in the 1st block to initialize Treasury account
-			else if (now % T::BlockNumber::from(block_interval)).is_zero() {
+			else if (_now % T::BlockNumber::from(block_interval)).is_zero() {
 				T::Currency::deposit_into_existing(&T::TreasuryAccountId::get(), <BlockInflation<T>>::get()).ok();
 
 				add_weight(3, 2, 12_900_000);
modifiedpallets/inflation/src/tests.rsdiffbeforeafterboth
before · pallets/inflation/src/tests.rs
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::{10	traits::{OnInitialize, Everything},11};12use sp_core::H256;13use sp_runtime::{14	traits::{BlakeTwo256, IdentityLookup},15	testing::Header,16};1718type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;19type Block = frame_system::mocking::MockBlock<Test>;2021const YEAR: u64 = 2_629_800;2223parameter_types! {24	pub const ExistentialDeposit: u64 = 1;25	pub const MaxLocks: u32 = 50;26}2728impl pallet_balances::Config for Test {29	type AccountStore = System;30	type Balance = u64;31	type DustRemoval = ();32	type Event = ();33	type ExistentialDeposit = ExistentialDeposit;34	type WeightInfo = ();35	type MaxLocks = MaxLocks;36	type MaxReserves = ();37	type ReserveIdentifier = ();38}3940frame_support::construct_runtime!(41	pub enum Test where42		Block = Block,43		NodeBlock = Block,44		UncheckedExtrinsic = UncheckedExtrinsic,45	{46		Balances: pallet_balances::{Pallet, Call, Storage},47		System: frame_system::{Pallet, Call, Config, Storage, Event<T>},48		Inflation: pallet_inflation::{Pallet, Call, Storage},49	}50);5152parameter_types! {53	pub const BlockHashCount: u64 = 250;54	pub BlockWeights: frame_system::limits::BlockWeights =55		frame_system::limits::BlockWeights::simple_max(1024);56	pub const SS58Prefix: u8 = 42;57}5859impl frame_system::Config for Test {60	type BaseCallFilter = Everything;61	type BlockWeights = ();62	type BlockLength = ();63	type DbWeight = ();64	type Origin = Origin;65	type Call = Call;66	type Index = u64;67	type BlockNumber = u64;68	type Hash = H256;69	type Hashing = BlakeTwo256;70	type AccountId = u64;71	type Lookup = IdentityLookup<Self::AccountId>;72	type Header = Header;73	type Event = ();74	type BlockHashCount = BlockHashCount;75	type Version = ();76	type PalletInfo = PalletInfo;77	type AccountData = pallet_balances::AccountData<u64>;78	type OnNewAccount = ();79	type OnKilledAccount = ();80	type SystemWeightInfo = ();81	type SS58Prefix = SS58Prefix;82	type OnSetCode = ();83}8485parameter_types! {86	pub TreasuryAccountId: u64 = 1234;87	pub const InflationBlockInterval: u32 = 100; // every time per how many blocks inflation is applied88}8990impl pallet_inflation::Config for Test {91	type Currency = Balances;92	type TreasuryAccountId = TreasuryAccountId;93	type InflationBlockInterval = InflationBlockInterval;94}9596pub fn new_test_ext() -> sp_io::TestExternalities {97	frame_system::GenesisConfig::default()98		.build_storage::<Test>()99		.unwrap()100		.into()101}102103#[test]104fn inflation_works() {105	new_test_ext().execute_with(|| {106		// Total issuance = 1_000_000_000107		let initial_issuance: u64 = 1_000_000_000;108		let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);109		assert_eq!(Balances::free_balance(1234), initial_issuance);110111		// BlockInflation should be set after 1st block and112		// first inflation deposit should be equal to BlockInflation113		Inflation::on_initialize(1);114115		// Expected 100-block inflation for year 1 is 100 * 100_000_000 / YEAR = 3803116		assert_eq!(Inflation::block_inflation(), 3803);117		assert_eq!(118			Balances::free_balance(1234) - initial_issuance,119			Inflation::block_inflation()120		);121	});122}123124#[test]125fn inflation_second_deposit() {126	new_test_ext().execute_with(|| {127		// Total issuance = 1_000_000_000128		let initial_issuance: u64 = 1_000_000_000;129		let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);130		assert_eq!(Balances::free_balance(1234), initial_issuance);131		Inflation::on_initialize(1);132133		// Next inflation deposit happens when block is multiple of InflationBlockInterval134		let mut block: u32 = 2;135		let balance_before: u64 = Balances::free_balance(1234);136		while block % InflationBlockInterval::get() != 0 {137			Inflation::on_initialize(block as u64);138			block += 1;139		}140		let balance_just_before: u64 = Balances::free_balance(1234);141		assert_eq!(balance_before, balance_just_before);142143		// The block with inflation144		Inflation::on_initialize(block as u64);145		let balance_after: u64 = Balances::free_balance(1234);146		assert_eq!(147			balance_after - balance_just_before,148			Inflation::block_inflation()149		);150	});151}152153#[test]154fn inflation_in_1_year() {155	new_test_ext().execute_with(|| {156		// Total issuance = 1_000_000_000157		let initial_issuance: u64 = 1_000_000_000;158		let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);159		assert_eq!(Balances::free_balance(1234), initial_issuance);160		Inflation::on_initialize(1);161162		// Go through all the block inflations for year 1,163		// total issuance will be updated accordingly164		for block in (100..YEAR).step_by(100) {165			Inflation::on_initialize(block);166		}167		assert_eq!(168			initial_issuance + (3803 * (YEAR / 100)),169			<Balances as Currency<_>>::total_issuance()170		);171172		Inflation::on_initialize(YEAR);173		let block_inflation_year_1 = Inflation::block_inflation();174		// Expected 100-block inflation for year 2: 100 * 9.33% * initial issuance * 110% / YEAR = 3904175		assert_eq!(block_inflation_year_1, 3904);176	});177}178179#[test]180fn inflation_in_1_to_9_years() {181	new_test_ext().execute_with(|| {182		// Total issuance = 1_000_000_000183		let initial_issuance: u64 = 1_000_000_000;184		let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);185		assert_eq!(Balances::free_balance(1234), initial_issuance);186		Inflation::on_initialize(1);187188		for year in 1..=9 {189			let block_inflation_year_before = Inflation::block_inflation();190			Inflation::on_initialize(YEAR * year);191			let block_inflation_year_after = Inflation::block_inflation();192193			// SBP M2 review: this is actually not true (not for the first few years)194			// Assert that next year inflation is less than previous year inflation195			assert!(block_inflation_year_before > block_inflation_year_after);196		}197	});198}199200#[test]201fn inflation_after_year_10_is_flat() {202	new_test_ext().execute_with(|| {203		// Total issuance = 1_000_000_000204		let initial_issuance: u64 = 1_000_000_000;205		let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);206		assert_eq!(Balances::free_balance(1234), initial_issuance);207		Inflation::on_initialize(YEAR * 9);208209		for year in 10..=20 {210			let block_inflation_year_before = Inflation::block_inflation();211			Inflation::on_initialize(YEAR * year);212			let block_inflation_year_after = Inflation::block_inflation();213214			// Assert that next year inflation is equal to previous year inflation215			assert_eq!(block_inflation_year_before, block_inflation_year_after);216		}217	});218}219220#[test]221fn inflation_rate_by_year() {222	new_test_ext().execute_with(|| {223		let payouts: u64 = YEAR / InflationBlockInterval::get() as u64;224225		// Inflation starts at 10% and does down by 2/3% every year until year 9 (included),226		// then it is flat.227		let payout_by_year: [u64; 11] = [1000, 933, 867, 800, 733, 667, 600, 533, 467, 400, 400];228229		// For accuracy total issuance = payout0 * payouts * 10;230		let initial_issuance: u64 = payout_by_year[0] * payouts * 10;231		let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);232		assert_eq!(Balances::free_balance(1234), initial_issuance);233234		for year in 0..=10 {235			// Year first block236			Inflation::on_initialize(year * YEAR);237			let mut actual_payout = Inflation::block_inflation();238			assert_eq!(actual_payout, payout_by_year[year as usize]);239240			// Year second block241			Inflation::on_initialize(year * YEAR + 1);242			actual_payout = Inflation::block_inflation();243			assert_eq!(actual_payout, payout_by_year[year as usize]);244245			// Year middle block246			Inflation::on_initialize(year * YEAR + YEAR / 2);247			actual_payout = Inflation::block_inflation();248			assert_eq!(actual_payout, payout_by_year[year as usize]);249250			// Year last block251			Inflation::on_initialize((year + 1) * YEAR - 1);252			actual_payout = Inflation::block_inflation();253			assert_eq!(actual_payout, payout_by_year[year as usize]);254		}255	});256}
after · pallets/inflation/src/tests.rs
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::{10	traits::{OnInitialize, Everything},11};12use sp_core::H256;13use sp_runtime::{14	traits::{BlakeTwo256, BlockNumberProvider, IdentityLookup},15	testing::Header,16};1718type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;19type Block = frame_system::mocking::MockBlock<Test>;2021const YEAR: u64 = 2_629_800;2223parameter_types! {24	pub const ExistentialDeposit: u64 = 1;25	pub const MaxLocks: u32 = 50;26}2728impl pallet_balances::Config for Test {29	type AccountStore = System;30	type Balance = u64;31	type DustRemoval = ();32	type Event = ();33	type ExistentialDeposit = ExistentialDeposit;34	type WeightInfo = ();35	type MaxLocks = MaxLocks;36	type MaxReserves = ();37	type ReserveIdentifier = ();38}3940frame_support::construct_runtime!(41	pub enum Test where42		Block = Block,43		NodeBlock = Block,44		UncheckedExtrinsic = UncheckedExtrinsic,45	{46		Balances: pallet_balances::{Pallet, Call, Storage},47		System: frame_system::{Pallet, Call, Config, Storage, Event<T>},48		Inflation: pallet_inflation::{Pallet, Call, Storage},49	}50);5152parameter_types! {53	pub const BlockHashCount: u64 = 250;54	pub BlockWeights: frame_system::limits::BlockWeights =55		frame_system::limits::BlockWeights::simple_max(1024);56	pub const SS58Prefix: u8 = 42;57}5859impl frame_system::Config for Test {60	type BaseCallFilter = Everything;61	type BlockWeights = ();62	type BlockLength = ();63	type DbWeight = ();64	type Origin = Origin;65	type Call = Call;66	type Index = u64;67	type BlockNumber = u64;68	type Hash = H256;69	type Hashing = BlakeTwo256;70	type AccountId = u64;71	type Lookup = IdentityLookup<Self::AccountId>;72	type Header = Header;73	type Event = ();74	type BlockHashCount = BlockHashCount;75	type Version = ();76	type PalletInfo = PalletInfo;77	type AccountData = pallet_balances::AccountData<u64>;78	type OnNewAccount = ();79	type OnKilledAccount = ();80	type SystemWeightInfo = ();81	type SS58Prefix = SS58Prefix;82	type OnSetCode = ();83}8485parameter_types! {86	pub TreasuryAccountId: u64 = 1234;87	pub const InflationBlockInterval: u32 = 100; // every time per how many blocks inflation is applied88	pub static MockBlockNumberProvider: u64 = 0;89}9091impl BlockNumberProvider for MockBlockNumberProvider {92	type BlockNumber = u64;9394	fn current_block_number() -> Self::BlockNumber {95		Self::get()96	}97}9899impl pallet_inflation::Config for Test {100	type Currency = Balances;101	type TreasuryAccountId = TreasuryAccountId;102	type InflationBlockInterval = InflationBlockInterval;103	type BlockNumberProvider = MockBlockNumberProvider;104}105106pub fn new_test_ext() -> sp_io::TestExternalities {107	frame_system::GenesisConfig::default()108		.build_storage::<Test>()109		.unwrap()110		.into()111}112113#[test]114fn inflation_works() {115	new_test_ext().execute_with(|| {116		// Total issuance = 1_000_000_000117		let initial_issuance: u64 = 1_000_000_000;118		let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);119		assert_eq!(Balances::free_balance(1234), initial_issuance);120121		// BlockInflation should be set after 1st block and122		// first inflation deposit should be equal to BlockInflation123		MockBlockNumberProvider::set(1);124		Inflation::on_initialize(0);125126		// Expected 100-block inflation for year 1 is 100 * 100_000_000 / YEAR = 3803127		assert_eq!(Inflation::block_inflation(), 3803);128		assert_eq!(129			Balances::free_balance(1234) - initial_issuance,130			Inflation::block_inflation()131		);132	});133}134135#[test]136fn inflation_second_deposit() {137	new_test_ext().execute_with(|| {138		// Total issuance = 1_000_000_000139		let initial_issuance: u64 = 1_000_000_000;140		let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);141		assert_eq!(Balances::free_balance(1234), initial_issuance);142		MockBlockNumberProvider::set(1);143		Inflation::on_initialize(0);144145		// Next inflation deposit happens when block is multiple of InflationBlockInterval146		let mut block: u32 = 2;147		let balance_before: u64 = Balances::free_balance(1234);148		while block % InflationBlockInterval::get() != 0 {149			MockBlockNumberProvider::set(block as u64);150			Inflation::on_initialize(0);151			block += 1;152		}153		let balance_just_before: u64 = Balances::free_balance(1234);154		assert_eq!(balance_before, balance_just_before);155156		// The block with inflation157		MockBlockNumberProvider::set(block as u64);158		Inflation::on_initialize(0);159		let balance_after: u64 = Balances::free_balance(1234);160		assert_eq!(161			balance_after - balance_just_before,162			Inflation::block_inflation()163		);164	});165}166167#[test]168fn inflation_in_1_year() {169	new_test_ext().execute_with(|| {170		// Total issuance = 1_000_000_000171		let initial_issuance: u64 = 1_000_000_000;172		let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);173		assert_eq!(Balances::free_balance(1234), initial_issuance);174		MockBlockNumberProvider::set(1);175		Inflation::on_initialize(0);176177		// Go through all the block inflations for year 1,178		// total issuance will be updated accordingly179		for block in (100..YEAR).step_by(100) {180			MockBlockNumberProvider::set(block);181			Inflation::on_initialize(0);182		}183		assert_eq!(184			initial_issuance + (3803 * (YEAR / 100)),185			<Balances as Currency<_>>::total_issuance()186		);187188		MockBlockNumberProvider::set(YEAR);189		Inflation::on_initialize(0);190		let block_inflation_year_1 = Inflation::block_inflation();191		// Expected 100-block inflation for year 2: 100 * 9.33% * initial issuance * 110% / YEAR = 3904192		assert_eq!(block_inflation_year_1, 3904);193	});194}195196#[test]197fn inflation_in_1_to_9_years() {198	new_test_ext().execute_with(|| {199		// Total issuance = 1_000_000_000200		let initial_issuance: u64 = 1_000_000_000;201202		let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);203		assert_eq!(Balances::free_balance(1234), initial_issuance);204		MockBlockNumberProvider::set(1);205		Inflation::on_initialize(0);206207		for year in 1..=9 {208			let block_inflation_year_before = Inflation::block_inflation();209			MockBlockNumberProvider::set(YEAR * year);210			Inflation::on_initialize(0);211			let block_inflation_year_after = Inflation::block_inflation();212213			// SBP M2 review: this is actually not true (not for the first few years)214			// Assert that next year inflation is less than previous year inflation215			assert!(block_inflation_year_before > block_inflation_year_after);216		}217	});218}219220#[test]221fn inflation_after_year_10_is_flat() {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 Currency<_>>::deposit_creating(&1234, initial_issuance);226		assert_eq!(Balances::free_balance(1234), initial_issuance);227		MockBlockNumberProvider::set(YEAR * 9);228		Inflation::on_initialize(0);229230		for year in 10..=20 {231			let block_inflation_year_before = Inflation::block_inflation();232			MockBlockNumberProvider::set(YEAR * year);233			Inflation::on_initialize(0);234			let block_inflation_year_after = Inflation::block_inflation();235236			// Assert that next year inflation is equal to previous year inflation237			assert_eq!(block_inflation_year_before, block_inflation_year_after);238		}239	});240}241242#[test]243fn inflation_rate_by_year() {244	new_test_ext().execute_with(|| {245		let payouts: u64 = YEAR / InflationBlockInterval::get() as u64;246247		// Inflation starts at 10% and does down by 2/3% every year until year 9 (included),248		// then it is flat.249		let payout_by_year: [u64; 11] = [1000, 933, 867, 800, 733, 667, 600, 533, 467, 400, 400];250251		// For accuracy total issuance = payout0 * payouts * 10;252		let initial_issuance: u64 = payout_by_year[0] * payouts * 10;253		let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);254		assert_eq!(Balances::free_balance(1234), initial_issuance);255256		for year in 0..=10 {257			// Year first block258			MockBlockNumberProvider::set(YEAR * year);259			Inflation::on_initialize(0);260			let mut actual_payout = Inflation::block_inflation();261			assert_eq!(actual_payout, payout_by_year[year as usize]);262263			// Year second block264			MockBlockNumberProvider::set(YEAR * year + 1);265			Inflation::on_initialize(0);266			actual_payout = Inflation::block_inflation();267			assert_eq!(actual_payout, payout_by_year[year as usize]);268269			// Year middle block270			MockBlockNumberProvider::set(year * YEAR + YEAR / 2);271			Inflation::on_initialize(0);272			actual_payout = Inflation::block_inflation();273			assert_eq!(actual_payout, payout_by_year[year as usize]);274275			// Year last block276			MockBlockNumberProvider::set((year + 1) * YEAR - 1);277			Inflation::on_initialize(0);278			actual_payout = Inflation::block_inflation();279			assert_eq!(actual_payout, payout_by_year[year as usize]);280		}281	});282}
modifiedruntime/src/lib.rsdiffbeforeafterboth
--- a/runtime/src/lib.rs
+++ b/runtime/src/lib.rs
@@ -768,6 +768,7 @@
 	type Currency = Balances;
 	type TreasuryAccountId = TreasuryAccountId;
 	type InflationBlockInterval = InflationBlockInterval;
+	type BlockNumberProvider = RelayChainBlockNumberProvider<Runtime>;
 }
 
 // parameter_types! {