difftreelog
Merge pull request #268 from UniqueNetwork/hotfix/inflation_year_fix
in: master
Hotfix/inflation year fix
3 files changed
node/cli/src/chain_spec.rsdiffbeforeafterboth--- 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,
},
pallets/inflation/src/lib.rsdiffbeforeafterboth--- a/pallets/inflation/src/lib.rs
+++ b/pallets/inflation/src/lib.rs
@@ -75,6 +75,10 @@
pub type NextRecalculationBlock<T: Config> =
StorageValue<Value = T::BlockNumber, QueryKind = ValueQuery>;
+ /// Relay block when inflation has started
+ #[pallet::storage]
+ pub type StartBlock<T: Config> = StorageValue<Value = T::BlockNumber, QueryKind = ValueQuery>;
+
#[pallet::hooks]
impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {
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 = <NextInflationBlock<T>>::get();
- if next_inflation == 0u32.into() {
+ if <StartBlock<T>>::get() == 0u32.into() {
+ // Set inflation global start block
+ <StartBlock<T>>::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<T: Config> Pallet<T> {
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 - <StartBlock<T>>::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);
pallets/inflation/src/tests.rsdiffbeforeafterboth230 });230 });231}231}232233#[test]234fn inflation_start_large_kusama_block() {235 new_test_ext().execute_with(|| {236 // Total issuance = 1_000_000_000237 let initial_issuance: u64 = 1_000_000_000;238 let start_block: u64 = 10457457;239 let _ = <Balances as Currency<_>>::deposit_creating(&1234, initial_issuance);240 assert_eq!(Balances::free_balance(1234), initial_issuance);241 MockBlockNumberProvider::set(start_block);242243 // Start inflation as sudo244 assert_ok!(Inflation::start_inflation(245 RawOrigin::Root.into(),246 start_block247 ));248249 // Go through all the block inflations for year 1,250 // total issuance will be updated accordingly251 // Inflation is set to start in block 1, so first iteration is block 101252 for block in (101..YEAR).step_by(100) {253 MockBlockNumberProvider::set(start_block + block);254 Inflation::on_initialize(0);255 }256 assert_eq!(257 initial_issuance + (FIRST_YEAR_BLOCK_INFLATION * (YEAR / 100)),258 <Balances as Currency<_>>::total_issuance()259 );260261 MockBlockNumberProvider::set(start_block + YEAR + 1);262 Inflation::on_initialize(0);263 let block_inflation_year_2 = block_inflation!();264 // Expected 100-block inflation for year 2: 100 * 9.33% * initial issuance * 110% / YEAR == 1951265 let expecter_year_2_inflation: u64 = (initial_issuance266 + FIRST_YEAR_BLOCK_INFLATION * YEAR / 100)267 * 933 * 100 / (10000 * YEAR);268 assert_eq!(block_inflation_year_2 / 10, expecter_year_2_inflation / 10); // divide by 10 for approx. equality269 });270}232271233#[test]272#[test]234fn inflation_after_year_10_is_flat() {273fn inflation_after_year_10_is_flat() {