Skip to content

Ethereum Test Forks package

Ethereum test fork definitions.

Frontier

Bases: BaseFork

Frontier fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class Frontier(BaseFork):
    """
    Frontier fork
    """

    @classmethod
    def header_base_fee_required(cls, block_number: int, timestamp: int) -> bool:
        """
        At genesis, header must not contain base fee
        """
        return False

    @classmethod
    def header_prev_randao_required(cls, block_number: int, timestamp: int) -> bool:
        """
        At genesis, header must not contain Prev Randao value
        """
        return False

    @classmethod
    def header_zero_difficulty_required(cls, block_number: int, timestamp: int) -> bool:
        """
        At genesis, header must not have difficulty zero
        """
        return False

    @classmethod
    def header_withdrawals_required(cls, block_number: int, timestamp: int) -> bool:
        """
        At genesis, header must not contain withdrawals
        """
        return False

    @classmethod
    def header_excess_data_gas_required(cls, block_number: int, timestamp: int) -> bool:
        """
        At genesis, header must not contain excess data gas
        """
        return False

    @classmethod
    def header_data_gas_used_required(cls, block_number: int, timestamp: int) -> bool:
        """
        At genesis, header must not contain data gas used
        """
        return False

    @classmethod
    def get_reward(cls, block_number: int, timestamp: int) -> int:
        """
        At Genesis the expected reward amount in wei is
        5_000_000_000_000_000_000
        """
        return 5_000_000_000_000_000_000

header_base_fee_required(block_number, timestamp) classmethod

At genesis, header must not contain base fee

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
13
14
15
16
17
18
@classmethod
def header_base_fee_required(cls, block_number: int, timestamp: int) -> bool:
    """
    At genesis, header must not contain base fee
    """
    return False

header_prev_randao_required(block_number, timestamp) classmethod

At genesis, header must not contain Prev Randao value

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
20
21
22
23
24
25
@classmethod
def header_prev_randao_required(cls, block_number: int, timestamp: int) -> bool:
    """
    At genesis, header must not contain Prev Randao value
    """
    return False

header_zero_difficulty_required(block_number, timestamp) classmethod

At genesis, header must not have difficulty zero

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
27
28
29
30
31
32
@classmethod
def header_zero_difficulty_required(cls, block_number: int, timestamp: int) -> bool:
    """
    At genesis, header must not have difficulty zero
    """
    return False

header_withdrawals_required(block_number, timestamp) classmethod

At genesis, header must not contain withdrawals

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
34
35
36
37
38
39
@classmethod
def header_withdrawals_required(cls, block_number: int, timestamp: int) -> bool:
    """
    At genesis, header must not contain withdrawals
    """
    return False

header_excess_data_gas_required(block_number, timestamp) classmethod

At genesis, header must not contain excess data gas

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
41
42
43
44
45
46
@classmethod
def header_excess_data_gas_required(cls, block_number: int, timestamp: int) -> bool:
    """
    At genesis, header must not contain excess data gas
    """
    return False

header_data_gas_used_required(block_number, timestamp) classmethod

At genesis, header must not contain data gas used

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
48
49
50
51
52
53
@classmethod
def header_data_gas_used_required(cls, block_number: int, timestamp: int) -> bool:
    """
    At genesis, header must not contain data gas used
    """
    return False

get_reward(block_number, timestamp) classmethod

At Genesis the expected reward amount in wei is 5_000_000_000_000_000_000

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
55
56
57
58
59
60
61
@classmethod
def get_reward(cls, block_number: int, timestamp: int) -> int:
    """
    At Genesis the expected reward amount in wei is
    5_000_000_000_000_000_000
    """
    return 5_000_000_000_000_000_000

BerlinToLondonAt5

Bases: Berlin

Berlin to London transition at Block 5 fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/transition.py
 9
10
11
12
13
14
15
16
17
18
19
20
@transition_fork(to_fork=London)
class BerlinToLondonAt5(Berlin):
    """
    Berlin to London transition at Block 5 fork
    """

    @classmethod
    def header_base_fee_required(cls, block_number: int, _: int) -> bool:
        """
        Base Fee is required starting from London.
        """
        return block_number >= 5

header_base_fee_required(block_number, _) classmethod

Base Fee is required starting from London.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/transition.py
15
16
17
18
19
20
@classmethod
def header_base_fee_required(cls, block_number: int, _: int) -> bool:
    """
    Base Fee is required starting from London.
    """
    return block_number >= 5

InvalidForkError

Bases: Exception

Invalid fork error raised when the fork specified by command-line option --latest-fork is not found.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/helpers.py
11
12
13
14
15
16
17
18
class InvalidForkError(Exception):
    """
    Invalid fork error raised when the fork specified by command-line option
    --latest-fork is not found.
    """

    def __init__(self, message):
        super().__init__(message)

