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  }