difftreelog
Fix inflation for large kusama start block
in: master
2 files changed
pallets/inflation/src/lib.rsdiffbeforeafterboth75 pub type NextRecalculationBlock<T: Config> =75 pub type NextRecalculationBlock<T: Config> =76 StorageValue<Value = T::BlockNumber, QueryKind = ValueQuery>;76 StorageValue<Value = T::BlockNumber, QueryKind = ValueQuery>;7778 /// Relay block when inflation has started79 #[pallet::storage]80 pub type StartBlock<T: Config> =81 StorageValue<Value = T::BlockNumber, QueryKind = ValueQuery>;778278 #[pallet::hooks]83 #[pallet::hooks]79 impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {84 impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {145 ensure_root(origin)?;150 ensure_root(origin)?;146151147 // Start inflation if it has not been yet initialized152 // Start inflation if it has not been yet initialized148 let next_inflation: T::BlockNumber = <NextInflationBlock<T>>::get();149 if next_inflation == 0u32.into() {153 if <StartBlock<T>>::get() == 0u32.into() {154 // Set inflation global start block155 <StartBlock<T>>::set(inflation_start_relay_block);156150 // Recalculate inflation. This can be backdated and will catch up.157 // Recalculate inflation. This can be backdated and will catch up.151 Self::recalculate_inflation(inflation_start_relay_block);158 Self::recalculate_inflation(inflation_start_relay_block);166173167impl<T: Config> Pallet<T> {174impl<T: Config> Pallet<T> {168 pub fn recalculate_inflation(recalculation_block: T::BlockNumber) {175 pub fn recalculate_inflation(recalculation_block: T::BlockNumber) {169 let current_year: u32 = (recalculation_block / T::BlockNumber::from(YEAR))176 let current_year: u32 = ((recalculation_block - <StartBlock<T>>::get()) / T::BlockNumber::from(YEAR))170 .try_into()177 .try_into()171 .unwrap_or(0);178 .unwrap_or(0);172 let block_interval: u32 = T::InflationBlockInterval::get().try_into().unwrap_or(0);179 let block_interval: u32 = T::InflationBlockInterval::get().try_into().unwrap_or(0);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(RawOrigin::Root.into(), start_block));245246 // Go through all the block inflations for year 1,247 // total issuance will be updated accordingly248 // Inflation is set to start in block 1, so first iteration is block 101249 for block in (101..YEAR).step_by(100) {250 MockBlockNumberProvider::set(start_block + block);251 Inflation::on_initialize(0);252 }253 assert_eq!(254 initial_issuance + (FIRST_YEAR_BLOCK_INFLATION * (YEAR / 100)),255 <Balances as Currency<_>>::total_issuance()256 );257258 MockBlockNumberProvider::set(start_block + YEAR + 1);259 Inflation::on_initialize(0);260 let block_inflation_year_2 = block_inflation!();261 // Expected 100-block inflation for year 2: 100 * 9.33% * initial issuance * 110% / YEAR == 1951262 let expecter_year_2_inflation: u64 = (initial_issuance263 + FIRST_YEAR_BLOCK_INFLATION * YEAR / 100)264 * 933 * 100 / (10000 * YEAR);265 assert_eq!(block_inflation_year_2 / 10, expecter_year_2_inflation / 10); // divide by 10 for approx. equality266 });267}232268233#[test]269#[test]234fn inflation_after_year_10_is_flat() {270fn inflation_after_year_10_is_flat() {