Skip to content

Commit 3c028dc

Browse files
authored
Merge pull request #4163 from ethereum/dev
Release v1.5.0-beta.3
2 parents b3e83f6 + 95c3fba commit 3c028dc

File tree

98 files changed

+1414
-359
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

98 files changed

+1414
-359
lines changed

.circleci/config.yml

+8-8
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@ commands:
3535
description: "Restore the cache with pyspec keys"
3636
steps:
3737
- restore_cached_venv:
38-
venv_name: v33-pyspec
39-
reqs_checksum: cache-{{ checksum "setup.py" }}-{{ checksum "pyproject.toml" }}-{{ python3 --version }}
38+
venv_name: v34-pyspec
39+
reqs_checksum: cache-{{ checksum "setup.py" }}-{{ checksum "pyproject.toml" }}
4040
save_pyspec_cached_venv:
41-
description: Save a venv into a cache with pyspec keys"
41+
description: "Save a venv into a cache with pyspec keys"
4242
steps:
4343
- save_cached_venv:
44-
venv_name: v33-pyspec
45-
reqs_checksum: cache-{{ checksum "setup.py" }}-{{ checksum "pyproject.toml" }}-{{ python3 --version }}
44+
venv_name: v34-pyspec
45+
reqs_checksum: cache-{{ checksum "setup.py" }}-{{ checksum "pyproject.toml" }}
4646
venv_path: ./venv
4747
jobs:
4848
checkout_specs:
@@ -168,7 +168,7 @@ jobs:
168168
command: make test fork=fulu
169169
- store_test_results:
170170
path: tests/core/pyspec/test-reports
171-
test-whisk:
171+
test-eip7441:
172172
docker:
173173
- image: cimg/python:3.12-node
174174
working_directory: ~/specs-repo
@@ -178,7 +178,7 @@ jobs:
178178
- restore_pyspec_cached_venv
179179
- run:
180180
name: Run py-tests
181-
command: make test fork=whisk
181+
command: make test fork=eip7441
182182
- store_test_results:
183183
path: tests/core/pyspec/test-reports
184184
lint:
@@ -224,7 +224,7 @@ workflows:
224224
- test-fulu:
225225
requires:
226226
- install_pyspec_test
227-
- test-whisk:
227+
- test-eip7441:
228228
requires:
229229
- install_pyspec_test
230230
- lint:

.github/workflows/run-tests.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ jobs:
6161
needs: [lint]
6262
strategy:
6363
matrix:
64-
version: ["phase0", "altair", "bellatrix", "capella", "deneb", "electra", "fulu", "whisk"]
64+
version: ["phase0", "altair", "bellatrix", "capella", "deneb", "electra", "fulu", "eip7441"]
6565
steps:
6666
- name: Checkout repository
6767
uses: actions/checkout@v4

.gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ tests/core/pyspec/eth2spec/capella/
2424
tests/core/pyspec/eth2spec/deneb/
2525
tests/core/pyspec/eth2spec/electra/
2626
tests/core/pyspec/eth2spec/fulu/
27-
tests/core/pyspec/eth2spec/whisk/
2827
tests/core/pyspec/eth2spec/eip6800/
28+
tests/core/pyspec/eth2spec/eip7441/
2929
tests/core/pyspec/eth2spec/eip7732/
30+
tests/core/pyspec/eth2spec/eip7805/
3031

3132
# coverage reports
3233
.htmlcov

Makefile

+16-9
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ ALL_EXECUTABLE_SPEC_NAMES = \
1010
deneb \
1111
electra \
1212
fulu \
13-
whisk \
1413
eip6800 \
15-
eip7732
14+
eip7441 \
15+
eip7732 \
16+
eip7805
1617

1718
# A list of fake targets.
1819
.PHONY: \
@@ -73,10 +74,12 @@ PYSPEC_DIR = $(TEST_LIBS_DIR)/pyspec
7374

