github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/staking/client/cli/tx.go (about)

     1  package cli
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"os"
     7  
     8  	"github.com/fibonacci-chain/fbc/x/common"
     9  
    10  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/flags"
    11  
    12  	"github.com/spf13/cobra"
    13  	flag "github.com/spf13/pflag"
    14  	"github.com/spf13/viper"
    15  
    16  	cfg "github.com/fibonacci-chain/fbc/libs/tendermint/config"
    17  	"github.com/fibonacci-chain/fbc/libs/tendermint/crypto"
    18  
    19  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client"
    20  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context"
    21  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    22  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    23  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
    24  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/client/utils"
    25  	"github.com/fibonacci-chain/fbc/x/staking/types"
    26  )
    27  
    28  // GetTxCmd returns the transaction commands for this module
    29  func GetTxCmd(storeKey string, cdc *codec.Codec) *cobra.Command {
    30  	stakingTxCmd := &cobra.Command{
    31  		Use:                        types.ModuleName,
    32  		Short:                      "Staking transaction subcommands",
    33  		DisableFlagParsing:         true,
    34  		SuggestionsMinimumDistance: 2,
    35  		RunE:                       client.ValidateCmd,
    36  	}
    37  
    38  	stakingTxCmd.AddCommand(
    39  		flags.PostCommands(
    40  			GetCmdCreateValidator(cdc),
    41  			GetCmdDestroyValidator(cdc),
    42  			GetCmdEditValidator(cdc),
    43  			GetCmdEditValidatorCommissionRate(cdc),
    44  			GetCmdDeposit(cdc),
    45  			GetCmdWithdraw(cdc),
    46  			GetCmdAddShares(cdc),
    47  		)...)
    48  
    49  	stakingTxCmd.AddCommand(GetCmdProxy(cdc))
    50  
    51  	return stakingTxCmd
    52  }
    53  
    54  // GetCmdCreateValidator gets the create validator command handler
    55  func GetCmdCreateValidator(cdc *codec.Codec) *cobra.Command {
    56  	cmd := &cobra.Command{
    57  		Use:   "create-validator",
    58  		Short: "create new validator",
    59  		RunE: func(cmd *cobra.Command, args []string) error {
    60  			inBuf := bufio.NewReader(cmd.InOrStdin())
    61  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
    62  			cliCtx := context.NewCLIContext().WithCodec(cdc)
    63  
    64  			txBldr, msg, err := BuildCreateValidatorMsg(cliCtx, txBldr)
    65  			if err != nil {
    66  				return err
    67  			}
    68  
    69  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
    70  		},
    71  	}
    72  
    73  	cmd.Flags().AddFlagSet(FsPk)
    74  	//cmd.Flags().AddFlagSet(FsAmount)
    75  	cmd.Flags().AddFlagSet(fsDescriptionCreate)
    76  	//cmd.Flags().AddFlagSet(FsCommissionCreate)
    77  	//cmd.Flags().AddFlagSet(FsMinSelfDelegation)
    78  
    79  	cmd.Flags().String(FlagIP, "",
    80  		fmt.Sprintf("The node's public IP. It takes effect only when used in combination with --%s", flags.FlagGenerateOnly))
    81  	cmd.Flags().String(FlagNodeID, "", "The node's ID")
    82  
    83  	cmd.MarkFlagRequired(flags.FlagFrom)
    84  	cmd.MarkFlagRequired(FlagPubKey)
    85  	cmd.MarkFlagRequired(FlagMoniker)
    86  
    87  	return cmd
    88  }
    89  
    90  // GetCmdEditValidator gets the create edit validator command
    91  // TODO: add full description
    92  func GetCmdEditValidator(cdc *codec.Codec) *cobra.Command {
    93  	cmd := &cobra.Command{
    94  		Use:   "edit-validator",
    95  		Short: "edit an existing validator account",
    96  		RunE: func(cmd *cobra.Command, args []string) error {
    97  			inBuf := bufio.NewReader(cmd.InOrStdin())
    98  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(auth.DefaultTxEncoder(cdc))
    99  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   100  
   101  			valAddr := cliCtx.GetFromAddress()
   102  			description := types.Description{
   103  				Moniker:  viper.GetString(FlagMoniker),
   104  				Identity: viper.GetString(FlagIdentity),
   105  				Website:  viper.GetString(FlagWebsite),
   106  				Details:  viper.GetString(FlagDetails),
   107  			}
   108  
   109  			// TODO: recover the msd modification later
   110  			//var newMinSelfDelegation *sdk.Int
   111  			//
   112  			//minSelfDelegationString := viper.GetString(FlagMinSelfDelegation)
   113  			//if minSelfDelegationString != "" {
   114  			//	msb, ok := sdk.NewIntFromString(minSelfDelegationString)
   115  			//	if !ok {
   116  			//		return fmt.Errorf(types.ErrMinSelfDelegationInvalid(types.DefaultCodespace).Error())
   117  			//	}
   118  			//	/* required by fbchain */
   119  			//	msb = msb.StandardizeAsc()
   120  			//
   121  			//	newMinSelfDelegation = &msb
   122  			//}
   123  			//
   124  			//msg := types.NewMsgEditValidator(sdk.ValAddress(valAddr), description, newRate, newMinSelfDelegation)
   125  			msg := types.NewMsgEditValidator(sdk.ValAddress(valAddr), description)
   126  
   127  			// build and sign the transaction, then broadcast to Tendermint
   128  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   129  		},
   130  	}
   131  
   132  	cmd.Flags().AddFlagSet(fsDescriptionEdit)
   133  	//cmd.Flags().AddFlagSet(fsCommissionUpdate)
   134  
   135  	return cmd
   136  }
   137  
   138  //__________________________________________________________
   139  
   140  var (
   141  // defaultTokens                  = sdk.TokensFromConsensusPower(100)
   142  // defaultAmount                  = defaultTokens.String() + sdk.DefaultBondDenom
   143  // defaultCommissionRate          = "0.1"
   144  // defaultCommissionMaxRate       = "0.2"
   145  // defaultCommissionMaxChangeRate = "0.01"
   146  )
   147  
   148  // CreateValidatorMsgHelpers returns the flagset, particular flags, and a description of defaults
   149  // this is anticipated to be used with the gen-tx
   150  func CreateValidatorMsgHelpers(ipDefault string) (fs *flag.FlagSet, nodeIDFlag, pubkeyFlag, amountFlag,
   151  	defaultsDesc string) {
   152  	fsCreateValidator := flag.NewFlagSet("", flag.ContinueOnError)
   153  	fsCreateValidator.String(FlagIP, ipDefault, "The node's public IP")
   154  	fsCreateValidator.String(FlagNodeID, "", "The node's NodeID")
   155  	fsCreateValidator.String(FlagWebsite, "", "The validator's (optional) website")
   156  	fsCreateValidator.String(FlagDetails, "", "The validator's (optional) details")
   157  	fsCreateValidator.String(FlagIdentity, "", "The (optional) identity signature (ex. UPort or Keybase)")
   158  	//fsCreateValidator.AddFlagSet(FsCommissionCreate)
   159  	//fsCreateValidator.AddFlagSet(FsMinSelfDelegation)
   160  	//fsCreateValidator.AddFlagSet(FsAmount)
   161  	fsCreateValidator.AddFlagSet(FsPk)
   162  
   163  	return fsCreateValidator, FlagNodeID, FlagPubKey, "", ""
   164  }
   165  
   166  // PrepareFlagsForTxCreateValidator prepares flags in config
   167  func PrepareFlagsForTxCreateValidator(
   168  	config *cfg.Config, nodeID, chainID string, valPubKey crypto.PubKey,
   169  ) {
   170  
   171  	ip := viper.GetString(FlagIP)
   172  	if ip == "" {
   173  		fmt.Fprintf(os.Stderr, "couldn't retrieve an external IP; "+
   174  			"the tx's memo field will be unset")
   175  	}
   176  
   177  	website := viper.GetString(FlagWebsite)
   178  	details := viper.GetString(FlagDetails)
   179  	identity := viper.GetString(FlagIdentity)
   180  
   181  	viper.Set(flags.FlagChainID, chainID)
   182  	viper.Set(flags.FlagFrom, viper.GetString(flags.FlagName))
   183  	viper.Set(FlagNodeID, nodeID)
   184  	viper.Set(FlagIP, ip)
   185  	viper.Set(FlagPubKey, types.MustBech32ifyConsPub(valPubKey))
   186  	viper.Set(FlagMoniker, config.Moniker)
   187  	viper.Set(FlagWebsite, website)
   188  	viper.Set(FlagDetails, details)
   189  	viper.Set(FlagIdentity, identity)
   190  
   191  	if config.Moniker == "" {
   192  		viper.Set(FlagMoniker, viper.GetString(flags.FlagName))
   193  	}
   194  	//if viper.GetString(FlagAmount) == "" {
   195  	//	viper.Set(FlagAmount, defaultAmount)
   196  	//}
   197  	//if viper.GetString(FlagCommissionRate) == "" {
   198  	//	viper.Set(FlagCommissionRate, defaultCommissionRate)
   199  	//}
   200  	//if viper.GetString(FlagCommissionMaxRate) == "" {
   201  	//	viper.Set(FlagCommissionMaxRate, defaultCommissionMaxRate)
   202  	//}
   203  	//if viper.GetString(FlagCommissionMaxChangeRate) == "" {
   204  	//	viper.Set(FlagCommissionMaxChangeRate, defaultCommissionMaxChangeRate)
   205  	//}
   206  	// if viper.GetString(FlagMinSelfDelegation) == "" {
   207  	//	viper.Set(FlagMinSelfDelegation, defaultMinSelfDelegation)
   208  	//}
   209  }
   210  
   211  // BuildCreateValidatorMsg makes a new MsgCreateValidator.
   212  func BuildCreateValidatorMsg(cliCtx context.CLIContext, txBldr auth.TxBuilder) (auth.TxBuilder, sdk.Msg, error) {
   213  
   214  	valAddr := cliCtx.GetFromAddress()
   215  	pkStr := viper.GetString(FlagPubKey)
   216  	pk, err := types.GetConsPubKeyBech32(pkStr)
   217  	if err != nil {
   218  		return txBldr, nil, err
   219  	}
   220  
   221  	description := types.NewDescription(
   222  		viper.GetString(FlagMoniker),
   223  		viper.GetString(FlagIdentity),
   224  		viper.GetString(FlagWebsite),
   225  		viper.GetString(FlagDetails),
   226  	)
   227  
   228  	// get the initial validator min self delegation
   229  	minSelfDelegation := sdk.NewDecCoinFromDec(common.NativeToken, types.DefaultMinSelfDelegation)
   230  
   231  	msg := types.NewMsgCreateValidator(
   232  		sdk.ValAddress(valAddr),
   233  		pk,
   234  		description,
   235  		minSelfDelegation,
   236  	)
   237  
   238  	if viper.GetBool(flags.FlagGenerateOnly) {
   239  		ip := viper.GetString(FlagIP)
   240  		nodeID := viper.GetString(FlagNodeID)
   241  		if nodeID != "" && ip != "" {
   242  			txBldr = txBldr.WithMemo(fmt.Sprintf("%s@%s:26656", nodeID, ip))
   243  		}
   244  	}
   245  
   246  	return txBldr, msg, nil
   247  }