From 30f58ba5fa05c869bfb12e902f71f0705f8f84b5 Mon Sep 17 00:00:00 2001 From: kozyrevdev <73348153+kozyrevdev@users.noreply.github.com> Date: Fri, 10 Dec 2021 14:18:43 +0000 Subject: [PATCH] Merge pull request #268 from UniqueNetwork/hotfix/inflation_year_fix Hotfix/inflation year fix --- --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -220,6 +220,7 @@ sudo: SudoConfig { key: root_key }, vesting: VestingConfig { vesting: vec![] }, parachain_info: unique_runtime::ParachainInfoConfig { parachain_id: id }, + parachain_system: Default::default(), aura: unique_runtime::AuraConfig { authorities: initial_authorities, }, --- a/pallets/inflation/src/lib.rs +++ b/pallets/inflation/src/lib.rs @@ -75,6 +75,10 @@ pub type NextRecalculationBlock = StorageValue; + /// Relay block when inflation has started + #[pallet::storage] + pub type StartBlock = StorageValue; + #[pallet::hooks] impl Hooks> for Pallet { fn on_initialize(_: T::BlockNumber) -> Weight @@ -145,8 +149,10 @@ ensure_root(origin)?; // Start inflation if it has not been yet initialized - let next_inflation: T::BlockNumber = >::get(); - if next_inflation == 0u32.into() { + if >::get() == 0u32.into() { + // Set inflation global start block + >::set(inflation_start_relay_block); + // Recalculate inflation. This can be backdated and will catch up. Self::recalculate_inflation(inflation_start_relay_block); let block_interval: u32 = T::InflationBlockInterval::get().try_into().unwrap_or(0); @@ -166,9 +172,10 @@ impl Pallet { pub fn recalculate_inflation(recalculation_block: T::BlockNumber) { - let current_year: u32 = (recalculation_block / T::BlockNumber::from(YEAR)) - .try_into() - .unwrap_or(0); + let current_year: u32 = ((recalculation_block - >::get()) + / T::BlockNumber::from(YEAR)) + .try_into() + .unwrap_or(0); let block_interval: u32 = T::InflationBlockInterval::get().try_into().unwrap_or(0); let one_percent = Perbill::from_percent(1); --- a/pallets/inflation/src/tests.rs +++ b/pallets/inflation/src/tests.rs @@ -231,6 +231,45 @@ } #[test] +fn inflation_start_large_kusama_block() { + new_test_ext().execute_with(|| { + // Total issuance = 1_000_000_000 + let initial_issuance: u64 = 1_000_000_000; + let start_block: u64 = 10457457; + let _ = >::deposit_creating(&1234, initial_issuance); + assert_eq!(Balances::free_balance(1234), initial_issuance); + MockBlockNumberProvider::set(start_block); + + // Start inflation as sudo + assert_ok!(Inflation::start_inflation( + RawOrigin::Root.into(), + start_block + )); + + // Go through all the block inflations for year 1, + // total issuance will be updated accordingly + // Inflation is set to start in block 1, so first iteration is block 101 + for block in (101..YEAR).step_by(100) { + MockBlockNumberProvider::set(start_block + block); + Inflation::on_initialize(0); + } + assert_eq!( + initial_issuance + (FIRST_YEAR_BLOCK_INFLATION * (YEAR / 100)), + >::total_issuance() + ); + + MockBlockNumberProvider::set(start_block + YEAR + 1); + Inflation::on_initialize(0); + let block_inflation_year_2 = block_inflation!(); + // Expected 100-block inflation for year 2: 100 * 9.33% * initial issuance * 110% / YEAR == 1951 + let expecter_year_2_inflation: u64 = (initial_issuance + + FIRST_YEAR_BLOCK_INFLATION * YEAR / 100) + * 933 * 100 / (10000 * YEAR); + assert_eq!(block_inflation_year_2 / 10, expecter_year_2_inflation / 10); // divide by 10 for approx. equality + }); +} + +#[test] fn inflation_after_year_10_is_flat() { new_test_ext().execute_with(|| { // Total issuance = 1_000_000_000 -- gitstuff