Skip to content

Conversation

hwwhww
Copy link
Contributor

@hwwhww hwwhww commented Sep 20, 2023

Issue

One of the pushbacks of #3433 implementation is that it introduces a new timing setting scheme while the CL specs and clients have used INTERVALS_PER_SLOT in several places.

Proposal

This PR is a refactoring to use #3433 style parameters in phase0, and getting rid of INTERVALS_PER_SLOT from the specs. The goal is to provide a more flexible time-setting scheme and eliminate the legacy technical debt.

Even if we don't add #3433 to Deneb, this refactoring can give us a foundation to change the duty times setting in the future forks. e.g., we can set new ATTESTATION_DUE_MS_ELECTRA in presets easily.

/cc @arnetheduck

TBD

  • Moving all new parameters to "Configurations" v.s. moving them + SECONDS_PER_SLOT to "Presets"
  • Parameter naming discussion

@hwwhww
Copy link
Contributor Author

hwwhww commented Sep 20, 2023

@tersec @tbenr

Is it a nice-to-have change to you?

@tbenr
Copy link
Contributor

tbenr commented Sep 20, 2023

Seems reasonable to me to introduce the params in presets, which allows to set the stage without touching configs. Clients are free to start implementing or wait until electra.

@rolfyone WDYT?

@arnetheduck
Copy link
Contributor

Oh, nice! great idea!

@tbenr
Copy link
Contributor

tbenr commented Sep 20, 2023

The only inconvenience is that those params must show up in the spec beacon API to be consumed by VCs, so it wont be super transparent.

(And technically they become mandatory from VC perspective, leading to potential interoperability issues)

@ppopth
Copy link
Member

ppopth commented Sep 21, 2023

I quite agree with this PR. It makes sense to also remove INTERVALS_PER_SLOT in all the previous hard forks and it also makes sense to put the *_DUE_MS in presets rather than configurations.

But I have a concern. I saw that SECONDS_PER_SLOT is a configuration rather than a preset. Those all the *_DUE_MS numbers depend on SECONDS_PER_SLOT but SECONDS_PER_SLOT is a configuration that depends on a specific network.

I guess this fact makes the *_DUE_MS numbers should be in the configurations instead?

However, personally I think all of them, including SECONDS_PER_SLOT, should be in the presets.

@mcdee
Copy link
Contributor

mcdee commented Sep 21, 2023

Not a massive fan of the new naming convention. Taking ATTESTATION_DUE_MS as an example: 4s into the slot isn't really when attestations are due, they are:

  • generated at the earliest of (4s, block arrival time)
  • propagated through the network
  • and ideally arrive before 8s into the slot (although some clients use them earlier)

As such, I'm not sure that the name reflects the reality. Although not perfect, perhaps using deadlines instead would be better e.g. BLOCK_RECEIPT_DEADLINE_MS set to 4000 may be clearer.

Separately, if this goes through then we need to consider downstream systems and their adoption of these changes. Specifically, I'm thinking of https://ethereum.github.io/beacon-APIs/#/Config/getSpec and the how this would impact the output. Although this isn't part of the spec itself, I would like to see all client teams to commit to providing both old-style and new-style configuration values during the Deneb period (i.e. from the Deneb hard fork up to the Electra hard fork) in this API to allow dependent systems time to cut over.

@rolfyone
Copy link
Contributor

Is the intent that all clients apply clock disparity to the values?

I think it's good. We had problems with the last constants moved because some clients didn't offer them and some clients had disruption, so coordination is probably worth having in rolling this out to reduce the possibility of more disruptions...

Probably mitigated by loading our preset values we ship with as 'defaults' I guess...

@ppopth
Copy link
Member

ppopth commented Sep 21, 2023

Not a massive fan of the new naming convention. Taking ATTESTATION_DUE_MS as an example: 4s into the slot isn't really when attestations are due

ATTESTATION_DUE_MS doesn't mean the due time that the attestation must arrive, but it means the time that the attestation must be generated, so 4s quite makes sense.

@mcdee
Copy link
Contributor

mcdee commented Sep 21, 2023

ATTESTATION_DUE_MS doesn't mean the due time that the attestation must arrive, but it means the time that the attestation must be generated, so 4s quite makes sense.

a) this is not correct if the block for the slot is imported earlier

b) your sentence shows that the _DUE_ part of the constant has implicit information around what is due (although even then I disagree with "must be generated" and instead would say "should start the generation process")

So I stand by my general point that using DUE is likely to be confusing to those coming fresh to the specs.

@casparschwa
Copy link
Member

casparschwa commented Sep 21, 2023

Not a massive fan of the new naming convention. Taking ATTESTATION_DUE_MS as an example: 4s into the slot isn't really when attestations are due, they are:

  • generated at the earliest of (4s, block arrival time)

As per the honest validator specs an attestation is to be released as soon as a valid block is heard, or at 4s, whichever occurs first. The intention of the honest specs, as currently written, is not to target a receival time, but a release time.

  • and ideally arrive before 8s into the slot (although some clients use them earlier)

The aggregation is to be released at 8s, so attestations not received until then will not be aggregated within that slot (assuming honest validator specs are followed).

As such, I'm not sure that the name reflects the reality. Although not perfect, perhaps using deadlines instead would be
better e.g. BLOCK_RECEIPT_DEADLINE_MS set to 4000 may be clearer.

In my understanding this really is not the intention of the honest validator spec. You want the block to be released at 0s, rather than received by 4s. Similarly, you want the attestations to be released at the latest at 4s, rather than received by 8s, because the aggregates are to be released at 8s and it takes time to aggregate...

This block release schedule is not strictly incentive compatible, as we model and show in our paper, but that is a separate discussion to be had in my opinion. The language around this topic is subtle, but important. While not strictly incentive compatible, I think we should not easily throw away the framing of that duties are due by some time.

Default client settings are powerful Schelling Points and we should not encourage optimizing for network latency (release consensus messages as late as possible while being early enough, as this is the rational strategy) through use of language here. Or at least this would require a larger discussion imo.

@hwwhww
Copy link
Contributor Author

hwwhww commented Sep 21, 2023

@ppopth

I quite agree with this PR. It makes sense to also remove INTERVALS_PER_SLOT in all the previous hard forks and it also makes sense to put the *_DUE_MS in presets rather than configurations.

But I have a concern. I saw that SECONDS_PER_SLOT is a configuration rather than a preset. Those all the *_DUE_MS numbers depend on SECONDS_PER_SLOT but SECONDS_PER_SLOT is a configuration that depends on a specific network.

I guess this fact makes the *_DUE_MS numbers should be in the configurations instead?

However, personally I think all of them, including SECONDS_PER_SLOT, should be in the presets.

Oh, good point! I agree that it makes more sense to put these new parameters with SECONDS_PER_SLOT. 👍

About Presets v.s. Configurations: one argument was that we could tune SECONDS_PER_SLOT to find the shorter block time if possible. e.g., when tuning PBS. Therefore, moving all timing parameters to Configurations may also make sense. We can still add *_DUE_MS_ELECTRA configuration. Moreover, it seems more potential disasters if we move SECONDS_PER_SLOT.

I now tend to move them to configurations. 😅

@arnetheduck
Copy link
Contributor

arnetheduck commented Sep 21, 2023

The other way to express this is to call it a BLOCK_TIMOUT_MS - this corresponds to what we want should happen: we wait for the block no longer than 4s but clients MUST send attestations as soon as they observe the block.

Ditto attestations, ie ATTESTATION_TIMEOUT_MS is the timeout when we stop aggregating things and send out the aggregate so far (but all attestations up to that point must be included, per other PR on this subject).

@ppopth
Copy link
Member

ppopth commented Sep 21, 2023

@mcdee @casparschwa We also had a serious discussion in the past on what 4s really means, i.e. whether it means the time that the attestation MUST or SHOULD be transmitted (or it should start the generation process). And we didn't have a conclusion.

Unfortunately, the spec doesn't describe it clearly.

@ppopth
Copy link
Member

ppopth commented Sep 21, 2023

Ditto attestations, ie ATTESTATION_TIMEOUT_MS is the timeout when we stop aggregating things and send out the aggregate so far (but all attestations up to that point must be included, per other PR on this subject).

Did you mean this PR #3472 ?

@mcdee
Copy link
Contributor

mcdee commented Sep 21, 2023

As per the honest validator specs an attestation is to be released as soon as a valid block is heard, or at 4s, whichever occurs first. The intention of the honest specs, as currently written, is not to target a receival time, but a release time.