get_forks()

Returns a list of all the fork classes implemented by ethereum_test_forks ordered chronologically by deployment.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/helpers.py
21
22
23
24
25
26
27
28
29
30
31
32
33
def get_forks() -> List[Fork]:
    """
    Returns a list of all the fork classes implemented by
    `ethereum_test_forks` ordered chronologically by deployment.
    """
    all_forks: List[Fork] = []
    for fork_name in forks.__dict__:
        fork = forks.__dict__[fork_name]
        if not isinstance(fork, type):
            continue
        if issubclass(fork, BaseFork) and fork is not BaseFork:
            all_forks.append(fork)
    return all_forks

MergeToShanghaiAtTime15k

Bases: Merge

Merge to Shanghai transition at Timestamp 15k fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/transition.py
23
24
25
26
27
28
29
30
31
32
33
34
@transition_fork(to_fork=Shanghai)
class MergeToShanghaiAtTime15k(Merge):
    """
    Merge to Shanghai transition at Timestamp 15k fork
    """

    @classmethod
    def header_withdrawals_required(cls, _: int, timestamp: int) -> bool:
        """
        Withdrawals are required starting from Shanghai.
        """
        return timestamp >= 15_000

header_withdrawals_required(_, timestamp) classmethod

Withdrawals are required starting from Shanghai.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/transition.py
29
30
31
32
33
34
@classmethod
def header_withdrawals_required(cls, _: int, timestamp: int) -> bool:
    """
    Withdrawals are required starting from Shanghai.
    """
    return timestamp >= 15_000

get_deployed_forks()

Returns a list of all the fork classes implemented by ethereum_test_forks that have been deployed to mainnet, chronologically ordered by deployment.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/helpers.py
36
37
38
39
40
41
def get_deployed_forks():
    """
    Returns a list of all the fork classes implemented by `ethereum_test_forks`
    that have been deployed to mainnet, chronologically ordered by deployment.
    """
    return [fork for fork in get_forks() if fork.is_deployed()]

ShanghaiToCancunAtTime15k

Bases: Shanghai

Shanghai to Cancun transition at Timestamp 15k

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/transition.py
37
38
39
40
41
42
43
44
45
46
47
48
@transition_fork(to_fork=Cancun)
class ShanghaiToCancunAtTime15k(Shanghai):
    """
    Shanghai to Cancun transition at Timestamp 15k
    """

    @classmethod
    def header_excess_data_gas_required(cls, _: int, timestamp: int) -> bool:
        """
        Excess data gas is required if transitioning to Cancun.
        """
        return timestamp >= 15_000

header_excess_data_gas_required(_, timestamp) classmethod

Excess data gas is required if transitioning to Cancun.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/transition.py
43
44
45
46
47
48
@classmethod
def header_excess_data_gas_required(cls, _: int, timestamp: int) -> bool:
    """
    Excess data gas is required if transitioning to Cancun.
    """
    return timestamp >= 15_000

get_development_forks()

Returns a list of all the fork classes implemented by ethereum_test_forks that have been not yet deployed to mainnet and are currently under development. The list is ordered by their planned deployment date.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/helpers.py
44
45
46
47
48
49
50
def get_development_forks():
    """
    Returns a list of all the fork classes implemented by `ethereum_test_forks`
    that have been not yet deployed to mainnet and are currently under
    development. The list is ordered by their planned deployment date.
    """
    return [fork for fork in get_forks() if not fork.is_deployed()]

get_transition_forks()

Returns all the transition forks

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/helpers.py
60
61
62
63
64
65
66
67
68
69
70
71
72
73
def get_transition_forks() -> List[Fork]:
    """
    Returns all the transition forks
    """
    transition_forks: List[Fork] = []

    for fork_name in transition.__dict__:
        fork = transition.__dict__[fork_name]
        if not isinstance(fork, type):
            continue
        if issubclass(fork, TransitionBaseClass) and issubclass(fork, BaseFork):
            transition_forks.append(fork)

    return transition_forks

Homestead

Bases: Frontier

Homestead fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
64
65
66
67
68
69
class Homestead(Frontier):
    """
    Homestead fork
    """

    pass

Byzantium

Bases: Homestead

Byzantium fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
72
73
74
75
76
77
78
79
80
81
82
83
class Byzantium(Homestead):
    """
    Byzantium fork
    """

    @classmethod
    def get_reward(cls, block_number: int, timestamp: int) -> int:
        """
        At Byzantium, the block reward is reduced to
        3_000_000_000_000_000_000 wei
        """
        return 3_000_000_000_000_000_000

