@@ -18,61 +18,65 @@ type ValidatorsAPI struct {
1818 vm * VM
1919}
2020
21- func (api * ValidatorsAPI ) GetCurrentValidators (_ * http.Request , req * client.GetCurrentValidatorsRequest , reply * client.GetCurrentValidatorsResponse ) error {
21+ func (api * ValidatorsAPI ) GetCurrentValidators (httpReq * http.Request , req * client.GetCurrentValidatorsRequest , reply * client.GetCurrentValidatorsResponse ) error {
2222 api .vm .vmLock .RLock ()
2323 defer api .vm .vmLock .RUnlock ()
24+ ctx := httpReq .Context ()
2425
25- var vIDs set.Set [ids.ID ]
26+ validatorSet , _ , err := api .vm .ctx .ValidatorState .GetCurrentValidatorSet (ctx , api .vm .ctx .SubnetID )
27+ if err != nil {
28+ return fmt .Errorf ("failed to get current validator set: %w" , err )
29+ }
30+
31+ // Filter by requested nodeIDs if specified
32+ requestedNodeIDs := set.NewSet [ids.NodeID ](len (req .NodeIDs ))
2633 if len (req .NodeIDs ) > 0 {
27- vIDs = set.NewSet [ids.ID ](len (req .NodeIDs ))
2834 for _ , nodeID := range req .NodeIDs {
29- vID , err := api .vm .validatorsManager .GetValidationID (nodeID )
30- if err != nil {
31- return fmt .Errorf ("couldn't find validator with node ID %s" , nodeID )
32- }
33- vIDs .Add (vID )
35+ requestedNodeIDs .Add (nodeID )
3436 }
35- } else {
36- vIDs = api .vm .validatorsManager .GetValidationIDs ()
3737 }
3838
39- reply .Validators = make ([]client.CurrentValidator , 0 , vIDs .Len ())
40-
41- for _ , vID := range vIDs .List () {
42- validator , err := api .vm .validatorsManager .GetValidator (vID )
43- if err != nil {
44- return fmt .Errorf ("couldn't find validator with validation ID %s" , vID )
39+ reply .Validators = make ([]client.CurrentValidator , 0 , len (validatorSet ))
40+ for validationID , validator := range validatorSet {
41+ // Skip if specific nodeIDs were requested and this isn't one of them
42+ if requestedNodeIDs .Len () > 0 && ! requestedNodeIDs .Contains (validator .NodeID ) {
43+ continue
4544 }
4645
47- isConnected := api .vm .validatorsManager .IsConnected (validator .NodeID )
48-
49- upDuration , lastUpdated , err := api .vm .validatorsManager .CalculateUptime (validator .NodeID )
46+ upDuration , lastUpdated , found , err := api .vm .uptimeTracker .GetUptime (validationID )
5047 if err != nil {
51- return err
48+ return fmt . Errorf ( "failed to get uptime for validation ID %s: %w" , validationID , err )
5249 }
50+ if ! found {
51+ return fmt .Errorf ("validator not found for validation ID %s" , validationID )
52+ }
53+
5354 var uptimeFloat float64
54- startTime := time .Unix (int64 (validator .StartTimestamp ), 0 )
55+
56+ startTime := time .Unix (int64 (validator .StartTime ), 0 )
5557 bestPossibleUpDuration := lastUpdated .Sub (startTime )
5658 if bestPossibleUpDuration == 0 {
5759 uptimeFloat = 1
5860 } else {
5961 uptimeFloat = float64 (upDuration ) / float64 (bestPossibleUpDuration )
6062 }
61-
6263 // Transform this to a percentage (0-100) to make it consistent
6364 // with currentValidators in PlatformVM API
6465 uptimePercentage := float32 (uptimeFloat * 100 )
66+ uptimeSeconds := uint64 (upDuration .Seconds ())
67+
68+ isConnected := api .vm .P2PValidators ().Has (ctx , validator .NodeID )
6569
6670 reply .Validators = append (reply .Validators , client.CurrentValidator {
67- ValidationID : validator . ValidationID ,
71+ ValidationID : validationID ,
6872 NodeID : validator .NodeID ,
69- StartTimestamp : validator .StartTimestamp ,
73+ StartTimestamp : validator .StartTime ,
7074 Weight : validator .Weight ,
7175 IsActive : validator .IsActive ,
7276 IsL1Validator : validator .IsL1Validator ,
7377 IsConnected : isConnected ,
7478 UptimePercentage : uptimePercentage ,
75- UptimeSeconds : uint64 ( upDuration . Seconds ()) ,
79+ UptimeSeconds : uptimeSeconds ,
7680 })
7781 }
7882 return nil
0 commit comments