I'm not sure what you mean by "released", that isn't a word used in the validator spec. And the specs target a time at which the various processes (block generation, attestation etc.) start, with the implicit assumption that they will complete within a given timeframe (or, if not, some sort of penalty applies for example the addition of proposer boost).

In my understanding this really is not the intention of the honest validator spec. You want the block to be released at 0s, rather than received by 4s.

Yes, but the point of the 4s mark at current is that it's the cutoff time by which validators give up on the idea of seeing a block for the slot and attest based on the existing head. It isn't a time at which anything is due, per say.

We also had a serious discussion in the past on what 4s really means, i.e. whether it means the time that the attestation MUST or SHOULD be transmitted (or it should start the generation process). And we didn't have a conclusion.

I'm not sure of which bit of the second paragraph at https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/validator.md#attesting is unclear, could you expand on this?

@ppopth
Copy link
Member

ppopth commented Sep 22, 2023

I'm not sure of which bit of the second paragraph at https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/validator.md#attesting is unclear, could you expand on this?

Alright this one has a "should" word. So never mind and sorry. I misremembered that. The discussion in the past I mentioned is on the 8s not on the 4s. It's not clear if the validator MUST or SHOULD broadcast their aggregate at 8s https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/validator.md#broadcast-aggregate

Fyi, Prysm people think that it's a MUST, so they start the aggregation process in advance and try to send the aggregate exactly at 8s (without any error).

@@ -104,8 +104,8 @@ def on_block(store: Store, signed_block: SignedBeaconBlock) -> None:

# Add block timeliness to the store
time_into_slot = (store.time - store.genesis_time) % SECONDS_PER_SLOT
is_before_attesting_interval = time_into_slot < SECONDS_PER_SLOT // INTERVALS_PER_SLOT
is_timely = get_current_slot(store) == block.slot and is_before_attesting_interval
is_before_late_block_cutoff = time_into_slot * 1000 < LATE_BLOCK_CUTOFF_MS
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if we're changing intervals to MS then it probably equally makes sense to be looking at time_into_slot_ms, maybe even millis_per_slot - maybe thats a bigger change than we'd want this PR though...

I'm not sure about the best name for LATE_BLOCK_CUTOFF_MS but its sounds a lot like late block reorg and we probably want to avoid that overlap given that's very different to whats happening here... maybe instead we should just be using ATTESTATION_DUE_MS here, and remove LATE_BLOCK_CUTOFF_MS.

@hwwhww
Copy link
Contributor Author

hwwhww commented May 13, 2025

re: preset v.s. config

@jacobkaufmann and co are working on a separate proposal to support fork-specific-SECONDS_PER_SLOT. If we consider that, it makes more sense to move the ATTESTATION_DUE_MS settings to config.

@rolfyone
Copy link
Contributor

@jacobkaufmann and co are working on a separate proposal to support fork-specific-SECONDS_PER_SLOT. If we consider that, it makes more sense to move the ATTESTATION_DUE_MS settings to config.

i do think that we're probably better off standardising on milliseconds if we're changing seconds per slot

@potuz
Copy link
Contributor

potuz commented Jun 13, 2025

After all the discussions at interop and for the lack of a better place to leave this comment I'll do it here. It would be good to eventually have in the spec a framework for these constants like ATTESTATIONS_DUE_MS_ELECTRA to be variable and not keep adding a new constant on every change. I envision that while the full structure of the slot may be scoped for a long time after Glamsterdam, the relative timings of all the different and new deadlines bound to be added to the spec (like FOCIL duties, merge views, etc) will be adjusted periodically and multiple times as the blob and gas limit increases. It would be good to have such a framework in the spec to reflect this fact.

jtraglia
jtraglia previously approved these changes Jun 27, 2025
@jtraglia
Copy link
Member

At ACDC we agreed to wait to merge this until v1.7.0-alpha.0 (for Glamsterdam). I'll follow up then.

@jtraglia jtraglia added the gloas label Jun 27, 2025
@potuz
Copy link
Contributor

potuz commented Jul 4, 2025

One minor issue I see with this PR is that currently to test shorter slots in Kurtosis you need to change just a single parameter which is the seconds per slot. With this PR you'd need to change many.

I kinda believe perhaps a better approach would be to have had a fixed denominator, say 10000, and then the deadlines expressed as percentages of the slot. So an attestation deadline of 10000 would be the size of the slot, one of 5000 would be half way etc. This way we keep milliseconds granularity and you only need to tweak one parameter which is the slot length on testing.

Slot length also should be modified to be in milliseconds I believe since we probably will move to fractional seconds slots

@jtraglia jtraglia changed the base branch from dev to master July 9, 2025 19:52
@jtraglia jtraglia dismissed their stale review July 9, 2025 19:52

The base branch was changed.

potuz added a commit to potuz/consensus-specs that referenced this pull request Jul 29, 2025
This is just a placeholder EIP to have the right data structure. This
change should entail changes in the following places but those can only
be made after rebasing on top of Fulu and ethereum#3510

- The honest validator guide should include two separate deadlines for
  the PTC, on payload available and data available.
- The honest validator guide should give instructions on how to set the
  new data available flag to true if the data was available at the last
deadline and set the payload available flag if the payload was available
at the first deadline
- Forkchoice should update `get_proposer_head` with the payload and data
  timeliness flags.
jtraglia pushed a commit that referenced this pull request Jul 30, 2025
This is just a placeholder EIP to have the right data structure. This
change should entail changes in the following places but those can only
be made after rebasing on top of Fulu and #3510

- The honest validator guide should include two separate deadlines for
the PTC, on payload available and data available.
- The honest validator guide should give instructions on how to set the
new data available flag to true if the data was available at the last
deadline and set the payload available flag if the payload was available
at the first deadline
- Forkchoice should update `get_proposer_head` with the payload and data
timeliness flags.
jtraglia added a commit that referenced this pull request Aug 11, 2025
This PR is an alternative to #3510.

* Deprecate `SECONDS_PER_SLOT` in favor of `SLOT_DURATION_MS`.
* Deprecate `INTERVALS_PER_SLOT` in favor of config vars in basis points.

Instead of presets in millisecond units, this PR defines slot component
durations (eg `ATTESTATION_DUE_BPS`) with config variables where the
unit is basis points (a common way to describe percentages). This will
make it easier to test different slot times and fine-tune slot component
durations. To test a different slot time, change `SLOT_DURATION_MS` and
the component times will automatically adjust since they are percentages
of `SLOT_DURATION_MS`.
@jtraglia
Copy link
Member

