Skip to content

Commit 88dd6be

Browse files
committed
add RemovedPrecompilesAt for filtering a list of removed precompiles
1 parent 8979a49 commit 88dd6be

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

precompiles/src/precompile_set.rs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ impl<T> From<DiscriminantResult<T>> for IsPrecompileResult {
132132
pub enum PrecompileKind {
133133
Single(H160),
134134
Prefixed(Vec<u8>),
135+
Multiple(Vec<H160>),
135136
}
136137

137138
#[derive(Debug, Clone)]
@@ -836,6 +837,68 @@ impl<A> IsActivePrecompile for RevertPrecompile<A> {
836837
}
837838
}
838839

840+
/// Precompiles that were removed from a precompile set.
841+
/// Still considered precompiles but are inactive and always revert.
842+
pub struct RemovedPrecompilesAt<A>(PhantomData<A>);
843+
impl<A> PrecompileSetFragment for RemovedPrecompilesAt<A>
844+
where
845+
A: Get<Vec<H160>>,
846+
{
847+
#[inline(always)]
848+
fn new() -> Self {
849+
Self(PhantomData)
850+
}
851+
852+
#[inline(always)]
853+
fn execute<R: pallet_evm::Config>(
854+
&self,
855+
handle: &mut impl PrecompileHandle,
856+
) -> Option<PrecompileResult> {
857+
if A::get().contains(&handle.code_address()) {
858+
Some(Err(revert("Removed precompile")))
859+
} else {
860+
None
861+
}
862+
}
863+
864+
#[inline(always)]
865+
fn is_precompile(&self, address: H160, _gas: u64) -> IsPrecompileResult {
866+
IsPrecompileResult::Answer {
867+
is_precompile: A::get().contains(&address),
868+
extra_cost: 0,
869+
}
870+
}
871+
872+
#[inline(always)]
873+
fn used_addresses(&self) -> Vec<H160> {
874+
A::get()
875+
}
876+
877+
fn summarize_checks(&self) -> Vec<PrecompileCheckSummary> {
878+
vec![PrecompileCheckSummary {
879+
name: None,
880+
precompile_kind: PrecompileKind::Multiple(A::get()),
881+
recursion_limit: Some(0),
882+
accept_delegate_call: true,
883+
callable_by_smart_contract: "Reverts in all cases".into(),
884+
callable_by_precompile: "Reverts in all cases".into(),
885+
}]
886+
}
887+
}
888+
889+
impl<A> IsActivePrecompile for RemovedPrecompilesAt<A>
890+
where
891+
Self: PrecompileSetFragment,
892+
{
893+
#[inline(always)]
894+
fn is_active_precompile(&self, _address: H160, _gas: u64) -> IsPrecompileResult {
895+
IsPrecompileResult::Answer {
896+
is_precompile: false,
897+
extra_cost: 0,
898+
}
899+
}
900+
}
901+
839902
/// A precompile that was removed from a precompile set.
840903
/// Still considered a precompile but is inactive and always revert.
841904
pub struct RemovedPrecompileAt<A>(PhantomData<A>);

0 commit comments

Comments
 (0)