difftreelog
Replace spaces with tabs
in: master
2 files changed
pallets/inflation/src/lib.rsdiffbeforeafterboth--- a/pallets/inflation/src/lib.rs
+++ b/pallets/inflation/src/lib.rs
@@ -20,19 +20,19 @@
mod tests;
pub use frame_support::{
- construct_runtime, decl_module, decl_storage,
- ensure,
- traits::{
- Currency, ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced,
- Randomness, IsSubType, WithdrawReasons,
- },
- weights::{
- constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},
- DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,
- WeightToFeePolynomial, DispatchClass,
- },
- StorageValue,
- transactional,
+ construct_runtime, decl_module, decl_storage,
+ ensure,
+ traits::{
+ Currency, ExistenceRequirement, Get, Imbalance, KeyOwnerProofSystem, OnUnbalanced,
+ Randomness, IsSubType, WithdrawReasons,
+ },
+ weights::{
+ constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},
+ DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,
+ WeightToFeePolynomial, DispatchClass,
+ },
+ StorageValue,
+ transactional,
};
// #[cfg(feature = "runtime-benchmarks")]
@@ -40,7 +40,7 @@
use sp_runtime::{
Perbill,
- traits::{Zero}
+ traits::{Zero}
};
use sp_std::convert::TryInto;
@@ -56,75 +56,75 @@
pub const END_INFLATION_PERCENT: u32 = 4;
pub trait Config: system::Config {
- type Currency: Currency<Self::AccountId>;
- type TreasuryAccountId: Get<Self::AccountId>;
- type InflationBlockInterval: Get<Self::BlockNumber>;
+ type Currency: Currency<Self::AccountId>;
+ type TreasuryAccountId: Get<Self::AccountId>;
+ type InflationBlockInterval: Get<Self::BlockNumber>;
}
decl_storage! {
- trait Store for Module<T: Config> as Inflation {
- /// starting year total issuance
- pub StartingYearTotalIssuance get(fn starting_year_total_issuance): BalanceOf<T>;
+ trait Store for Module<T: Config> as Inflation {
+ /// starting year total issuance
+ pub StartingYearTotalIssuance get(fn starting_year_total_issuance): BalanceOf<T>;
- /// Current block inflation
- pub BlockInflation get(fn block_inflation): BalanceOf<T>;
- }
+ /// Current block inflation
+ pub BlockInflation get(fn block_inflation): BalanceOf<T>;
+ }
}
decl_module! {
- pub struct Module<T: Config> for enum Call
- where
- origin: T::Origin,
- {
- const InflationBlockInterval: T::BlockNumber = T::InflationBlockInterval::get();
+ pub struct Module<T: Config> for enum Call
+ where
+ origin: T::Origin,
+ {
+ const InflationBlockInterval: T::BlockNumber = T::InflationBlockInterval::get();
- fn on_initialize(now: T::BlockNumber) -> Weight
- {
+ fn on_initialize(now: T::BlockNumber) -> Weight
+ {
let mut consumed_weight = 0;
let mut add_weight = |reads, writes, weight| {
consumed_weight += T::DbWeight::get().reads_writes(reads, writes);
consumed_weight += weight;
};
- let block_interval: u32 = T::InflationBlockInterval::get().try_into().unwrap_or(0);
+ let block_interval: u32 = T::InflationBlockInterval::get().try_into().unwrap_or(0);
- // 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);
+ // 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);
- let one_percent = Perbill::from_percent(1);
+ let one_percent = Perbill::from_percent(1);
- if current_year <= TOTAL_YEARS_UNTIL_FLAT {
- let amount: BalanceOf<T> = Perbill::from_rational_approximation(
- block_interval * (START_INFLATION_PERCENT * TOTAL_YEARS_UNTIL_FLAT - current_year * (START_INFLATION_PERCENT - END_INFLATION_PERCENT)),
- YEAR * TOTAL_YEARS_UNTIL_FLAT
- ) * ( one_percent * T::Currency::total_issuance() );
- <BlockInflation<T>>::put(amount);
- }
- else {
- let amount: BalanceOf<T> = Perbill::from_rational_approximation(
- block_interval * END_INFLATION_PERCENT,
- YEAR
- ) * (one_percent * T::Currency::total_issuance());
- <BlockInflation<T>>::put(amount);
- }
- <StartingYearTotalIssuance<T>>::set(T::Currency::total_issuance());
+ if current_year <= TOTAL_YEARS_UNTIL_FLAT {
+ let amount: BalanceOf<T> = Perbill::from_rational_approximation(
+ block_interval * (START_INFLATION_PERCENT * TOTAL_YEARS_UNTIL_FLAT - current_year * (START_INFLATION_PERCENT - END_INFLATION_PERCENT)),
+ YEAR * TOTAL_YEARS_UNTIL_FLAT
+ ) * ( one_percent * T::Currency::total_issuance() );
+ <BlockInflation<T>>::put(amount);
+ }
+ else {
+ let amount: BalanceOf<T> = Perbill::from_rational_approximation(
+ block_interval * END_INFLATION_PERCENT,
+ YEAR
+ ) * (one_percent * T::Currency::total_issuance());
+ <BlockInflation<T>>::put(amount);
+ }
+ <StartingYearTotalIssuance<T>>::set(T::Currency::total_issuance());
- // First time deposit
- T::Currency::deposit_creating(&T::TreasuryAccountId::get(), <BlockInflation<T>>::get());
+ // First time deposit
+ T::Currency::deposit_creating(&T::TreasuryAccountId::get(), <BlockInflation<T>>::get());
- add_weight(7, 6, 28_300_000);
- }
+ add_weight(7, 6, 28_300_000);
+ }
- // Apply inflation every InflationBlockInterval blocks and in the 1st block to initialize Treasury account
- else if (now % T::BlockNumber::from(block_interval)).is_zero() {
- T::Currency::deposit_into_existing(&T::TreasuryAccountId::get(), <BlockInflation<T>>::get()).ok();
+ // Apply inflation every InflationBlockInterval blocks and in the 1st block to initialize Treasury account
+ 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);
- }
+ add_weight(3, 2, 12_900_000);
+ }
- consumed_weight
- }
+ consumed_weight
+ }
- }
+ }
}
pallets/inflation/src/tests.rsdiffbeforeafterboth1#[cfg(test)]2mod tests {3 use crate as pallet_inflation;45 use frame_system;6 use frame_support::{traits::{Currency}, parameter_types};7 use frame_support::{traits::OnInitialize};8 use sp_core::H256;9 use sp_runtime::{traits::{BlakeTwo256, IdentityLookup}, testing::Header};1011 type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;12 type Block = frame_system::mocking::MockBlock<Test>;1314 const YEAR: u64 = 5_259_600;1516 parameter_types! {17 pub const ExistentialDeposit: u64 = 1;18 pub const MaxLocks: u32 = 50;19 }20 21 impl pallet_balances::Config for Test {22 type AccountStore = System;23 type Balance = u64;24 type DustRemoval = ();25 type Event = ();26 type ExistentialDeposit = ExistentialDeposit;27 type WeightInfo = ();28 type MaxLocks = MaxLocks;29 }30 31 frame_support::construct_runtime!(32 pub enum Test where33 Block = Block,34 NodeBlock = Block,35 UncheckedExtrinsic = UncheckedExtrinsic,36 {37 Balances: pallet_balances::{Module, Call, Storage},38 System: frame_system::{Module, Call, Config, Storage, Event<T>},39 Inflation: pallet_inflation::{Module, Call, Storage},40 }41 );4243 parameter_types! {44 pub const BlockHashCount: u64 = 250;45 pub BlockWeights: frame_system::limits::BlockWeights =46 frame_system::limits::BlockWeights::simple_max(1024);47 pub const SS58Prefix: u8 = 42;48 }4950 impl frame_system::Config for Test {51 type BaseCallFilter = ();52 type BlockWeights = ();53 type BlockLength = ();54 type DbWeight = ();55 type Origin = Origin;56 type Call = Call;57 type Index = u64;58 type BlockNumber = u64;59 type Hash = H256;60 type Hashing = BlakeTwo256;61 type AccountId = u64;62 type Lookup = IdentityLookup<Self::AccountId>;63 type Header = Header;64 type Event = ();65 type BlockHashCount = BlockHashCount;66 type Version = ();67 type PalletInfo = PalletInfo;68 type AccountData = pallet_balances::AccountData<u64>;69 type OnNewAccount = ();70 type OnKilledAccount = ();71 type SystemWeightInfo = ();72 type SS58Prefix = SS58Prefix;73 }7475 parameter_types! {76 pub TreasuryAccountId: u64 = 1234;77 pub const InflationBlockInterval: u32 = 100; // every time per how many blocks inflation is applied78 }79 80 impl pallet_inflation::Config for Test {81 type Currency = Balances;82 type TreasuryAccountId = TreasuryAccountId;83 type InflationBlockInterval = InflationBlockInterval;84 }8586 // Build genesis storage according to the mock runtime.87 pub fn new_test_ext() -> sp_io::TestExternalities {88 frame_system::GenesisConfig::default().build_storage::<Test>().unwrap().into()89 }9091 #[test]92 fn inflation_works() {93 new_test_ext().execute_with(|| {94 // Total issuance = 1_000_000_00095 let initial_issuance: u64 = 1_000_000_000;96 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);97 assert_eq!(Balances::free_balance(1234), initial_issuance);9899 // BlockInflation should be set after 1st block and 100 // first inflation deposit should be equal to BlockInflation101 Inflation::on_initialize(1);102 assert!(Inflation::block_inflation() > 0);103 assert_eq!(Balances::free_balance(1234) - initial_issuance, Inflation::block_inflation());104 });105 }106107 #[test]108 fn inflation_second_deposit() {109 new_test_ext().execute_with(|| {110 // Total issuance = 1_000_000_000111 let initial_issuance: u64 = 1_000_000_000;112 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);113 assert_eq!(Balances::free_balance(1234), initial_issuance);114 Inflation::on_initialize(1);115116 // Next inflation deposit happens when block is multiple of InflationBlockInterval117 let mut block: u32 = 2;118 let balance_before: u64 = Balances::free_balance(1234);119 while block % InflationBlockInterval::get() != 0 {120 Inflation::on_initialize(block as u64);121 block += 1;122 }123 let balance_just_before: u64 = Balances::free_balance(1234);124 assert_eq!(balance_before, balance_just_before);125126 // The block with inflation127 Inflation::on_initialize(block as u64);128 let balance_after: u64 = Balances::free_balance(1234);129 assert_eq!(balance_after - balance_just_before, Inflation::block_inflation());130 });131 }132133 #[test]134 fn inflation_in_1_year() {135 new_test_ext().execute_with(|| {136 // Total issuance = 1_000_000_000137 let initial_issuance: u64 = 1_000_000_000;138 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);139 assert_eq!(Balances::free_balance(1234), initial_issuance);140 Inflation::on_initialize(1);141 let block_inflation_year_0 = Inflation::block_inflation();142143 Inflation::on_initialize(YEAR);144 let block_inflation_year_1 = Inflation::block_inflation();145146 // Assert that year 1 inflation is less than year 0147 assert!(block_inflation_year_0 > block_inflation_year_1);148 });149 }150151 #[test]152 fn inflation_in_1_to_9_years() {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);159160 for year in 1..=9 {161 let block_inflation_year_before = Inflation::block_inflation();162 Inflation::on_initialize(YEAR * year);163 let block_inflation_year_after = Inflation::block_inflation();164165 // Assert that next year inflation is less than previous year inflation166 assert!(block_inflation_year_before > block_inflation_year_after);167 }168169 });170 }171172 #[test]173 fn inflation_after_year_10_is_flat() {174 new_test_ext().execute_with(|| {175 // Total issuance = 1_000_000_000176 let initial_issuance: u64 = 1_000_000_000;177 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);178 assert_eq!(Balances::free_balance(1234), initial_issuance);179 Inflation::on_initialize(YEAR * 9);180181 for year in 10..=20 {182 let block_inflation_year_before = Inflation::block_inflation();183 Inflation::on_initialize(YEAR * year);184 let block_inflation_year_after = Inflation::block_inflation();185186 // Assert that next year inflation is equal to previous year inflation187 assert_eq!(block_inflation_year_before, block_inflation_year_after);188 }189 });190 }191192 #[test]193 fn inflation_rate_by_year() {194 new_test_ext().execute_with(|| {195 let payouts: u64 = YEAR / InflationBlockInterval::get() as u64;196197 // Inflation starts at 10% and does down by 2/3% every year until year 9 (included), 198 // then it is flat.199 let payout_by_year: [u64; 11] = [200 1000,201 933,202 867,203 800,204 733,205 667,206 600,207 533,208 467,209 400,210 400211 ];212213 // For accuracy total issuance = payout0 * payouts * 10;214 let initial_issuance: u64 = payout_by_year[0] * payouts * 10;215 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);216 assert_eq!(Balances::free_balance(1234), initial_issuance);217218 for year in 0..=10 {219 // Year first block220 Inflation::on_initialize(year*YEAR);221 let mut actual_payout = Inflation::block_inflation();222 assert_eq!(actual_payout, payout_by_year[year as usize]);223224 // Year second block225 Inflation::on_initialize(year*YEAR+1);226 actual_payout = Inflation::block_inflation();227 assert_eq!(actual_payout, payout_by_year[year as usize]);228229 // Year middle block230 Inflation::on_initialize(year*YEAR + YEAR/2);231 actual_payout = Inflation::block_inflation();232 assert_eq!(actual_payout, payout_by_year[year as usize]);233234 // Year last block235 Inflation::on_initialize((year + 1)*YEAR-1);236 actual_payout = Inflation::block_inflation();237 assert_eq!(actual_payout, payout_by_year[year as usize]);238 }239 });240 }241}