Commit d02c7c3
authored
feat: Glamsterdam (gloas) support — fork registry, ePBS slot phases, payload lifecycle (#444)
* feat(forks): recognise gloas and derive slot phases per fork
The fork registry carried a misspelled 'glaos' placeholder while networks
already serve forks.consensus.gloas, so every fork-aware surface crashed on
glamsterdam devnets (FORK_METADATA lookup returned undefined). Renames the
placeholder to gloas with real Glamsterdam metadata (EIP-7732 ePBS +
EIP-7805 FOCIL, execution fork amsterdam), gives ForkLabel a fallback so
unknown future fork names degrade to a plain label instead of a crash, and
adds isForkAtOrAfter so fork gates stop being string-equality checks that
new forks silently miss (BlobDataColumnSpreadChart only matched fulu).
Slot phases are now specified once per fork in basis points of the slot
duration, mirroring the consensus config deadlines: pre-gloas keeps
block/attestation/aggregation at 33/67%, gloas uses the ePBS structure
(attestation 25%, aggregate 50%, payload reveal + PTC due 75%).
getSlotPhases(fork) drives the live view phase bar.
* chore(api): regenerate client with gloas ePBS tables
Generated from a local cbt-api running the xatu-cbt gloas models
(fct_block_payload_first_seen_by_node, fct_block_payload_available_by_node,
fct_block_payload_ptc_vote[_head], fct_block_payload_bid,
fct_payload_bid_highest_value_by_builder_chunked_50ms).
* feat(slots): ePBS payload lifecycle card on slot detail
Gloas slots get a Payload card showing the winning builder bid, when
sentries first saw the revealed envelope, when payload+blobs verified
locally, and the PTC verdict. derivePayloadStatus classifies the slot
(payload delivered / late / withheld) from PTC majority with sentry
sightings breaking the late-vs-withheld tie; self-builds are detected by
builder index == proposer index. Renders nothing before gloas.
* feat(slots): move ePBS payload lifecycle into its own tab with the bid race
The payload card sat above the tab strip on every gloas slot, crowding the
page. Gloas slots now get a dedicated Payload tab (hidden pre-gloas)
holding the lifecycle summary and a Builder Bid Race chart — the
fct_payload_bid_highest_value_by_builder_chunked_50ms series rendered
through MevBiddingTimelineChart, whose title, anchor and y-axis label are
now props so it serves both the relay-era and ePBS auctions.
* feat(live): ePBS payload and bid race in the slot HUD
On gloas networks the HUD swaps its relay-era MEV and Auction sections for
the payload lifecycle: the Auction lane streams the on-chain builder bid
race (bid count, distinct builders, best bid, first-bid time — negative
when bids beat the slot start), and a Payload section shows envelope reveal
timing across sentries, the revealing builder, and PTC votes with a
delivered/late/withheld chip driven by derivePayloadStatus. Payload rows
fade in as the replay clock crosses the envelope arrival; auction data
shows immediately since bidding precedes the slot.
* fix(live): clamp playhead to bounds intersection and poll near-head slots
The playhead derived maxSlot from maxOfMaxes, so the fastest-moving table
could drag playback into slots the slower tables had no data for. Use
minOfMaxes — the newest slot every table has landed.
Per-slot queries also fetched once at slot start and cached for 60s, baking
whatever partial state the pipeline had (one node on the map, a lone
attestation chunk) into the whole replay. Slots younger than 48s now poll
every 5s until settled, then keep the cache-forever behaviour.
* feat(live): PTC arrival stream and payload propagation wave
The second attestation type gloas introduces — PTC payload attestations —
now renders as its own arrivals chart under the committee attestation
chart, fed by the new fct_payload_attestation_first_seen_chunked_50ms
table and revealed progressively with the replay clock like everything
else. Payload envelope sightings also join the map as a second
purple-tinted wave, so the payload visibly washes over the sentry network
after the block does. API client regenerated with the new endpoint.
* feat(live): merge PTC stream into the arrivals chart and sidebar timeline
The stacked mini-chart treatment for PTC payload attestations was cramped
and unreadable. Both vote streams now share one MultiLine chart with a
legend; the PTC series appears once votes actually exist, so pre-gloas
networks and the first seconds of a slot stay single-series.
The sidebar timeline gains the gloas events it was missing: payload
envelope sightings (grouped by city like blocks) and PTC vote arrivals.
Devnet sentries all sit in one datacenter city, which the sidebar rendered
as a single anonymous Block row — city rows now carry their node count so
one location no longer reads as one node.
* fix(live): cap how far one lagging table holds playback behind head
Pure minOfMaxes froze the playhead entirely when a single table's bounds
trailed by minutes. Prefer the intersection but never fall more than three
slots behind the freshest table — near-head slots poll and backfill as the
lagging table lands.
* feat(live): per-node block and payload rows in the sidebar timeline
City aggregation collapsed every sentry in a datacenter into one anonymous
row, which on devnets meant the whole fleet read as a single node. Block
and payload sightings are now one row per node with the city as secondary
text, on every network.
* fix(live): location-first labels on per-node sidebar rows
Per-node rows kept, but the visible label is the node's location, matching
the established mainnet rendering; the node id rides along muted.
* fix(live): keep per-node sidebar rows inside the row width
Node ids repeated the network name and nothing in the row could shrink, so
content ran off the page. The network prefix is stripped, the location
stays visible, and the node id truncates with the full value on hover.
* fix(live): render sidebar rows exactly as master does
Back to the city-grouped location rows master ships. The only sidebar
changes left are additive: payload envelope rows in the identical shape,
and PTC vote rows in the attestation-row shape.
* fix(forks): drop the FOCIL claim from gloas metadata
EIP-7805 is not part of Glamsterdam — ePBS took the consensus headliner
slot. A few leftover inclusion-list constants in the devnet config presets
misled the description; the devnets expose no inclusion-list surface.
* feat(slots): real gloas execution data and payload verdicts in the list
The Execution tab rendered zero-filled values on gloas slots because the
beacon block no longer carries the payload. Payload facts from the new
fct_block_payload table (bid commitment joined with envelope contents)
overlay the block's execution columns, and fields that genuinely no longer
exist CL-side (gas used, base fee, block number) are hidden rather than
shown as zeros.
The slots list gains a Payload column on gloas networks: the PTC's verdict
per slot, Delivered or Absent, with the vote tally on hover.
* fix(live): show only real execution facts in the gloas HUD lane
The CL block carries no payload post-gloas, so txns/gas/base/block arrive
zero-filled at the head. The Execution lane now shows just the blob count
on gloas networks instead of misleading zeros.
* fix(slots): accept PTC votes as block evidence in payload status
The proposer pipeline lags the head, so requiring it before judging the
payload left slots showing Awaiting data despite a full PTC verdict. Votes
and envelope sightings are themselves proof a block existed.
* feat(slots): cap the bid race chart at the top ten builders
One series per builder stops scaling long before the on-chain auction
does. The ten strongest bidders by peak value keep individual series and
the remainder collapses into a single field series carrying the best
remaining bid per chunk, so hundreds of builders render as eleven lines
and the fetch stays within one page.
* feat(slots): drive the bid race from the auction frontier
The frontier table bounds chart data by the 50ms grid regardless of
builder count: the ten strongest bidders keep individual series, the
frontier renders as the best-bid line when builders were cut from the top
list, and if the by_builder fetch ever truncates the chart degrades to the
frontier alone instead of silently lying.
* feat(slots): payload propagation and PTC arrivals on the Payload tab
Parity with the live view: envelope propagation across sentries reuses
BlockPropagationChart and PTC vote arrivals reuse AttestationArrivalsChart,
both parameterized for title and anchor so the components serve either
stream. The payload data hook also exposes raw PTC chunks.
* fix(slots): apply title prop on all arrivals chart render paths
* feat(overview): payload delivery rate chart
Hourly PTC-judged delivery outcomes from fct_block_payload_status_hourly,
reusing the proposal-status chart shape (same record structure). Self-gates
by data presence, so pre-gloas networks never show it.
* feat(slots): payload reveal and PTC vote lanes in the timeline waterfall
The trace timeline gains the two gloas phases it was missing: an envelope
reveal span covering first-to-last sighting across sentries and a PTC vote
span covering the vote arrival window, both fed by the payload data hook
and only present post-gloas.
* test(live): include intersection aggregates in bounds mock
The playhead now reads minOfMaxes, which the fixture didn't provide.1 parent 19e33f7 commit d02c7c3
60 files changed
Lines changed: 263681 additions & 128094 deletions
File tree
- src
- api
- @tanstack
- client
- core
- components/Ethereum/ForkLabel
- hooks
- useConfig
- useSlotPlayer
- pages/ethereum
- consensus/overview
- live
- components
- AttestationArrivals
- BottomBar
- SlotHud
- SlotViewLayout
- hooks
- useSidebarData
- useSlotViewData
- slots
- components
- AttestationArrivalsChart
- BlobDataColumnSpreadChart
- BlockPropagationChart
- MevBiddingTimelineChart
- SlotBasicInfoCard
- SlotPayloadCard
- SlotProgressTimeline
- hooks
- useSlotPayloadData
- providers/SlotPlayerProvider
- routes/ethereum/slots
- utils
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
17 | 19 | | |
18 | | - | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
65 | 65 | | |
66 | 66 | | |
67 | 67 | | |
68 | | - | |
| 68 | + | |
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
| |||
128 | 128 | | |
129 | 129 | | |
130 | 130 | | |
131 | | - | |
132 | | - | |
133 | | - | |
| 131 | + | |
134 | 132 | | |
135 | 133 | | |
136 | 134 | | |
| |||
234 | 232 | | |
235 | 233 | | |
236 | 234 | | |
237 | | - | |
238 | | - | |
| 235 | + | |
239 | 236 | | |
240 | 237 | | |
241 | 238 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
6 | | - | |
7 | | - | |
8 | | - | |
9 | | - | |
| 5 | + | |
10 | 6 | | |
11 | 7 | | |
12 | 8 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
5 | | - | |
6 | | - | |
7 | | - | |
| 4 | + | |
8 | 5 | | |
9 | 6 | | |
10 | 7 | | |
| |||
66 | 63 | | |
67 | 64 | | |
68 | 65 | | |
69 | | - | |
70 | | - | |
71 | | - | |
72 | | - | |
73 | | - | |
| 66 | + | |
74 | 67 | | |
75 | 68 | | |
76 | 69 | | |
| |||
142 | 135 | | |
143 | 136 | | |
144 | 137 | | |
145 | | - | |
| 138 | + | |
146 | 139 | | |
147 | 140 | | |
148 | 141 | | |
| |||
151 | 144 | | |
152 | 145 | | |
153 | 146 | | |
154 | | - | |
| 147 | + | |
155 | 148 | | |
156 | 149 | | |
157 | 150 | | |
| |||
161 | 154 | | |
162 | 155 | | |
163 | 156 | | |
164 | | - | |
| 157 | + | |
165 | 158 | | |
166 | 159 | | |
167 | 160 | | |
| |||
172 | 165 | | |
173 | 166 | | |
174 | 167 | | |
175 | | - | |
| 168 | + | |
176 | 169 | | |
177 | 170 | | |
178 | 171 | | |
| |||
188 | 181 | | |
189 | 182 | | |
190 | 183 | | |
191 | | - | |
| 184 | + | |
192 | 185 | | |
193 | 186 | | |
194 | 187 | | |
| |||
206 | 199 | | |
207 | 200 | | |
208 | 201 | | |
209 | | - | |
210 | | - | |
211 | | - | |
212 | | - | |
| 202 | + | |
213 | 203 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
7 | | - | |
8 | | - | |
9 | | - | |
10 | | - | |
| 6 | + | |
11 | 7 | | |
12 | 8 | | |
13 | 9 | | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
| 10 | + | |
18 | 11 | | |
19 | 12 | | |
20 | 13 | | |
| |||
86 | 79 | | |
87 | 80 | | |
88 | 81 | | |
89 | | - | |
90 | | - | |
91 | | - | |
| 82 | + | |
92 | 83 | | |
93 | 84 | | |
94 | 85 | | |
| |||
103 | 94 | | |
104 | 95 | | |
105 | 96 | | |
106 | | - | |
| 97 | + | |
107 | 98 | | |
108 | 99 | | |
109 | 100 | | |
110 | 101 | | |
111 | | - | |
112 | | - | |
113 | | - | |
114 | | - | |
115 | | - | |
| 102 | + | |
116 | 103 | | |
117 | 104 | | |
118 | 105 | | |
| |||
156 | 143 | | |
157 | 144 | | |
158 | 145 | | |
159 | | - | |
| 146 | + | |
160 | 147 | | |
161 | 148 | | |
162 | 149 | | |
| |||
185 | 172 | | |
186 | 173 | | |
187 | 174 | | |
188 | | - | |
189 | | - | |
190 | | - | |
| 175 | + | |
191 | 176 | | |
192 | 177 | | |
193 | 178 | | |
| |||
206 | 191 | | |
207 | 192 | | |
208 | 193 | | |
209 | | - | |
210 | | - | |
211 | | - | |
212 | | - | |
| 194 | + | |
213 | 195 | | |
214 | 196 | | |
215 | 197 | | |
| |||
220 | 202 | | |
221 | 203 | | |
222 | 204 | | |
223 | | - | |
| 205 | + | |
224 | 206 | | |
225 | 207 | | |
226 | 208 | | |
227 | 209 | | |
228 | | - | |
229 | | - | |
230 | | - | |
231 | | - | |
232 | | - | |
| 210 | + | |
233 | 211 | | |
234 | 212 | | |
235 | 213 | | |
| |||
278 | 256 | | |
279 | 257 | | |
280 | 258 | | |
281 | | - | |
282 | | - | |
283 | | - | |
284 | | - | |
285 | | - | |
286 | | - | |
| 259 | + | |
287 | 260 | | |
288 | 261 | | |
289 | 262 | | |
| |||
306 | 279 | | |
307 | 280 | | |
308 | 281 | | |
309 | | - | |
| 282 | + | |
310 | 283 | | |
311 | 284 | | |
312 | 285 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | | - | |
| 24 | + | |
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
42 | | - | |
43 | | - | |
44 | | - | |
| 42 | + | |
45 | 43 | | |
46 | 44 | | |
47 | 45 | | |
48 | 46 | | |
49 | 47 | | |
50 | 48 | | |
51 | 49 | | |
52 | | - | |
| 50 | + | |
53 | 51 | | |
54 | 52 | | |
55 | 53 | | |
| |||
73 | 71 | | |
74 | 72 | | |
75 | 73 | | |
76 | | - | |
| 74 | + | |
77 | 75 | | |
78 | 76 | | |
79 | 77 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
74 | 74 | | |
75 | 75 | | |
76 | 76 | | |
77 | | - | |
78 | | - | |
79 | | - | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
80 | 80 | | |
81 | 81 | | |
82 | 82 | | |
| |||
91 | 91 | | |
92 | 92 | | |
93 | 93 | | |
94 | | - | |
| 94 | + | |
95 | 95 | | |
96 | 96 | | |
97 | 97 | | |
| |||
106 | 106 | | |
107 | 107 | | |
108 | 108 | | |
109 | | - | |
110 | | - | |
111 | | - | |
112 | | - | |
113 | | - | |
| 109 | + | |
114 | 110 | | |
115 | 111 | | |
116 | 112 | | |
117 | 113 | | |
118 | 114 | | |
119 | 115 | | |
120 | | - | |
| 116 | + | |
121 | 117 | | |
122 | 118 | | |
123 | 119 | | |
| |||
164 | 160 | | |
165 | 161 | | |
166 | 162 | | |
167 | | - | |
| 163 | + | |
168 | 164 | | |
169 | 165 | | |
170 | 166 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
7 | | - | |
8 | | - | |
9 | | - | |
10 | | - | |
11 | | - | |
12 | | - | |
| 6 | + | |
13 | 7 | | |
14 | 8 | | |
15 | 9 | | |
| |||
0 commit comments