-
Notifications
You must be signed in to change notification settings - Fork 12
/
tx.go
133 lines (122 loc) · 3.85 KB
/
tx.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package cli
import (
"encoding/hex"
"fmt"
"strings"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/client/tx"
cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/version"
"github.com/cosmos/cosmos-sdk/x/staking/client/cli"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
"github.com/spf13/cobra"
"github.com/functionx/fx-core/v5/x/staking/types"
)
// NewTxCmd returns a root CLI command handler for all x/staking transaction commands.
func NewTxCmd() *cobra.Command {
stakingTxCmd := &cobra.Command{
Use: stakingtypes.ModuleName,
Short: "Staking transaction subcommands",
DisableFlagParsing: true,
SuggestionsMinimumDistance: 2,
RunE: client.ValidateCmd,
}
stakingTxCmd.AddCommand(
cli.NewCreateValidatorCmd(),
cli.NewEditValidatorCmd(),
cli.NewDelegateCmd(),
cli.NewRedelegateCmd(),
cli.NewUnbondCmd(),
cli.NewCancelUnbondingDelegation(),
NewGrantPrivilegeCmd(),
NewEditConsensusPubKeyCmd(),
)
return stakingTxCmd
}
func NewGrantPrivilegeCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "grant-privilege [validator-address] [to-address]",
Short: "Grant validator privilege to an account",
Long: strings.TrimSpace(
fmt.Sprintf(`create a new grant authorization to an address to execute a transaction on validator:
Examples:
$ %s tx %s grant-privilege fxvaloper1.. fx1.. --from=fx1..
`, version.AppName, stakingtypes.ModuleName)),
Args: cobra.ExactArgs(2),
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientTxContext(cmd)
if err != nil {
return err
}
valAddr, err := sdk.ValAddressFromBech32(args[0])
if err != nil {
return err
}
fromAddr := clientCtx.GetFromAddress()
toAddr, err := sdk.AccAddressFromBech32(args[1])
if err != nil {
return err
}
toInfo, err := clientCtx.Keyring.KeyByAddress(toAddr)
if err != nil {
return err
}
// signature
sign, _, err := clientCtx.Keyring.Sign(toInfo.Name, types.GrantPrivilegeSignatureData(valAddr, fromAddr, toAddr))
if err != nil {
return fmt.Errorf("sign grant privilege signature error %v", err)
}
msg := &types.MsgGrantPrivilege{
ValidatorAddress: valAddr.String(),
FromAddress: fromAddr.String(),
ToPubkey: toInfo.PubKey,
Signature: hex.EncodeToString(sign),
}
if err = msg.ValidateBasic(); err != nil {
return err
}
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
},
}
flags.AddTxFlagsToCmd(cmd)
return cmd
}
func NewEditConsensusPubKeyCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "edit-consensus-pubkey [validator-address] [pubkey]",
Short: "Edit an existing validator consensus public key",
Long: strings.TrimSpace(
fmt.Sprintf(`edit an existing validator consensus public key:
Examples:
$ %s tx %s edit-consensus-pubkey fxvaloper1.. '{"@type":"/cosmos.crypto.ed25519.PubKey","key":"...."}' --from=fx1..
`, version.AppName, stakingtypes.ModuleName)),
Args: cobra.ExactArgs(2),
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientTxContext(cmd)
if err != nil {
return err
}
valAddr, err := sdk.ValAddressFromBech32(args[0])
if err != nil {
return err
}
fromAddr := clientCtx.GetFromAddress()
var pk cryptotypes.PubKey
if err := clientCtx.Codec.UnmarshalInterfaceJSON([]byte(args[1]), &pk); err != nil {
return err
}
msg, err := types.NewMsgEditConsensusPubKey(valAddr, fromAddr, pk)
if err != nil {
return err
}
if err := msg.ValidateBasic(); err != nil {
return err
}
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
},
}
flags.AddTxFlagsToCmd(cmd)
return cmd
}