Skip to content

Commit 30f58ba

Browse files
authored
Merge pull request #268 from UniqueNetwork/hotfix/inflation_year_fix
Hotfix/inflation year fix
2 parents a1f3ad0 + 002f42f commit 30f58ba

3 files changed

Lines changed: 52 additions & 5 deletions

File tree

node/cli/src/chain_spec.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ fn testnet_genesis(
220220
sudo: SudoConfig { key: root_key },
221221
vesting: VestingConfig { vesting: vec![] },
222222
parachain_info: unique_runtime::ParachainInfoConfig { parachain_id: id },
223+
parachain_system: Default::default(),
223224
aura: unique_runtime::AuraConfig {
224225
authorities: initial_authorities,
225226
},

pallets/inflation/src/lib.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ pub mod pallet {
7575
pub type NextRecalculationBlock<T: Config> =
7676
StorageValue<Value = T::BlockNumber, QueryKind = ValueQuery>;
7777

78+
/// Relay block when inflation has started
79+
#[pallet::storage]
80+
pub type StartBlock<T: Config> = StorageValue<Value = T::BlockNumber, QueryKind = ValueQuery>;
81+
7882
#[pallet::hooks]
7983
impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {
8084
fn on_initialize(_: T::BlockNumber) -> Weight
@@ -145,8 +149,10 @@ pub mod pallet {
145149
ensure_root(origin)?;
146150

147151
// Start inflation if it has not been yet initialized
148-
let next_inflation: T::BlockNumber = <NextInflationBlock<T>>::get();
149-
if next_inflation == 0u32.into() {
152+
if <StartBlock<T>>::get() == 0u32.into() {
153+
// Set inflation global start block
154+
<StartBlock<T>>::set(inflation_start_relay_block);
155+
150156
// Recalculate inflation. This can be backdated and will catch up.
151157
Self::recalculate_inflation(inflation_start_relay_block);
152158
let block_interval: u32 = T::InflationBlockInterval::get().try_into().unwrap_or(0);
@@ -166,9 +172,10 @@ pub mod pallet {
166172

167173
impl<T: Config> Pallet<T> {
168174
pub fn recalculate_inflation(recalculation_block: T::BlockNumber) {
169-
let current_year: u32 = (recalculation_block / T::BlockNumber::from(YEAR))
170-
.try_into()
171-
.unwrap_or(0);
175+
let current_year: u32 = ((recalculation_block - <StartBlock<T>>::get())
176+
/ T::BlockNumber::from(YEAR))
177+
.try_into()
178+
.unwrap_or(0);
172179
let block_interval: u32 = T::InflationBlockInterval::get().try_into().unwrap_or(0);
173180

174181
let one_percent = Perbill::from_percent(1);

pallets/inflation/src/tests.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,45 @@ fn inflation_in_1_year() {
230230
});
231231
}
232232

233+
#[test]
234+
fn inflation_start_large_kusama_block() {
235+
new_test_ext().execute_with(|| {
236+
// Total issuance = 1_000_000_000
237+
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);
242+
243+
// Start inflation as sudo
244+
assert_ok!(Inflation::start_inflation(
245+
RawOrigin::Root.into(),
246+
start_block
247+
));
248+
249+
// Go through all the block inflations for year 1,
250+
// total issuance will be updated accordingly
251+
// Inflation is set to start in block 1, so first iteration is block 101
252+
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+
);
260+
261+
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 == 1951
265+
let expecter_year_2_inflation: u64 = (initial_issuance
266+
+ 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. equality
269+
});
270+
}
271+
233272
#[test]
234273
fn inflation_after_year_10_is_flat() {
235274
new_test_ext().execute_with(|| {

0 commit comments

Comments
 (0)