From c55d9a05d981b6c23c157d6bd140201ee5e9b967 Mon Sep 17 00:00:00 2001 From: Uncle Stretch Date: Tue, 3 Jun 2025 19:06:50 +0300 Subject: [PATCH] auto nullification during finalization and appropriate tests Signed-off-by: Uncle Stretch --- Cargo.lock | 4 ++-- pallets/networks/Cargo.toml | 4 +++- pallets/networks/src/lib.rs | 27 ++++++++++++++++++++++++--- pallets/networks/src/tests.rs | 24 +++++++++++++++++++++++- 4 files changed, 52 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b450177..a6e2d08 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3648,7 +3648,7 @@ dependencies = [ [[package]] name = "ghost-networks" -version = "0.1.3" +version = "0.1.4" dependencies = [ "frame-benchmarking", "frame-support", @@ -3868,7 +3868,7 @@ dependencies = [ [[package]] name = "ghost-traits" -version = "0.3.19" +version = "0.3.20" dependencies = [ "frame-support", "sp-runtime 31.0.1", diff --git a/pallets/networks/Cargo.toml b/pallets/networks/Cargo.toml index f90fb04..177ceb9 100644 --- a/pallets/networks/Cargo.toml +++ b/pallets/networks/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ghost-networks" -version = "0.1.3" +version = "0.1.4" license.workspace = true authors.workspace = true edition.workspace = true @@ -50,4 +50,6 @@ runtime-benchmarks = [ try-runtime = [ "frame-support/try-runtime", "frame-system/try-runtime", + "pallet-staking/try-runtime", + "pallet-balances/try-runtime", ] diff --git a/pallets/networks/src/lib.rs b/pallets/networks/src/lib.rs index d073c1d..cdc0c77 100644 --- a/pallets/networks/src/lib.rs +++ b/pallets/networks/src/lib.rs @@ -8,13 +8,13 @@ use frame_support::{ }; use frame_system::pallet_prelude::*; use scale_info::TypeInfo; + use sp_runtime::{ traits::{CheckedSub, CheckedAdd, AtLeast32BitUnsigned, Member}, curve::PiecewiseLinear, DispatchResult, }; -use sp_std::prelude::*; -use sp_std::convert::TryInto; +use sp_std::{prelude::*, convert::TryInto}; pub use ghost_traits::networks::{ NetworkDataBasicHandler, NetworkDataInspectHandler, @@ -93,6 +93,8 @@ where false => total_issuance.saturating_sub(Balance::from(bridged_in - bridged_out)), }; + NullifyNeeded::::set(true); + match piecewise_linear .calculate_for_fraction_times_denominator(total_staked, adjusted_issuance) .checked_mul(&accumulated_balance) @@ -165,6 +167,10 @@ pub mod module { NetworkRemoved { chain_id: T::NetworkId }, } + #[pallet::storage] + #[pallet::getter(fn nullify_needed)] + pub type NullifyNeeded = StorageValue<_, bool, ValueQuery>; + #[pallet::storage] #[pallet::getter(fn bridged_imbalance)] pub type BridgedImbalance = @@ -221,7 +227,18 @@ pub mod module { pub struct Pallet(PhantomData); #[pallet::hooks] - impl Hooks> for Pallet {} + impl Hooks> for Pallet { + fn on_initialize(_: BlockNumberFor) -> Weight { + T::DbWeight::get().reads_writes(1, 1) + } + + fn on_finalize(_: BlockNumberFor) { + if Self::nullify_needed() { + Self::nullify_commission(); + NullifyNeeded::::put(false); + } + } + } #[pallet::call] impl Pallet { @@ -596,6 +613,10 @@ impl NetworkDataInspectHandler for Pallet { fn iter() -> PrefixIterator<(Self::NetworkId, NetworkData)> { Networks::::iter() } + + fn is_nullification_period() -> bool { + NullifyNeeded::::get() + } } impl NetworkDataMutateHandler> for Pallet { diff --git a/pallets/networks/src/tests.rs b/pallets/networks/src/tests.rs index 8076440..07d1b1c 100644 --- a/pallets/networks/src/tests.rs +++ b/pallets/networks/src/tests.rs @@ -798,7 +798,6 @@ fn bridged_inlation_reward_works() { let total_staked_not_ideal: u128 = 68; let total_issuance: u128 = 100; - assert_eq!(BridgedInflationCurve::::era_payout( total_staked_ideal * 1_000, total_issuance * 1_000, @@ -913,3 +912,26 @@ fn bridged_inlation_reward_works() { 1, total_issuance * 1_000_000_000_000_000_000_000_000 + amount, 0), (0, 0)); }); } + +#[test] +fn bridged_inflation_era_payout_triggers_need_of_nullification() { + ExtBuilder::build() + .execute_with(|| { + let chain_id: u32 = 1; + let amount: u128 = 1337 * 1_000_000_000; + let commission: u128 = amount / 100; // 1% commission + let total_staked_ideal: u128 = 69; + let total_issuance: u128 = 100; + + assert_ok!(GhostNetworks::accumulate_commission(&commission)); + assert_ok!(GhostNetworks::increase_gatekeeper_amount(&chain_id, &amount)); + assert_eq!(NullifyNeeded::::get(), false); + assert_eq!(BridgedInflationCurve::::era_payout( + total_staked_ideal * 1_000, + total_issuance * 1_000 + amount, + 0), (commission, 0)); + assert_eq!(NullifyNeeded::::get(), true); + GhostNetworks::on_finalize(69); + assert_eq!(NullifyNeeded::::get(), false); + }); +}