153 lines
4.5 KiB
Go
153 lines
4.5 KiB
Go
// nolint
|
|
package cli
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/viper"
|
|
amino "github.com/tendermint/go-amino"
|
|
|
|
"github.com/cosmos/cosmos-sdk/client"
|
|
"github.com/cosmos/cosmos-sdk/client/context"
|
|
"github.com/cosmos/cosmos-sdk/client/utils"
|
|
"github.com/cosmos/cosmos-sdk/codec"
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
"github.com/cosmos/cosmos-sdk/version"
|
|
authtxb "github.com/cosmos/cosmos-sdk/x/auth/client/txbuilder"
|
|
|
|
"github.com/cosmos/cosmos-sdk/x/distribution/client/common"
|
|
"github.com/cosmos/cosmos-sdk/x/distribution/types"
|
|
)
|
|
|
|
var (
|
|
flagOnlyFromValidator = "only-from-validator"
|
|
flagIsValidator = "is-validator"
|
|
flagComission = "commission"
|
|
)
|
|
|
|
// GetTxCmd returns the transaction commands for this module
|
|
func GetTxCmd(storeKey string, cdc *amino.Codec) *cobra.Command {
|
|
distTxCmd := &cobra.Command{
|
|
Use: "dist",
|
|
Short: "Distribution transactions subcommands",
|
|
}
|
|
|
|
distTxCmd.AddCommand(client.PostCommands(
|
|
GetCmdWithdrawRewards(cdc),
|
|
GetCmdSetWithdrawAddr(cdc),
|
|
)...)
|
|
|
|
return distTxCmd
|
|
}
|
|
|
|
// command to withdraw rewards
|
|
func GetCmdWithdrawRewards(cdc *codec.Codec) *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "withdraw-rewards [validator-addr]",
|
|
Short: "Withdraw rewards from a given delegation address, and optionally withdraw validator commission if the delegation address given is a validator operator",
|
|
Long: strings.TrimSpace(
|
|
fmt.Sprintf(`Withdraw rewards from a given delegation address,
|
|
and optionally withdraw validator commission if the delegation address given is a validator operator.
|
|
|
|
Example:
|
|
$ %s tx distr withdraw-rewards cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj --from mykey
|
|
$ %s tx distr withdraw-rewards cosmosvaloper1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj --from mykey --commission
|
|
`,
|
|
version.ClientName, version.ClientName,
|
|
),
|
|
),
|
|
Args: cobra.ExactArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
txBldr := authtxb.NewTxBuilderFromCLI().WithTxEncoder(utils.GetTxEncoder(cdc))
|
|
cliCtx := context.NewCLIContext().
|
|
WithCodec(cdc).
|
|
WithAccountDecoder(cdc)
|
|
|
|
delAddr := cliCtx.GetFromAddress()
|
|
valAddr, err := sdk.ValAddressFromBech32(args[0])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
msgs := []sdk.Msg{types.NewMsgWithdrawDelegatorReward(delAddr, valAddr)}
|
|
if viper.GetBool(flagComission) {
|
|
msgs = append(msgs, types.NewMsgWithdrawValidatorCommission(valAddr))
|
|
}
|
|
|
|
return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, msgs)
|
|
},
|
|
}
|
|
cmd.Flags().Bool(flagComission, false, "also withdraw validator's commission")
|
|
return cmd
|
|
}
|
|
|
|
// command to withdraw all rewards
|
|
func GetCmdWithdrawAllRewards(cdc *codec.Codec, queryRoute string) *cobra.Command {
|
|
return &cobra.Command{
|
|
Use: "withdraw-all-rewards",
|
|
Short: "withdraw all delegations rewards for a delegator",
|
|
Long: strings.TrimSpace(
|
|
fmt.Sprintf(`Withdraw all rewards for a single delegator.
|
|
|
|
Example:
|
|
$ %s tx distr withdraw-all-rewards --from mykey
|
|
`,
|
|
version.ClientName,
|
|
),
|
|
),
|
|
Args: cobra.NoArgs,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
|
|
txBldr := authtxb.NewTxBuilderFromCLI().WithTxEncoder(utils.GetTxEncoder(cdc))
|
|
cliCtx := context.NewCLIContext().
|
|
WithCodec(cdc).
|
|
WithAccountDecoder(cdc)
|
|
|
|
delAddr := cliCtx.GetFromAddress()
|
|
msgs, err := common.WithdrawAllDelegatorRewards(cliCtx, cdc, queryRoute, delAddr)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, msgs)
|
|
},
|
|
}
|
|
}
|
|
|
|
// command to replace a delegator's withdrawal address
|
|
func GetCmdSetWithdrawAddr(cdc *codec.Codec) *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "set-withdraw-addr [withdraw-addr]",
|
|
Short: "change the default withdraw address for rewards associated with an address",
|
|
Long: strings.TrimSpace(
|
|
fmt.Sprintf(`Set the withdraw address for rewards associated with a delegator address.
|
|
|
|
Example:
|
|
$ %s tx set-withdraw-addr cosmos1gghjut3ccd8ay0zduzj64hwre2fxs9ld75ru9p --from mykey
|
|
`,
|
|
version.ClientName,
|
|
),
|
|
),
|
|
Args: cobra.ExactArgs(1),
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
|
|
txBldr := authtxb.NewTxBuilderFromCLI().WithTxEncoder(utils.GetTxEncoder(cdc))
|
|
cliCtx := context.NewCLIContext().
|
|
WithCodec(cdc).
|
|
WithAccountDecoder(cdc)
|
|
|
|
delAddr := cliCtx.GetFromAddress()
|
|
withdrawAddr, err := sdk.AccAddressFromBech32(args[0])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
msg := types.NewMsgSetWithdrawAddress(delAddr, withdrawAddr)
|
|
return utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
|
|
},
|
|
}
|
|
return cmd
|
|
}
|