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  }