@@ -132,6 +132,7 @@ impl<T> From<DiscriminantResult<T>> for IsPrecompileResult {
132
132
pub enum PrecompileKind {
133
133
Single ( H160 ) ,
134
134
Prefixed ( Vec < u8 > ) ,
135
+ Multiple ( Vec < H160 > ) ,
135
136
}
136
137
137
138
#[ derive( Debug , Clone ) ]
@@ -836,6 +837,68 @@ impl<A> IsActivePrecompile for RevertPrecompile<A> {
836
837
}
837
838
}
838
839
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
+
839
902
/// A precompile that was removed from a precompile set.
840
903
/// Still considered a precompile but is inactive and always revert.
841
904
pub struct RemovedPrecompileAt < A > ( PhantomData < A > ) ;
0 commit comments