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 }