github.com/Finschia/finschia-sdk@v0.49.1/x/fbridge/client/cli/tx.go (about) 1 package cli 2 3 import ( 4 "fmt" 5 "strconv" 6 7 "github.com/spf13/cobra" 8 9 "github.com/Finschia/finschia-sdk/client" 10 "github.com/Finschia/finschia-sdk/client/flags" 11 "github.com/Finschia/finschia-sdk/client/tx" 12 sdk "github.com/Finschia/finschia-sdk/types" 13 sdkerrors "github.com/Finschia/finschia-sdk/types/errors" 14 "github.com/Finschia/finschia-sdk/version" 15 "github.com/Finschia/finschia-sdk/x/fbridge/types" 16 ) 17 18 // NewTxCmd returns the transaction commands for fbridge module 19 func NewTxCmd() *cobra.Command { 20 TxCmd := &cobra.Command{ 21 Use: types.ModuleName, 22 Short: "fbridge transactions subcommands", 23 DisableFlagParsing: true, 24 SuggestionsMinimumDistance: 2, 25 RunE: client.ValidateCmd, 26 } 27 28 TxCmd.AddCommand( 29 NewTransferTxCmd(), 30 NewSuggestRoleTxCmd(), 31 NewAddVoteForRoleTxCmd(), 32 NewSetBridgeStatusTxCmd(), 33 ) 34 35 return TxCmd 36 } 37 38 func NewTransferTxCmd() *cobra.Command { 39 cmd := &cobra.Command{ 40 Use: "transfer [to_address] [amount]", 41 Short: `Transfer token from current chain to counterparty chain`, 42 Example: fmt.Sprintf("%s tx %s transfer link1... 1000cony --from mykey", version.AppName, types.ModuleName), 43 Args: cobra.ExactArgs(2), 44 RunE: func(cmd *cobra.Command, args []string) error { 45 clientCtx, err := client.GetClientTxContext(cmd) 46 if err != nil { 47 return err 48 } 49 fromAddr := clientCtx.GetFromAddress().String() 50 if _, err := sdk.AccAddressFromBech32(fromAddr); err != nil { 51 return sdkerrors.ErrInvalidAddress.Wrapf("invalid address: %s", fromAddr) 52 } 53 toAddr := args[0] 54 coins, err := sdk.ParseCoinsNormalized(args[1]) 55 if err != nil { 56 return err 57 } 58 if len(coins) != 1 { 59 return sdkerrors.ErrInvalidRequest.Wrapf("only one native coin type is allowed") 60 } 61 62 msg := types.MsgTransfer{ 63 Sender: fromAddr, 64 Receiver: toAddr, 65 Amount: coins[0].Amount, 66 } 67 68 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg) 69 }, 70 } 71 72 flags.AddTxFlagsToCmd(cmd) 73 74 return cmd 75 } 76 77 func NewSuggestRoleTxCmd() *cobra.Command { 78 cmd := &cobra.Command{ 79 Use: "suggest-role [target_address] [role]", 80 Short: `Suggest a role to a specific address (unspecified|guardian|operator|judge)`, 81 Args: cobra.ExactArgs(2), 82 Example: fmt.Sprintf("%s tx %s suggest-role link1... guardian --from guardiankey", version.AppName, types.ModuleName), 83 RunE: func(cmd *cobra.Command, args []string) error { 84 clientCtx, err := client.GetClientTxContext(cmd) 85 if err != nil { 86 return err 87 } 88 from := clientCtx.GetFromAddress().String() 89 if _, err := sdk.AccAddressFromBech32(from); err != nil { 90 return sdkerrors.ErrInvalidAddress.Wrapf("invalid address: %s", from) 91 } 92 target := args[0] 93 role, found := types.QueryParamToRole[args[1]] 94 if !found { 95 return sdkerrors.ErrInvalidRequest.Wrapf("invalid role: %s", args[1]) 96 } 97 98 msg := types.MsgSuggestRole{ 99 From: from, 100 Target: target, 101 Role: role, 102 } 103 104 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg) 105 }, 106 } 107 108 flags.AddTxFlagsToCmd(cmd) 109 110 return cmd 111 } 112 113 func NewAddVoteForRoleTxCmd() *cobra.Command { 114 cmd := &cobra.Command{ 115 Use: "add-vote-for-role [proposal_id] [option]", 116 Short: `Vote for a role proposal (yes|no)`, 117 Args: cobra.ExactArgs(2), 118 Example: fmt.Sprintf("%s tx %s add-vote-for-role 1 yes --from guardiankey", version.AppName, types.ModuleName), 119 RunE: func(cmd *cobra.Command, args []string) error { 120 clientCtx, err := client.GetClientTxContext(cmd) 121 if err != nil { 122 return err 123 } 124 from := clientCtx.GetFromAddress().String() 125 if _, err := sdk.AccAddressFromBech32(from); err != nil { 126 return sdkerrors.ErrInvalidAddress.Wrapf("invalid address: %s", from) 127 } 128 proposalID, err := strconv.ParseUint(args[0], 10, 64) 129 if err != nil { 130 return sdkerrors.ErrInvalidRequest.Wrapf("invalid proposal ID: %s", args[0]) 131 } 132 133 voteOpts := map[string]types.VoteOption{ 134 "yes": types.OptionYes, 135 "no": types.OptionNo, 136 } 137 option, found := voteOpts[args[1]] 138 if !found { 139 return sdkerrors.ErrInvalidRequest.Wrapf("invalid vote option: %s", args[1]) 140 } 141 142 msg := types.MsgAddVoteForRole{ 143 From: from, 144 ProposalId: proposalID, 145 Option: option, 146 } 147 148 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg) 149 }, 150 } 151 152 flags.AddTxFlagsToCmd(cmd) 153 154 return cmd 155 } 156 157 func NewSetBridgeStatusTxCmd() *cobra.Command { 158 cmd := &cobra.Command{ 159 Use: "set-bridge-status [status]", 160 Short: `Set sender's bridge switch for halting/resuming the bridge module. Each guardian has their own switch. (halt|resume)`, 161 Args: cobra.ExactArgs(1), 162 Example: fmt.Sprintf("%s tx %s set-bridge-status halt --from guardiankey\n"+ 163 "%s tx %s set-bridge-status resume --from guardiankey\n", version.AppName, types.ModuleName, version.AppName, types.ModuleName), 164 RunE: func(cmd *cobra.Command, args []string) error { 165 clientCtx, err := client.GetClientTxContext(cmd) 166 if err != nil { 167 return err 168 } 169 from := clientCtx.GetFromAddress().String() 170 if _, err := sdk.AccAddressFromBech32(from); err != nil { 171 return sdkerrors.ErrInvalidAddress.Wrapf("invalid address: %s", from) 172 } 173 174 conv := map[string]types.BridgeStatus{ 175 "halt": types.StatusInactive, 176 "resume": types.StatusActive, 177 } 178 179 msg := types.MsgSetBridgeStatus{ 180 Guardian: from, 181 Status: conv[args[0]], 182 } 183 184 return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), &msg) 185 }, 186 } 187 188 flags.AddTxFlagsToCmd(cmd) 189 190 return cmd 191 }