refactor(client): use cmtservice for comet-validator-set command (#17187)

Co-authored-by: Julien Robert <julien@rbrt.fr>
This commit is contained in:
zakir
2023-08-02 08:55:01 +00:00
committed by GitHub
co-authored by Julien Robert
parent 63113e88ed
commit 8503c1822b
6 changed files with 53 additions and 106 deletions
+3 -92
View File
@@ -1,24 +1,16 @@
package rpc
import (
"context"
"fmt"
"strconv"
"strings"
cmttypes "github.com/cometbft/cometbft/types"
"github.com/spf13/cobra"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/flags"
cryptocodec "github.com/cosmos/cosmos-sdk/crypto/codec"
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/client/grpc/cmtservice"
"github.com/cosmos/cosmos-sdk/types/query"
)
// TODO these next two functions feel kinda hacky based on their placement
// ValidatorCommand returns the validator set for a given height
func ValidatorCommand() *cobra.Command {
cmd := &cobra.Command{
@@ -49,12 +41,12 @@ func ValidatorCommand() *cobra.Command {
page, _ := cmd.Flags().GetInt(flags.FlagPage)
limit, _ := cmd.Flags().GetInt(flags.FlagLimit)
result, err := GetValidators(cmd.Context(), clientCtx, height, &page, &limit)
response, err := cmtservice.ValidatorsOutput(cmd.Context(), clientCtx, height, page, limit)
if err != nil {
return err
}
return clientCtx.PrintObjectLegacy(result)
return clientCtx.PrintProto(response)
},
}
@@ -65,84 +57,3 @@ func ValidatorCommand() *cobra.Command {
return cmd
}
// Validator output
type ValidatorOutput struct {
Address sdk.ConsAddress `json:"address"`
PubKey cryptotypes.PubKey `json:"pub_key"`
ProposerPriority int64 `json:"proposer_priority"`
VotingPower int64 `json:"voting_power"`
}
// Validators at a certain height output in bech32 format
type ResultValidatorsOutput struct {
BlockHeight int64 `json:"block_height"`
Validators []ValidatorOutput `json:"validators"`
Total uint64 `json:"total"`
}
func (rvo ResultValidatorsOutput) String() string {
var b strings.Builder
fmt.Fprintf(&b, "block height: %d\n", rvo.BlockHeight)
fmt.Fprintf(&b, "total count: %d\n", rvo.Total)
for _, val := range rvo.Validators {
fmt.Fprintf(&b, `
Address: %s
Pubkey: %s
ProposerPriority: %d
VotingPower: %d
`,
val.Address, val.PubKey, val.ProposerPriority, val.VotingPower,
)
}
return b.String()
}
func validatorOutput(validator *cmttypes.Validator) (ValidatorOutput, error) {
pk, err := cryptocodec.FromCmtPubKeyInterface(validator.PubKey)
if err != nil {
return ValidatorOutput{}, err
}
return ValidatorOutput{
Address: sdk.ConsAddress(validator.Address),
PubKey: pk,
ProposerPriority: validator.ProposerPriority,
VotingPower: validator.VotingPower,
}, nil
}
// GetValidators from client
func GetValidators(ctx context.Context, clientCtx client.Context, height *int64, page, limit *int) (ResultValidatorsOutput, error) {
// get the node
node, err := clientCtx.GetNode()
if err != nil {
return ResultValidatorsOutput{}, err
}
validatorsRes, err := node.Validators(ctx, height, page, limit)
if err != nil {
return ResultValidatorsOutput{}, err
}
total := validatorsRes.Total
if validatorsRes.Total < 0 {
total = 0
}
out := ResultValidatorsOutput{
BlockHeight: validatorsRes.BlockHeight,
Validators: make([]ValidatorOutput, len(validatorsRes.Validators)),
Total: uint64(total),
}
for i := 0; i < len(validatorsRes.Validators); i++ {
out.Validators[i], err = validatorOutput(validatorsRes.Validators[i])
if err != nil {
return out, err
}
}
return out, nil
}