forked from ghostchain/ghost-node
		
	auto nullification during finalization and appropriate tests
Signed-off-by: Uncle Stretch <uncle.stretch@ghostchain.io>
This commit is contained in:
		
							parent
							
								
									5847097e94
								
							
						
					
					
						commit
						c55d9a05d9
					
				
							
								
								
									
										4
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -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",
 | 
			
		||||
 | 
			
		||||
@ -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",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
@ -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::<T>::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<T: Config> = StorageValue<_, bool, ValueQuery>;
 | 
			
		||||
 | 
			
		||||
    #[pallet::storage]
 | 
			
		||||
    #[pallet::getter(fn bridged_imbalance)]
 | 
			
		||||
    pub type BridgedImbalance<T: Config> =
 | 
			
		||||
@ -221,7 +227,18 @@ pub mod module {
 | 
			
		||||
    pub struct Pallet<T>(PhantomData<T>);
 | 
			
		||||
 | 
			
		||||
    #[pallet::hooks]
 | 
			
		||||
    impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {}
 | 
			
		||||
    impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {
 | 
			
		||||
        fn on_initialize(_: BlockNumberFor<T>) -> Weight {
 | 
			
		||||
            T::DbWeight::get().reads_writes(1, 1)
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fn on_finalize(_: BlockNumberFor<T>) {
 | 
			
		||||
            if Self::nullify_needed() {
 | 
			
		||||
                Self::nullify_commission();
 | 
			
		||||
                NullifyNeeded::<T>::put(false);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[pallet::call]
 | 
			
		||||
    impl<T: Config> Pallet<T> {
 | 
			
		||||
@ -596,6 +613,10 @@ impl<T: Config> NetworkDataInspectHandler<NetworkData> for Pallet<T> {
 | 
			
		||||
    fn iter() -> PrefixIterator<(Self::NetworkId, NetworkData)> {
 | 
			
		||||
        Networks::<T>::iter()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn is_nullification_period() -> bool {
 | 
			
		||||
        NullifyNeeded::<T>::get()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl<T: Config> NetworkDataMutateHandler<NetworkData, BalanceOf<T>> for Pallet<T> {
 | 
			
		||||
 | 
			
		||||
@ -798,7 +798,6 @@ fn bridged_inlation_reward_works() {
 | 
			
		||||
            let total_staked_not_ideal: u128 = 68;
 | 
			
		||||
            let total_issuance: u128 = 100;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::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::<Test>::get(), false);
 | 
			
		||||
            assert_eq!(BridgedInflationCurve::<RewardCurve, Test>::era_payout(
 | 
			
		||||
                    total_staked_ideal * 1_000,
 | 
			
		||||
                    total_issuance * 1_000 + amount,
 | 
			
		||||
                    0), (commission, 0));
 | 
			
		||||
            assert_eq!(NullifyNeeded::<Test>::get(), true);
 | 
			
		||||
            GhostNetworks::on_finalize(69);
 | 
			
		||||
            assert_eq!(NullifyNeeded::<Test>::get(), false);
 | 
			
		||||
        });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user