From 24caad5f67d73ab3ed3ee259ae5c6daffb52c016 Mon Sep 17 00:00:00 2001 From: Aliaksandr Tsurko Date: Fri, 7 Mar 2025 18:20:38 +0100 Subject: [PATCH 1/3] Add try_execute method to PrecompileExt --- precompiles/src/extensions.rs | 29 +++++++++++++++++-- precompiles/src/lib.rs | 54 ++++++----------------------------- 2 files changed, 35 insertions(+), 48 deletions(-) diff --git a/precompiles/src/extensions.rs b/precompiles/src/extensions.rs index 90cc85ff03..1a61d2ba79 100644 --- a/precompiles/src/extensions.rs +++ b/precompiles/src/extensions.rs @@ -4,9 +4,10 @@ use alloc::format; use frame_support::dispatch::{GetDispatchInfo, Pays, PostDispatchInfo}; use frame_system::RawOrigin; +use pallet_admin_utils::{PrecompileEnable, PrecompileEnum}; use pallet_evm::{ - AddressMapping, BalanceConverter, ExitError, GasWeightMapping, PrecompileFailure, - PrecompileHandle, + AddressMapping, BalanceConverter, ExitError, GasWeightMapping, Precompile, PrecompileFailure, + PrecompileHandle, PrecompileResult, }; use precompile_utils::EvmResult; use sp_core::{H160, U256, blake2_256}; @@ -109,7 +110,7 @@ pub(crate) trait PrecompileHandleExt: PrecompileHandle { impl PrecompileHandleExt for T where T: PrecompileHandle {} -pub(crate) trait PrecompileExt> { +pub(crate) trait PrecompileExt>: Precompile { const INDEX: u64; // ss58 public key i.e., the contract sends funds it received to the destination address from @@ -127,6 +128,24 @@ pub(crate) trait PrecompileExt> { hash.into() } + + fn try_execute( + handle: &mut impl PrecompileHandle, + precompile_enum: PrecompileEnum, + ) -> Option + where + R: frame_system::Config + pallet_admin_utils::Config, + { + if PrecompileEnable::::get(&precompile_enum) { + Some(Self::execute(handle)) + } else { + Some(Err(PrecompileFailure::Error { + exit_status: ExitError::Other( + format!("Precompile {:?} is disabled", precompile_enum).into(), + ), + })) + } + } } #[cfg(test)] @@ -152,4 +171,8 @@ mod test { impl PrecompileExt for TestPrecompile { const INDEX: u64 = 2051; } + + #[allow(unreachable_code)] + #[precompile_utils::precompile] + impl TestPrecompile {} } diff --git a/precompiles/src/lib.rs b/precompiles/src/lib.rs index 66068a58bb..4076069b55 100644 --- a/precompiles/src/lib.rs +++ b/precompiles/src/lib.rs @@ -138,61 +138,25 @@ where } // Subtensor specific precompiles : a if a == hash(BalanceTransferPrecompile::::INDEX) => { - if PrecompileEnable::::get(PrecompileEnum::BalanceTransfer) { - Some(BalanceTransferPrecompile::::execute(handle)) - } else { - Some(Err(PrecompileFailure::Error { - exit_status: ExitError::Other( - "Precompile Balance Transfer is disabled".into(), - ), - })) - } + BalanceTransferPrecompile::::try_execute::( + handle, + PrecompileEnum::BalanceTransfer, + ) } a if a == hash(StakingPrecompile::::INDEX) => { - if PrecompileEnable::::get(PrecompileEnum::Staking) { - Some(StakingPrecompile::::execute(handle)) - } else { - Some(Err(PrecompileFailure::Error { - exit_status: ExitError::Other("Precompile Staking is disabled".into()), - })) - } + StakingPrecompile::::try_execute::(handle, PrecompileEnum::Staking) } a if a == hash(StakingPrecompileV2::::INDEX) => { - if PrecompileEnable::::get(PrecompileEnum::Staking) { - Some(StakingPrecompileV2::::execute(handle)) - } else { - Some(Err(PrecompileFailure::Error { - exit_status: ExitError::Other("Precompile Staking is disabled".into()), - })) - } + StakingPrecompile::::try_execute::(handle, PrecompileEnum::Staking) } - a if a == hash(SubnetPrecompile::::INDEX) => { - if PrecompileEnable::::get(PrecompileEnum::Subnet) { - Some(SubnetPrecompile::::execute(handle)) - } else { - Some(Err(PrecompileFailure::Error { - exit_status: ExitError::Other("Precompile Subnet is disabled".into()), - })) - } + SubnetPrecompile::::try_execute::(handle, PrecompileEnum::Subnet) } a if a == hash(MetagraphPrecompile::::INDEX) => { - if PrecompileEnable::::get(PrecompileEnum::Metagraph) { - Some(MetagraphPrecompile::::execute(handle)) - } else { - Some(Err(PrecompileFailure::Error { - exit_status: ExitError::Other("Precompile Metagrah is disabled".into()), - })) - } + MetagraphPrecompile::::try_execute::(handle, PrecompileEnum::Metagraph) } a if a == hash(NeuronPrecompile::::INDEX) => { - if PrecompileEnable::::get(PrecompileEnum::Neuron) { - Some(NeuronPrecompile::::execute(handle)) - } else { - Some(Err(PrecompileFailure::Error { - exit_status: ExitError::Other("Precompile Neuron is disabled".into()), - })) - } + NeuronPrecompile::::try_execute::(handle, PrecompileEnum::Neuron) } _ => None, } From 092d518fa698934b53d3812aacafc55b91251ff7 Mon Sep 17 00:00:00 2001 From: Aliaksandr Tsurko Date: Fri, 7 Mar 2025 18:21:12 +0100 Subject: [PATCH 2/3] Reformat --- precompiles/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/precompiles/src/lib.rs b/precompiles/src/lib.rs index 4076069b55..8bf301cb27 100644 --- a/precompiles/src/lib.rs +++ b/precompiles/src/lib.rs @@ -6,8 +6,8 @@ use core::marker::PhantomData; use frame_support::dispatch::{GetDispatchInfo, PostDispatchInfo}; use pallet_evm::{ - AddressMapping, ExitError, IsPrecompileResult, Precompile, PrecompileFailure, PrecompileHandle, - PrecompileResult, PrecompileSet, + AddressMapping, IsPrecompileResult, Precompile, PrecompileHandle, PrecompileResult, + PrecompileSet, }; use pallet_evm_precompile_modexp::Modexp; use pallet_evm_precompile_sha3fips::Sha3FIPS256; @@ -17,7 +17,7 @@ use sp_runtime::traits::Dispatchable; use sp_runtime::traits::StaticLookup; use subtensor_runtime_common::ProxyType; -use pallet_admin_utils::{PrecompileEnable, PrecompileEnum}; +use pallet_admin_utils::PrecompileEnum; use crate::balance_transfer::*; use crate::ed25519::*; From 40e0b8716680b9b5c861f6c8c42d24f6e3efb56b Mon Sep 17 00:00:00 2001 From: Aliaksandr Tsurko Date: Fri, 7 Mar 2025 18:49:25 +0100 Subject: [PATCH 3/3] Fix StakingPrecompileV2 dispatch --- precompiles/src/extensions.rs | 4 +++- precompiles/src/lib.rs | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/precompiles/src/extensions.rs b/precompiles/src/extensions.rs index 1a61d2ba79..373bf0a60d 100644 --- a/precompiles/src/extensions.rs +++ b/precompiles/src/extensions.rs @@ -148,6 +148,9 @@ pub(crate) trait PrecompileExt>: Precompile { } } +// allowing unreachable for the whole module fixes clippy reports about precompile macro +// implementation for `TestPrecompile`, that couldn't be fixed granularly +#[allow(unreachable_code)] #[cfg(test)] mod test { use super::*; @@ -172,7 +175,6 @@ mod test { const INDEX: u64 = 2051; } - #[allow(unreachable_code)] #[precompile_utils::precompile] impl TestPrecompile {} } diff --git a/precompiles/src/lib.rs b/precompiles/src/lib.rs index 8bf301cb27..42f250d563 100644 --- a/precompiles/src/lib.rs +++ b/precompiles/src/lib.rs @@ -147,7 +147,7 @@ where StakingPrecompile::::try_execute::(handle, PrecompileEnum::Staking) } a if a == hash(StakingPrecompileV2::::INDEX) => { - StakingPrecompile::::try_execute::(handle, PrecompileEnum::Staking) + StakingPrecompileV2::::try_execute::(handle, PrecompileEnum::Staking) } a if a == hash(SubnetPrecompile::::INDEX) => { SubnetPrecompile::::try_execute::(handle, PrecompileEnum::Subnet)