@@ -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
363364func (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