7475
# Create the pyspec for all phases.
7576
pyspec: $(VENV) setup.py pyproject.toml
76-
@echo "Building eth2spec"
7777
@$(PYTHON_VENV) -m uv pip install --reinstall-package=eth2spec .[docs,lint,test,generator]
78-
@echo "Building all pyspecs"
79-
@$(PYTHON_VENV) setup.py pyspecdev
78+
@for dir in $(ALL_EXECUTABLE_SPEC_NAMES); do \
79+
mkdir -p "./tests/core/pyspec/eth2spec/$$dir"; \
80+
cp "./build/lib/eth2spec/$$dir/mainnet.py" "./tests/core/pyspec/eth2spec/$$dir/mainnet.py"; \
81+
cp "./build/lib/eth2spec/$$dir/minimal.py" "./tests/core/pyspec/eth2spec/$$dir/minimal.py"; \
82+
done
8083

8184
###############################################################################
8285
# Testing
@@ -240,12 +243,16 @@ gen_all: $(GENERATOR_TARGETS)
240243

241244
# Detect errors in generators.
242245
detect_errors: $(TEST_VECTOR_DIR)
243-
@find $(TEST_VECTOR_DIR) -name "INCOMPLETE"
246+
@incomplete_files=$$(find $(TEST_VECTOR_DIR) -name "INCOMPLETE"); \
247+
if [ -n "$$incomplete_files" ]; then \
248+
echo "[ERROR] incomplete detected"; \
249+
exit 1; \
250+
fi
244251
@if [ -f $(GENERATOR_ERROR_LOG_FILE) ]; then \
245252
echo "[ERROR] $(GENERATOR_ERROR_LOG_FILE) file exists"; \
246-
else \
247-
echo "[PASSED] error log file does not exist"; \
253+
exit 1; \
248254
fi
255+
@echo "[PASSED] no errors detected"
249256

250257
# Generate KZG trusted setups for testing.
251258
kzg_setups: pyspec
@@ -263,4 +270,4 @@ kzg_setups: pyspec
263270

