difftreelog
Inflation pallet block provider added. Setted up to relay chain.
in: master
3 files changed
pallets/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);
pallets/inflation/src/tests.rsdiffbeforeafterboth1#![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}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}runtime/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! {