forked from ghostchain/ghost-node
		
	new tests based on new ghost-network functinality
Signed-off-by: Uncle Stinky <uncle.stinky@ghostchain.io>
This commit is contained in:
		
							parent
							
								
									46d4716f67
								
							
						
					
					
						commit
						573e57dfb4
					
				
							
								
								
									
										4
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							@ -3834,7 +3834,7 @@ dependencies = [
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "ghost-slow-clap"
 | 
					name = "ghost-slow-clap"
 | 
				
			||||||
version = "0.3.17"
 | 
					version = "0.3.19"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 "frame-benchmarking",
 | 
					 "frame-benchmarking",
 | 
				
			||||||
 "frame-support",
 | 
					 "frame-support",
 | 
				
			||||||
@ -3843,6 +3843,8 @@ dependencies = [
 | 
				
			|||||||
 "log",
 | 
					 "log",
 | 
				
			||||||
 "pallet-balances",
 | 
					 "pallet-balances",
 | 
				
			||||||
 "pallet-session",
 | 
					 "pallet-session",
 | 
				
			||||||
 | 
					 "pallet-staking",
 | 
				
			||||||
 | 
					 "pallet-staking-reward-curve",
 | 
				
			||||||
 "parity-scale-codec",
 | 
					 "parity-scale-codec",
 | 
				
			||||||
 "scale-info",
 | 
					 "scale-info",
 | 
				
			||||||
 "serde",
 | 
					 "serde",
 | 
				
			||||||
 | 
				
			|||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
[package]
 | 
					[package]
 | 
				
			||||||
name = "ghost-slow-clap"
 | 
					name = "ghost-slow-clap"
 | 
				
			||||||
version = "0.3.18"
 | 
					version = "0.3.19"
 | 
				
			||||||
description = "Applause protocol for the EVM bridge"
 | 
					description = "Applause protocol for the EVM bridge"
 | 
				
			||||||
license.workspace = true
 | 
					license.workspace = true
 | 
				
			||||||
authors.workspace = true
 | 
					authors.workspace = true
 | 
				
			||||||
@ -27,11 +27,13 @@ sp-staking = { workspace = true }
 | 
				
			|||||||
sp-io = { workspace = true }
 | 
					sp-io = { workspace = true }
 | 
				
			||||||
sp-std = { workspace = true }
 | 
					sp-std = { workspace = true }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pallet-balances = { workspace = true }
 | 
					 | 
				
			||||||
ghost-networks = { workspace = true }
 | 
					ghost-networks = { workspace = true }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[dev-dependencies]
 | 
					[dev-dependencies]
 | 
				
			||||||
pallet-session = { workspace = true, default-features = true }
 | 
					pallet-balances = { workspace = true }
 | 
				
			||||||
 | 
					pallet-session = { workspace = true }
 | 
				
			||||||
 | 
					pallet-staking = { workspace = true }
 | 
				
			||||||
 | 
					pallet-staking-reward-curve = { workspace = true }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[features]
 | 
					[features]
 | 
				
			||||||
default = ["std"]
 | 
					default = ["std"]
 | 
				
			||||||
@ -49,6 +51,7 @@ std = [
 | 
				
			|||||||
    "sp-io/std",
 | 
					    "sp-io/std",
 | 
				
			||||||
    "sp-std/std",
 | 
					    "sp-std/std",
 | 
				
			||||||
    "pallet-session/std",
 | 
					    "pallet-session/std",
 | 
				
			||||||
 | 
					    "pallet-staking/std",
 | 
				
			||||||
    "pallet-balances/std",
 | 
					    "pallet-balances/std",
 | 
				
			||||||
    "ghost-networks/std",
 | 
					    "ghost-networks/std",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
				
			|||||||
@ -558,7 +558,7 @@ impl<T: Config> Pallet<T> {
 | 
				
			|||||||
        received_claps_key: &(SessionIndex, &H256, &H256),
 | 
					        received_claps_key: &(SessionIndex, &H256, &H256),
 | 
				
			||||||
    ) -> DispatchResult {
 | 
					    ) -> DispatchResult {
 | 
				
			||||||
        ApplausesForTransaction::<T>::try_mutate(received_claps_key, |is_applaused| {
 | 
					        ApplausesForTransaction::<T>::try_mutate(received_claps_key, |is_applaused| {
 | 
				
			||||||
            if *is_applaused {
 | 
					            if *is_applaused || T::NetworkDataHandler::is_nullification_period() {
 | 
				
			||||||
                return Ok(())
 | 
					                return Ok(())
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -2,15 +2,13 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use frame_support::{
 | 
					use frame_support::{
 | 
				
			||||||
    derive_impl, parameter_types,
 | 
					    derive_impl, parameter_types,
 | 
				
			||||||
    traits::{ConstU32, ConstU64},
 | 
					    traits::{ConstU32, ConstU64}, weights::Weight,
 | 
				
			||||||
    weights::Weight,
 | 
					 | 
				
			||||||
    PalletId,
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use frame_system::EnsureRoot;
 | 
					use frame_system::EnsureRoot;
 | 
				
			||||||
use pallet_session::historical as pallet_session_historical;
 | 
					use pallet_session::historical as pallet_session_historical;
 | 
				
			||||||
use sp_runtime::{
 | 
					use sp_runtime::{
 | 
				
			||||||
    testing::{TestXt, UintAuthorityId},
 | 
					    testing::{TestXt, UintAuthorityId},
 | 
				
			||||||
    traits::ConvertInto,
 | 
					    traits::ConvertInto, curve::PiecewiseLinear,
 | 
				
			||||||
    Permill,
 | 
					    Permill,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
use sp_staking::{
 | 
					use sp_staking::{
 | 
				
			||||||
@ -176,9 +174,20 @@ impl ghost_networks::Config for Runtime {
 | 
				
			|||||||
    type WeightInfo = ();
 | 
					    type WeightInfo = ();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pallet_staking_reward_curve::build! {
 | 
				
			||||||
 | 
					    const REWARD_CURVE: PiecewiseLinear<'static> = curve!(
 | 
				
			||||||
 | 
					        min_inflation: 0_006_000,
 | 
				
			||||||
 | 
					        max_inflation: 1_000_000,
 | 
				
			||||||
 | 
					        ideal_stake: 0_690_000,
 | 
				
			||||||
 | 
					        falloff: 0_050_000,
 | 
				
			||||||
 | 
					        max_piece_count: 100,
 | 
				
			||||||
 | 
					        test_precision: 0_005_000,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
parameter_types! {
 | 
					parameter_types! {
 | 
				
			||||||
    pub static ExistentialDeposit: u64 = 2;
 | 
					    pub static ExistentialDeposit: u64 = 2;
 | 
				
			||||||
    pub const TreasuryPalletId: PalletId = PalletId(*b"mck/test");
 | 
					    pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)]
 | 
					#[derive_impl(pallet_balances::config_preludes::TestDefaultConfig)]
 | 
				
			||||||
 | 
				
			|||||||
@ -10,6 +10,9 @@ use sp_core::offchain::{
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
use sp_runtime::testing::UintAuthorityId;
 | 
					use sp_runtime::testing::UintAuthorityId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use ghost_networks::BridgedInflationCurve;
 | 
				
			||||||
 | 
					use pallet_staking::EraPayout;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const MAX_DEVIATION_DEPTH: u32 = 10;
 | 
					const MAX_DEVIATION_DEPTH: u32 = 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn prepare_evm_network(
 | 
					fn prepare_evm_network(
 | 
				
			||||||
@ -262,18 +265,24 @@ fn should_mark_clapped_transaction_when_clap_received() {
 | 
				
			|||||||
fn should_applause_and_take_next_claps() {
 | 
					fn should_applause_and_take_next_claps() {
 | 
				
			||||||
    let (network_id, transaction_hash, unique_transaction_hash) =
 | 
					    let (network_id, transaction_hash, unique_transaction_hash) =
 | 
				
			||||||
        generate_unique_hash(None, None, None, None);
 | 
					        generate_unique_hash(None, None, None, None);
 | 
				
			||||||
 | 
					    let (_, receiver, amount) = get_mocked_metadata();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    new_test_ext().execute_with(|| {
 | 
					    new_test_ext().execute_with(|| {
 | 
				
			||||||
        let session_index = advance_session_and_get_index();
 | 
					        let session_index = advance_session_and_get_index();
 | 
				
			||||||
        let storage_key = (session_index, transaction_hash, unique_transaction_hash);
 | 
					        let storage_key = (session_index, transaction_hash, unique_transaction_hash);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert_eq!(pallet::ApplausesForTransaction::<Runtime>::get(&storage_key), false);
 | 
					        assert_eq!(pallet::ApplausesForTransaction::<Runtime>::get(&storage_key), false);
 | 
				
			||||||
 | 
					        assert_eq!(Balances::balance(&receiver), 0);
 | 
				
			||||||
        assert_ok!(do_clap_from(session_index, network_id, 0, false));
 | 
					        assert_ok!(do_clap_from(session_index, network_id, 0, false));
 | 
				
			||||||
        assert_eq!(pallet::ApplausesForTransaction::<Runtime>::get(&storage_key), false);
 | 
					        assert_eq!(pallet::ApplausesForTransaction::<Runtime>::get(&storage_key), false);
 | 
				
			||||||
 | 
					        assert_eq!(Balances::balance(&receiver), 0);
 | 
				
			||||||
        assert_ok!(do_clap_from(session_index, network_id, 1, false));
 | 
					        assert_ok!(do_clap_from(session_index, network_id, 1, false));
 | 
				
			||||||
        assert_eq!(pallet::ApplausesForTransaction::<Runtime>::get(&storage_key), true);
 | 
					        assert_eq!(pallet::ApplausesForTransaction::<Runtime>::get(&storage_key), true);
 | 
				
			||||||
 | 
					        assert_eq!(Balances::balance(&receiver), amount);
 | 
				
			||||||
        assert_ok!(do_clap_from(session_index, network_id, 2, false));
 | 
					        assert_ok!(do_clap_from(session_index, network_id, 2, false));
 | 
				
			||||||
        assert_eq!(pallet::ApplausesForTransaction::<Runtime>::get(&storage_key), true);
 | 
					        assert_eq!(pallet::ApplausesForTransaction::<Runtime>::get(&storage_key), true);
 | 
				
			||||||
 | 
					        assert_eq!(Balances::balance(&receiver), amount);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -530,10 +539,74 @@ fn should_throw_error_on_commission_overflow() {
 | 
				
			|||||||
    });
 | 
					    });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[test]
 | 
				
			||||||
 | 
					fn should_nullify_commission_on_finalize() {
 | 
				
			||||||
 | 
					    let total_staked = 69_000_000;
 | 
				
			||||||
 | 
					    let total_issuance = 100_000_000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let (network_id, _, _) = generate_unique_hash(None, None, None, None);
 | 
				
			||||||
 | 
					    let (_, _, amount) = get_mocked_metadata();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    new_test_ext().execute_with(|| {
 | 
				
			||||||
 | 
					        let _ = prepare_evm_network(Some(network_id), Some(500_000_000));
 | 
				
			||||||
 | 
					        let session_index = advance_session_and_get_index();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert_eq!(Networks::accumulated_commission(), 0);
 | 
				
			||||||
 | 
					        assert_ok!(do_clap_from(session_index, network_id, 0, false));
 | 
				
			||||||
 | 
					        assert_ok!(do_clap_from(session_index, network_id, 1, false));
 | 
				
			||||||
 | 
					        assert_eq!(Networks::accumulated_commission(), amount.saturating_div(2));
 | 
				
			||||||
 | 
					        assert_eq!(Networks::is_nullification_period(), false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert_eq!(BridgedInflationCurve::<RewardCurve, Runtime>::era_payout(
 | 
				
			||||||
 | 
					                total_staked,
 | 
				
			||||||
 | 
					                (total_issuance + amount).into(),
 | 
				
			||||||
 | 
					                0), (1260099399952u128, 208739900600048u128)); // precomputed values
 | 
				
			||||||
 | 
					        assert_eq!(Networks::is_nullification_period(), true);
 | 
				
			||||||
 | 
					        Networks::on_finalize(System::block_number());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert_eq!(Networks::is_nullification_period(), false);
 | 
				
			||||||
 | 
					        assert_eq!(Networks::accumulated_commission(), 0);
 | 
				
			||||||
 | 
					        assert_ok!(do_clap_from(session_index, network_id, 2, false));
 | 
				
			||||||
 | 
					        assert_eq!(Networks::accumulated_commission(), 0);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[test]
 | 
				
			||||||
 | 
					fn should_avoid_applause_during_nullification_period() {
 | 
				
			||||||
 | 
					    let total_staked = 69_000_000;
 | 
				
			||||||
 | 
					    let total_issuance = 100_000_000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let (network_id, _, _) = generate_unique_hash(None, None, None, None);
 | 
				
			||||||
 | 
					    let (_, receiver, amount) = get_mocked_metadata();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    new_test_ext().execute_with(|| {
 | 
				
			||||||
 | 
					        let _ = prepare_evm_network(Some(network_id), Some(0));
 | 
				
			||||||
 | 
					        let session_index = advance_session_and_get_index();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert_eq!(Networks::is_nullification_period(), false);
 | 
				
			||||||
 | 
					        assert_eq!(BridgedInflationCurve::<RewardCurve, Runtime>::era_payout(
 | 
				
			||||||
 | 
					                total_staked,
 | 
				
			||||||
 | 
					                total_issuance,
 | 
				
			||||||
 | 
					                0), (0, 0));
 | 
				
			||||||
 | 
					        assert_eq!(Networks::is_nullification_period(), true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert_ok!(do_clap_from(session_index, network_id, 0, false));
 | 
				
			||||||
 | 
					        assert_ok!(do_clap_from(session_index, network_id, 1, false));
 | 
				
			||||||
 | 
					        assert_eq!(Balances::balance(&receiver), 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Networks::on_finalize(System::block_number());
 | 
				
			||||||
 | 
					        assert_eq!(Networks::is_nullification_period(), false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        assert_ok!(do_clap_from(session_index, network_id, 2, false));
 | 
				
			||||||
 | 
					        assert_eq!(Balances::balance(&receiver), amount);
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO: check event
 | 
					// TODO: check event
 | 
				
			||||||
// TODO: multiple logs will create multiple records
 | 
					// TODO: multiple logs will create multiple records
 | 
				
			||||||
// TODO: errors should be checked as much as possible
 | 
					// TODO: errors should be checked as much as possible
 | 
				
			||||||
// TODO: offences generated as expected
 | 
					// TODO: offences generated as expected
 | 
				
			||||||
 | 
					// TODO: deal with below existential amount after commission
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn advance_session_and_get_index() -> u32 {
 | 
					fn advance_session_and_get_index() -> u32 {
 | 
				
			||||||
    advance_session();
 | 
					    advance_session();
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user