get_reward(block_number, timestamp) classmethod

At Byzantium, the block reward is reduced to 3_000_000_000_000_000_000 wei

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
77
78
79
80
81
82
83
@classmethod
def get_reward(cls, block_number: int, timestamp: int) -> int:
    """
    At Byzantium, the block reward is reduced to
    3_000_000_000_000_000_000 wei
    """
    return 3_000_000_000_000_000_000

transition_fork_from_to(fork_from, fork_to)

Returns the transition fork that transitions to and from the specified forks.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/helpers.py
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
def transition_fork_from_to(fork_from: Fork, fork_to: Fork) -> Fork | None:
    """
    Returns the transition fork that transitions to and from the specified
    forks.
    """
    for transition_fork in get_transition_forks():
        if not issubclass(transition_fork, TransitionBaseClass):
            continue
        if (
            transition_fork.transitions_to() == fork_to
            and transition_fork.transitions_from() == fork_from
        ):
            return transition_fork

    return None

Constantinople

Bases: Byzantium

Constantinople fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
86
87
88
89
90
91
92
93
94
95
96
97
class Constantinople(Byzantium):
    """
    Constantinople fork
    """

    @classmethod
    def get_reward(cls, block_number: int, timestamp: int) -> int:
        """
        At Constantinople, the block reward is reduced to
        2_000_000_000_000_000_000 wei
        """
        return 2_000_000_000_000_000_000

get_reward(block_number, timestamp) classmethod

At Constantinople, the block reward is reduced to 2_000_000_000_000_000_000 wei

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
91
92
93
94
95
96
97
@classmethod
def get_reward(cls, block_number: int, timestamp: int) -> int:
    """
    At Constantinople, the block reward is reduced to
    2_000_000_000_000_000_000 wei
    """
    return 2_000_000_000_000_000_000

transition_fork_to(fork_to)

Returns the transition fork that transitions to the specified fork.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/helpers.py
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
def transition_fork_to(fork_to: Fork) -> List[Fork]:
    """
    Returns the transition fork that transitions to the specified fork.
    """
    transition_forks: List[Fork] = []
    for transition_fork in get_transition_forks():
        if not issubclass(transition_fork, TransitionBaseClass):
            continue
        if transition_fork.transitions_to() == fork_to:
            transition_forks.append(transition_fork)

    return transition_forks

ConstantinopleFix

Bases: Constantinople

Constantinople Fix fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
100
101
102
103
104
105
class ConstantinopleFix(Constantinople):
    """
    Constantinople Fix fork
    """

    pass

forks_from_until(fork_from, fork_until)

Returns the specified fork and all forks after it until and including the second specified fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/helpers.py
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
def forks_from_until(fork_from: Fork, fork_until: Fork) -> List[Fork]:
    """
    Returns the specified fork and all forks after it until and including the
    second specified fork
    """
    prev_fork = fork_until

    forks: List[Fork] = []

    while prev_fork != BaseFork and prev_fork != fork_from:
        forks.insert(0, prev_fork)

        prev_fork = prev_fork.__base__

    if prev_fork == BaseFork:
        return []

    forks.insert(0, fork_from)

    return forks

Istanbul

Bases: ConstantinopleFix

Istanbul fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
108
109
110
111
112
113
class Istanbul(ConstantinopleFix):
    """
    Istanbul fork
    """

    pass

MuirGlacier

Bases: Istanbul

Muir Glacier fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
117
118
119
120
121
122
class MuirGlacier(Istanbul):
    """
    Muir Glacier fork
    """

    pass

Berlin

Bases: Istanbul

Berlin fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
125
126
127
128
129
130
class Berlin(Istanbul):
    """
    Berlin fork
    """

    pass

forks_from(fork, deployed_only=True)

Returns the specified fork and all forks after it.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/helpers.py
129
130
131
132
133
134
135
136
137
def forks_from(fork: Fork, deployed_only: bool = True) -> List[Fork]:
    """
    Returns the specified fork and all forks after it.
    """
    if deployed_only:
        latest_fork = get_deployed_forks()[-1]
    else:
        latest_fork = get_forks()[-1]
    return forks_from_until(fork, latest_fork)

London

Bases: Berlin

London fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
133
134
135
136
137
138
139
140
141
142
143
class London(Berlin):
    """
    London fork
    """

    @classmethod
    def header_base_fee_required(cls, block_number: int, timestamp: int) -> bool:
        """
        Base Fee is required starting from London.
        """
        return True

header_base_fee_required(block_number, timestamp) classmethod

Base Fee is required starting from London.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
138
139
140
141
142
143
@classmethod
def header_base_fee_required(cls, block_number: int, timestamp: int) -> bool:
    """
    Base Fee is required starting from London.
    """
    return True

