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 }