@@ -31,6 +31,9 @@ import (
3131// (August 2nd, 2025, 04:00 UTC)
3232const invalidateDelegateUnix = 1754107200
3333
34+ // P256VerifyAddress is the address of the p256 signature verification precompile
35+ var P256VerifyAddress = common .BytesToAddress ([]byte {0x1 , 0x00 })
36+
3437type RulesExtra extras.Rules
3538
3639func GetRulesExtra (r Rules ) * extras.Rules {
@@ -51,71 +54,66 @@ func (RulesExtra) MinimumGasConsumption(x uint64) uint64 {
5154 return (ethparams.NOOPHooks {}).MinimumGasConsumption (x )
5255}
5356
54- var PrecompiledContractsApricotPhase2 = map [common.Address ]contract. StatefulPrecompiledContract {
55- nativeasset .GenesisContractAddr : & nativeasset.DeprecatedContract {},
56- nativeasset .NativeAssetBalanceAddr : & nativeasset.NativeAssetBalance {GasCost : AssetBalanceApricot },
57- nativeasset .NativeAssetCallAddr : & nativeasset.NativeAssetCall {GasCost : AssetCallApricot , CallNewAccountGas : ethparams .CallNewAccountGas },
57+ var PrecompiledContractsApricotPhase2 = map [common.Address ]vm. PrecompiledContract {
58+ nativeasset .GenesisContractAddr : makePrecompile ( & nativeasset.DeprecatedContract {}) ,
59+ nativeasset .NativeAssetBalanceAddr : makePrecompile ( & nativeasset.NativeAssetBalance {GasCost : AssetBalanceApricot }) ,
60+ nativeasset .NativeAssetCallAddr : makePrecompile ( & nativeasset.NativeAssetCall {GasCost : AssetCallApricot , CallNewAccountGas : ethparams .CallNewAccountGas }) ,
5861}
5962
60- var PrecompiledContractsApricotPhasePre6 = map [common.Address ]contract. StatefulPrecompiledContract {
61- nativeasset .GenesisContractAddr : & nativeasset.DeprecatedContract {},
62- nativeasset .NativeAssetBalanceAddr : & nativeasset.DeprecatedContract {},
63- nativeasset .NativeAssetCallAddr : & nativeasset.DeprecatedContract {},
63+ var PrecompiledContractsApricotPhasePre6 = map [common.Address ]vm. PrecompiledContract {
64+ nativeasset .GenesisContractAddr : makePrecompile ( & nativeasset.DeprecatedContract {}) ,
65+ nativeasset .NativeAssetBalanceAddr : makePrecompile ( & nativeasset.DeprecatedContract {}) ,
66+ nativeasset .NativeAssetCallAddr : makePrecompile ( & nativeasset.DeprecatedContract {}) ,
6467}
6568
66- var PrecompiledContractsApricotPhase6 = map [common.Address ]contract. StatefulPrecompiledContract {
67- nativeasset .GenesisContractAddr : & nativeasset.DeprecatedContract {},
68- nativeasset .NativeAssetBalanceAddr : & nativeasset.NativeAssetBalance {GasCost : AssetBalanceApricot },
69- nativeasset .NativeAssetCallAddr : & nativeasset.NativeAssetCall {GasCost : AssetCallApricot , CallNewAccountGas : ethparams .CallNewAccountGas },
69+ var PrecompiledContractsApricotPhase6 = map [common.Address ]vm. PrecompiledContract {
70+ nativeasset .GenesisContractAddr : makePrecompile ( & nativeasset.DeprecatedContract {}) ,
71+ nativeasset .NativeAssetBalanceAddr : makePrecompile ( & nativeasset.NativeAssetBalance {GasCost : AssetBalanceApricot }) ,
72+ nativeasset .NativeAssetCallAddr : makePrecompile ( & nativeasset.NativeAssetCall {GasCost : AssetCallApricot , CallNewAccountGas : ethparams .CallNewAccountGas }) ,
7073}
7174
72- var PrecompiledContractsBanff = map [common.Address ]contract. StatefulPrecompiledContract {
73- nativeasset .GenesisContractAddr : & nativeasset.DeprecatedContract {},
74- nativeasset .NativeAssetBalanceAddr : & nativeasset.DeprecatedContract {},
75- nativeasset .NativeAssetCallAddr : & nativeasset.DeprecatedContract {},
75+ var PrecompiledContractsBanff = map [common.Address ]vm. PrecompiledContract {
76+ nativeasset .GenesisContractAddr : makePrecompile ( & nativeasset.DeprecatedContract {}) ,
77+ nativeasset .NativeAssetBalanceAddr : makePrecompile ( & nativeasset.DeprecatedContract {}) ,
78+ nativeasset .NativeAssetCallAddr : makePrecompile ( & nativeasset.DeprecatedContract {}) ,
7679}
7780
78- func (r RulesExtra ) ActivePrecompiles (existing []common.Address ) []common.Address {
79- var precompiles map [common.Address ]contract.StatefulPrecompiledContract
80- switch {
81- case r .IsBanff :
82- precompiles = PrecompiledContractsBanff
83- case r .IsApricotPhase6 :
84- precompiles = PrecompiledContractsApricotPhase6
85- case r .IsApricotPhasePre6 :
86- precompiles = PrecompiledContractsApricotPhasePre6
87- case r .IsApricotPhase2 :
88- precompiles = PrecompiledContractsApricotPhase2
89- }
81+ var PrecompiledContractsGranite = map [common.Address ]vm.PrecompiledContract {
82+ nativeasset .GenesisContractAddr : makePrecompile (& nativeasset.DeprecatedContract {}),
83+ nativeasset .NativeAssetBalanceAddr : makePrecompile (& nativeasset.DeprecatedContract {}),
84+ nativeasset .NativeAssetCallAddr : makePrecompile (& nativeasset.DeprecatedContract {}),
85+ P256VerifyAddress : & vm.P256Verify {},
86+ }
9087
88+ func (r RulesExtra ) ActivePrecompiles (existing []common.Address ) []common.Address {
9189 var addresses []common.Address
92- addresses = slices .AppendSeq (addresses , maps .Keys (precompiles ))
90+ addresses = slices .AppendSeq (addresses , maps .Keys (r . currentPrecompiles () ))
9391 addresses = append (addresses , existing ... )
9492 return addresses
9593}
9694
97- // precompileOverrideBuiltin specifies precompiles that were activated prior to the
98- // dynamic precompile activation registry.
99- // These were only active historically and are not active in the current network.
100- func (r RulesExtra ) precompileOverrideBuiltin (addr common.Address ) (libevm.PrecompiledContract , bool ) {
101- var precompiles map [common.Address ]contract.StatefulPrecompiledContract
95+ func (r RulesExtra ) currentPrecompiles () map [common.Address ]vm.PrecompiledContract {
10296 switch {
97+ case r .IsGranite :
98+ return PrecompiledContractsGranite
10399 case r .IsBanff :
104- precompiles = PrecompiledContractsBanff
100+ return PrecompiledContractsBanff
105101 case r .IsApricotPhase6 :
106- precompiles = PrecompiledContractsApricotPhase6
102+ return PrecompiledContractsApricotPhase6
107103 case r .IsApricotPhasePre6 :
108- precompiles = PrecompiledContractsApricotPhasePre6
104+ return PrecompiledContractsApricotPhasePre6
109105 case r .IsApricotPhase2 :
110- precompiles = PrecompiledContractsApricotPhase2
111- }
112-
113- precompile , ok := precompiles [addr ]
114- if ! ok {
115- return nil , false
106+ return PrecompiledContractsApricotPhase2
116107 }
108+ return nil
109+ }
117110
118- return makePrecompile (precompile ), true
111+ // precompileOverrideBuiltin specifies precompiles that were activated prior to the
112+ // dynamic precompile activation registry.
113+ // These were only active historically and are not active in the current network.
114+ func (r RulesExtra ) precompileOverrideBuiltin (addr common.Address ) (libevm.PrecompiledContract , bool ) {
115+ precompile , ok := r .currentPrecompiles ()[addr ]
116+ return precompile , ok
119117}
120118
121119func makePrecompile (contract contract.StatefulPrecompiledContract ) libevm.PrecompiledContract {
@@ -159,6 +157,7 @@ func (r RulesExtra) PrecompileOverride(addr common.Address) (libevm.PrecompiledC
159157 if p , ok := r .precompileOverrideBuiltin (addr ); ok {
160158 return p , true
161159 }
160+
162161 if _ , ok := r .Precompiles [addr ]; ! ok {
163162 return nil , false
164163 }
0 commit comments