Skip to content

feat(buildoor): auto-add payload-attributes flag to first participant - #1429

Merged
barnabasbusa merged 5 commits into
mainfrom
feat/buildoor-auto-payload-attributes
Jun 19, 2026
Merged

feat(buildoor): auto-add payload-attributes flag to first participant#1429
barnabasbusa merged 5 commits into
mainfrom
feat/buildoor-auto-payload-attributes

Conversation

@barnabasbusa

@barnabasbusa barnabasbusa commented Jun 19, 2026

Copy link
Copy Markdown
Collaborator

What

When mev_type: buildoor is 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_attributes SSE 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 via cl_extra_params.

Changes

In 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

teku, nimbus and consensoor have 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.

Notes:

  • The lighthouse flag is --always-prepare-payload (singular); it requires --suggested-fee-recipient, which the beacon node already sets when an EL is attached (lighthouse_launcher.star).
  • consensoor support is being added separately (it needs to emit the payload_attributes SSE event first).

Testing

kurtosis run --dry-run confirmed:

  • lodestar + buildoor → parses and runs end-to-end (exit 0).
  • grandine + buildoor → parses and runs end-to-end (exit 0).
  • teku + buildoor → fails with the intended error message.

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.
@barnabasbusa
barnabasbusa merged commit 12da7b4 into main Jun 19, 2026
17 checks passed
@barnabasbusa
barnabasbusa deleted the feat/buildoor-auto-payload-attributes branch June 19, 2026 12:47
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants