22Useful types for generating Ethereum tests.
33"""
44from copy import copy , deepcopy
5- from dataclasses import dataclass , fields
5+ from dataclasses import dataclass , fields , replace
66from itertools import count
77from typing import (
88 Any ,
@@ -948,6 +948,13 @@ class Environment:
948948 cast_type = Number ,
949949 ),
950950 )
951+ beacon_root : Optional [FixedSizeBytesConvertible ] = field (
952+ default = None ,
953+ json_encoder = JSONEncoder .Field (
954+ name = "beaconRoot" ,
955+ cast_type = Hash ,
956+ ),
957+ )
951958 extra_data : Optional [BytesConvertible ] = field (
952959 default = None ,
953960 json_encoder = JSONEncoder .Field (
@@ -1036,6 +1043,9 @@ def set_fork_requirements(self, fork: Fork) -> "Environment":
10361043 ):
10371044 res .blob_gas_used = 0
10381045
1046+ if fork .header_beacon_root_required (number , timestamp ) and res .beacon_root is None :
1047+ res .beacon_root = 0
1048+
10391049 return res
10401050
10411051
@@ -1798,6 +1808,7 @@ class Header:
17981808 withdrawals_root : Optional [FixedSizeBytesConvertible | Removable ] = None
17991809 blob_gas_used : Optional [NumberConvertible | Removable ] = None
18001810 excess_blob_gas : Optional [NumberConvertible | Removable ] = None
1811+ beacon_root : Optional [FixedSizeBytesConvertible | Removable ] = None
18011812 hash : Optional [FixedSizeBytesConvertible ] = None
18021813
18031814 REMOVE_FIELD : ClassVar [Removable ] = Removable ()
@@ -2075,6 +2086,16 @@ class FixtureHeader:
20752086 json_encoder = JSONEncoder .Field (name = "excessBlobGas" , cast_type = ZeroPaddedHexNumber ),
20762087 )
20772088
2089+ beacon_root : Optional [Hash ] = header_field (
2090+ default = None ,
2091+ source = HeaderFieldSource (
2092+ parse_type = Hash ,
2093+ fork_requirement_check = "header_beacon_root_required" ,
2094+ source_environment = "beacon_root" ,
2095+ ),
2096+ json_encoder = JSONEncoder .Field (name = "beaconRoot" ),
2097+ )
2098+
20782099 hash : Optional [Hash ] = header_field (
20792100 default = None ,
20802101 source = HeaderFieldSource (
@@ -2172,6 +2193,8 @@ def build(
21722193 header .append (Uint (int (self .blob_gas_used )))
21732194 if self .excess_blob_gas is not None :
21742195 header .append (Uint (self .excess_blob_gas ))
2196+ if self .beacon_root is not None :
2197+ header .append (self .beacon_root )
21752198
21762199 block = [
21772200 header ,
@@ -2253,6 +2276,8 @@ def set_environment(self, env: Environment) -> Environment:
22532276 new_env .excess_blob_gas = self .excess_blob_gas
22542277 if not isinstance (self .blob_gas_used , Removable ):
22552278 new_env .blob_gas_used = self .blob_gas_used
2279+ if not isinstance (self .beacon_root , Removable ):
2280+ new_env .beacon_root = self .beacon_root
22562281 """
22572282 These values are required, but they depend on the previous environment,
22582283 so they can be calculated here.
@@ -2422,6 +2447,13 @@ class FixtureEngineNewPayload:
24222447 version : int = field (
24232448 json_encoder = JSONEncoder .Field (),
24242449 )
2450+ beacon_root : Optional [FixedSizeBytesConvertible ] = field (
2451+ default = None ,
2452+ json_encoder = JSONEncoder .Field (
2453+ name = "parentBeaconBlockRoot" ,
2454+ cast_type = Hash ,
2455+ ),
2456+ )
24252457 error_code : Optional [EngineAPIError ] = field (
24262458 default = None ,
24272459 json_encoder = JSONEncoder .Field (
@@ -2449,7 +2481,9 @@ def from_fixture_header(
24492481
24502482 new_payload = cls (
24512483 payload = FixtureExecutionPayload .from_fixture_header (
2452- header = header , transactions = transactions , withdrawals = withdrawals
2484+ header = replace (header , beacon_root = None ),
2485+ transactions = transactions ,
2486+ withdrawals = withdrawals ,
24532487 ),
24542488 version = new_payload_version ,
24552489 error_code = error_code ,
@@ -2460,6 +2494,9 @@ def from_fixture_header(
24602494 transactions
24612495 )
24622496
2497+ if fork .engine_new_payload_beacon_root (header .number , header .timestamp ):
2498+ new_payload .beacon_root = header .beacon_root
2499+
24632500 return new_payload
24642501
24652502
0 commit comments