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

     1  package cli
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"strings"
     7  
     8  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/flags"
     9  
    10  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context"
    11  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    12  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    13  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/version"
    14  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth"
    15  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/client/utils"
    16  	"github.com/fibonacci-chain/fbc/x/staking/types"
    17  	"github.com/spf13/cobra"
    18  )
    19  
    20  // GetCmdDestroyValidator gets command for destroying a validator and unbonding the min-self-delegation
    21  func GetCmdDestroyValidator(cdc *codec.Codec) *cobra.Command {
    22  	return &cobra.Command{
    23  		Use:   "destroy-validator [flags]",
    24  		Args:  cobra.NoArgs,
    25  		Short: "deregister the validator from the FbChain and unbond the min self delegation",
    26  		Long: strings.TrimSpace(
    27  			fmt.Sprintf(`Deregister the validator from the FbChain and unbond the min self delegation.
    28  
    29  Example:
    30  $ %s tx staking destroy-validator --from mykey
    31  `,
    32  				version.ClientName),
    33  		),
    34  		RunE: func(cmd *cobra.Command, args []string) error {
    35  			inBuf := bufio.NewReader(cmd.InOrStdin())
    36  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(auth.DefaultTxEncoder(cdc))
    37  			cliCtx := context.NewCLIContext().WithCodec(cdc)
    38  
    39  			delAddr := cliCtx.GetFromAddress()
    40  
    41  			msg := types.NewMsgDestroyValidator(delAddr)
    42  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
    43  
    44  		},
    45  	}
    46  }
    47  
    48  // GetCmdDeposit gets command for deposit
    49  func GetCmdDeposit(cdc *codec.Codec) *cobra.Command {
    50  	cmd := &cobra.Command{
    51  		Use:  "deposit [amount]",
    52  		Args: cobra.ExactArgs(1),
    53  		Short: fmt.Sprintf("deposit an amount of %s to delegator account; deposited %s in delegator account is a prerequisite for adding shares",
    54  			sdk.DefaultBondDenom, sdk.DefaultBondDenom),
    55  		Long: strings.TrimSpace(
    56  			fmt.Sprintf(`Deposit an amount of %s to delegator account. Deposited %s in delegator account is a prerequisite for adding shares.
    57  
    58  Example:
    59  $ %s tx staking deposit 1000%s --from mykey
    60  `,
    61  				sdk.DefaultBondDenom, sdk.DefaultBondDenom, version.ClientName, sdk.DefaultBondDenom,
    62  			),
    63  		),
    64  		RunE: func(cmd *cobra.Command, args []string) error {
    65  			inBuf := bufio.NewReader(cmd.InOrStdin())
    66  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(auth.DefaultTxEncoder(cdc))
    67  			cliCtx := context.NewCLIContext().WithCodec(cdc)
    68  
    69  			amount, err := sdk.ParseDecCoin(args[0])
    70  			if err != nil {
    71  				return err
    72  			}
    73  
    74  			delAddr := cliCtx.GetFromAddress()
    75  			msg := types.NewMsgDeposit(delAddr, amount)
    76  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
    77  		},
    78  	}
    79  	return cmd
    80  }
    81  
    82  // GetCmdWithdraw gets command for withdrawing the deposit
    83  func GetCmdWithdraw(cdc *codec.Codec) *cobra.Command {
    84  	cmd := &cobra.Command{
    85  		Use:   "withdraw [amount]",
    86  		Args:  cobra.ExactArgs(1),
    87  		Short: fmt.Sprintf("withdraw an amount of %s and the corresponding shares from all validators", sdk.DefaultBondDenom),
    88  		Long: strings.TrimSpace(
    89  			fmt.Sprintf(`Withdraw an amount of %s and the corresponding shares from all validators.
    90  
    91  Example:
    92  $ %s tx staking withdraw 1%s
    93  `,
    94  				sdk.DefaultBondDenom, version.ClientName, sdk.DefaultBondDenom,
    95  			),
    96  		),
    97  		RunE: func(cmd *cobra.Command, args []string) error {
    98  			inBuf := bufio.NewReader(cmd.InOrStdin())
    99  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(auth.DefaultTxEncoder(cdc))
   100  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   101  
   102  			amount, err := sdk.ParseDecCoin(args[0])
   103  			if err != nil {
   104  				return err
   105  			}
   106  
   107  			delAddr := cliCtx.GetFromAddress()
   108  			msg := types.NewMsgWithdraw(delAddr, amount)
   109  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   110  		},
   111  	}
   112  	return cmd
   113  }
   114  
   115  // GetCmdAddShares gets command for multi voting
   116  func GetCmdAddShares(cdc *codec.Codec) *cobra.Command {
   117  	return &cobra.Command{
   118  		Use:   "add-shares [validator-addr1, validator-addr2, validator-addr3, ... validator-addrN] [flags]",
   119  		Args:  cobra.ExactArgs(1),
   120  		Short: fmt.Sprintf("add shares to one or more validators by all deposited %s", sdk.DefaultBondDenom),
   121  		Long: strings.TrimSpace(
   122  			fmt.Sprintf("Add shares to one or more validators by all deposited %s.\n\nExample:\n$ %s tx staking add-shares "+
   123  				"fbvaloper1alq9na49n9yycysh889rl90g9nhe58lcqkfpfg,"+
   124  				"fbvaloper1svzxp4ts5le2s4zugx34ajt6shz2hg42dnwst5,"+
   125  				"fbvaloper10q0rk5qnyag7wfvvt7rtphlw589m7frshchly8,"+
   126  				"fbvaloper1g7znsf24w4jc3xfca88pq9kmlyjdare6tr3mk6 --from mykey\n",
   127  				sdk.DefaultBondDenom, version.ClientName),
   128  		),
   129  		RunE: func(cmd *cobra.Command, args []string) error {
   130  			inBuf := bufio.NewReader(cmd.InOrStdin())
   131  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(auth.DefaultTxEncoder(cdc))
   132  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   133  
   134  			delAddr := cliCtx.GetFromAddress()
   135  			valAddrs, err := getValsSet(args[0])
   136  			if err != nil {
   137  				return err
   138  			}
   139  
   140  			msg := types.NewMsgAddShares(delAddr, valAddrs)
   141  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   142  
   143  		},
   144  	}
   145  }
   146  
   147  // GetCmdProxy gets subcommands for proxy voting
   148  func GetCmdProxy(cdc *codec.Codec) *cobra.Command {
   149  
   150  	proxyCmd := &cobra.Command{
   151  		Use:   "proxy",
   152  		Short: "proxy subcommands",
   153  	}
   154  
   155  	proxyCmd.AddCommand(
   156  		flags.PostCommands(
   157  			GetCmdRegProxy(cdc),
   158  			GetCmdUnregProxy(cdc),
   159  			GetCmdBindProxy(cdc),
   160  			GetCmdUnbindProxy(cdc),
   161  		)...)
   162  
   163  	return proxyCmd
   164  }
   165  
   166  // GetCmdRegProxy gets command for proxy registering
   167  func GetCmdRegProxy(cdc *codec.Codec) *cobra.Command {
   168  	return &cobra.Command{
   169  		Use:   "reg [flags]",
   170  		Args:  cobra.ExactArgs(0),
   171  		Short: "become a proxy by registration",
   172  		Long: strings.TrimSpace(
   173  			fmt.Sprintf(`Become a proxy by registration.
   174  
   175  Example:
   176  $ %s tx staking proxy reg --from mykey
   177  `,
   178  				version.ClientName),
   179  		),
   180  		RunE: func(cmd *cobra.Command, args []string) error {
   181  			inBuf := bufio.NewReader(cmd.InOrStdin())
   182  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(auth.DefaultTxEncoder(cdc))
   183  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   184  
   185  			delAddr := cliCtx.GetFromAddress()
   186  
   187  			msg := types.NewMsgRegProxy(delAddr, true)
   188  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   189  		},
   190  	}
   191  }
   192  
   193  // GetCmdUnregProxy gets command for proxy unregistering
   194  func GetCmdUnregProxy(cdc *codec.Codec) *cobra.Command {
   195  	return &cobra.Command{
   196  		Use:   "unreg [flags]",
   197  		Args:  cobra.ExactArgs(0),
   198  		Short: "unregister the proxy identity",
   199  		Long: strings.TrimSpace(
   200  			fmt.Sprintf(`Unregister the proxy identity.
   201  
   202  Example:
   203  $ %s tx staking proxy unreg --from mykey
   204  `,
   205  				version.ClientName),
   206  		),
   207  		RunE: func(cmd *cobra.Command, args []string) error {
   208  			inBuf := bufio.NewReader(cmd.InOrStdin())
   209  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(auth.DefaultTxEncoder(cdc))
   210  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   211  
   212  			delAddr := cliCtx.GetFromAddress()
   213  
   214  			msg := types.NewMsgRegProxy(delAddr, false)
   215  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   216  		},
   217  	}
   218  }
   219  
   220  // GetCmdBindProxy gets command for binding proxy
   221  func GetCmdBindProxy(cdc *codec.Codec) *cobra.Command {
   222  	return &cobra.Command{
   223  		Use:   "bind [flags]",
   224  		Args:  cobra.ExactArgs(1),
   225  		Short: "bind proxy relationship",
   226  		Long: strings.TrimSpace(
   227  			fmt.Sprintf(`Bind proxy relationship.
   228  
   229  Example:
   230  $ %s tx staking proxy bind fb1cftp8q8g4aa65nw9s5trwexe77d9t6cr8ndu02 --from mykey
   231  `,
   232  				version.ClientName),
   233  		),
   234  		RunE: func(cmd *cobra.Command, args []string) error {
   235  			inBuf := bufio.NewReader(cmd.InOrStdin())
   236  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(auth.DefaultTxEncoder(cdc))
   237  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   238  
   239  			delAddr := cliCtx.GetFromAddress()
   240  
   241  			proxyAddress, err := sdk.AccAddressFromBech32(args[0])
   242  			if err != nil {
   243  				return fmt.Errorf("invalid address:%s", args[0])
   244  			}
   245  			msg := types.NewMsgBindProxy(delAddr, proxyAddress)
   246  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   247  		},
   248  	}
   249  }
   250  
   251  // GetCmdUnbindProxy gets command for unbinding proxy
   252  func GetCmdUnbindProxy(cdc *codec.Codec) *cobra.Command {
   253  	return &cobra.Command{
   254  		Use:   "unbind [flags]",
   255  		Args:  cobra.ExactArgs(0),
   256  		Short: "unbind proxy relationship",
   257  		Long: strings.TrimSpace(
   258  			fmt.Sprintf(`Unbind proxy relationship.
   259  
   260  Example:
   261  $ %s tx staking proxy unbind --from mykey
   262  `,
   263  				version.ClientName),
   264  		),
   265  		RunE: func(cmd *cobra.Command, args []string) error {
   266  			inBuf := bufio.NewReader(cmd.InOrStdin())
   267  			txBldr := auth.NewTxBuilderFromCLI(inBuf).WithTxEncoder(auth.DefaultTxEncoder(cdc))
   268  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   269  
   270  			delAddr := cliCtx.GetFromAddress()
   271  
   272  			msg := types.NewMsgUnbindProxy(delAddr)
   273  			return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   274  		},
   275  	}
   276  }
   277  
   278  // getValsSet gets validator set from client args
   279  func getValsSet(address string) (valAddrs []sdk.ValAddress, err error) {
   280  	addrs := strings.Split(strings.TrimSpace(address), ",")
   281  	lenVals := len(addrs)
   282  	valAddrs = make([]sdk.ValAddress, lenVals)
   283  	for i := 0; i < lenVals; i++ {
   284  		valAddrs[i], err = sdk.ValAddressFromBech32(addrs[i])
   285  		if err != nil {
   286  			return nil, fmt.Errorf("invalid target validator address: %s", addrs[i])
   287  		}
   288  	}
   289  	return
   290  }