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 }