@jtraglia jtraglia closed this Aug 11, 2025
Rose2161 pushed a commit to Rose2161/consensus-specs that referenced this pull request Aug 18, 2025
* Fix a small bug in a pending consolidation test (#4217)

* Update fork trigger sections (#4208)

* Use consistent note style (#4224)

* Remove outdated paragraph about ExecutionPayloadV4 in electra (#4221)

* Add missing section headers to fulu spec (#4223)

* Replace some instances of "extended" with "modified" (#4225)

* Add Distributed Blob Publishing to Fulu networking spec (#4183)

* Add distributed blob publishing section to Fulu p2p interface spec.

# Conflicts:
#	specs/deneb/p2p-interface.md

* Apply suggestions from code review

Co-authored-by: Lion - dapplion <[email protected]>

* Apply suggestions from code review

Co-authored-by: Justin Traglia <[email protected]>
Co-authored-by: fradamt <[email protected]>

* Fix lint

* Fix lint.

* Add new line before list

* Clarify columns that clients must publish to in Distributed Publishing.

* add function to retrieve sidecars from both block and sidecar

* fix lint

* fix lint again

* fix tests

* Fix tests & nits

* Fix more nits

* Address review comment.

* clarify language

Co-authored-by: Alex Stokes <[email protected]>

---------

Co-authored-by: Lion - dapplion <[email protected]>
Co-authored-by: Justin Traglia <[email protected]>
Co-authored-by: fradamt <[email protected]>
Co-authored-by: fradamt <[email protected]>
Co-authored-by: Justin Traglia <[email protected]>
Co-authored-by: Alex Stokes <[email protected]>

* Use finalized state for Fulu validator custody (#4211)

In `get_validators_custody_requirement`, use the latest finalized state as `BeaconState` instead of the current beacon state.

* State that effective balance should be used (#4218)

* Bump version to v1.5.0-beta.4 (#4236)

* Round down value when setting validator's effective balance (#4229)

* Add full_pending_withdrawals_but_first_skipped_* tests (#4237)

* Add multiple_pending_deposits_same_pubkey_different_signature test (#4238)

* Add withdrawal_and_consolidation_effective_balance_updates test (#4239)

* Bump actions/setup-python from 5.4.0 to 5.5.0 in the actions group (#4242)

Bumps the actions group with 1 update: [actions/setup-python](https://github.com/actions/setup-python).


Updates `actions/setup-python` from 5.4.0 to 5.5.0
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/42375524e23c412d93fb67b49958b491fce71c38...8d9ed9ac5c53483de85588cdf95a591a75ab9f55)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 5.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump the actions group with 3 updates (#4241)

* Bump the actions group with 3 updates

Bumps the actions group with 3 updates: [setuptools](https://github.com/pypa/setuptools), [flake8](https://github.com/pycqa/flake8) and [mkdocs-material](https://github.com/squidfunk/mkdocs-material).


Updates `setuptools` from 78.0.2 to 78.1.0
- [Release notes](https://github.com/pypa/setuptools/releases)
- [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst)
- [Commits](https://github.com/pypa/setuptools/compare/v78.0.2...v78.1.0)

Updates `flake8` from 7.1.2 to 7.2.0
- [Commits](https://github.com/pycqa/flake8/compare/7.1.2...7.2.0)

Updates `mkdocs-material` from 9.6.9 to 9.6.10
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.6.9...9.6.10)

---
updated-dependencies:
- dependency-name: setuptools
  dependency-version: 78.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: flake8
  dependency-version: 7.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: mkdocs-material
  dependency-version: 9.6.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>

* Fix lint

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Justin Traglia <[email protected]>

* close outdated issues (#4231)

* Adds test that affects the proposer selection (#4230)

* Change in balance affects proposer selection

* move test to phase0

* lint imports

* improve comment

* brute force proposer change

* Remove helper function

---------

Co-authored-by: Justin Traglia <[email protected]>

* Use `mdformat` for markdown formatting (#4244)

* Replace skip footnote with html block

* Remove unnecessary duration columns

* Add mdformat to pyproject

* Start to use mdformat-toc

* Remove table of contents headers

* Fix empty header

* Finally, run mdformat

* Remove doctoc from CI

* Fix issue with eip7732

* Error if linter changes something in CI

* Use black for linting tests directory (#4245)

* Remove flake8 & run black on tests

* Run make lint

---------

Co-authored-by: Justin Traglia <[email protected]>

* Add two consolidation request processing edge case tests (#4246)

* Fix the full consolidation queue test (#4248)

* Bump the actions group with 3 updates (#4249)

Bumps the actions group with 3 updates: [marko](https://github.com/frostming/marko), [pytest-cov](https://github.com/pytest-dev/pytest-cov) and [mkdocs-material](https://github.com/squidfunk/mkdocs-material).


Updates `marko` from 2.1.2 to 2.1.3
- [Release notes](https://github.com/frostming/marko/releases)
- [Changelog](https://github.com/frostming/marko/blob/master/CHANGELOG.md)
- [Commits](https://github.com/frostming/marko/compare/v2.1.2...v2.1.3)

Updates `pytest-cov` from 6.0.0 to 6.1.1
- [Changelog](https://github.com/pytest-dev/pytest-cov/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-cov/compare/v6.0.0...v6.1.1)

Updates `mkdocs-material` from 9.6.10 to 9.6.11
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.6.10...9.6.11)

---
updated-dependencies:
- dependency-name: marko
  dependency-version: 2.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: pytest-cov
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: mkdocs-material
  dependency-version: 9.6.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Add EIP-7805 fork version/epoch to the configs (#4250)

* Update WS period computation for Electra (#4179)

* Add `withdrawal_requests_when_pending_withdrawal_queue_is_full` test (#4252)

* Clean up electra presets (#4254)

* feat: schedule electra for mainnet (#4258)

* Test consolidation with same source and target (#4259)

* Bump version to v1.5.0-beta.5 (#4260)

* Bump actions/setup-python from 5.4.0 to 5.5.0 in the actions group (#4242)

Bumps the actions group with 1 update: [actions/setup-python](https://github.com/actions/setup-python).


Updates `actions/setup-python` from 5.4.0 to 5.5.0
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/42375524e23c412d93fb67b49958b491fce71c38...8d9ed9ac5c53483de85588cdf95a591a75ab9f55)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 5.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump the actions group with 3 updates (#4241)

* Bump the actions group with 3 updates

Bumps the actions group with 3 updates: [setuptools](https://github.com/pypa/setuptools), [flake8](https://github.com/pycqa/flake8) and [mkdocs-material](https://github.com/squidfunk/mkdocs-material).


Updates `setuptools` from 78.0.2 to 78.1.0
- [Release notes](https://github.com/pypa/setuptools/releases)
- [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst)
- [Commits](https://github.com/pypa/setuptools/compare/v78.0.2...v78.1.0)

Updates `flake8` from 7.1.2 to 7.2.0
- [Commits](https://github.com/pycqa/flake8/compare/7.1.2...7.2.0)

Updates `mkdocs-material` from 9.6.9 to 9.6.10
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.6.9...9.6.10)

---
updated-dependencies:
- dependency-name: setuptools
  dependency-version: 78.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: flake8
  dependency-version: 7.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: mkdocs-material
  dependency-version: 9.6.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>

* Fix lint

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Justin Traglia <[email protected]>

* Adds test that affects the proposer selection (#4230)

* Change in balance affects proposer selection

* move test to phase0

* lint imports

* improve comment

* brute force proposer change

* Remove helper function

---------

Co-authored-by: Justin Traglia <[email protected]>

* Use `mdformat` for markdown formatting (#4244)

* Replace skip footnote with html block

* Remove unnecessary duration columns

* Add mdformat to pyproject

* Start to use mdformat-toc

* Remove table of contents headers

* Fix empty header

* Finally, run mdformat

* Remove doctoc from CI

* Fix issue with eip7732

* Error if linter changes something in CI

* Use black for linting tests directory (#4245)

* Remove flake8 & run black on tests

* Run make lint

---------

Co-authored-by: Justin Traglia <[email protected]>

* Add two consolidation request processing edge case tests (#4246)

* Fix the full consolidation queue test (#4248)

* Bump the actions group with 3 updates (#4249)

Bumps the actions group with 3 updates: [marko](https://github.com/frostming/marko), [pytest-cov](https://github.com/pytest-dev/pytest-cov) and [mkdocs-material](https://github.com/squidfunk/mkdocs-material).


Updates `marko` from 2.1.2 to 2.1.3
- [Release notes](https://github.com/frostming/marko/releases)
- [Changelog](https://github.com/frostming/marko/blob/master/CHANGELOG.md)
- [Commits](https://github.com/frostming/marko/compare/v2.1.2...v2.1.3)

Updates `pytest-cov` from 6.0.0 to 6.1.1
- [Changelog](https://github.com/pytest-dev/pytest-cov/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-cov/compare/v6.0.0...v6.1.1)

Updates `mkdocs-material` from 9.6.10 to 9.6.11
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.6.10...9.6.11)

---
updated-dependencies:
- dependency-name: marko
  dependency-version: 2.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: pytest-cov
  dependency-version: 6.1.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: mkdocs-material
  dependency-version: 9.6.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Add EIP-7805 fork version/epoch to the configs (#4250)

* Update WS period computation for Electra (#4179)

* Add `withdrawal_requests_when_pending_withdrawal_queue_is_full` test (#4252)

* Clean up electra presets (#4254)

* feat: schedule electra for mainnet (#4258)

* Test consolidation with same source and target (#4259)

* Bump version to v1.5.0-beta.5 (#4260)

* Cleanup presets and configs (#4256)

* Delete unnecessary blank lines

* Remove more unnecessary blank lines

* Use consistent title/order for rewards and penalties

* Add some units

* Various improvements

* Split up deneb presets appropriately

* Clean up fulu presets

* Fix nits

* Rename eip7732 preset files

* Remove deprecated presets

* Random config changes

* More configs cleanup

* Fix more phase0 stuff

* Various cleanups

* Go with Ben's year

* Fix eip7732 kzg commitment inclusion proof depth (#4264)

* Update inclusion proof depth for mainnet

* Disable two fork-choice tests for now

* Remove unused is_previous_epoch_justified function (#4269)

* Disable parallelism with make test if a test name is specified (#4270)

* Simplify specification tables in main readme (#4271)

* Do a major clean up of the main readme (#4272)

* Add various tests cases for electra (#4265)

* Bump the actions group with 2 updates (#4273)

* Allow skipping verification for blobs from EL (#4262)

* EIP7805: Use MAX_TRANSACTIONS_PER_PAYLOAD for InclusionList transactions size (#4220)

* Update config/preset files for EIP7805 (#4268)

* Add eip7805 presets

* Move params to presets

* Move IL committee domain to constant (#4276)

* Add workflow to run nightly mainnet tests (#4280)

* Fix bug in electra withdrawals processing (#4281)

* Fix a couple broken links (#4279)

* Bump the actions group with 3 updates (#4282)

Bumps the actions group with 3 updates: [setuptools](https://github.com/pypa/setuptools), [pathos](https://github.com/uqfoundation/pathos) and [mkdocs-material](https://github.com/squidfunk/mkdocs-material).


Updates `setuptools` from 78.1.0 to 79.0.0
- [Release notes](https://github.com/pypa/setuptools/releases)
- [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst)
- [Commits](https://github.com/pypa/setuptools/compare/v78.1.0...v79.0.0)

Updates `pathos` from 0.3.3 to 0.3.4
- [Release notes](https://github.com/uqfoundation/pathos/releases)
- [Commits](https://github.com/uqfoundation/pathos/compare/0.3.3...0.3.4)

Updates `mkdocs-material` from 9.6.11 to 9.6.12
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.6.11...9.6.12)

---
updated-dependencies:
- dependency-name: setuptools
  dependency-version: 79.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: pathos
  dependency-version: 0.3.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: mkdocs-material
  dependency-version: 9.6.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Improve DataColumnSidecarsByRoot request (#4284)

* Mark electra as stable (#4285)

* Fix some small, unrelated nits

* Remove electra work-in-progress notes

* Move electra to stable table

* Add two new custody group tests (#4290)

* Remove unnecessary sort in `compute_columns_for_custody_group` (#4289)

The output is already sorted, no need to sort it again.

* Bump actions/setup-python from 5.5.0 to 5.6.0 in the actions group (#4293)

Bumps the actions group with 1 update: [actions/setup-python](https://github.com/actions/setup-python).


Updates `actions/setup-python` from 5.5.0 to 5.6.0
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/8d9ed9ac5c53483de85588cdf95a591a75ab9f55...a26af69be951a213d495a4c3e4e4022e16d87065)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 5.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Bump setuptools from 79.0.0 to 80.0.0 in the actions group (#4292)

Bumps the actions group with 1 update: [setuptools](https://github.com/pypa/setuptools).


Updates `setuptools` from 79.0.0 to 80.0.0
- [Release notes](https://github.com/pypa/setuptools/releases)
- [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst)
- [Commits](https://github.com/pypa/setuptools/compare/v79.0.0...v80.0.0)

---
updated-dependencies:
- dependency-name: setuptools
  dependency-version: 80.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Make `*_REQUESTS_PER_PAYLOAD` the same for mainnet/minimal (#4291)

* Add ability to run generators for specific tests (#4288)

* Add test_case argument when running generator targets.
Add same argument to the general test generator.
Skip generating a test if test_case was provided and it does not match.

* Add fork-list and preset-list arguments when running generator targets.
Update case_list argument to --case-list, for consistenty with fork and preset names.
Have these list arguments actually support providing lists.

* Fix: Check correct variable for forks' print statement.
Add print statement for cases too.

* Update generator README for new arguments.

* Update README to include gen_all in the docs for the new filtering.

* Fix linting issues.

* Fix example indentation

---------

Co-authored-by: Justin Traglia <[email protected]>

* Remove deprecated testing infrastructure (#4294)

* deprecate custody game tests

* deprecate sharding tests

* add ignore to Makefile

* fix imports

* remove DAS phase

* remove sharding TODOs and mention

* create deprecated state functions for sharding

* linting changes

* remove deprecated tests

* remove other references

* Revert "add ignore to Makefile"

This reverts commit 5cc55f62643ca4a2d938714766f71aa3e8e5aa39.

* Update ELECTRA_FORK_EPOCH in fork.md

* Bump the actions group with 2 updates (#4299)

Bumps the actions group with 2 updates: [setuptools](https://github.com/pypa/setuptools) and [pylint](https://github.com/pylint-dev/pylint).


Updates `setuptools` from 80.0.0 to 80.3.1
- [Release notes](https://github.com/pypa/setuptools/releases)
- [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst)
- [Commits](https://github.com/pypa/setuptools/compare/v80.0.0...v80.3.1)

Updates `pylint` from 3.3.6 to 3.3.7
- [Release notes](https://github.com/pylint-dev/pylint/releases)
- [Commits](https://github.com/pylint-dev/pylint/compare/v3.3.6...v3.3.7)

---
updated-dependencies:
- dependency-name: setuptools
  dependency-version: 80.3.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: pylint
  dependency-version: 3.3.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Ensure presets/configs for yaml/spec match (#4297)

* Add checks to ensure presets/configs for yaml/spec match

* Simplify

* Clean up generator runner (#4301)

* Clean up generator runner

* Fix mistake

* Fix mistake when doing multiprocessing

* Refactor `kzg_7594` generator (#4296)

* Refactor `kzg_4844` generator (#4300)

* Fix two mistakes when refactoring the `kzg_4844` generator (#4302)

* Deprecate BlobSidecarsByRange/Root in Fulu (#4286)

* Bump version to v1.5.0 (#4303)

* Refactor bls generator (#4304)

* Improve generator UX (#4309)

* Refactor `gen_runner` (#4310)

* Fix typos in blob configuration comments for fulu presets (#4311)

* Introduce blob schedule (#4277)

* Bump the actions group with 2 updates (#4312)

* Clarification on custody sampling (#4251)

* Nits on custody sampling

* Update specs/fulu/das-core.md

Co-authored-by: fradamt <[email protected]>

* Update SAMPLES_PER_SLOT

* Not specifying the unit of samples

Co-authored-by: fradamt <[email protected]>

---------

Co-authored-by: fradamt <[email protected]>

* Simplify reference test generators (#4317)

* Fix assert in `run_get_committee_assignment` (#4315)

* Wrap lines at 80 characters in all markdown files

* Generate reference tests for EIP7732 & EIP7805 (#4319)

* Use latest version of uv when creating the venv (#4325)

* Fix link to das-core in fulu validator specs (#4324)

* Do import sorting with isort (#4327)

* Fix phase run decorator to skip EIP-7732 as intended (#4326)

* Update `isort` to `order_by_type = false` (#4328)

* Bump version to 1.6.0-alpha.0 (#4329)

* Add to epoch processing tests generation states before and after full epoch processing (#4155)

* State that reconstructed sidecars which are not custodied may be deleted (#4332)

* Clarify node behavior when validator custody changes (#4320)

* Bind inputs in ssz_generic reftests (#4333)

* Bump the actions group with 3 updates

Bumps the actions group with 3 updates: [pycryptodome](https://github.com/Legrandin/pycryptodome), [setuptools](https://github.com/pypa/setuptools) and [mkdocs-material](https://github.com/squidfunk/mkdocs-material).


Updates `pycryptodome` from 3.22.0 to 3.23.0
- [Release notes](https://github.com/Legrandin/pycryptodome/releases)
- [Changelog](https://github.com/Legrandin/pycryptodome/blob/master/Changelog.rst)
- [Commits](https://github.com/Legrandin/pycryptodome/compare/v3.22.0...v3.23.0)

Updates `setuptools` from 80.4.0 to 80.7.1
- [Release notes](https://github.com/pypa/setuptools/releases)
- [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst)
- [Commits](https://github.com/pypa/setuptools/compare/v80.4.0...v80.7.1)

Updates `mkdocs-material` from 9.6.13 to 9.6.14
- [Release notes](https://github.com/squidfunk/mkdocs-material/releases)
- [Changelog](https://github.com/squidfunk/mkdocs-material/blob/master/CHANGELOG)
- [Commits](https://github.com/squidfunk/mkdocs-material/compare/9.6.13...9.6.14)

---
updated-dependencies:
- dependency-name: pycryptodome
  dependency-version: 3.23.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: setuptools
  dependency-version: 80.7.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: mkdocs-material
  dependency-version: 9.6.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>

* Run linting on pysetup directory (#4335)

* Delete unnecessary eth2spec/eip7732/__init__.py file (#4336)

* Bump the actions group with 4 updates

Bumps the actions group with 4 updates: ruamel-yaml, [setuptools](https://github.com/pypa/setuptools), [pytest-xdist](https://github.com/pytest-dev/pytest-xdist) and [mdformat-gfm-alerts](https://github.com/kyleking/mdformat-gfm-alerts).


Updates `ruamel-yaml` from 0.18.10 to 0.18.11

Updates `setuptools` from 80.7.1 to 80.8.0
- [Release notes](https://github.com/pypa/setuptools/releases)
- [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst)
- [Commits](https://github.com/pypa/setuptools/compare/v80.7.1...v80.8.0)

Updates `pytest-xdist` from 3.6.1 to 3.7.0
- [Release notes](https://github.com/pytest-dev/pytest-xdist/releases)
- [Changelog](https://github.com/pytest-dev/pytest-xdist/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-xdist/compare/v3.6.1...v3.7.0)

Updates `mdformat-gfm-alerts` from 1.0.1 to 1.0.2
- [Release notes](https://github.com/kyleking/mdformat-gfm-alerts/releases)
- [Commits](https://github.com/kyleking/mdformat-gfm-alerts/compare/v1.0.1...v1.0.2)

---
updated-dependencies:
- dependency-name: ruamel-yaml
  dependency-version: 0.18.11
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: setuptools
  dependency-version: 80.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: pytest-xdist
  dependency-version: 3.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: mdformat-gfm-alerts
  dependency-version: 1.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>

* Allow custom arg parser in test generators (#4339)

* Markdown to SpecObject refactoring (#4330)

* Remove deneb/electra from blob schedule and default to electra limit (#4341)

* Set blob schedule to an empty list (#4342)

* Fix handling of multiple Python definitions in code blocks (#4344)

* Updated minimum python version to 3.10 (#4345)

Co-authored-by: Justin Traglia <[email protected]>

* Bump version to v1.6.0-alpha.1 (#4347)

* Update default shell to bail on error (#4349)

* Run linter on setup.py (#4348)

* Bump the actions group with 4 updates (#4355)

Bumps the actions group with 4 updates: ruamel-yaml, [setuptools](https://github.com/pypa/setuptools), [pytest](https://github.com/pytest-dev/pytest) and [mypy](https://github.com/python/mypy).


Updates `ruamel-yaml` from 0.18.11 to 0.18.12

Updates `setuptools` from 80.8.0 to 80.9.0
- [Release notes](https://github.com/pypa/setuptools/releases)
- [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst)
- [Commits](https://github.com/pypa/setuptools/compare/v80.8.0...v80.9.0)

Updates `pytest` from 8.3.5 to 8.4.0
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/8.3.5...8.4.0)

Updates `mypy` from 1.15.0 to 1.16.0
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.15.0...v1.16.0)

---
updated-dependencies:
- dependency-name: ruamel-yaml
  dependency-version: 0.18.12
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: setuptools
  dependency-version: 80.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: pytest
  dependency-version: 8.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: mypy
  dependency-version: 1.16.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Add repo input to reftest generator action (#4356)

* EIP-7917: Deterministic proposer lookahead (#4190)

* Validator custody: Increase only and optional dynamic backfill. (#4357)

* Replace black/pylint/isort with ruff (#4350)

* Delete unnecessary container comments (#4358)

* Run linter on code in markdown files (#4359)

* EIP-7917: Refactor return types from List to Vector (#4361)

* Increase mainnet tests timeout to 12 hours (#4362)

* Use python 3.13 in CI actions (#4363)

* Fix epoch processing tests for proposer lookahead (#4364)

* Alias new test to blocks handler (#4365)

* Fix a few things in setup.py (#4360)

* Detect errors in reference test generator action (#4366)

* Bump version to v1.6.0-alpha.2 (#4368)

* Suggest using getBlobsV2 to get blobs/proofs

* Use getPayloadV5

* Bump the actions group with 3 updates (#4372)

* Define requirements for the blob schedule (#4370)

* CGC: Update before Fulu (#4373)

* Modify fork digest to distinguish BPO forks + add entry to ENR (#4354)

* Introduce Status v2 with `earliest_available_slot` (#4374)

* Release v1.6.0-alpha.2 (#4367)

* Delete unnecessary container comments (#4358)

* Run linter on code in markdown files (#4359)

* EIP-7917: Refactor return types from List to Vector (#4361)

* Increase mainnet tests timeout to 12 hours (#4362)

* Use python 3.13 in CI actions (#4363)

* Fix epoch processing tests for proposer lookahead (#4364)

* Alias new test to blocks handler (#4365)

* Fix a few things in setup.py (#4360)

* Detect errors in reference test generator action (#4366)

* Bump version to v1.6.0-alpha.2 (#4368)

* Suggest using getBlobsV2 to get blobs/proofs

* Use getPayloadV5

* Bump the actions group with 3 updates (#4372)

* Define requirements for the blob schedule (#4370)

* CGC: Update before Fulu (#4373)

* Modify fork digest to distinguish BPO forks + add entry to ENR (#4354)

* Introduce Status v2 with `earliest_available_slot` (#4374)

---------

Co-authored-by: Lin Oshitani <[email protected]>
Co-authored-by: Leo Lara <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Manu NALEPA <[email protected]>
Co-authored-by: Alex Stokes <[email protected]>
Co-authored-by: raulk <[email protected]>

* Add fork version to compute fork digest test cases (#4376)

* Do not wrap long lines in `config.yaml` files (#4379)

Spec configs follow a YAML subset that does not involve linebreaks,
to avoid requiring client implementations to include a full YAML lib.

When Ruamel YAML was updated recently, the default settings changed and
certain tests started to emit `config.yaml` with linebreaks. By setting
Ruamel config `width` to a larger value, previous behaviour is restored.

* EIP-7917: Add test for proposer lookahead excluding exited validators

* Add more proposer lookahead tests

* Bump the actions group with 4 updates (#4385)

Bumps the actions group with 4 updates: [marko](https://github.com/frostming/marko), [py-ecc](https://github.com/ethereum/py_ecc), [pytest-cov](https://github.com/pytest-dev/pytest-cov) and [mypy](https://github.com/python/mypy).


Updates `marko` from 2.1.3 to 2.1.4
- [Release notes](https://github.com/frostming/marko/releases)
- [Changelog](https://github.com/frostming/marko/blob/master/CHANGELOG.md)
- [Commits](https://github.com/frostming/marko/compare/v2.1.3...v2.1.4)

Updates `py-ecc` from 7.0.1 to 8.0.0
- [Release notes](https://github.com/ethereum/py_ecc/releases)
- [Changelog](https://github.com/ethereum/py_ecc/blob/main/docs/release_notes.rst)
- [Commits](https://github.com/ethereum/py_ecc/compare/v7.0.1...v8.0.0)

Updates `pytest-cov` from 6.1.1 to 6.2.1
- [Changelog](https://github.com/pytest-dev/pytest-cov/blob/master/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest-cov/compare/v6.1.1...v6.2.1)

Updates `mypy` from 1.16.0 to 1.16.1
- [Changelog](https://github.com/python/mypy/blob/master/CHANGELOG.md)
- [Commits](https://github.com/python/mypy/compare/v1.16.0...v1.16.1)

---
updated-dependencies:
- dependency-name: marko
  dependency-version: 2.1.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: py-ecc
  dependency-version: 8.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: actions
- dependency-name: pytest-cov
  dependency-version: 6.2.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: mypy
  dependency-version: 1.16.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Fix yields in new proposer lookahead test (#4386)

* Add fork choice compliance test generator (#3831)

* Replace ast.unparse() with custom parsing (#4387)

* Combine helpers into compute_time_at_slot (#4388)

* Add execution_requests to fulu.GetPayloadResponse (#4389)

* Add jtraglia's spec viewer to the readme (#4392)

* Fix test_effective_decrease_balance_updates_lookahead reftest (#4395)

* Remove dead attestation generation code (#4396)

* Align master with dev after v1.6.0-alpha.2 release mistake (#4397)

* Delete unnecessary container comments (#4358)

* Run linter on code in markdown files (#4359)

* EIP-7917: Refactor return types from List to Vector (#4361)

* Increase mainnet tests timeout to 12 hours (#4362)

* Use python 3.13 in CI actions (#4363)

* Fix epoch processing tests for proposer lookahead (#4364)

* Alias new test to blocks handler (#4365)

* Fix a few things in setup.py (#4360)

* Detect errors in reference test generator action (#4366)

* Bump version to v1.6.0-alpha.2 (#4368)

* Suggest using getBlobsV2 to get blobs/proofs

* Use getPayloadV5

* Bump the actions group with 3 updates (#4372)

* Define requirements for the blob schedule (#4370)

* CGC: Update before Fulu (#4373)

* Modify fork digest to distinguish BPO forks + add entry to ENR (#4354)

* Introduce Status v2 with `earliest_available_slot` (#4374)

---------

Co-authored-by: Lin Oshitani <[email protected]>
Co-authored-by: Leo Lara <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Manu NALEPA <[email protected]>
Co-authored-by: Alex Stokes <[email protected]>
Co-authored-by: raulk <[email protected]>

* Use get_blob_parameters in gossip block validation

* Add nightly workflow to deal with stale issues/PRs

* Bump version to v1.6.0-alpha.3

* Bump the actions group with 2 updates (#4405)

* Bump the actions group with 2 updates

Bumps the actions group with 2 updates: [pytest](https://github.com/pytest-dev/pytest) and [ruff](https://github.com/astral-sh/ruff).


Updates `pytest` from 8.4.0 to 8.4.1
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pytest-dev/pytest/compare/8.4.0...8.4.1)

Updates `ruff` from 0.11.13 to 0.12.0
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.11.13...0.12.0)

---
updated-dependencies:
- dependency-name: pytest
  dependency-version: 8.4.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: ruff
  dependency-version: 0.12.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>

* Fix imports

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Justin Traglia <[email protected]>

* Correct the docstrings for `process_execution_payload` tests with blobs (#4408)

* Fix formatting for Capella preset (#4411)

* Add support for automated releases (#4409)

* Remove unnecessary config overrides in test (#4410)

* Remove peer sampling in Fulu (#4393)

* Add some clarifications around new ENR changes (#4406)

* Clarify peering expectations when `nfd` values are different (#4407)

* `DataColumnSidecarsByRoot`: Serve for finalized epochs. (#4394)

* Test proposer lookahead initialization uses active validator set at fork (#4413)

* Add PeerDAS tests (#4391)

* Update release documentation (#4416)

* Run mdformat on all markdown files (#4417)

* Convert DAS providers section to supernodes section (#4415)

* Fix sanity test steps in release action (#4418)

* Fix sanity test steps in release action (#4419)

* Remove blobs/proofs from new PeerDAS forkchoice tests (#4421)

* Increase release action timeout to 24 hours (#4423)

* In the release action, disable sanity checks & remove sudo (#4425)

* In the release action, add back sudo (#4428)

* Remove broken link from README (#4431)

In #4317 the test generators were moved and the README was deleted.

* Remove duplicate "the" words in comments (#4430)

Description: Fix duplicate word "the" in test comments for consolidation
process in test_process_consolidation_request.py.

* Add IL committee assignment and IL signature tests (#4435)

This PR adds EIP-7805 tests that are agnostic to the upcoming spec
changes.

`get_attester_head` is changed for the sake of spec tests. In the real
world, `on_block` is called before `get_attester_head`, guaranteeing the
existence of `head_block`. However, in spec tests, many of attestation
tests run attestation functions directly without calling `on_block`. The
gimmick of fetching `head_block` only when it's necessary avoids failure
in such cases.

* Remove empty sections and unify Protocols section name (#4436)

* Fix mutable default argument anti-pattern for Random objects (#4433)

For the previous release
([commit](https://github.com/ethereum/consensus-spec-tests/commit/0fd545b2ba739479082680e3d0683bf91f8164f8)),
I noticed that many of the test files were different. I found that we
were using `rng=Random(...)` in function declarations which will not
work like we want. The core issue is that default arguments are
evaluated once when the function is defined, not each time it's called.
So when we use `rng=Random(...)` in a function declaration, that same
`Random` object instance gets shared across all function calls,
accumulating state changes. For reference, see [Mutable Default
Arguments](https://docs.python-guide.org/writing/gotchas/#mutable-default-arguments).

I tested this by running the following multiple times, confirming that
the hash was the same each time:

```bash
rm -rf ../consensus-spec-tests
make reftests preset=minimal
find ../consensus-spec-tests -type f -exec sha256sum {} + | sort | sha256sum
```

To be clear, the next release's diff will be large, but the next next
release's diff will be small 😄

* Improve the release action (#4432)

* Add gloas section in preparation for that.
* Remove invalid `sort-by: number` configuration.
* Re-enable the two sanity tests (minimal & mainnet tests).
* Add a new version check to ensure tag matches the version file.

* Bump the actions group across 1 directory with 3 updates (#4434)

* Make updates to reflect default master branch (#4437)

* Update links to the `dev` branch.
* Set `master` as the default branch in workflows.
* Update release instructions to reflect change.

* Replace outdated instance of csc with cgc (#4444)

* Bump the actions group with 2 updates (#4442)

Bumps the actions group with 2 updates:
[mypy](https://github.com/python/mypy) and
[ruff](https://github.com/astral-sh/ruff).

* Fix broken links in markdown files (#4441)

* Resolve TODOs and Improve EIP-7805 (FOCIL) Spec (#4351)

This PR resolves TODOs and improves the honest validator section of
EIP-7805 spec. It contains minimal test changes and rest of tests will
be added by the subsequent PR.

* Move inclusion list specs to new `inclusion-list.md` file (#4446)

This PR adds `inclusion-list.md` as
[suggested](https://github.com/ethereum/consensus-specs/pull/4351#pullrequestreview-3023153485)
in the previous PR. `inclusion-list.md` encapsulates
`InclusionListStore` and inclusion list handling logic. Fork-choice
store interacts with IL store via functions defined in
`inclusion-list.md`, leveraging this abstraction.

This can be considered as adding another module that is responsible of
inclusion list. To represent some of the relationship between the
fork-choice module and others in a simple diagram, it would look like
this: [Beacon chain] — [Fork-choice] — [Inclusion list].

* Make commitment deduplication in `verify_cell_kzg_proof_batch` deterministic (#4447)

We found a small issue w.r.t. the deduplication of commitments in
`verify_cell_kzg_proof_batch`:

```python
    # Create the list of deduplicated commitments we are dealing with
    deduplicated_commitments = [
        bytes_to_kzg_commitment(commitment_bytes) for commitment_bytes in set(commitments_bytes)
    ]
```

In short, using `set` to remove the duplicates is wrong as sets are
unordered objects:

```python
>>> a = [1, 3, 2, 1]
>>> list(set(a))
[1, 2, 3]
```

Because of that, between runs, `deduplicated_commitments` will be
different and so `commitment_indices`. The issue here is that the
Fiat-Shamir challenge is computed by taking this arguments and hashing
them together:

```python
def verify_cell_kzg_proof_batch_impl(
    commitments: Sequence[KZGCommitment],
    commitment_indices: Sequence[CommitmentIndex],
    cell_indices: Sequence[CellIndex],
    cosets_evals: Sequence[CosetEvals],
    proofs: Sequence[KZGProof],
) -> bool:

    ...

    # Step 1: Compute a challenge r and its powers r^0, ..., r^{num_cells-1}
    r = compute_verify_cell_kzg_proof_batch_challenge(
        commitments, commitment_indices, cell_indices, cosets_evals, proofs
    )

   ...
```

so, if between runs they change due to the non-deterministic
deduplication, so does the challenge. This breaks Fiat-Shamir because if
the prover generates a challenge $c_i$ and the verifier generates $c_j$
so that $c_i != c_j$ for the same set of inputs $S$, then proofs won't
be able to be verified, even if "correct".

Right now this is not an issue as this is used in PeerDAS as an
optimization, not like the usual two-parties setup we find in ZK.
However, for correctness, this should be addressed, as the specs are
"formally" wrong as of now.

* Make several updates to EIP-7732 spec (#4438)

This PR updates EIP-7732 in several places. It should be read commit by
commit. The list of commits is as follows

- Add a Builder withdrawal prefix `0x03` which is a compounding
validator, allow any validator to self-build for a zero value, but only
0x03 validators to build for others.
- Remove all PTC reward logic and keep the beacon committee as pre-7732.
- Add slot to the execution payload envelope (makes implementation
easier)
- Remove the payload status enumeration and simply use a boolean in the
PTCAttestation object.
- Update the payment mechanism from a direct transfer of validator
balance to a withdrawal to a specific execution layer address (a fee
recipient).
- Use the attestation data index field to signal payload availability in
attestations.
- Fix all tests

This PR does not update the forkchoice logic, that will come on a
separate PR perhaps from @fradamt

* Align section headers in `fork-choice.md` for EIP-7805 (#4449)

* Add script to check for inconsistent fork comments (#4448)

This PR adds a script (and CI check with calls the script) which
identifies "fork comments" (the [New in Fork] and [Modified in Fork]
comments) and ensures the following consistencies:

* Fork comments with EIPs must not have a dash.
* Just the way we do things. I think it's to match the python constant,
which cannot have dashes.
* Fork comments must use one of the approved actions.
  * The two actions are "New" and "Modified"; "Updated" is not allowed.
* Fork comments must be on a standalone line; not inline comments.
* The reason this matters is because the linter will break long lines
which is very ugly.

* Fix `KZG_COMMITMENT_INCLUSION_PROOF_DEPTH_EIP7732` (#4451)

Got this error when generating test vectors last night. The mainnet
value was wrong.

```
Exception: invalid inputs length: 22, vector length is: 21
```

* Update EIP-7732 fork-choice (#4450)

This PR:
- Reverts the fork-choice to today's behavior in terms of boost
(proposer boost = 40, no other boosts), and by removing (block, slot)
voting
- Starting from today's fork-choice, it allows for decoupled beacon
block and payload by working on a tree of `ForkChoiceNode`s instead of
blocks.
- A `ForkChoiceNode` has `(root, payload_status)`, where
`payload_status` is either `PENDING`, `EMPTY` or `FULL`.
Pending is for the beacon block *before making a decision on the
payload*, the other two for the payload decision. As long as a `PENDING`
`ForkChoiceNode` is chosen by `get_head`, the corresponding beacon block
is part of the canonical chain, though the payload may or may not be
part of it.
- `FULL` and `EMPTY` are considered children of the `PENDING`
`ForkChoiceNode`, so all weight from the `EMPTY`
     and `FULL` variants is inherited by the `PENDING` variant.
- the `FULL` variant is only considered if the payload is locally
available (is imported in `store.execution_payload_states`, which
requires satisfying `is_data_available`)
- When running `get_head`, we alternate choosing between beacon blocks,
i.e., `PENDING` `ForkChoiceNode`s, and then making a a decision about
the `EMPTY` and `FULL` children of the current beacon block:
```
(B, PENDING)
├── (B, EMPTY)
└── (B, FULL)

(B, PENDING)
├─→ (B, EMPTY)
│     ├─→ (C, PENDING)
│     │     ├─→ (C, EMPTY)
│     │     └─→ (C, FULL)
│     └─→ (D, PENDING)
└X→ (B, FULL) (unavailable)
```
- Still,`get_head` remains nearly identical to today, by adding a
`get_fork_choice_children` function that substitutes the current
explicit choice of children of the current `head` and abstracts away the
alternating logic of choosing between empty/full payloads and actual
beacon blocks
- `LatestMessage`s are augmented with a `payload_present` boolean
recording the payload presence indicated by (the overloading of)
`data.index` (set to `data.index == 1`). This is useful when `data.slot
> block.slot`, when the attestation expresses an opinion on the
payload's presence, as it tells us whether to assign weight to the
`EMPTY` or `FULL` variant (which also trickles down to the `PENDING`
variant since they are children of it), whereas it is irrelevant when
`data.slot == block.slot` (and should always be set to `False` because
`data.index` can only be `0` then)
- `should_extend_payload` handles the remaining decision, about the
payload status of a block *from the previous slot*, when we don't have
any regular attestations *with information about the payload*. If the
payload is locally available, the `FULL` variant is chosen:
    - Whenever a majority of the PTC has voted for it
- If the current proposer has extended anything but the EMPTY variant
In other words, the next proposer is allowed to reorg the previous
payload only if it receives less than half of the PTC votes, and
otherwise we always default to FULL

---------

Co-authored-by: Justin Traglia <[email protected]>
Co-authored-by: Potuz <[email protected]>

* Clarify payload envelope construction in EIP-7732 (#4454)

- Add specification on constructing `slot` and `execution_requests` in
execution payload envelope
- Remove spec related to `payload_withheld`

---------

Co-authored-by: Justin Traglia <[email protected]>

* Add missing new/modified prefixes to eip7732 functions (#4455)

For consistency, we should state if these functions are new or modified.

* Fix duplicate function call (#4460)

This removes the duplicate calls to `process_withdrawals`
and `process_execution_payload_header`

* eip7732: add becoming builder section (#4456)

* In `get_custody_groups`, skip computation if all groups are custodied (#4459)

A simple optimization which doesn't change anything, but worth
mentioning because not all clients do this. For supernodes which custody
everything, we can skip computing the list of custody groups and return
the full range of groups. Given that there is quite a bit of hashing
involved, this isn't exactly free.

Thanks to @nalepae for suggesting this.

* eip7732: update self build condition (#4464)

For self builder (ie `builder_index == block.proposer_index`), the
amount should be zero otherwise builder prefix is required

* Store blob schedule as a VariableDefinition in the pyspec (#4469)

We forgot to store the blob schedule as a `VariableDefinition` here.
This didn't really affect anything internally, but it prevented this
config variable from being correctly parsed by outside tooling (eg the
consensus specifications viewer).

* Bump the actions group with 3 updates (#4471)

Bumps the actions group with 3 updates:
[ruff](https://github.com/astral-sh/ruff),
[rich](https://github.com/Textualize/rich) and
[mkdocs-material](https://github.com/squidfunk/mkdocs-material).

* eip7732: fix builder pending withdrawals processing (#4470)

I think `process_withdrawals` slice assignment logic is off:
```python
  state.builder_pending_withdrawals[:processed_builder_withdrawals_count] = [
      w
      for w in state.builder_pending_withdrawals[:processed_builder_withdrawals_count]
      if not is_builder_payment_withdrawable(state, w)
  ]
```
The left side creates a slice of exactly N items, but the filtered list
comprehension on the right could produce fewer items I think what should
have happened is `processed_builder_withdrawals_count` tracks how many
withdrawals were processed from the queue (regardless of success), and
we should remove exactly that many items from the front of the queue.
This is similar to how `processed_partial_withdrawals_count` work

* Fast test_full_attestations_one_validator_one_gwei (#4462)

Fixes https://github.com/ethereum/consensus-specs/issues/4318 

Now it takes seconds.

Before merging we need to consider:
 + With this version the one gwei validator is not the only validator.
+ As one gwei makes it less likely to be chosen for the committee, with
a different pseudo-random seed this test could fail.

The previous version would never fail because the one gwei validator was
the only one, so it was warrantied to be part of the committee. However,
the previous version could take arbitrary time depending on the
pseudo-random seed.

So this approach has its pros and cons with respect to previous version.

* eip7732: remove duplicate merge transition complete testing section (#4478)

* Update EIP-7732:  Add boolean to PayloadAttestationData (#4473)

This is just a placeholder EIP to have the right data structure. This
change should entail changes in the following places but those can only
be made after rebasing on top of Fulu and #3510

- The honest validator guide should include two separate deadlines for
the PTC, on payload available and data available.
- The honest validator guide should give instructions on how to set the
new data available flag to true if the data was available at the last
deadline and set the payload available flag if the payload was available
at the first deadline
- Forkchoice should update `get_proposer_head` with the payload and data
timeliness flags.

* Add EIP-7916 ProgressiveList specs and tests (#4445)

EIP-7916 defines a new SSZ type for lists of unknown length.

Historically, we used List[type, N] with very large N values for this:

- This wastes hashes, as log(N) hashes are still required even if only a
single item is present. This is especially bad when nesting lists.

- Generalized indices break, as is what happened when the Attestation
count got reduced in Electra, introducing maintenance burden to apps
that possibly involves security countil for upgrading smart contracts.

This PR adds specs and tests for EIP-7916 which fixes these issues,
making the new list type available to EIP implementations in _features.

- https://eips.ethereum.org/EIPS/eip-7916

* Improve some eip7732 p2p gossip validations (#4474)

* Simplify some statements.
* Move `header.builder_index` check before withdrawal creds check.
* Fix `header.value` check; clarify that it's excess balance &
`MIN_ACTIVATION_BALANCE` not `MIN_BUILDER_BALANCE`.
* Fix joined list item for `header.parent_block_root`.

* eip7732: add process execution payload header tests (#4457)

* eip7732: add process payload att tests (#4463)

This PR adds the following payload attestation tests
  - Valid basic attestations (payload present/not present)
  - Partial PTC participation
  - Invalid beacon block root/slot timing
  - Invalid signatures and edge cases

* eip7732: fix a typo in builder.md (#4483)

This PR fixes a typo `state.last_block_hash` to
`state.latest_block_hash`.

* eip7732: fix quorum calc to avoid double-counting (#4481)

* Use frozendict with list-of-records (#4486)

It was like this before but somehow got removed. When there's a
non-empty blob schedule, entries must be a frozendict so that it can be
hashed.

* Bump the actions group with 2 updates (#4487)

Bumps the actions group with 2 updates:
[mypy](https://github.com/python/mypy) and
[ruff](https://github.com/astral-sh/ruff).

* Make NUMBER_OF_COLUMNS a preset (#4485)

[As discussed on
discord](https://discord.com/channels/595666850260713488/1401858592264552501),
`NUMBER_OF_COLUMNS` should be a preset, not a configuration value. It's
technically an alias of `CELLS_PER_EXT_BLOB` (preset) which is used in
KZG libraries. I've also added the latter to the preset files as well so
that it is more clear that it's an alias.

* eip7805: remove unnecessary equivocation filter (#4492)

This PR removes unnecessary equivocation filter. The idea was to make
sure we don't include any ILs from equivocators but
`process_inclusion_list` already handles this requirement. (See L17 of
`process_inclusion_list`.)

* Add EIP-7916 ProgressiveBitlist specs and tests (#4480)

This follows up on #4445 to extend EIP-7916 support for bitlists, making
the `ProgressiveBitlist` type available to implementations in _features.

- https://eips.ethereum.org/EIPS/eip-7916

* eip7805: fix cutoff config typo (#4490)

This PR fixes cutoff config typo.

* Make PTC selection balance-weighted (#4488)

1. The first commit changes the sampling logic in `get_ptc` to be
balance weighted, for security reasons (see discord discussion starting
[here](https://discord.com/channels/595666850260713488/874767108809031740/1400916536197251082)).
Unlike for sync-committees and proposers, it doesn't use a new shuffle
to select candidate indices to which a balance-weighted acceptance
probability is applied. Instead, to minimize computational load, it just
reuses the existing committee shuffle, starting from the committees of
the PTC's `slot` and moving forward from there (wrapping around if
necessary).
2. The second commit refactors all functions that do balance weighted
sampling, through helpers `compute_balance_weighted_selection` and
`compute_balance_weighted_acceptance`:
- `compute_balance_weighted_acceptance` takes care of the
balance-weighted acceptance (whether a candidate index is accepted or
not, with probability proportional to its balance)
- `compute_balance_weighted_selection` takes care of the whole selection
process, going over the given `indices` and selecting them with
balance-weighted probability until the required number has been
selected. It has a parameter `shuffle_indices` which indicates whether
`indices` should be shuffled or not. This is `False` for the PTC, since
we are just reusing the existing shuffle
3. The other commits remove `state.latest_full_slot`, which is unused
after the introduction of `state.execution_payload_availability`, and
fixes a small mistake in `fork-choice.md`

If people think the refactor is unnecessary, we could just go with the
first commit. On the one end, the refactor might make it a bit more
annoying to change the selection logic for just some of these in the
future. On the other hand, there is currently a lot of code duplication
and lack of readability, and `get_ptc` is in particular quite hard to
understand because there's a lot going on in it.

Another option could be a smaller refactor with just
`compute_balance_weighted_acceptance`, which should be much less likely
to be customized by different selection processes (whereas
`compute_balance_weighted_selection` already has some customization with
`shuffle_indices`, and there's other possibilities like fixed size or
not)

* Bump version to v1.6.0-alpha.4 (#4494)

* Disable payload attestation tests on mainnet (#4495)

These are currently broken. Will disable on mainnet for now, so I can
make a release.

* eip7732: do not deduplicate `indexed_payload_attestations` (#4496)

`attesting_indices` for a payload attestation should be able to contain
duplicate indices if the PTC does (which it can, as of #4488), to verify
an aggregate signature/pubkey that contains some signature/pubkey
multiple times. This is also the behavior for sync committees, as
opposed to including a single signature/pubkey even for duplicate
indices, and having to deal with duplication more explicitly (e.g.
`aggregation_bits` could be less than `PTC_SIZE`, counting would have to
be with multiplicity).

Tests are fixed by making `prepare_signed_payload_attestation` deal with
duplicates in `attesting_indices` when setting `aggregation_bits`, by
enforcing 1 index = 1 bit set (if a validator index appears `n` times in
the PTC but only `m < n` in `attesting_indices`, only `m` bits are set)

* Replace INTERVALS_PER_SLOT with explicit slot component times (#4476)

This PR is an alternative to #3510.

* Deprecate `SECONDS_PER_SLOT` in favor of `SLOT_DURATION_MS`.
* Deprecate `INTERVALS_PER_SLOT` in favor of config vars in basis points.

Instead of presets in millisecond units, this PR defines slot component
durations (eg `ATTESTATION_DUE_BPS`) with config variables where the
unit is basis points (a common way to describe percentages). This will
make it easier to test different slot times and fine-tune slot component
durations. To test a different slot time, change `SLOT_DURATION_MS` and
the component times will automatically adjust since they are percentages
of `SLOT_DURATION_MS`.

* Organize configuration sections & add missing comments (#4497)

* `MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA` &
`MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT` should have been in the
validator cycle section.
* There should have been a deneb section for
`MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT`.
* The comment for `ATTESTATION_SUBNET_COUNT` was wrong.
* Add missing comments for newer upgrades (including Fulu).

* Remove time conversion comments from configs/presets (#4498)

Now that we're considering changing the slot duration (EIP7782), we
should remove time conversion comments (eg 256 epochs is ~27 hours) so
these aren't misleading. My other changes are little nits, mostly for
consistency.

* Bump the actions group with 3 updates (#4499)

Bumps the actions group with 3 updates:
[marko](https://github.com/frostming/marko),
[deepdiff](https://github.com/seperman/deepdiff) and
[ruff](https://github.com/astral-sh/ruff).

* eip7732: use correct late block cutoff time in proposer boost tests (#4501)

These three tests were failing under the mainnet preset. The issue is
that we were using `ATTESTATION_DUE_BPS` instead of
`ATTESTATION_DUE_BPS_EIP7732` in eip7732.

* eip7805: rebase spec onto fulu (#4502)

This PR sets EIP7805's previous fork to Fulu & makes other necessary
changes.

PS: It also makes the `is_data_available` comment consistent across all
specs.

* eip7805: make variable name more coherent (#4505)

* eip7732: rebase spec onto fulu (#4503)

This PR rebases eip7732 specs from electra to fulu.

It also fixes a few small inconsistencies I noticed while reviewing.

Mainnet tests pass too:

<img width="916" height="354" alt="image"
src="https://github.com/user-attachments/assets/7479ae8f-a0a5-450b-9ce1-a65f6bcbe254"
/>

* eip7732: add tests for builder pending payments processing (#4475)

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Justin Traglia <[email protected]>
Co-authored-by: Gabriel Astieres <[email protected]>
Co-authored-by: Jimmy Chen <[email protected]>
Co-authored-by: Lion - dapplion <[email protected]>
Co-authored-by: fradamt <[email protected]>
Co-authored-by: fradamt <[email protected]>
Co-authored-by: Justin Traglia <[email protected]>
Co-authored-by: Alex Stokes <[email protected]>
Co-authored-by: Manu NALEPA <[email protected]>
Co-authored-by: NC <[email protected]>
Co-authored-by: Tyler <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: JihoonSong <[email protected]>
Co-authored-by: Mikhail Kalinin <[email protected]>
Co-authored-by: Barnabas Busa <[email protected]>
Co-authored-by: Ben Edgington <[email protected]>
Co-authored-by: Derek Guenther <[email protected]>
Co-authored-by: Mehdi AOUADI <[email protected]>
Co-authored-by: Cypher Pepe <[email protected]>
Co-authored-by: Michel Simonot <[email protected]>
Co-authored-by: Wenceslas Sanchez <[email protected]>
Co-authored-by: SunnysidedJ <[email protected]>
Co-authored-by: Leo Lara <[email protected]>
Co-authored-by: Pop Chunhapanya <[email protected]>
Co-authored-by: Alex Vlasov <[email protected]>
Co-authored-by: Lin Oshitani <[email protected]>
Co-authored-by: raulk <[email protected]>
Co-authored-by: Etan Kissling <[email protected]>
Co-authored-by: Agnish Ghosh <[email protected]>
Co-authored-by: Potuz <[email protected]>
Co-authored-by: CrazyFrog <[email protected]>
Co-authored-by: kilavvy <[email protected]>
Co-authored-by: nethoxa <[email protected]>
Co-authored-by: Toni Wahrstätter <[email protected]>
Co-authored-by: terence <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants