github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/order/client/cli/tx.go (about)

     1  package cli
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"strings"
     7  
     8  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/context"
     9  	client "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/client/flags"
    10  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec"
    11  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    12  	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/client/utils"
    13  	authtxb "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/types"
    14  	"github.com/fibonacci-chain/fbc/x/order/types"
    15  	"github.com/pkg/errors"
    16  	"github.com/spf13/cobra"
    17  )
    18  
    19  // GetTxCmd returns the transaction commands for this module
    20  func GetTxCmd(cdc *codec.Codec) *cobra.Command {
    21  	txCmd := &cobra.Command{
    22  		Use:   "order",
    23  		Short: "Order transactions subcommands",
    24  	}
    25  
    26  	txCmd.AddCommand(client.PostCommands(
    27  		getCmdNewOrder(cdc),
    28  		getCmdCancelOrder(cdc),
    29  	)...)
    30  
    31  	return txCmd
    32  }
    33  
    34  func getCmdNewOrder(cdc *codec.Codec) *cobra.Command {
    35  	// new order flags
    36  	var product string
    37  	var side string
    38  	var price string
    39  	var quantity string
    40  	cmd := &cobra.Command{
    41  		Use:   "new",
    42  		Short: "place a new order",
    43  		RunE: func(cmd *cobra.Command, args []string) error {
    44  			if len(product) == 0 || len(side) == 0 || len(price) == 0 || len(quantity) == 0 {
    45  				return errors.New("invalid param format")
    46  			}
    47  			if len(args) > 0 {
    48  				return errors.New(`invalid param format. tips:use comma "," to place multi orders`)
    49  			}
    50  			productArr := strings.Split(product, ",")
    51  
    52  			if len(productArr) == 0 {
    53  				return errors.New("invalid param counts")
    54  			}
    55  
    56  			err := handleNewOrder(cmd, cdc, product, side, price, quantity)
    57  			return err
    58  
    59  		},
    60  	}
    61  
    62  	cmd.Flags().StringVarP(&product, "product", "", "", "Trading pair in full name of the tokens: ${baseAssetSymbol}_${quoteAssetSymbol}, for example \"mycoin_fibo\".")
    63  	cmd.Flags().StringVarP(&side, "side", "s", "", "BUY or SELL (default \"SELL\")")
    64  	cmd.Flags().StringVarP(&price, "price", "p", "", "The price of the order")
    65  	cmd.Flags().StringVarP(&quantity, "quantity", "q", "", "The quantity of the order")
    66  	return cmd
    67  }
    68  
    69  func handleNewOrder(cmd *cobra.Command, cdc *codec.Codec, product string, side string, price string, quantity string) error {
    70  	var items []types.OrderItem
    71  	productArr := strings.Split(product, ",")
    72  	sideArr := strings.Split(side, ",")
    73  	priceArr := strings.Split(price, ",")
    74  	quantityArr := strings.Split(quantity, ",")
    75  	if len(productArr) != len(sideArr) {
    76  		return errors.New("invalid param side counts")
    77  	}
    78  
    79  	if len(productArr) != len(priceArr) {
    80  		return errors.New("invalid param price counts")
    81  	}
    82  
    83  	if len(productArr) != len(quantityArr) {
    84  		return errors.New("invalid param quantity counts")
    85  	}
    86  
    87  	for i := 0; i < len(productArr); i++ {
    88  		product := productArr[i]
    89  		side := sideArr[i]
    90  		price, err := sdk.NewDecFromStr(priceArr[i])
    91  		if err != nil {
    92  			return errors.New(err.Error())
    93  		}
    94  		quantity, err := sdk.NewDecFromStr(quantityArr[i])
    95  		if err != nil {
    96  			return errors.New(err.Error())
    97  		}
    98  		items = append(items, types.OrderItem{
    99  			Product:  product,
   100  			Side:     side,
   101  			Price:    price,
   102  			Quantity: quantity,
   103  		})
   104  	}
   105  	inBuf := bufio.NewReader(cmd.InOrStdin())
   106  	txBldr := authtxb.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
   107  	cliCtx := context.NewCLIContext().WithCodec(cdc)
   108  
   109  	msg := types.NewMsgNewOrders(cliCtx.GetFromAddress(), items)
   110  	err := utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   111  	return err
   112  }
   113  
   114  func getCmdCancelOrder(cdc *codec.Codec) *cobra.Command {
   115  	return &cobra.Command{
   116  		Use:   "cancel [order-id]",
   117  		Short: "cancel order",
   118  		Args:  cobra.ExactArgs(1),
   119  		RunE: func(cmd *cobra.Command, args []string) error {
   120  			orderIDs := strings.Split(args[0], ",")
   121  			inBuf := bufio.NewReader(cmd.InOrStdin())
   122  			txBldr := authtxb.NewTxBuilderFromCLI(inBuf).WithTxEncoder(utils.GetTxEncoder(cdc))
   123  			cliCtx := context.NewCLIContext().WithCodec(cdc)
   124  
   125  			msg := types.NewMsgCancelOrders(cliCtx.GetFromAddress(), orderIDs)
   126  			err := utils.GenerateOrBroadcastMsgs(cliCtx, txBldr, []sdk.Msg{msg})
   127  			if err != nil {
   128  				fmt.Println(err)
   129  			}
   130  			return err
   131  		},
   132  	}
   133  }