feat(buildoor): auto-add payload-attributes flag to first participant - #1429
Merged
Conversation
When mev_type is buildoor, the builder connects directly to the first participant's beacon node and relies on its payload_attributes SSE stream to trigger block building. Beacon nodes only emit these events for slots they propose unless explicitly told to build a payload on every slot. Automatically add the relevant flag to the first participant's CL: - lodestar: --emitPayloadAttributes=true - prysm: --prepare-all-payloads - lighthouse: --always-prepare-payload teku, nimbus, grandine and consensoor have no equivalent flag, so fail fast with a clear message when one of them is the first participant.
grandine builds a payload on every slot with --features=AlwaysPrepareExecutionPayload, so wire it up and drop it from the fail list (teku, nimbus and consensoor still have no such flag).
consensoor now emits payload_attributes on every slot natively (ethpandaops/consensoor#8), so it needs no extra flag — drop it from the fail list. teku and nimbus still have no way to and still fail fast.
consensoor now gates payload_attributes emission behind a flag, so pass --emit-payload-attributes when it's the first participant rather than relying on it being on by default.
pk910
approved these changes
Jun 19, 2026
barnabasbusa
added a commit
that referenced
this pull request
Jun 19, 2026
Follow-up to #1429. teku can emit `payload_attributes` on every slot via `-Xfork-choice-updated-always-send-payload-attributes`, so it can serve as buildoor's first participant. Wire up the flag and drop teku from the fail list. ## Changes `enrich_mev_extra_params` (`src/package_io/input_parser.star`), gated on `mev_type == buildoor` and `index == 0`: | CL | Flag added | |---|---| | lodestar | `--emitPayloadAttributes=true` | | prysm | `--prepare-all-payloads` | | lighthouse | `--always-prepare-payload` | | grandine | `--features=AlwaysPrepareExecutionPayload` | | consensoor | `--emit-payload-attributes` | | **teku** | **`-Xfork-choice-updated-always-send-payload-attributes=true`** | | nimbus | fail fast (no equivalent flag) | Only **nimbus** is left unsupported. ## Testing `kurtosis run --dry-run`: - teku + buildoor → parses and runs end-to-end (exit 0). - nimbus + buildoor → fails with the intended error message.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
When
mev_type: buildooris set, automatically add the "build a payload on every slot" flag to the first participant's consensus client.Why
Buildoor connects directly to the first participant's beacon node (
all_cl_contexts[0]) and subscribes to its/eth/v1/events?topics=payload_attributesSSE stream to know when to start building. Beacon nodes only emit these events for slots they propose unless explicitly told to always prepare a payload — so without this flag buildoor wouldn't reliably trigger block building. Previously this flag had to be added manually viacl_extra_params.Changes
In
enrich_mev_extra_params(src/package_io/input_parser.star), gated onmev_type == buildoorandindex == 0:--emitPayloadAttributes=true--prepare-all-payloads--always-prepare-payload--features=AlwaysPrepareExecutionPayloadteku,nimbusandconsensoorhave no equivalent flag, so the parser now fails fast with a clear message naming the offending client when one of them is the first participant.Testing
kurtosis run --dry-runconfirmed: