Skip to content

Commit acfa9a2

Browse files
codchenphilipsu522
authored andcommitted
Add order validation (#173)
1 parent 1259b72 commit acfa9a2

File tree

2 files changed

+114
-6
lines changed

2 files changed

+114
-6
lines changed

x/dex/keeper/msgserver/msg_server_place_orders.go

+18-6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package msgserver
22

33
import (
44
"context"
5+
"errors"
56
"math/big"
67

78
conversion "github.com/sei-protocol/sei-chain/utils"
@@ -17,8 +18,6 @@ func (k msgServer) transferFunds(goCtx context.Context, msg *types.MsgPlaceOrder
1718
if len(msg.Funds) == 0 {
1819
return nil
1920
}
20-
_, span := (*k.tracingInfo.Tracer).Start(goCtx, "TransferFunds")
21-
defer span.End()
2221

2322
ctx := sdk.UnwrapSDKContext(goCtx)
2423
contractAddr, err := sdk.AccAddressFromBech32(msg.ContractAddr)
@@ -43,11 +42,14 @@ func (k msgServer) transferFunds(goCtx context.Context, msg *types.MsgPlaceOrder
4342
}
4443

4544
func (k msgServer) PlaceOrders(goCtx context.Context, msg *types.MsgPlaceOrders) (*types.MsgPlaceOrdersResponse, error) {
46-
spanCtx, span := (*k.tracingInfo.Tracer).Start(goCtx, "PlaceOrders")
47-
defer span.End()
48-
4945
ctx := sdk.UnwrapSDKContext(goCtx)
5046

47+
for _, order := range msg.Orders {
48+
if err := k.validateOrder(order); err != nil {
49+
return nil, err
50+
}
51+
}
52+
5153
if msg.AutoCalculateDeposit {
5254
calculatedCollateral := sdk.NewDecFromBigInt(big.NewInt(0))
5355
for _, order := range msg.Orders {
@@ -69,7 +71,7 @@ func (k msgServer) PlaceOrders(goCtx context.Context, msg *types.MsgPlaceOrders)
6971
msg.Funds[0].Denom = newDenom
7072
}
7173

72-
if err := k.transferFunds(spanCtx, msg); err != nil {
74+
if err := k.transferFunds(goCtx, msg); err != nil {
7375
return nil, err
7476
}
7577

@@ -95,3 +97,13 @@ func (k msgServer) PlaceOrders(goCtx context.Context, msg *types.MsgPlaceOrders)
9597
OrderIds: idsInResp,
9698
}, nil
9799
}
100+
101+
func (k msgServer) validateOrder(order *types.Order) error {
102+
if order.Quantity.IsNil() {
103+
return errors.New("quantity cannot be empty")
104+
}
105+
if order.Price.IsNil() {
106+
return errors.New("price cannot be empty")
107+
}
108+
return nil
109+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package msgserver_test
2+
3+
import (
4+
"testing"
5+
6+
sdk "github.com/cosmos/cosmos-sdk/types"
7+
keepertest "github.com/sei-protocol/sei-chain/testutil/keeper"
8+
"github.com/sei-protocol/sei-chain/x/dex/keeper/msgserver"
9+
"github.com/sei-protocol/sei-chain/x/dex/types"
10+
"github.com/stretchr/testify/require"
11+
)
12+
13+
const TestCreator = "sei1ewxvf5a9wq9zk5nurtl6m9yfxpnhyp7s7uk5sl"
14+
const TestContract = "sei14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sh9m79m"
15+
16+
func TestPlaceOrder(t *testing.T) {
17+
msg := &types.MsgPlaceOrders{
18+
Creator: TestCreator,
19+
ContractAddr: TestContract,
20+
Orders: []*types.Order{
21+
{
22+
Price: sdk.MustNewDecFromStr("10"),
23+
Quantity: sdk.MustNewDecFromStr("10"),
24+
Data: "",
25+
PositionDirection: types.PositionDirection_LONG,
26+
OrderType: types.OrderType_LIMIT,
27+
PriceDenom: keepertest.TestPriceDenom,
28+
AssetDenom: keepertest.TestAssetDenom,
29+
},
30+
{
31+
Price: sdk.MustNewDecFromStr("20"),
32+
Quantity: sdk.MustNewDecFromStr("5"),
33+
Data: "",
34+
PositionDirection: types.PositionDirection_SHORT,
35+
OrderType: types.OrderType_MARKET,
36+
PriceDenom: keepertest.TestPriceDenom,
37+
AssetDenom: keepertest.TestAssetDenom,
38+
},
39+
},
40+
}
41+
keeper, ctx := keepertest.DexKeeper(t)
42+
keeper.AddRegisteredPair(ctx, TestContract, keepertest.TestPair)
43+
keeper.SetTickSizeForPair(ctx, TestContract, keepertest.TestPair, *keepertest.TestPair.Ticksize)
44+
wctx := sdk.WrapSDKContext(ctx)
45+
server := msgserver.NewMsgServerImpl(*keeper, nil)
46+
res, err := server.PlaceOrders(wctx, msg)
47+
require.Nil(t, err)
48+
require.Equal(t, 2, len(res.OrderIds))
49+
require.Equal(t, uint64(0), res.OrderIds[0])
50+
require.Equal(t, uint64(1), res.OrderIds[1])
51+
}
52+
53+
func TestPlaceInvalidOrder(t *testing.T) {
54+
keeper, ctx := keepertest.DexKeeper(t)
55+
keeper.AddRegisteredPair(ctx, TestContract, keepertest.TestPair)
56+
keeper.SetTickSizeForPair(ctx, TestContract, keepertest.TestPair, *keepertest.TestPair.Ticksize)
57+
wctx := sdk.WrapSDKContext(ctx)
58+
59+
msg := &types.MsgPlaceOrders{
60+
Creator: TestCreator,
61+
ContractAddr: TestContract,
62+
Orders: []*types.Order{
63+
{
64+
Price: sdk.MustNewDecFromStr("10"),
65+
Quantity: sdk.Dec{},
66+
Data: "",
67+
PositionDirection: types.PositionDirection_LONG,
68+
OrderType: types.OrderType_LIMIT,
69+
PriceDenom: keepertest.TestPriceDenom,
70+
AssetDenom: keepertest.TestAssetDenom,
71+
},
72+
},
73+
}
74+
server := msgserver.NewMsgServerImpl(*keeper, nil)
75+
_, err := server.PlaceOrders(wctx, msg)
76+
require.NotNil(t, err)
77+
78+
msg = &types.MsgPlaceOrders{
79+
Creator: TestCreator,
80+
ContractAddr: TestContract,
81+
Orders: []*types.Order{
82+
{
83+
Price: sdk.Dec{},
84+
Quantity: sdk.MustNewDecFromStr("10"),
85+
Data: "",
86+
PositionDirection: types.PositionDirection_LONG,
87+
OrderType: types.OrderType_LIMIT,
88+
PriceDenom: keepertest.TestPriceDenom,
89+
AssetDenom: keepertest.TestAssetDenom,
90+
},
91+
},
92+
}
93+
server = msgserver.NewMsgServerImpl(*keeper, nil)
94+
_, err = server.PlaceOrders(wctx, msg)
95+
require.NotNil(t, err)
96+
}

0 commit comments

Comments
 (0)