Skip to content

Commit 9d53fc0

Browse files
committed
Get megapool validator info when creating network state for a node, logging text fixes
1 parent b5342a1 commit 9d53fc0

File tree

1 file changed

+70
-7
lines changed

1 file changed

+70
-7
lines changed

shared/services/state/network-state.go

Lines changed: 70 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -218,21 +218,21 @@ func (m *NetworkStateManager) createNetworkState(slotNumber uint64) (*NetworkSta
218218
if err != nil {
219219
return nil, fmt.Errorf("error getting network details: %w", err)
220220
}
221-
m.logLine("1/6 - Retrieved network details (%s so far)", time.Since(start))
221+
m.logLine("1/7 - Retrieved network details (%s so far)", time.Since(start))
222222

223223
// Node details
224224
state.NodeDetails, err = rpstate.GetAllNativeNodeDetails(m.rp, contracts)
225225
if err != nil {
226226
return nil, fmt.Errorf("error getting all node details: %w", err)
227227
}
228-
m.logLine("2/6 - Retrieved node details (%s so far)", time.Since(start))
228+
m.logLine("2/7 - Retrieved node details (%s so far)", time.Since(start))
229229

230230
// Minipool details
231231
state.MinipoolDetails, err = rpstate.GetAllNativeMinipoolDetails(m.rp, contracts)
232232
if err != nil {
233233
return nil, fmt.Errorf("error getting all minipool details: %w", err)
234234
}
235-
m.logLine("3/6 - Retrieved minipool details (%s so far)", time.Since(start))
235+
m.logLine("3/7 - Retrieved minipool details (%s so far)", time.Since(start))
236236

237237
// Create the node lookup
238238
for i, details := range state.NodeDetails {
@@ -314,6 +314,7 @@ func (m *NetworkStateManager) createNetworkState(slotNumber uint64) (*NetworkSta
314314
}
315315
}
316316
}
317+
m.logLine("4/7 - Retrieved megapool validator details (%s so far)", time.Since(start))
317318

