/
message_place_limit_order.go
110 lines (90 loc) · 2.41 KB
/
message_place_limit_order.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package types
import (
"time"
sdkerrors "cosmossdk.io/errors"
"cosmossdk.io/math"
sdk "github.com/cosmos/cosmos-sdk/types"
)
const TypeMsgPlaceLimitOrder = "place_limit_order"
var _ sdk.Msg = &MsgPlaceLimitOrder{}
func NewMsgPlaceLimitOrder(
creator,
receiver,
tokenIn,
tokenOut string,
tickIndex int64,
amountIn math.Int,
orderType LimitOrderType,
goodTil *time.Time,
maxAmountOut *math.Int,
) *MsgPlaceLimitOrder {
return &MsgPlaceLimitOrder{
Creator: creator,
Receiver: receiver,
TokenIn: tokenIn,
TokenOut: tokenOut,
TickIndexInToOut: tickIndex,
AmountIn: amountIn,
OrderType: orderType,
ExpirationTime: goodTil,
MaxAmountOut: maxAmountOut,
}
}
func (msg *MsgPlaceLimitOrder) Route() string {
return RouterKey
}
func (msg *MsgPlaceLimitOrder) Type() string {
return TypeMsgPlaceLimitOrder
}
func (msg *MsgPlaceLimitOrder) GetSigners() []sdk.AccAddress {
creator, err := sdk.AccAddressFromBech32(msg.Creator)
if err != nil {
panic(err)
}
return []sdk.AccAddress{creator}
}
func (msg *MsgPlaceLimitOrder) GetSignBytes() []byte {
bz := ModuleCdc.MustMarshalJSON(msg)
return sdk.MustSortJSON(bz)
}
func (msg *MsgPlaceLimitOrder) ValidateBasic() error {
_, err := sdk.AccAddressFromBech32(msg.Creator)
if err != nil {
return sdkerrors.Wrapf(ErrInvalidAddress, "invalid creator address (%s)", err)
}
_, err = sdk.AccAddressFromBech32(msg.Receiver)
if err != nil {
return sdkerrors.Wrapf(ErrInvalidAddress, "invalid receiver address (%s)", err)
}
if msg.AmountIn.LTE(math.ZeroInt()) {
return ErrZeroLimitOrder
}
if msg.OrderType.IsGoodTil() && msg.ExpirationTime == nil {
return ErrGoodTilOrderWithoutExpiration
}
if !msg.OrderType.IsGoodTil() && msg.ExpirationTime != nil {
return ErrExpirationOnWrongOrderType
}
if msg.MaxAmountOut != nil {
if !msg.MaxAmountOut.IsPositive() {
return ErrZeroMaxAmountOut
}
if !msg.OrderType.IsTakerOnly() {
return ErrInvalidMaxAmountOutForMaker
}
}
if IsTickOutOfRange(msg.TickIndexInToOut) {
return ErrTickOutsideRange
}
return nil
}
func (msg *MsgPlaceLimitOrder) ValidateGoodTilExpiration(blockTime time.Time) error {
if msg.OrderType.IsGoodTil() && !msg.ExpirationTime.After(blockTime) {
return sdkerrors.Wrapf(ErrExpirationTimeInPast,
"Current BlockTime: %s; Provided ExpirationTime: %s",
blockTime.String(),
msg.ExpirationTime.String(),
)
}
return nil
}