github.com/lino-network/lino@v0.6.11/x/validator/client/cli/tx.go (about)

     1  package cli
     2  
     3  import (
     4  	"os/user"
     5  	"strings"
     6  
     7  	"github.com/cosmos/cosmos-sdk/codec"
     8  	"github.com/spf13/cobra"
     9  	"github.com/spf13/viper"
    10  	cfg "github.com/tendermint/tendermint/config"
    11  	"github.com/tendermint/tendermint/crypto"
    12  	cmn "github.com/tendermint/tendermint/libs/common"
    13  	pvm "github.com/tendermint/tendermint/privval"
    14  
    15  	"github.com/lino-network/lino/client"
    16  	linotypes "github.com/lino-network/lino/types"
    17  	types "github.com/lino-network/lino/x/validator/types"
    18  )
    19  
    20  const (
    21  	FlagUser       = "user"
    22  	FlagAmount     = "amount"
    23  	FlagLink       = "link"
    24  	FlagValidators = "validators"
    25  )
    26  
    27  func GetTxCmd(cdc *codec.Codec) *cobra.Command {
    28  	cmd := &cobra.Command{
    29  		Use:                        types.ModuleName,
    30  		Short:                      "validator tx subcommands",
    31  		DisableFlagParsing:         true,
    32  		SuggestionsMinimumDistance: 2,
    33  		RunE:                       client.ValidateCmd,
    34  	}
    35  
    36  	cmd.AddCommand(client.PostCommands(
    37  		GetCmdRegister(cdc),
    38  		GetCmdRevoke(cdc),
    39  		GetCmdVote(cdc),
    40  		GetCmdUpdate(cdc),
    41  	)...)
    42  
    43  	return cmd
    44  
    45  }
    46  
    47  // GetCmdRegister -
    48  func GetCmdRegister(cdc *codec.Codec) *cobra.Command {
    49  	cmd := &cobra.Command{
    50  		Use:   "register",
    51  		Short: "register user --link <link>",
    52  		Args:  cobra.ExactArgs(1),
    53  		RunE: func(cmd *cobra.Command, args []string) error {
    54  			ctx := client.NewCoreContextFromViper().WithTxEncoder(linotypes.TxEncoder(cdc))
    55  			validator := args[0]
    56  			link := viper.GetString(FlagLink)
    57  			pubKey, err := getLocalUserPubKey()
    58  			if err != nil {
    59  				return err
    60  			}
    61  			msg := types.NewValidatorRegisterMsg(validator, pubKey, link)
    62  			return ctx.DoTxPrintResponse(msg)
    63  		},
    64  	}
    65  	cmd.Flags().String(FlagLink, "", "link of the validator")
    66  	return cmd
    67  }
    68  
    69  func getLocalUserPubKey() (crypto.PubKey, error) {
    70  	usr, err := user.Current()
    71  	if err != nil {
    72  		return nil, err
    73  	}
    74  	root := usr.HomeDir + "/.lino/"
    75  
    76  	tmConfig := cfg.DefaultConfig()
    77  	tmConfig = tmConfig.SetRoot(root)
    78  
    79  	privValFile := tmConfig.PrivValidatorKeyFile()
    80  	privValStateFile := tmConfig.PrivValidatorStateFile()
    81  
    82  	var privValidator *pvm.FilePV
    83  	if cmn.FileExists(privValFile) {
    84  		privValidator = pvm.LoadFilePV(privValFile, privValStateFile)
    85  	} else {
    86  		privValidator = pvm.GenFilePV(privValFile, privValStateFile)
    87  		privValidator.Save()
    88  	}
    89  	pubKey := privValidator.GetPubKey()
    90  	return pubKey, nil
    91  }
    92  
    93  // GetCmdRevoke -
    94  func GetCmdRevoke(cdc *codec.Codec) *cobra.Command {
    95  	cmd := &cobra.Command{
    96  		Use:   "revoke",
    97  		Short: "revoke <username>",
    98  		Args:  cobra.ExactArgs(1),
    99  		RunE: func(cmd *cobra.Command, args []string) error {
   100  			ctx := client.NewCoreContextFromViper().WithTxEncoder(linotypes.TxEncoder(cdc))
   101  			user := args[0]
   102  			msg := types.NewValidatorRevokeMsg(user)
   103  			return ctx.DoTxPrintResponse(msg)
   104  		},
   105  	}
   106  	return cmd
   107  }
   108  
   109  // GetCmdVote -
   110  func GetCmdVote(cdc *codec.Codec) *cobra.Command {
   111  	cmd := &cobra.Command{
   112  		Use:   "vote",
   113  		Short: "vote voter --validators val1,val,...",
   114  		Args:  cobra.ExactArgs(1),
   115  		RunE: func(cmd *cobra.Command, args []string) error {
   116  			ctx := client.NewCoreContextFromViper().WithTxEncoder(linotypes.TxEncoder(cdc))
   117  			voter := args[0]
   118  			validators := strings.Split(viper.GetString(FlagValidators), ",")
   119  			msg := types.NewVoteValidatorMsg(voter, validators)
   120  			return ctx.DoTxPrintResponse(msg)
   121  		},
   122  	}
   123  	cmd.Flags().String(FlagValidators, "", "a comma-separated string, the list of validators")
   124  	_ = cmd.MarkFlagRequired(FlagValidators)
   125  	return cmd
   126  }
   127  
   128  // GetCmdRegister -
   129  func GetCmdUpdate(cdc *codec.Codec) *cobra.Command {
   130  	cmd := &cobra.Command{
   131  		Use:   "update",
   132  		Short: "update user --link <link>",
   133  		Args:  cobra.ExactArgs(1),
   134  		RunE: func(cmd *cobra.Command, args []string) error {
   135  			ctx := client.NewCoreContextFromViper().WithTxEncoder(linotypes.TxEncoder(cdc))
   136  			validator := args[0]
   137  			link := viper.GetString(FlagLink)
   138  			msg := types.NewValidatorUpdateMsg(validator, link)
   139  			return ctx.DoTxPrintResponse(msg)
   140  		},
   141  	}
   142  	cmd.Flags().String(FlagLink, "", "link of the validator")
   143  	return cmd
   144  }