cosmos-sdk/x/stake/client/cli/tx.go

200 lines
5.7 KiB
Go
Raw Normal View History

2018-04-25 07:18:06 -07:00
package cli
2018-02-24 05:19:32 -08:00
import (
"encoding/hex"
"fmt"
"github.com/spf13/cobra"
"github.com/spf13/viper"
crypto "github.com/tendermint/go-crypto"
"github.com/cosmos/cosmos-sdk/client/context"
2018-02-25 15:45:20 -08:00
sdk "github.com/cosmos/cosmos-sdk/types"
2018-03-17 09:22:11 -07:00
"github.com/cosmos/cosmos-sdk/wire"
2018-04-25 07:18:06 -07:00
authcmd "github.com/cosmos/cosmos-sdk/x/auth/client/cli"
2018-02-25 15:45:20 -08:00
"github.com/cosmos/cosmos-sdk/x/stake"
2018-02-24 05:19:32 -08:00
)
2018-03-17 09:22:11 -07:00
// create declare candidacy command
func GetCmdDeclareCandidacy(cdc *wire.Codec) *cobra.Command {
cmd := &cobra.Command{
2018-05-17 08:12:28 -07:00
Use: "create-validator",
Short: "create new validator initialized with a self-delegation to it",
2018-03-17 09:22:11 -07:00
RunE: func(cmd *cobra.Command, args []string) error {
ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc))
2018-03-17 09:22:11 -07:00
amount, err := sdk.ParseCoin(viper.GetString(FlagAmount))
if err != nil {
return err
}
validatorAddr, err := sdk.GetValAddressBech32Cosmos(viper.GetString(FlagAddressValidator))
2018-03-17 09:22:11 -07:00
if err != nil {
return err
}
pkStr := viper.GetString(FlagPubKey)
if len(pkStr) == 0 {
return fmt.Errorf("must use --pubkey flag")
}
pkBytes, err := hex.DecodeString(pkStr)
2018-03-17 09:22:11 -07:00
if err != nil {
return err
}
pk, err := crypto.PubKeyFromBytes(pkBytes)
if err != nil {
return err
}
2018-03-17 09:22:11 -07:00
if viper.GetString(FlagMoniker) == "" {
2018-05-17 08:12:28 -07:00
return fmt.Errorf("please enter a moniker for the validator using --moniker")
2018-03-17 09:22:11 -07:00
}
description := stake.Description{
Moniker: viper.GetString(FlagMoniker),
Identity: viper.GetString(FlagIdentity),
Website: viper.GetString(FlagWebsite),
Details: viper.GetString(FlagDetails),
}
2018-05-09 21:01:58 -07:00
msg := stake.NewMsgDeclareCandidacy(validatorAddr, pk, amount, description)
2018-03-17 09:22:11 -07:00
// build and sign the transaction, then broadcast to Tendermint
2018-04-18 21:49:24 -07:00
res, err := ctx.EnsureSignBuildBroadcast(ctx.FromAddressName, msg, cdc)
2018-03-17 09:22:11 -07:00
if err != nil {
return err
}
fmt.Printf("Committed at block %d. Hash: %s\n", res.Height, res.Hash.String())
return nil
},
}
cmd.Flags().AddFlagSet(fsPk)
cmd.Flags().AddFlagSet(fsAmount)
cmd.Flags().AddFlagSet(fsDescription)
2018-05-09 21:01:58 -07:00
cmd.Flags().AddFlagSet(fsValidator)
2018-03-17 09:22:11 -07:00
return cmd
2018-02-24 05:19:32 -08:00
}
2018-03-17 09:22:11 -07:00
// create edit candidacy command
func GetCmdEditCandidacy(cdc *wire.Codec) *cobra.Command {
cmd := &cobra.Command{
2018-05-17 08:12:28 -07:00
Use: "edit-validator",
Short: "edit and existing validator account",
2018-03-17 09:22:11 -07:00
RunE: func(cmd *cobra.Command, args []string) error {
validatorAddr, err := sdk.GetValAddressBech32Cosmos(viper.GetString(FlagAddressValidator))
2018-03-17 09:22:11 -07:00
if err != nil {
return err
}
description := stake.Description{
Moniker: viper.GetString(FlagMoniker),
Identity: viper.GetString(FlagIdentity),
Website: viper.GetString(FlagWebsite),
Details: viper.GetString(FlagDetails),
}
2018-05-09 21:01:58 -07:00
msg := stake.NewMsgEditCandidacy(validatorAddr, description)
2018-03-17 09:22:11 -07:00
// build and sign the transaction, then broadcast to Tendermint
ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc))
2018-04-18 21:49:24 -07:00
res, err := ctx.EnsureSignBuildBroadcast(ctx.FromAddressName, msg, cdc)
2018-03-17 09:22:11 -07:00
if err != nil {
return err
}
fmt.Printf("Committed at block %d. Hash: %s\n", res.Height, res.Hash.String())
return nil
},
}
cmd.Flags().AddFlagSet(fsDescription)
2018-05-09 21:01:58 -07:00
cmd.Flags().AddFlagSet(fsValidator)
2018-03-17 09:22:11 -07:00
return cmd
}
2018-02-24 05:19:32 -08:00
2018-03-17 09:22:11 -07:00
// create edit candidacy command
func GetCmdDelegate(cdc *wire.Codec) *cobra.Command {
cmd := &cobra.Command{
Use: "delegate",
2018-05-17 08:12:28 -07:00
Short: "delegate coins to an existing validator",
2018-03-17 09:22:11 -07:00
RunE: func(cmd *cobra.Command, args []string) error {
amount, err := sdk.ParseCoin(viper.GetString(FlagAmount))
if err != nil {
return err
}
2018-02-24 05:19:32 -08:00
delegatorAddr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressDelegator))
validatorAddr, err := sdk.GetValAddressBech32Cosmos(viper.GetString(FlagAddressValidator))
2018-03-17 09:22:11 -07:00
if err != nil {
return err
}
2018-02-24 05:19:32 -08:00
2018-05-09 21:01:58 -07:00
msg := stake.NewMsgDelegate(delegatorAddr, validatorAddr, amount)
2018-02-24 05:19:32 -08:00
2018-03-17 09:22:11 -07:00
// build and sign the transaction, then broadcast to Tendermint
ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc))
2018-04-18 21:49:24 -07:00
res, err := ctx.EnsureSignBuildBroadcast(ctx.FromAddressName, msg, cdc)
2018-03-17 09:22:11 -07:00
if err != nil {
return err
}
2018-02-24 05:19:32 -08:00
2018-03-17 09:22:11 -07:00
fmt.Printf("Committed at block %d. Hash: %s\n", res.Height, res.Hash.String())
return nil
},
2018-02-24 05:19:32 -08:00
}
2018-03-17 09:22:11 -07:00
cmd.Flags().AddFlagSet(fsAmount)
2018-03-20 14:21:18 -07:00
cmd.Flags().AddFlagSet(fsDelegator)
2018-05-09 21:01:58 -07:00
cmd.Flags().AddFlagSet(fsValidator)
2018-03-17 09:22:11 -07:00
return cmd
2018-02-24 05:19:32 -08:00
}
2018-03-17 09:22:11 -07:00
// create edit candidacy command
func GetCmdUnbond(cdc *wire.Codec) *cobra.Command {
cmd := &cobra.Command{
Use: "unbond",
2018-05-17 08:12:28 -07:00
Short: "unbond shares from a validator",
2018-03-17 09:22:11 -07:00
RunE: func(cmd *cobra.Command, args []string) error {
// check the shares before broadcasting
sharesStr := viper.GetString(FlagShares)
var shares sdk.Rat
if sharesStr != "MAX" {
var err error
shares, err = sdk.NewRatFromDecimal(sharesStr)
if err != nil {
return err
}
2018-04-30 14:21:14 -07:00
if !shares.GT(sdk.ZeroRat()) {
2018-03-17 09:22:11 -07:00
return fmt.Errorf("shares must be positive integer or decimal (ex. 123, 1.23456789)")
}
}
delegatorAddr, err := sdk.GetAccAddressBech32Cosmos(viper.GetString(FlagAddressDelegator))
validatorAddr, err := sdk.GetValAddressBech32Cosmos(viper.GetString(FlagAddressValidator))
2018-03-17 09:22:11 -07:00
if err != nil {
return err
}
2018-05-09 21:01:58 -07:00
msg := stake.NewMsgUnbond(delegatorAddr, validatorAddr, sharesStr)
2018-03-17 09:22:11 -07:00
// build and sign the transaction, then broadcast to Tendermint
ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc))
2018-04-18 21:49:24 -07:00
res, err := ctx.EnsureSignBuildBroadcast(ctx.FromAddressName, msg, cdc)
2018-03-17 09:22:11 -07:00
if err != nil {
return err
}
fmt.Printf("Committed at block %d. Hash: %s\n", res.Height, res.Hash.String())
return nil
},
}
cmd.Flags().AddFlagSet(fsShares)
2018-03-20 14:21:18 -07:00
cmd.Flags().AddFlagSet(fsDelegator)
2018-05-09 21:01:58 -07:00
cmd.Flags().AddFlagSet(fsValidator)
2018-03-17 09:22:11 -07:00
return cmd
2018-02-24 05:19:32 -08:00
}