github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/order/types/msgs.go (about) 1 package types 2 3 import ( 4 "strings" 5 6 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 7 ) 8 9 // nolint 10 const ( 11 OrderItemLimit = 200 12 MultiCancelOrderItemLimit = 200 13 ) 14 15 // nolint 16 type MsgNewOrder struct { 17 Sender sdk.AccAddress `json:"sender"` // order maker address 18 Product string `json:"product"` // product for trading pair in full name of the tokens 19 Side string `json:"side"` // BUY/SELL 20 Price sdk.Dec `json:"price"` // price of the order 21 Quantity sdk.Dec `json:"quantity"` // quantity of the order 22 } 23 24 // NewMsgNewOrder is a constructor function for MsgNewOrder 25 func NewMsgNewOrder(sender sdk.AccAddress, product string, side string, price string, 26 quantity string) MsgNewOrders { 27 28 return MsgNewOrders{ 29 Sender: sender, 30 OrderItems: []OrderItem{ 31 { 32 Product: product, 33 Side: side, 34 Price: sdk.MustNewDecFromStr(price), 35 Quantity: sdk.MustNewDecFromStr(quantity), 36 }, 37 }, 38 } 39 } 40 41 // nolint 42 type MsgCancelOrder struct { 43 Sender sdk.AccAddress `json:"sender"` 44 OrderID string `json:"order_id"` 45 } 46 47 // NewMsgCancelOrder is a constructor function for MsgCancelOrder 48 func NewMsgCancelOrder(sender sdk.AccAddress, orderID string) MsgCancelOrders { 49 msgCancelOrder := MsgCancelOrders{ 50 Sender: sender, 51 OrderIDs: []string{orderID}, 52 } 53 return msgCancelOrder 54 } 55 56 // ********************MsgNewOrders************* 57 // nolint 58 type MsgNewOrders struct { 59 Sender sdk.AccAddress `json:"sender"` // order maker address 60 OrderItems []OrderItem `json:"order_items"` 61 } 62 63 // nolint 64 type OrderItem struct { 65 Product string `json:"product"` // product for trading pair in full name of the tokens 66 Side string `json:"side"` // BUY/SELL 67 Price sdk.Dec `json:"price"` // price of the order 68 Quantity sdk.Dec `json:"quantity"` // quantity of the order 69 } 70 71 // nolint 72 func NewOrderItem(product string, side string, price string, 73 quantity string) OrderItem { 74 return OrderItem{ 75 Product: product, 76 Side: side, 77 Price: sdk.MustNewDecFromStr(price), 78 Quantity: sdk.MustNewDecFromStr(quantity), 79 } 80 } 81 82 // NewMsgNewOrders is a constructor function for MsgNewOrder 83 func NewMsgNewOrders(sender sdk.AccAddress, orderItems []OrderItem) MsgNewOrders { 84 return MsgNewOrders{ 85 Sender: sender, 86 OrderItems: orderItems, 87 } 88 } 89 90 // nolint 91 func (msg MsgNewOrders) Route() string { return "order" } 92 93 // nolint 94 func (msg MsgNewOrders) Type() string { return "new" } 95 96 // ValidateBasic : Implements Msg. 97 func (msg MsgNewOrders) ValidateBasic() sdk.Error { 98 if msg.Sender.Empty() { 99 return ErrInvalidAddress(msg.Sender.String()) 100 } 101 if msg.OrderItems == nil || len(msg.OrderItems) == 0 { 102 return ErrOrderItemCountsIsEmpty() 103 } 104 if len(msg.OrderItems) > OrderItemLimit { 105 return ErrOrderItemCountsBiggerThanLimit(OrderItemLimit) 106 } 107 for _, item := range msg.OrderItems { 108 if len(item.Product) == 0 { 109 return ErrOrderItemProductCountsIsEmpty() 110 } 111 symbols := strings.Split(item.Product, "_") 112 if len(symbols) != 2 { 113 return ErrOrderItemProductFormat() 114 } 115 if symbols[0] == symbols[1] { 116 return ErrOrderItemProductSymbolIsEqual() 117 } 118 if item.Side != BuyOrder && item.Side != SellOrder { 119 return ErrOrderItemSideIsNotBuyAndSell() 120 } 121 if !(item.Price.IsPositive() && item.Quantity.IsPositive()) { 122 return ErrOrderItemPriceOrQuantityIsNotPositive() 123 } 124 } 125 126 return nil 127 } 128 129 // GetSignBytes : encodes the message for signing 130 func (msg MsgNewOrders) GetSignBytes() []byte { 131 bz := ModuleCdc.MustMarshalJSON(msg) 132 return sdk.MustSortJSON(bz) 133 } 134 135 // GetSigners defines whose signature is required 136 func (msg MsgNewOrders) GetSigners() []sdk.AccAddress { 137 return []sdk.AccAddress{msg.Sender} 138 } 139 140 // Calculate customize gas 141 func (msg MsgNewOrders) CalculateGas(gasUnit uint64) uint64 { 142 return uint64(len(msg.OrderItems)) * gasUnit 143 } 144 145 // nolint 146 type MsgCancelOrders struct { 147 Sender sdk.AccAddress `json:"sender"` // order maker address 148 OrderIDs []string `json:"order_ids"` 149 } 150 151 // NewMsgCancelOrders is a constructor function for MsgCancelOrder 152 func NewMsgCancelOrders(sender sdk.AccAddress, orderIDItems []string) MsgCancelOrders { 153 msgCancelOrder := MsgCancelOrders{ 154 Sender: sender, 155 OrderIDs: orderIDItems, 156 } 157 return msgCancelOrder 158 } 159 160 // nolint 161 func (msg MsgCancelOrders) Route() string { return "order" } 162 163 // nolint 164 func (msg MsgCancelOrders) Type() string { return "cancel" } 165 166 // nolint 167 func (msg MsgCancelOrders) ValidateBasic() sdk.Error { 168 if msg.Sender.Empty() { 169 return ErrInvalidAddress(msg.Sender.String()) 170 } 171 if msg.OrderIDs == nil || len(msg.OrderIDs) == 0 { 172 return ErrOrderIDsIsEmpty() 173 } 174 if len(msg.OrderIDs) > MultiCancelOrderItemLimit { 175 return ErrCancelOrderBiggerThanLimit(MultiCancelOrderItemLimit) 176 } 177 if hasDuplicatedID(msg.OrderIDs) { 178 return ErrOrderIDsHasDuplicatedID() 179 } 180 for _, item := range msg.OrderIDs { 181 if item == "" { 182 return ErrUserInputOrderIDIsEmpty() 183 } 184 } 185 186 return nil 187 } 188 189 func hasDuplicatedID(ids []string) bool { 190 idSet := make(map[string]bool) 191 for _, item := range ids { 192 if !idSet[item] { 193 idSet[item] = true 194 } else { 195 return true 196 } 197 } 198 return false 199 } 200 201 // GetSignBytes encodes the message for signing 202 func (msg MsgCancelOrders) GetSignBytes() []byte { 203 bz := ModuleCdc.MustMarshalJSON(msg) 204 return sdk.MustSortJSON(bz) 205 } 206 207 // GetSigners defines whose signature is required 208 func (msg MsgCancelOrders) GetSigners() []sdk.AccAddress { 209 return []sdk.AccAddress{msg.Sender} 210 } 211 212 // Calculate customize gas 213 func (msg MsgCancelOrders) CalculateGas(gasUnit uint64) uint64 { 214 return uint64(len(msg.OrderIDs)) * gasUnit 215 } 216 217 // nolint 218 type OrderResult struct { 219 Error error `json:"error"` 220 Message string `json:"msg"` // order return error message 221 OrderID string `json:"orderid"` // order return orderid 222 }