318319
// Calculate avg node fees and distributor shares
319320
for _, details := range state.NodeDetails {
@@ -325,7 +326,7 @@ func (m *NetworkStateManager) createNetworkState(slotNumber uint64) (*NetworkSta
325326
if err != nil {
326327
return nil, fmt.Errorf("error getting Oracle DAO details: %w", err)
327328
}
328-
m.logLine("4/6 - Retrieved Oracle DAO details (%s so far)", time.Since(start))
329+
m.logLine("5/7 - Retrieved Oracle DAO details (%s so far)", time.Since(start))
329330

330331
// Get the validator stats from Beacon
331332
statusMap, err := m.bc.GetValidatorStatuses(pubkeys, &beacon.ValidatorStatusOptions{
@@ -335,7 +336,7 @@ func (m *NetworkStateManager) createNetworkState(slotNumber uint64) (*NetworkSta
335336
return nil, err
336337
}
337338
state.MinipoolValidatorDetails = statusMap
338-
m.logLine("5/6 - Retrieved validator details (total time: %s)", time.Since(start))
339+
m.logLine("6/7 - Retrieved validator details (total time: %s)", time.Since(start))
339340

340341
// Get the complete node and user shares
341342
mpds := make([]*rpstate.NativeMinipoolDetails, len(state.MinipoolDetails))
@@ -354,14 +355,14 @@ func (m *NetworkStateManager) createNetworkState(slotNumber uint64) (*NetworkSta
354355
return nil, err
355356
}
356357
state.MinipoolValidatorDetails = statusMap
357-
m.logLine("6/6 - Calculated complete node and user balance shares (total time: %s)", time.Since(start))
358+
m.logLine("7/7 - Calculated complete node and user balance shares (total time: %s)", time.Since(start))
358359

359360
return state, nil
360361
}
361362

362363
// Creates a snapshot of the Rocket Pool network, but only for a single node
363364
func (m *NetworkStateManager) createNetworkStateForNode(slotNumber uint64, nodeAddress common.Address) (*NetworkState, error) {
364-
steps := 5
365+
steps := 7
365366

366367
// Get the execution block for the given slot
367368
beaconBlock, exists, err := m.bc.GetBeaconBlock(fmt.Sprintf("%d", slotNumber))
@@ -497,6 +498,68 @@ func (m *NetworkStateManager) createNetworkStateForNode(slotNumber uint64, nodeA
497498
m.logLine("%d/%d - Retrieved Protocol DAO proposals (total time: %s)", currentStep, steps, time.Since(start))
498499
currentStep++
499500

501+
if isSaturnDeployed {
502+
state.MegapoolValidatorGlobalIndex, err = rpstate.GetAllMegapoolValidators(m.rp, contracts)
503+
if err != nil {
504+
return nil, fmt.Errorf("error getting all megapool validator details: %w", err)
505+
}
506+
megapoolValidatorPubkeys := make([]types.ValidatorPubkey, 0, len(state.MegapoolValidatorGlobalIndex))
507+
// Iterate over the megapool validators to add their pubkey to the list of pubkeys
508+
megapoolAddressMap := make(map[common.Address][]types.ValidatorPubkey)
509+
megapoolValidatorInfo := make(map[types.ValidatorPubkey]*megapool.ValidatorInfoFromGlobalIndex)
510+
for _, validator := range state.MegapoolValidatorGlobalIndex {
511+
// Add the megapool address to a set
512+
if len(validator.Pubkey) > 0 { // TODO CHECK validators without a pubkey
513+
megapoolAddressMap[validator.MegapoolAddress] = append(megapoolAddressMap[validator.MegapoolAddress], types.ValidatorPubkey(validator.Pubkey))
514+
megapoolValidatorPubkeys = append(megapoolValidatorPubkeys, types.ValidatorPubkey(validator.Pubkey))
515+
megapoolValidatorInfo[types.ValidatorPubkey(validator.Pubkey)] = &validator
516+
}
517+
}
518+
state.MegapoolToPubkeysMap = megapoolAddressMap
519+
statusMap, err := m.bc.GetValidatorStatuses(megapoolValidatorPubkeys, &beacon.ValidatorStatusOptions{
520+
Slot: &slotNumber,
521+
})
522+
if err != nil {
523+
return nil, err
524+
}
525+
state.MegapoolValidatorDetails = statusMap
526+
state.MegapoolValidatorInfo = megapoolValidatorInfo
527+
528+
// initialize state.MegapoolDetails
529+
state.MegapoolDetails = make(map[common.Address]rpstate.NativeMegapoolDetails)
530+
// Sync
531+
var wg errgroup.Group
532+
// Iterate the maps and query megapool details
533+
for megapoolAddress := range megapoolAddressMap {
534+
535+
megapoolAddress := megapoolAddress
536+
wg.Go(func() error {
537+
538+
// Load the megapool
539+
mp, err := megapool.NewMegaPoolV1(m.rp, megapoolAddress, opts)
540+
if err != nil {
541+
return err
542+
}
543+
nodeAddress, err := mp.GetNodeAddress(opts)
544+
if err != nil {
545+
return err
546+
}
547+
megapoolDetails, err := rpstate.GetNodeMegapoolDetails(m.rp, nodeAddress)
548+
if err != nil {
549+
return err
550+
}
551+
552+
state.MegapoolDetails[megapoolAddress] = megapoolDetails
553+
return nil
554+
})
555+
if err := wg.Wait(); err != nil {
556+
return nil, fmt.Errorf("error getting all megapool details: %w", err)
557+
}
558+
}
559+
}
560+
m.logLine("%d/%d - Retrieved megapool validator details (total time: %s)", currentStep, steps, time.Since(start))
561+
currentStep++
562+
500563
return state, nil
501564
}
502565

0 commit comments

Comments
 (0)