diff --git a/pallets/networks/Cargo.toml b/pallets/networks/Cargo.toml index 377100c..e5ea768 100644 --- a/pallets/networks/Cargo.toml +++ b/pallets/networks/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ghost-networks" -version = "0.1.16" +version = "0.1.18" license.workspace = true authors.workspace = true edition.workspace = true diff --git a/pallets/networks/src/benchmarking.rs b/pallets/networks/src/benchmarking.rs index c01eed4..a3402ee 100644 --- a/pallets/networks/src/benchmarking.rs +++ b/pallets/networks/src/benchmarking.rs @@ -43,6 +43,7 @@ fn prepare_network( gatekeeper, topic_name, network_type: NetworkType::Evm, + avg_block_speed: 12, finality_delay: 69, rate_limit_delay: 69, block_distance: 69, @@ -239,6 +240,20 @@ benchmarks! { assert_ne!(GhostNetworks::::networks(chain_id.clone()), prev_network); } + update_avg_block_speed { + let avg_block_speed = 420; + let (chain_id, network) = prepare_network::(1, 1, 1); + let authority = T::UpdateOrigin::try_successful_origin() + .map_err(|_| BenchmarkError::Weightless)?; + let prev_network = create_network::(chain_id.clone(), network.clone())?; + }: _(authority, chain_id.clone(), avg_block_speed) + verify { + assert_last_event::(Event::NetworkAvgBlockSpeedUpdated { + chain_id: chain_id.clone(), avg_block_speed, + }.into()); + assert_ne!(GhostNetworks::::networks(chain_id.clone()), prev_network); + } + remove_network { let (chain_id, network) = prepare_network::(1, 1, 1); let authority = T::RemoveOrigin::try_successful_origin() diff --git a/pallets/networks/src/lib.rs b/pallets/networks/src/lib.rs index c6db8e6..be8cdf2 100644 --- a/pallets/networks/src/lib.rs +++ b/pallets/networks/src/lib.rs @@ -38,7 +38,7 @@ mod tests; pub type BalanceOf = <::Currency as Inspect<::AccountId>>::Balance; -#[derive(Encode, Decode, Clone, PartialEq, Eq, RuntimeDebug, TypeInfo)] +#[derive(Encode, Decode, Clone, Copy, PartialEq, Eq, RuntimeDebug, TypeInfo)] pub enum NetworkType { Evm = 0, Utxo = 1, @@ -61,6 +61,7 @@ pub struct NetworkData { pub finality_delay: u64, pub rate_limit_delay: u64, pub block_distance: u64, + pub avg_block_speed: u64, pub incoming_fee: u32, pub outgoing_fee: u32, } @@ -220,6 +221,10 @@ pub mod module { chain_id: T::NetworkId, outgoing_fee: u32, }, + NetworkAvgBlockSpeedUpdated { + chain_id: T::NetworkId, + avg_block_speed: u64, + }, NetworkRemoved { chain_id: T::NetworkId, }, @@ -433,6 +438,17 @@ pub mod module { } #[pallet::call_index(11)] + #[pallet::weight(T::WeightInfo::update_avg_block_speed())] + pub fn update_avg_block_speed( + origin: OriginFor, + chain_id: T::NetworkId, + avg_block_speed: u64, + ) -> DispatchResult { + T::UpdateOrigin::ensure_origin_or_root(origin)?; + Self::do_update_avg_block_speed(chain_id, avg_block_speed) + } + + #[pallet::call_index(12)] #[pallet::weight(T::WeightInfo::remove_network())] pub fn remove_network(origin: OriginFor, chain_id: T::NetworkId) -> DispatchResult { T::RemoveOrigin::ensure_origin_or_root(origin)?; @@ -589,7 +605,7 @@ impl Pallet { Networks::::try_mutate(&chain_id, |maybe_network| -> DispatchResult { ensure!(maybe_network.is_some(), Error::::NetworkDoesNotExist); let net = maybe_network.as_mut().unwrap(); - net.network_type = network_type.clone(); + net.network_type = network_type; *maybe_network = Some(net.clone()); Ok(()) })?; @@ -653,7 +669,7 @@ impl Pallet { Networks::::try_mutate(&chain_id, |maybe_network| -> DispatchResult { ensure!(maybe_network.is_some(), Error::::NetworkDoesNotExist); let net = maybe_network.as_mut().unwrap(); - net.incoming_fee = incoming_fee.clone(); + net.incoming_fee = incoming_fee; *maybe_network = Some(net.clone()); Ok(()) })?; @@ -671,7 +687,7 @@ impl Pallet { Networks::::try_mutate(&chain_id, |maybe_network| -> DispatchResult { ensure!(maybe_network.is_some(), Error::::NetworkDoesNotExist); let net = maybe_network.as_mut().unwrap(); - net.outgoing_fee = outgoing_fee.clone(); + net.outgoing_fee = outgoing_fee; *maybe_network = Some(net.clone()); Ok(()) })?; @@ -681,6 +697,25 @@ impl Pallet { }); Ok(()) } + + pub fn do_update_avg_block_speed( + chain_id: T::NetworkId, + avg_block_speed: u64, + ) -> DispatchResult { + Networks::::try_mutate(&chain_id, |maybe_network| -> DispatchResult { + ensure!(maybe_network.is_some(), Error::::NetworkDoesNotExist); + let net = maybe_network.as_mut().unwrap(); + net.avg_block_speed = avg_block_speed; + *maybe_network = Some(net.clone()); + Ok(()) + })?; + Self::deposit_event(Event::::NetworkAvgBlockSpeedUpdated { + chain_id, + avg_block_speed, + }); + Ok(()) + } + } impl NetworkDataBasicHandler for Pallet { diff --git a/pallets/networks/src/mock.rs b/pallets/networks/src/mock.rs index 3b18062..d4e106e 100644 --- a/pallets/networks/src/mock.rs +++ b/pallets/networks/src/mock.rs @@ -98,7 +98,7 @@ impl ghost_networks::Config for Test { type RegisterOrigin = EnsureSignedBy; type UpdateOrigin = EnsureSignedBy; type RemoveOrigin = EnsureSignedBy; - type WeightInfo = crate::weights::SubstrateWeight; + type WeightInfo = (); } type Block = frame_system::mocking::MockBlock; diff --git a/pallets/networks/src/tests.rs b/pallets/networks/src/tests.rs index b7a980c..d956d4c 100644 --- a/pallets/networks/src/tests.rs +++ b/pallets/networks/src/tests.rs @@ -19,6 +19,7 @@ fn prepare_network_data() -> (u32, NetworkData) { finality_delay: 69, rate_limit_delay: 69, block_distance: 69, + avg_block_speed: 12_000, network_type: NetworkType::Evm, gatekeeper: b"0x1234567891234567891234567891234567891234".to_vec(), topic_name: b"0x12345678912345678912345678912345678912345678912345678912345678" diff --git a/pallets/networks/src/weights.rs b/pallets/networks/src/weights.rs index 17ef44d..cfeabe1 100644 --- a/pallets/networks/src/weights.rs +++ b/pallets/networks/src/weights.rs @@ -60,6 +60,7 @@ pub trait WeightInfo { fn update_network_topic_name() -> Weight; fn update_incoming_network_fee() -> Weight; fn update_outgoing_network_fee() -> Weight; + fn update_avg_block_speed() -> Weight; fn remove_network() -> Weight; } @@ -209,6 +210,18 @@ impl WeightInfo for () { } /// Storage: `GhostNetworks::Networks` (r:1 w:1) /// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn update_avg_block_speed() -> Weight { + // Proof Size summary in bytes: + // Measured: `302` + // Estimated: `3767` + // Minimum execution time: 49_579_000 picoseconds. + Weight::from_parts(51_126_000, 0) + .saturating_add(Weight::from_parts(0, 3767)) + .saturating_add(RocksDbWeight::get().reads(1)) + .saturating_add(RocksDbWeight::get().writes(1)) + } + /// Storage: `GhostNetworks::Networks` (r:1 w:1) + /// Proof: `GhostNetworks::Networks` (`max_values`: None, `max_size`: None, mode: `Measured`) fn remove_network() -> Weight { // Proof Size summary in bytes: // Measured: `302`