#![cfg(feature = "runtime-benchmarks")] use super::*; use crate::Pallet as GhostNetworks; use frame_benchmarking::v1::{benchmarks, BenchmarkError}; use sp_runtime::Saturating; use ghost_helpers::networks::{ MAX_ENDPOINT_LEN, MAX_ENDPOINTS_LEN, MAX_GATEKEEPER_LEN, MAX_SELECTOR_LEN, }; fn assert_last_event(generic_event: ::RuntimeEvent) { frame_system::Pallet::::assert_last_event(generic_event.into()); } fn prepare_network( n: u32, m: u32, k: u32, ) -> (T::NetworkId, NetworkData) { let chain_id: ::NetworkId = Default::default(); let chain_id = chain_id.saturating_add((n + m).into()); let mut gatekeeper = sp_std::vec![]; for i in 0..n { gatekeeper.push((i % 256) as u8); } let mut default_endpoints = sp_std::vec![]; for _ in 0..(k as usize) { default_endpoints.push(sp_std::vec![0x69; m as usize]); } let network = ghost_helpers::networks::NetworkDataBuilder::default() .with_gatekeeper(gatekeeper) .with_default_endpoints(default_endpoints) .with_selector(vec![1u8; 4]) .with_network_type(NetworkType::Evm) .with_network_curve(NetworkCurve::Secp256k1) .with_rate_limit_delay(6) .with_finality_delay(69) .with_block_deviation(420) .with_incoming_share(0) .with_outgoing_share(0) .build(); (chain_id, network) } fn create_network( chain_id: T::NetworkId, network: NetworkData, ) -> Result, BenchmarkError> { let prev_network = match GhostNetworks::::get(&chain_id) { Some(net) => net, None => { let authority = T::RegisterOrigin::try_successful_origin() .map_err(|_| BenchmarkError::Weightless)?; GhostNetworks::::register_network( authority, chain_id, network.clone(), ) .map_err(|_| BenchmarkError::Weightless)?; network } }; Ok(Some(prev_network)) } benchmarks! { register_network { let i in 1 .. MAX_GATEKEEPER_LEN; let j in 1 .. MAX_ENDPOINT_LEN; let k in 1 .. MAX_ENDPOINTS_LEN; let (chain_id, network) = prepare_network::(i, j, k); let authority = T::RegisterOrigin::try_successful_origin() .map_err(|_| BenchmarkError::Weightless)?; assert_eq!(GhostNetworks::::networks(chain_id), None); assert!(GhostNetworks::::network_indexes().is_empty()); }: _(authority, chain_id, network.clone()) verify { assert_last_event::(Event::NetworkRegistered {chain_id: chain_id}.into()); assert_eq!(GhostNetworks::::networks(chain_id), Some(network)); assert_eq!(GhostNetworks::::network_indexes(), vec![chain_id]); } update_network_selector { let raw_selector = sp_std::vec![0x42; MAX_SELECTOR_LEN as usize]; let selector = BoundedVec::>::try_from(raw_selector) .map_err(|_| BenchmarkError::Weightless)?; 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, network)?; }: _(authority, chain_id, selector) verify { assert_last_event::(Event::NetworkSelectorUpdated { chain_id }.into()); assert_ne!(GhostNetworks::::networks(chain_id), prev_network); } update_network_endpoint { let n in 1 .. MAX_ENDPOINT_LEN; let index = 0u32; let raw_endpoint = sp_std::vec![0x42; n as usize]; let endpoint = BoundedVec::>::try_from(raw_endpoint) .map_err(|_| BenchmarkError::Weightless)?; 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, network)?; }: _(authority, chain_id, Some(index), Some(endpoint)) verify { assert_last_event::(Event::NetworkEndpointUpdated {chain_id, index }.into()); assert_ne!(GhostNetworks::::networks(chain_id), prev_network); } update_network_finality_delay { let delay = 1337; 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, network)?; }: _(authority, chain_id, delay) verify { assert_last_event::(Event::NetworkFinalityDelayUpdated { chain_id, finality_delay: delay, }.into()); assert_ne!(GhostNetworks::::networks(chain_id), prev_network); } update_network_rate_limit_delay { let rate_limit = 1337; 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, network)?; }: _(authority, chain_id, rate_limit) verify { assert_last_event::(Event::NetworkRateLimitDelayUpdated { chain_id, rate_limit_delay: rate_limit, }.into()); assert_ne!(GhostNetworks::::networks(chain_id), prev_network); } update_network_block_deviation { let block_deviation = 1337; 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, network)?; }: _(authority, chain_id, block_deviation) verify { assert_last_event::(Event::NetworkBlockDeviationUpdated { chain_id, block_deviation }.into()); assert_ne!(GhostNetworks::::networks(chain_id), prev_network); } update_network_type { let network_type = NetworkType::Utxo; 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, network)?; }: _(authority, chain_id, network_type.clone()) verify { assert_last_event::(Event::NetworkTypeUpdated { chain_id, network_type }.into()); assert_ne!(GhostNetworks::::networks(chain_id), prev_network); } update_network_curve { let network_curve = NetworkCurve::Ed25519; 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, network)?; }: _(authority, chain_id, network_curve) verify { assert_last_event::(Event::NetworkCurveUpdated { chain_id, network_curve }.into()); assert_ne!(GhostNetworks::::networks(chain_id), prev_network); } update_network_gatekeeper { let mut raw_gatekeeper = b"0x".to_vec(); for i in 0..40 { raw_gatekeeper.push(i + 1); } let gatekeeper = BoundedVec::>::try_from(raw_gatekeeper) .map_err(|_| BenchmarkError::Weightless)?; 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, network)?; }: _(authority, chain_id, gatekeeper) verify { assert_last_event::(Event::NetworkGatekeeperUpdated { chain_id }.into()); assert_ne!(GhostNetworks::::networks(chain_id), prev_network); } update_incoming_network_share { let incoming_share = 1337; 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, network)?; }: _(authority, chain_id, incoming_share) verify { assert_last_event::(Event::NetworkIncomingShareUpdated { chain_id, incoming_share }.into()); assert_ne!(GhostNetworks::::networks(chain_id.clone()), prev_network); } update_outgoing_network_share { let outgoing_share = 1337; 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, network)?; }: _(authority, chain_id, outgoing_share) verify { assert_last_event::(Event::NetworkOutgoingShareUpdated { chain_id, outgoing_share }.into()); assert_ne!(GhostNetworks::::networks(chain_id), prev_network); } remove_network { let (chain_id, network) = prepare_network::(1, 1, 1); let authority = T::RemoveOrigin::try_successful_origin() .map_err(|_| BenchmarkError::Weightless)?; let maybe_network = create_network::(chain_id, network)?; assert_eq!(GhostNetworks::::networks(chain_id), maybe_network); assert_eq!(GhostNetworks::::network_indexes(), vec![chain_id]); }: _(authority, chain_id) verify { assert_last_event::(Event::NetworkRemoved { chain_id }.into()); assert_eq!(GhostNetworks::::networks(chain_id), None); assert!(GhostNetworks::::network_indexes().is_empty()); } impl_benchmark_test_suite!(GhostNetworks, crate::mock::ExtBuilder::build(), crate::mock::Test); }