mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2025-01-08 02:31:19 +00:00
5a66807989
* First take at updating everything to v5 * Patch gRPC gateway to use prysm v5 Fix patch * Update go ssz --------- Co-authored-by: Preston Van Loon <pvanloon@offchainlabs.com>
75 lines
2.2 KiB
Go
75 lines
2.2 KiB
Go
package beacon_api
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
neturl "net/url"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/prysmaticlabs/prysm/v5/api/server/structs"
|
|
validator2 "github.com/prysmaticlabs/prysm/v5/consensus-types/validator"
|
|
"github.com/prysmaticlabs/prysm/v5/validator/client/iface"
|
|
)
|
|
|
|
// NewPrysmBeaconChainClient returns implementation of iface.PrysmBeaconChainClient.
|
|
func NewPrysmBeaconChainClient(jsonRestHandler JsonRestHandler, nodeClient iface.NodeClient) iface.PrysmBeaconChainClient {
|
|
return prysmBeaconChainClient{
|
|
jsonRestHandler: jsonRestHandler,
|
|
nodeClient: nodeClient,
|
|
}
|
|
}
|
|
|
|
type prysmBeaconChainClient struct {
|
|
jsonRestHandler JsonRestHandler
|
|
nodeClient iface.NodeClient
|
|
}
|
|
|
|
func (c prysmBeaconChainClient) GetValidatorCount(ctx context.Context, stateID string, statuses []validator2.Status) ([]iface.ValidatorCount, error) {
|
|
// Check node version for prysm beacon node as it is a custom endpoint for prysm beacon node.
|
|
nodeVersion, err := c.nodeClient.GetVersion(ctx, nil)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "failed to get node version")
|
|
}
|
|
|
|
if !strings.Contains(strings.ToLower(nodeVersion.Version), "prysm") {
|
|
return nil, iface.ErrNotSupported
|
|
}
|
|
|
|
queryParams := neturl.Values{}
|
|
for _, status := range statuses {
|
|
queryParams.Add("status", status.String())
|
|
}
|
|
|
|
queryUrl := buildURL(fmt.Sprintf("/eth/v1/beacon/states/%s/validator_count", stateID), queryParams)
|
|
|
|
var validatorCountResponse structs.GetValidatorCountResponse
|
|
if err = c.jsonRestHandler.Get(ctx, queryUrl, &validatorCountResponse); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if validatorCountResponse.Data == nil {
|
|
return nil, errors.New("validator count data is nil")
|
|
}
|
|
|
|
if len(statuses) != 0 && len(statuses) != len(validatorCountResponse.Data) {
|
|
return nil, errors.New("mismatch between validator count data and the number of statuses provided")
|
|
}
|
|
|
|
var resp []iface.ValidatorCount
|
|
for _, vc := range validatorCountResponse.Data {
|
|
count, err := strconv.ParseUint(vc.Count, 10, 64)
|
|
if err != nil {
|
|
return nil, errors.Wrapf(err, "failed to parse validator count %s", vc.Count)
|
|
}
|
|
|
|
resp = append(resp, iface.ValidatorCount{
|
|
Status: vc.Status,
|
|
Count: count,
|
|
})
|
|
}
|
|
|
|
return resp, nil
|
|
}
|