@@ -291,25 +291,62 @@ func buildIndexPageData() (*models.IndexPageData, time.Duration) {
291291 }
292292
293293 // Add BPO forks from BLOB_SCHEDULE
294- for i , blobSchedule := range specs . BlobSchedule {
295- // BPO forks use the fork version that's active at the time of BPO activation
296- forkVersion := chainState . GetForkVersionAtEpoch ( phase0 . Epoch ( blobSchedule . Epoch ) )
297- blobParams := & consensus. BlobScheduleEntry {
298- Epoch : blobSchedule . Epoch ,
299- MaxBlobsPerBlock : blobSchedule .MaxBlobsPerBlock ,
300- }
301- forkDigest := chainState . GetForkDigest ( forkVersion , blobParams )
294+ elBlobSchedule := services . GlobalBeaconService . GetExecutionChainState (). GetFullBlobSchedule ()
295+ if len ( elBlobSchedule ) > 0 {
296+ // get blob schedule from el config (we have the full blob schedule available )
297+ bpoIdx := 0
298+ for _ , blobSchedule := range elBlobSchedule {
299+ if ! blobSchedule .IsBpo {
300+ continue
301+ }
302302
303- pageData .NetworkForks = append (pageData .NetworkForks , & models.IndexPageDataForks {
304- Name : fmt .Sprintf ("BPO%d" , i + 1 ),
305- Epoch : blobSchedule .Epoch ,
306- Version : nil , // BPO forks don't have fork versions
307- Time : uint64 (chainState .EpochToTime (phase0 .Epoch (blobSchedule .Epoch )).Unix ()),
308- Active : uint64 (currentEpoch ) >= blobSchedule .Epoch ,
309- Type : "bpo" ,
310- MaxBlobsPerBlock : & blobSchedule .MaxBlobsPerBlock ,
311- ForkDigest : forkDigest [:],
312- })
303+ bpoIdx ++
304+
305+ bpoEpoch := phase0 .Epoch (0 )
306+ if blobSchedule .Timestamp .After (networkGenesis .GenesisTime ) {
307+ bpoEpoch = chainState .EpochOfSlot (chainState .TimeToSlot (blobSchedule .Timestamp ))
308+ }
309+
310+ forkVersion := chainState .GetForkVersionAtEpoch (bpoEpoch )
311+ blobParams := & consensus.BlobScheduleEntry {
312+ Epoch : uint64 (bpoEpoch ),
313+ MaxBlobsPerBlock : blobSchedule .Schedule .Max ,
314+ }
315+ forkDigest := chainState .GetForkDigest (forkVersion , blobParams )
316+
317+ pageData .NetworkForks = append (pageData .NetworkForks , & models.IndexPageDataForks {
318+ Name : fmt .Sprintf ("BPO%d" , bpoIdx ),
319+ Epoch : uint64 (bpoEpoch ),
320+ Version : nil ,
321+ Time : uint64 (blobSchedule .Timestamp .Unix ()),
322+ Active : currentEpoch >= bpoEpoch ,
323+ Type : "bpo" ,
324+ MaxBlobsPerBlock : & blobSchedule .Schedule .Max ,
325+ ForkDigest : forkDigest [:],
326+ })
327+ }
328+ } else {
329+ // get blob schedule from cl specs (no el config available, so we only get the deduplicated blob schedule from the cl specs)
330+ for i , blobSchedule := range specs .BlobSchedule {
331+ // BPO forks use the fork version that's active at the time of BPO activation
332+ forkVersion := chainState .GetForkVersionAtEpoch (phase0 .Epoch (blobSchedule .Epoch ))
333+ blobParams := & consensus.BlobScheduleEntry {
334+ Epoch : blobSchedule .Epoch ,
335+ MaxBlobsPerBlock : blobSchedule .MaxBlobsPerBlock ,
336+ }
337+ forkDigest := chainState .GetForkDigest (forkVersion , blobParams )
338+
339+ pageData .NetworkForks = append (pageData .NetworkForks , & models.IndexPageDataForks {
340+ Name : fmt .Sprintf ("BPO%d" , i + 1 ),
341+ Epoch : blobSchedule .Epoch ,
342+ Version : nil , // BPO forks don't have fork versions
343+ Time : uint64 (chainState .EpochToTime (phase0 .Epoch (blobSchedule .Epoch )).Unix ()),
344+ Active : uint64 (currentEpoch ) >= blobSchedule .Epoch ,
345+ Type : "bpo" ,
346+ MaxBlobsPerBlock : & blobSchedule .MaxBlobsPerBlock ,
347+ ForkDigest : forkDigest [:],
348+ })
349+ }
313350 }
314351
315352 // Sort all forks by epoch
0 commit comments