11package handlers
22
33import (
4+ "bytes"
45 "context"
56 "encoding/hex"
67 "encoding/json"
@@ -981,8 +982,8 @@ func getSlotPageBlockData(ctx context.Context, blockData *services.CombinedBlock
981982 getSlotPageDepositRequests (pageData , requests .Deposits )
982983 getSlotPageWithdrawalRequests (pageData , requests .Withdrawals )
983984 getSlotPageConsolidationRequests (pageData , requests .Consolidations )
984- getSlotPageBuilderDeposits (pageData , requests .BuilderDeposits )
985- getSlotPageBuilderExits (pageData , requests .BuilderExits )
985+ getSlotPageBuilderDeposits (ctx , pageData , requests .BuilderDeposits )
986+ getSlotPageBuilderExits (ctx , pageData , requests .BuilderExits )
986987 }
987988 }
988989
@@ -1322,22 +1323,37 @@ func getSlotPageConsolidationRequests(pageData *models.SlotPageBlockData, consol
13221323 pageData .ConsolidationRequestsCount = uint64 (len (pageData .ConsolidationRequests ))
13231324}
13241325
1325- func getSlotPageBuilderDeposits (pageData * models.SlotPageBlockData , builderDeposits []* gloas.BuilderDepositRequest ) {
1326+ func getSlotPageBuilderDeposits (ctx context. Context , pageData * models.SlotPageBlockData , builderDeposits []* gloas.BuilderDepositRequest ) {
13261327 pageData .BuilderDepositRequests = make ([]* models.SlotPageBuilderDepositRequest , 0 , len (builderDeposits ))
13271328
1328- for _ , builderDeposit := range builderDeposits {
1329+ // resolve pubkeys -> builder indexes first, then batch-load the builders for those indexes to
1330+ // tell whether each pubkey still owns its (reusable) index or was superseded.
1331+ resolvedIdx := make ([]gloas.BuilderIndex , len (builderDeposits ))
1332+ resolvedOk := make ([]bool , len (builderDeposits ))
1333+ indexes := make ([]gloas.BuilderIndex , 0 , len (builderDeposits ))
1334+ for i , builderDeposit := range builderDeposits {
1335+ if builderIdx , found := services .GlobalBeaconService .GetBuilderIndexByPubkey (builderDeposit .Pubkey ); found {
1336+ resolvedIdx [i ] = builderIdx
1337+ resolvedOk [i ] = true
1338+ indexes = append (indexes , builderIdx )
1339+ }
1340+ }
1341+ builders := services .GlobalBeaconService .GetActiveBuildersByIndexes (ctx , indexes )
1342+
1343+ for i , builderDeposit := range builderDeposits {
13291344 requestData := & models.SlotPageBuilderDepositRequest {
13301345 PublicKey : builderDeposit .Pubkey [:],
13311346 WithdrawalCreds : builderDeposit .WithdrawalCredentials ,
13321347 Amount : uint64 (builderDeposit .Amount ),
13331348 Signature : builderDeposit .Signature [:],
13341349 }
13351350
1336- if rawIdx , found := services .GlobalBeaconService .GetValidatorIndexByPubkey (builderDeposit .Pubkey ); found {
1337- fullIndex := uint64 (rawIdx )
1338- if fullIndex & services .BuilderIndexFlag != 0 {
1351+ if resolvedOk [i ] {
1352+ if b := builders [resolvedIdx [i ]]; b != nil && bytes .Equal (b .PublicKey [:], builderDeposit .Pubkey [:]) {
13391353 requestData .HasBuilderIndex = true
1340- requestData .BuilderIndex = fullIndex &^ services .BuilderIndexFlag
1354+ requestData .BuilderIndex = uint64 (resolvedIdx [i ])
1355+ } else {
1356+ requestData .IsInactiveBuilder = true
13411357 }
13421358 }
13431359
@@ -1347,20 +1363,33 @@ func getSlotPageBuilderDeposits(pageData *models.SlotPageBlockData, builderDepos
13471363 pageData .BuilderDepositRequestsCount = uint64 (len (pageData .BuilderDepositRequests ))
13481364}
13491365
1350- func getSlotPageBuilderExits (pageData * models.SlotPageBlockData , builderExits []* gloas.BuilderExitRequest ) {
1366+ func getSlotPageBuilderExits (ctx context. Context , pageData * models.SlotPageBlockData , builderExits []* gloas.BuilderExitRequest ) {
13511367 pageData .BuilderExitRequests = make ([]* models.SlotPageBuilderExitRequest , 0 , len (builderExits ))
13521368
1353- for _ , builderExit := range builderExits {
1369+ resolvedIdx := make ([]gloas.BuilderIndex , len (builderExits ))
1370+ resolvedOk := make ([]bool , len (builderExits ))
1371+ indexes := make ([]gloas.BuilderIndex , 0 , len (builderExits ))
1372+ for i , builderExit := range builderExits {
1373+ if builderIdx , found := services .GlobalBeaconService .GetBuilderIndexByPubkey (builderExit .Pubkey ); found {
1374+ resolvedIdx [i ] = builderIdx
1375+ resolvedOk [i ] = true
1376+ indexes = append (indexes , builderIdx )
1377+ }
1378+ }
1379+ builders := services .GlobalBeaconService .GetActiveBuildersByIndexes (ctx , indexes )
1380+
1381+ for i , builderExit := range builderExits {
13541382 requestData := & models.SlotPageBuilderExitRequest {
13551383 SourceAddress : builderExit .SourceAddress [:],
13561384 PublicKey : builderExit .Pubkey [:],
13571385 }
13581386
1359- if rawIdx , found := services .GlobalBeaconService .GetValidatorIndexByPubkey (builderExit .Pubkey ); found {
1360- fullIndex := uint64 (rawIdx )
1361- if fullIndex & services .BuilderIndexFlag != 0 {
1387+ if resolvedOk [i ] {
1388+ if b := builders [resolvedIdx [i ]]; b != nil && bytes .Equal (b .PublicKey [:], builderExit .Pubkey [:]) {
13621389 requestData .HasBuilderIndex = true
1363- requestData .BuilderIndex = fullIndex &^ services .BuilderIndexFlag
1390+ requestData .BuilderIndex = uint64 (resolvedIdx [i ])
1391+ } else {
1392+ requestData .IsInactiveBuilder = true
13641393 }
13651394 }
13661395
0 commit comments