Skip to content

Serve real Gloas bids and envelopes from the auctioneer's existing submissions - #515

Open
0w3n-d wants to merge 1 commit into
od/gloas-step5-gloas-payload-typesfrom
od/gloas-step6-real-bid-and-envelope
Open

Serve real Gloas bids and envelopes from the auctioneer's existing submissions#515
0w3n-d wants to merge 1 commit into
od/gloas-step5-gloas-payload-typesfrom
od/gloas-step6-real-bid-and-envelope

Conversation

@0w3n-d

@0w3n-d 0w3n-d commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

Issue: #489 (step 6 of 6, per the reordering in #514)

What this PR does

  • getExecutionPayloadBid now builds and signs a real SignedExecutionPayloadBid:
    it reads the winning submission out of ctx.payloads/bid_sorter (the same
    map get_header already reads), converts it via the prior step's
    to_lighthouse_gloas_payload/execution_requests_to_gloas, and signs under
    helix's own configured GloasBuilderIdentity -- no longer a permanent
    NoBidPrepared stub.
  • submitSignedBeaconBlock's GloasPayloadStore/NoHeldPayloads placeholder is
    replaced by a real auctioneer round trip (Event::TakeHeldGloasPayload) that
    looks up the same payload by block hash and converts it for envelope
    construction.
  • GloasBuilderIdentity is now constructed once in main.rs (from
    config.gloas_builder_index + the relay's signing keypair) and shared
    between the proposer API and the auctioneer, instead of being built
    separately inside ProposerApi::new.
  • execution_payment is set equal to value (no payment-split product need
    yet -- see the resolved design note added to Gloas (ePBS) builder-API support #489).

What this PR deliberately does NOT do

  • Does not enforce submitBuilderPreferences's max_execution_payment against
    the served bid -- still a known follow-up, unrelated to this step.
  • Does not add a new builder-facing HTTP endpoint -- external builders keep
    submitting via the existing submit_block pipeline exactly as before; this
    PR only changes what happens to the winning submission when Gloas serves it.

Tests

Written before implementation, per this repo's workflow:

  • check_execution_payload_bid_liveness keeps its 4 existing liveness tests
    (last one updated to expect Ok(()) now that a real bid follows).
  • New build_signed_bid test: constructs a PayloadEntry, builds+signs a bid,
    checks every field maps from the entry/params/identity correctly, and
    verifies the BLS signature against the configured identity.
  • construct_signed_envelope's 5 existing tests updated for the new
    Option<HeldGloasPayload> signature (same coverage, same assertions).

Reviewer checklist

  • CI (lint, unit-test) is green
  • This PR matches the step it claims to be (see linked issue)
  • Nothing surprising: no unexplained scope creep, no unrelated files
    touched, no obviously-wrong code the tests happen not to cover

…bmissions

getExecutionPayloadBid now reads the winning submission out of the same
bid-sorter/payloads map get_header already reads, converts it via the
prior step's Gloas conversion functions, and signs a real
SignedExecutionPayloadBid under helix's own configured builder identity.

submitSignedBeaconBlock's GloasPayloadStore placeholder is replaced by a
real auctioneer round trip (Event::TakeHeldGloasPayload) that looks up
the same payload by block hash and converts it for envelope
construction. GloasBuilderIdentity is now constructed once in main.rs
and shared between the proposer API and the auctioneer.

execution_payment is set equal to value (no payment-split product need
yet, per #489).
@0w3n-d 0w3n-d mentioned this pull request Aug 25, 2026
7 tasks
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.

1 participant