is_fork(fork, which)

Returns True if fork is which or beyond, `False otherwise.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/helpers.py
140
141
142
143
144
145
146
147
148
149
150
151
152
def is_fork(fork: Fork, which: Fork) -> bool:
    """
    Returns `True` if `fork` is `which` or beyond, `False otherwise.
    """
    prev_fork = fork

    while prev_fork != BaseFork:
        if prev_fork == which:
            return True

        prev_fork = prev_fork.__base__

    return False

ArrowGlacier

Bases: London

Arrow Glacier fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
147
148
149
150
151
152
class ArrowGlacier(London):
    """
    Arrow Glacier fork
    """

    pass

GrayGlacier

Bases: ArrowGlacier

Gray Glacier fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
155
156
157
158
159
160
class GrayGlacier(ArrowGlacier):
    """
    Gray Glacier fork
    """

    pass

Merge

Bases: London

Merge fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
class Merge(London):
    """
    Merge fork
    """

    @classmethod
    def header_prev_randao_required(cls, block_number: int, timestamp: int) -> bool:
        """
        Prev Randao is required starting from Merge.
        """
        return True

    @classmethod
    def header_zero_difficulty_required(cls, block_number: int, timestamp: int) -> bool:
        """
        Zero difficulty is required starting from Merge.
        """
        return True

    @classmethod
    def get_reward(cls, block_number: int, timestamp: int) -> int:
        """
        Merge updates the reward to 0.
        """
        return 0

header_prev_randao_required(block_number, timestamp) classmethod

Prev Randao is required starting from Merge.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
168
169
170
171
172
173
@classmethod
def header_prev_randao_required(cls, block_number: int, timestamp: int) -> bool:
    """
    Prev Randao is required starting from Merge.
    """
    return True

header_zero_difficulty_required(block_number, timestamp) classmethod

Zero difficulty is required starting from Merge.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
175
176
177
178
179
180
@classmethod
def header_zero_difficulty_required(cls, block_number: int, timestamp: int) -> bool:
    """
    Zero difficulty is required starting from Merge.
    """
    return True

get_reward(block_number, timestamp) classmethod

Merge updates the reward to 0.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
182
183
184
185
186
187
@classmethod
def get_reward(cls, block_number: int, timestamp: int) -> int:
    """
    Merge updates the reward to 0.
    """
    return 0

Shanghai

Bases: Merge

Shanghai fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
190
191
192
193
194
195
196
197
198
199
200
class Shanghai(Merge):
    """
    Shanghai fork
    """

    @classmethod
    def header_withdrawals_required(cls, block_number: int, timestamp: int) -> bool:
        """
        Withdrawals are required starting from Shanghai.
        """
        return True

header_withdrawals_required(block_number, timestamp) classmethod

Withdrawals are required starting from Shanghai.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
195
196
197
198
199
200
@classmethod
def header_withdrawals_required(cls, block_number: int, timestamp: int) -> bool:
    """
    Withdrawals are required starting from Shanghai.
    """
    return True

Cancun

Bases: Shanghai

Cancun fork

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
class Cancun(Shanghai):
    """
    Cancun fork
    """

    @classmethod
    def is_deployed(cls):
        """
        Flags that Cancun has not been deployed to mainnet; it is under active
        development.
        """
        return False

    @classmethod
    def header_excess_data_gas_required(cls, block_number: int, timestamp: int) -> bool:
        """
        Excess data gas is required starting from Cancun.
        """
        return True

    @classmethod
    def header_data_gas_used_required(cls, block_number: int, timestamp: int) -> bool:
        """
        Data gas used is required starting from Cancun.
        """
        return True

is_deployed() classmethod

Flags that Cancun has not been deployed to mainnet; it is under active development.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
208
209
210
211
212
213
214
@classmethod
def is_deployed(cls):
    """
    Flags that Cancun has not been deployed to mainnet; it is under active
    development.
    """
    return False

header_excess_data_gas_required(block_number, timestamp) classmethod

Excess data gas is required starting from Cancun.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
216
217
218
219
220
221
@classmethod
def header_excess_data_gas_required(cls, block_number: int, timestamp: int) -> bool:
    """
    Excess data gas is required starting from Cancun.
    """
    return True

header_data_gas_used_required(block_number, timestamp) classmethod

Data gas used is required starting from Cancun.

Source code in /home/dtopz/code/github/danceratopz/execution-spec-tests/src/ethereum_test_forks/forks/forks.py
223
224
225
226
227
228
@classmethod
def header_data_gas_used_required(cls, block_number: int, timestamp: int) -> bool:
    """
    Data gas used is required starting from Cancun.
    """
    return True