diff --git a/pallets/networks/Cargo.toml b/pallets/networks/Cargo.toml index 7565690..97eb4b5 100644 --- a/pallets/networks/Cargo.toml +++ b/pallets/networks/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ghost-networks" -version = "0.1.22" +version = "0.1.23" license.workspace = true authors.workspace = true edition.workspace = true diff --git a/pallets/networks/src/benchmarking.rs b/pallets/networks/src/benchmarking.rs index a3402ee..039876c 100644 --- a/pallets/networks/src/benchmarking.rs +++ b/pallets/networks/src/benchmarking.rs @@ -85,13 +85,15 @@ benchmarks! { let (chain_id, network) = prepare_network::(i, j, k); let authority = T::RegisterOrigin::try_successful_origin() .map_err(|_| BenchmarkError::Weightless)?; - let prev_network = GhostNetworks::::networks(chain_id.clone()); + assert_eq!(GhostNetworks::::networks(chain_id.clone()), None); + assert!(GhostNetworks::::network_indexes().is_empty()); }: _(authority, chain_id.clone(), network.clone()) verify { assert_last_event::(Event::NetworkRegistered { - chain_id: chain_id.clone(), network, + chain_id: chain_id.clone(), network: network.clone(), }.into()); - assert_ne!(GhostNetworks::::networks(chain_id.clone()), prev_network); + assert_eq!(GhostNetworks::::networks(chain_id.clone()), Some(network)); + assert_eq!(GhostNetworks::::network_indexes(), vec![chain_id]); } update_network_name { @@ -251,20 +253,23 @@ benchmarks! { assert_last_event::(Event::NetworkAvgBlockSpeedUpdated { chain_id: chain_id.clone(), avg_block_speed, }.into()); - assert_ne!(GhostNetworks::::networks(chain_id.clone()), prev_network); + assert_ne!(GhostNetworks::::networks(chain_id.clone()), None); } remove_network { let (chain_id, network) = prepare_network::(1, 1, 1); let authority = T::RemoveOrigin::try_successful_origin() .map_err(|_| BenchmarkError::Weightless)?; - let prev_network = create_network::(chain_id.clone(), network.clone())?; + let _ = create_network::(chain_id.clone(), network.clone())?; + assert_eq!(GhostNetworks::::networks(chain_id.clone()), Some(network)); + assert_eq!(GhostNetworks::::network_indexes(), vec![chain_id.clone()]); }: _(authority, chain_id.clone()) verify { assert_last_event::(Event::NetworkRemoved { chain_id: chain_id.clone(), }.into()); - assert_ne!(GhostNetworks::::networks(chain_id.clone()), prev_network); + assert_eq!(GhostNetworks::::networks(chain_id.clone()), None); + assert!(GhostNetworks::::network_indexes().is_empty()); } impl_benchmark_test_suite!(GhostNetworks, crate::mock::ExtBuilder::build(), crate::mock::Test); diff --git a/pallets/networks/src/lib.rs b/pallets/networks/src/lib.rs index 6a2491f..d8470a8 100644 --- a/pallets/networks/src/lib.rs +++ b/pallets/networks/src/lib.rs @@ -737,9 +737,7 @@ impl NetworkDataInspectHandler for Pallet { Networks::::get(n) } - fn next_network_for_block( - block_number: impl Into, - ) -> Option<(Self::NetworkId, NetworkData)> { + fn network_for_block(block_number: impl Into) -> Option<(Self::NetworkId, NetworkData)> { let network_indexes = NetworkIndexes::::get(); block_number .into() diff --git a/pallets/networks/src/mock.rs b/pallets/networks/src/mock.rs index 951d286..71f7640 100644 --- a/pallets/networks/src/mock.rs +++ b/pallets/networks/src/mock.rs @@ -82,6 +82,7 @@ pallet_staking_reward_curve::build! { parameter_types! { pub const RewardCurve: &'static PiecewiseLinear<'static> = &REWARD_CURVE; + pub const MaxNetworks: u32 = 3; } ord_parameter_types! { @@ -98,7 +99,7 @@ impl ghost_networks::Config for Test { type RegisterOrigin = EnsureSignedBy; type UpdateOrigin = EnsureSignedBy; type RemoveOrigin = EnsureSignedBy; - type MaxNetworks = ConstU32<3>; + type MaxNetworks = MaxNetworks; type WeightInfo = (); } diff --git a/pallets/networks/src/tests.rs b/pallets/networks/src/tests.rs index 73e3c97..2e0780b 100644 --- a/pallets/networks/src/tests.rs +++ b/pallets/networks/src/tests.rs @@ -1,8 +1,8 @@ use super::*; use frame_support::{assert_err, assert_ok}; use mock::{ - ExtBuilder, GhostNetworks, RandomAccount, RegistererAccount, RemoverAccount, RewardCurve, - RuntimeEvent, RuntimeOrigin, System, Test, UpdaterAccount, + ExtBuilder, GhostNetworks, MaxNetworks, RandomAccount, RegistererAccount, RemoverAccount, + RewardCurve, RuntimeEvent, RuntimeOrigin, System, Test, UpdaterAccount, }; use pallet_staking::EraPayout; use sp_runtime::DispatchError; @@ -1818,6 +1818,32 @@ fn migration_from_v0_to_v1_works() { }); } +#[test] +fn error_on_max_networks_overflow() { + ExtBuilder::build().execute_with(|| { + let (chain_id, network) = prepare_network_data(); + + let max_networks = MaxNetworks::get(); + for index in 0..max_networks { + let other_chain_id = chain_id.saturating_add(index); + assert_ok!(GhostNetworks::register_network( + RuntimeOrigin::signed(RegistererAccount::get()), + other_chain_id, + network.clone(), + )); + } + + assert_err!( + GhostNetworks::register_network( + RuntimeOrigin::signed(RegistererAccount::get()), + chain_id.saturating_add(max_networks), + network.clone(), + ), + crate::Error::::TooManyNetworks, + ); + }); +} + #[test] fn migration_from_v0_to_v1_does_not_run_twice() { ExtBuilder::build().execute_with(|| {