264271
# Delete all untracked files.
265272
clean:
266-
@git clean -fdx
273+
@git clean -fdx

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Features are researched and developed in parallel, and then consolidated into se
1818
| Seq. | Code Name | Fork Epoch | Specs |
1919
| - | - | - | - |
2020
| 0 | **Phase0** |`0` | <ul><li>Core</li><ul><li>[The beacon chain](specs/phase0/beacon-chain.md)</li><li>[Deposit contract](specs/phase0/deposit-contract.md)</li><li>[Beacon chain fork choice](specs/phase0/fork-choice.md)</li></ul><li>Additions</li><ul><li>[Honest validator guide](specs/phase0/validator.md)</li><li>[P2P networking](specs/phase0/p2p-interface.md)</li><li>[Weak subjectivity](specs/phase0/weak-subjectivity.md)</li></ul></ul> |
21-
| 1 | **Altair** | `74240` | <ul><li>Core</li><ul><li>[Beacon chain changes](specs/altair/beacon-chain.md)</li><li>[Altair fork](specs/altair/fork.md)</li></ul><li>Additions</li><ul><li>[Light client sync protocol](specs/altair/light-client/sync-protocol.md) ([full node](specs/altair/light-client/full-node.md), [light client](specs/altair/light-client/light-client.md), [networking](specs/altair/light-client/p2p-interface.md))</li><li>[Honest validator guide changes](specs/altair/validator.md)</li><li>[P2P networking](specs/altair/p2p-interface.md)</li></ul></ul> |
21+
| 1 | **Altair** | `74240` | <ul><li>Core</li><ul><li>[Beacon chain changes](specs/altair/beacon-chain.md)</li><li>[Altair fork](specs/altair/fork.md)</li></ul><li>Additions</li><ul><li>[Light client sync protocol](specs/altair/light-client/sync-protocol.md) ([full node](specs/altair/light-client/full-node.md), [light client](specs/altair/light-client/light-client.md), [networking](specs/altair/light-client/p2p-interface.md))</li><li>[Honest validator guide changes](specs/altair/validator.md)</li><li>[P2P networking](specs/altair/p2p-interface.md)</li></ul></ul> |
2222
| 2 | **Bellatrix** <br/> (["The Merge"](https://ethereum.org/en/upgrades/merge/)) | `144896` | <ul><li>Core</li><ul><li>[Beacon Chain changes](specs/bellatrix/beacon-chain.md)</li><li>[Bellatrix fork](specs/bellatrix/fork.md)</li><li>[Fork choice changes](specs/bellatrix/fork-choice.md)</li></ul><li>Additions</li><ul><li>[Honest validator guide changes](specs/bellatrix/validator.md)</li><li>[P2P networking](specs/bellatrix/p2p-interface.md)</li></ul></ul> |
2323
| 3 | **Capella** | `194048` | <ul><li>Core</li><ul><li>[Beacon chain changes](specs/capella/beacon-chain.md)</li><li>[Capella fork](specs/capella/fork.md)</li></ul><li>Additions</li><ul><li>[Light client sync protocol changes](specs/capella/light-client/sync-protocol.md) ([fork](specs/capella/light-client/fork.md), [full node](specs/capella/light-client/full-node.md), [networking](specs/capella/light-client/p2p-interface.md))</li><li>[Validator additions](specs/capella/validator.md)</li><li>[P2P networking](specs/capella/p2p-interface.md)</li></ul></ul> |
2424
| 4 | **Deneb** | `269568` | <ul><li>Core</li><ul><li>[Beacon Chain changes](specs/deneb/beacon-chain.md)</li><li>[Deneb fork](specs/deneb/fork.md)</li><li>[Polynomial commitments](specs/deneb/polynomial-commitments.md)</li><li>[Fork choice changes](specs/deneb/fork-choice.md)</li></ul><li>Additions</li><ul><li>[Light client sync protocol changes](specs/deneb/light-client/sync-protocol.md) ([fork](specs/deneb/light-client/fork.md), [full node](specs/deneb/light-client/full-node.md), [networking](specs/deneb/light-client/p2p-interface.md))</li><li>[Honest validator guide changes](specs/deneb/validator.md)</li><li>[P2P networking](specs/deneb/p2p-interface.md)</li></ul></ul> |

configs/mainnet.yaml

+11-8
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ ELECTRA_FORK_EPOCH: 18446744073709551615 # temporary stub
5656
# Fulu
5757
FULU_FORK_VERSION: 0x06000000
5858
FULU_FORK_EPOCH: 18446744073709551615 # temporary stub
59-
# WHISK
60-
WHISK_FORK_VERSION: 0x08000000 # temporary stub
61-
WHISK_FORK_EPOCH: 18446744073709551615
59+
# EIP7441
60+
EIP7441_FORK_VERSION: 0x08000000 # temporary stub
61+
EIP7441_FORK_EPOCH: 18446744073709551615
6262
# EIP7732
6363
EIP7732_FORK_VERSION: 0x09000000 # temporary stub
6464
EIP7732_FORK_EPOCH: 18446744073709551615
@@ -175,11 +175,14 @@ BALANCE_PER_ADDITIONAL_CUSTODY_GROUP: 32000000000
175175
MAX_BLOBS_PER_BLOCK_FULU: 12
176176
MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS: 4096
177177

178-
# Whisk
179-
# `Epoch(2**8)`
180-
WHISK_EPOCHS_PER_SHUFFLING_PHASE: 256
181-
# `Epoch(2)`
182-
WHISK_PROPOSER_SELECTION_GAP: 2
178+
# EIP7441
179+
EPOCHS_PER_SHUFFLING_PHASE: 256
180+
PROPOSER_SELECTION_GAP: 2
183181

184182
# EIP7732
185183
MAX_REQUEST_PAYLOADS: 128
184+
185+
# EIP7805
186+
ATTESTATION_DEADLINE: 4
187+
PROPOSER_INCLUSION_LIST_CUT_OFF: 11
188+
VIEW_FREEZE_DEADLINE: 9

configs/minimal.yaml

+11-6
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ ELECTRA_FORK_EPOCH: 18446744073709551615
5555
# Fulu
5656
FULU_FORK_VERSION: 0x06000001
5757
FULU_FORK_EPOCH: 18446744073709551615
58-
# WHISK
59-
WHISK_FORK_VERSION: 0x08000001
60-
WHISK_FORK_EPOCH: 18446744073709551615
58+
# EIP7441
59+
EIP7441_FORK_VERSION: 0x08000001
60+
EIP7441_FORK_EPOCH: 18446744073709551615
6161
# EIP7732
6262
EIP7732_FORK_VERSION: 0x09000001
6363
EIP7732_FORK_EPOCH: 18446744073709551615
@@ -176,9 +176,14 @@ BALANCE_PER_ADDITIONAL_CUSTODY_GROUP: 32000000000
176176
MAX_BLOBS_PER_BLOCK_FULU: 12
177177
MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS: 4096
178178

179-
# Whisk
180-
WHISK_EPOCHS_PER_SHUFFLING_PHASE: 4
181-
WHISK_PROPOSER_SELECTION_GAP: 1
179+
# EIP7441
180+
EPOCHS_PER_SHUFFLING_PHASE: 4
181+
PROPOSER_SELECTION_GAP: 1
182182

183183
# EIP7732
184184
MAX_REQUEST_PAYLOADS: 128
185+
186+
# EIP7805
187+
ATTESTATION_DEADLINE: 2
188+
PROPOSER_INCLUSION_LIST_CUT_OFF: 5
189+
VIEW_FREEZE_DEADLINE: 3
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
# Mainnet preset - Whisk
1+
# Mainnet preset - EIP7441
22

33
# Misc
44
# ---------------------------------------------------------------
55
# `uint64(4)`
66
CURDLEPROOFS_N_BLINDERS: 4
77
# `uint64(2**14)`
8-
WHISK_CANDIDATE_TRACKERS_COUNT: 16384
9-
# `uint64(2**13)` must be < WHISK_CANDIDATE_TRACKERS_COUNT
10-
WHISK_PROPOSER_TRACKERS_COUNT: 8192
8+
CANDIDATE_TRACKERS_COUNT: 16384
9+
# `uint64(2**13)` must be < CANDIDATE_TRACKERS_COUNT
10+
PROPOSER_TRACKERS_COUNT: 8192
1111
# `uint64(2**7 - CURDLEPROOFS_N_BLINDERS)`
12-
WHISK_VALIDATORS_PER_SHUFFLE: 124
12+
VALIDATORS_PER_SHUFFLE: 124
1313
# `uint64(2**15)` TODO: will be replaced by a fix format once there's a serialized format
14-
WHISK_MAX_SHUFFLE_PROOF_SIZE: 32768
14+
MAX_SHUFFLE_PROOF_SIZE: 32768
1515
# `uint64(2**10)` TODO: will be replaced by a fix format once there's a serialized format
16-
WHISK_MAX_OPENING_PROOF_SIZE: 1024
16+
MAX_OPENING_PROOF_SIZE: 1024
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1-
# Minimal preset - Whisk
1+
# Minimal preset - EIP7441
22

33
# Misc
44
# ---------------------------------------------------------------
55
# [customized]
66
CURDLEPROOFS_N_BLINDERS: 4
77
# [customized]
8-
WHISK_CANDIDATE_TRACKERS_COUNT: 32
8+
CANDIDATE_TRACKERS_COUNT: 32
99
# [customized]
10-
WHISK_PROPOSER_TRACKERS_COUNT: 16
10+
PROPOSER_TRACKERS_COUNT: 16
1111
# [customized]
12-
WHISK_VALIDATORS_PER_SHUFFLE: 4
12+
VALIDATORS_PER_SHUFFLE: 4
1313
# `uint64(2**15)` TODO: will be replaced by a fix format once there's a serialized format
14-
WHISK_MAX_SHUFFLE_PROOF_SIZE: 32768
14+
MAX_SHUFFLE_PROOF_SIZE: 32768
1515
# `uint64(2**10)` TODO: will be replaced by a fix format once there's a serialized format
16-
WHISK_MAX_OPENING_PROOF_SIZE: 1024
16+
MAX_OPENING_PROOF_SIZE: 1024

pysetup/constants.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
ELECTRA = 'electra'
88
FULU = 'fulu'
99
EIP6800 = 'eip6800'
10-
WHISK = 'whisk'
10+
EIP7441 = 'eip7441'
1111
EIP7732 = 'eip7732'
12+
EIP7805 = 'eip7805'
1213

1314

1415
# The helper functions that are used when defining constants

pysetup/helpers.py

+22-14
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def collect_prev_forks(fork: str) -> list[str]:
2525
def requires_mypy_type_ignore(value: str) -> bool:
2626
return (
2727
value.startswith(('ByteVector'))
28-
or (value.startswith(('Vector')) and 'floorlog2' in value)
28+
or (value.startswith(('Vector')) and any(k in value for k in ['ceillog2', 'floorlog2']))
2929
)
3030

3131

@@ -41,15 +41,19 @@ def objects_to_spec(preset_name: str,
4141
"""
4242
Given all the objects that constitute a spec, combine them into a single pyfile.
4343
"""
44-
new_type_definitions = (
45-
'\n\n'.join(
46-
[
47-
f"class {key}({value}):\n pass\n" if not requires_mypy_type_ignore(value)
48-
else f"class {key}({value}): # type: ignore\n pass\n"
49-
for key, value in spec_object.custom_types.items()
50-
]
44+
def gen_new_type_definitions(custom_types: Dict[str, str]) -> str:
45+
return (
46+
'\n\n'.join(
47+
[
48+
f"class {key}({value}):\n pass\n" if not requires_mypy_type_ignore(value)
49+
else f"class {key}({value}): # type: ignore\n pass\n"
50+
for key, value in custom_types.items()
51+
]
52+
)
5153
)
52-
)
54+
55+
new_type_definitions = gen_new_type_definitions(spec_object.custom_types)
56+
preset_dep_new_type_definitions = gen_new_type_definitions(spec_object.preset_dep_custom_types)
5357

5458
# Collect builders with the reversed previous forks
5559
# e.g. `[bellatrix, altair, phase0]` -> `[phase0, altair, bellatrix]`
@@ -115,7 +119,6 @@ def format_constant(name: str, vardef: VariableDefinition) -> str:
115119

116120
# Merge all constant objects
117121
hardcoded_ssz_dep_constants = reduce(lambda obj, builder: {**obj, **builder.hardcoded_ssz_dep_constants()}, builders, {})
118-
hardcoded_custom_type_dep_constants = reduce(lambda obj, builder: {**obj, **builder.hardcoded_custom_type_dep_constants(spec_object)}, builders, {})
119122
hardcoded_func_dep_presets = reduce(lambda obj, builder: {**obj, **builder.hardcoded_func_dep_presets(spec_object)}, builders, {})
120123
# Concatenate all strings
121124
imports = reduce(lambda txt, builder: (txt + "\n\n" + builder.imports(preset_name) ).strip("\n"), builders, "")
@@ -135,25 +138,26 @@ def format_constant(name: str, vardef: VariableDefinition) -> str:
135138
filtered_hardcoded_func_dep_presets = {k: v for k, v in hardcoded_func_dep_presets.items() if k not in deprecate_presets}
136139

137140
constant_vars_spec = '# Constant vars\n' + '\n'.join(format_constant(k, v) for k, v in spec_object.constant_vars.items())
141+
preset_dep_constant_vars_spec = '# Preset computed constants\n' + '\n'.join(format_constant(k, v) for k, v in spec_object.preset_dep_constant_vars.items())
138142
preset_vars_spec = '# Preset vars\n' + '\n'.join(format_constant(k, v) for k, v in spec_object.preset_vars.items())
139143
ordered_class_objects_spec = '\n\n\n'.join(ordered_class_objects.values())
140144
ssz_dep_constants = '\n'.join(map(lambda x: '%s = %s' % (x, hardcoded_ssz_dep_constants[x]), hardcoded_ssz_dep_constants))
141145
ssz_dep_constants_verification = '\n'.join(map(lambda x: 'assert %s == %s' % (x, spec_object.ssz_dep_constants[x]), filtered_ssz_dep_constants))
142-
custom_type_dep_constants = '\n'.join(map(lambda x: '%s = %s' % (x, hardcoded_custom_type_dep_constants[x]), hardcoded_custom_type_dep_constants))
143146
func_dep_presets_verification = '\n'.join(map(lambda x: 'assert %s == %s # noqa: E501' % (x, spec_object.func_dep_presets[x]), filtered_hardcoded_func_dep_presets))
144147
spec_strs = [
145148
imports,
146149
preparations,
147150
f"fork = \'{fork}\'\n",
148151
# The helper functions that some SSZ containers require. Need to be defined before `custom_type_dep_constants`
149152
CONSTANT_DEP_SUNDRY_CONSTANTS_FUNCTIONS,
150-
# The constants that some SSZ containers require. Need to be defined before `new_type_definitions`
151-
custom_type_dep_constants,
152153
# The constants that some SSZ containers require. Need to be defined before `constants_spec`
153154
ssz_dep_constants,
154155
new_type_definitions,
155156
constant_vars_spec,
157+
# The presets that some SSZ types require. Need to be defined before `preset_dep_new_type_definitions`
156158
preset_vars_spec,
159+
preset_dep_constant_vars_spec,
160+
preset_dep_new_type_definitions,
157161
config_spec,
158162
# Custom classes which are not required to be SSZ containers.
159163
classes,
@@ -194,7 +198,7 @@ def combine_dicts(old_dict: Dict[str, T], new_dict: Dict[str, T]) -> Dict[str, T
194198
'uint8', 'uint16', 'uint32', 'uint64', 'uint128', 'uint256',
195199
'bytes', 'byte', 'ByteList', 'ByteVector',
196200
'Dict', 'dict', 'field', 'ceillog2', 'floorlog2', 'Set',
197-
'Optional', 'Sequence',
201+
'Optional', 'Sequence', 'Tuple',
198202
]
199203

200204

@@ -237,7 +241,9 @@ def combine_spec_objects(spec0: SpecObject, spec1: SpecObject) -> SpecObject:
237241
protocols = combine_protocols(spec0.protocols, spec1.protocols)
238242
functions = combine_dicts(spec0.functions, spec1.functions)
239243
custom_types = combine_dicts(spec0.custom_types, spec1.custom_types)
244+
preset_dep_custom_types = combine_dicts(spec0.preset_dep_custom_types, spec1.preset_dep_custom_types)
240245
constant_vars = combine_dicts(spec0.constant_vars, spec1.constant_vars)
246+
preset_dep_constant_vars = combine_dicts(spec0.preset_dep_constant_vars, spec1.preset_dep_constant_vars)
241247
preset_vars = combine_dicts(spec0.preset_vars, spec1.preset_vars)
242248
config_vars = combine_dicts(spec0.config_vars, spec1.config_vars)
243249
ssz_dep_constants = combine_dicts(spec0.ssz_dep_constants, spec1.ssz_dep_constants)
@@ -248,7 +254,9 @@ def combine_spec_objects(spec0: SpecObject, spec1: SpecObject) -> SpecObject:
248254
functions=functions,
249255
protocols=protocols,
250256
custom_types=custom_types,
257+
preset_dep_custom_types=preset_dep_custom_types,
251258
constant_vars=constant_vars,
259+
preset_dep_constant_vars=preset_dep_constant_vars,
252260
preset_vars=preset_vars,
253261
config_vars=config_vars,
254262
ssz_dep_constants=ssz_dep_constants,

pysetup/md_doc_paths.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@
88
DENEB,
99
ELECTRA,
1010
FULU,
11-
WHISK,
1211
EIP6800,
12+
EIP7441,
1313
EIP7732,
14+
EIP7805,
1415
)
1516

1617

@@ -22,9 +23,10 @@
2223
DENEB: CAPELLA,
2324
ELECTRA: DENEB,
2425
FULU: ELECTRA,
25-
WHISK: CAPELLA,
2626
EIP6800: DENEB,
27+
EIP7441: CAPELLA,
2728
EIP7732: ELECTRA,
29+
EIP7805: ELECTRA,
2830
}
2931

3032
ALL_FORKS = list(PREVIOUS_FORK_OF.keys())

0 commit comments

Comments
 (0)