Skip to content

Commit 2e561b3

Browse files
authored
[Tradeshield]: Fix batch execution issue (#1286)
* test * fix
1 parent f08f05e commit 2e561b3

File tree

2 files changed

+82
-6
lines changed

2 files changed

+82
-6
lines changed

x/tradeshield/keeper/msg_server_execute_order_test.go

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,82 @@ func (suite *TradeshieldKeeperTestSuite) TestMsgServerExecuteOrder() {
180180
}
181181
},
182182
},
183+
{
184+
"Success: Execute Multiple Spot Orders with One Failure",
185+
"",
186+
func() *types.MsgExecuteOrders {
187+
suite.ResetSuite()
188+
suite.SetupCoinPrices()
189+
190+
addr = suite.AddAccounts(1, addr)
191+
_ = suite.CreateNewAmmPool(addr[0], true, math.LegacyZeroDec(), math.LegacyZeroDec(), ptypes.ATOM, math.NewInt(100000000000).MulRaw(10), math.NewInt(100000000000).MulRaw(10))
192+
193+
openOrderMsg1 := &types.MsgCreateSpotOrder{
194+
OwnerAddress: addr[2].String(),
195+
OrderType: types.SpotOrderType_LIMITBUY,
196+
OrderPrice: math.LegacyNewDec(10),
197+
OrderAmount: sdk.NewCoin("uusdc", math.NewInt(100000)),
198+
OrderTargetDenom: "uatom",
199+
}
200+
msgSrvr := keeper.NewMsgServerImpl(suite.app.TradeshieldKeeper)
201+
_, err := msgSrvr.CreateSpotOrder(suite.ctx, openOrderMsg1)
202+
suite.Require().NoError(err)
203+
204+
openOrderMsg2 := &types.MsgCreateSpotOrder{
205+
OwnerAddress: addr[2].String(),
206+
OrderType: types.SpotOrderType_LIMITSELL,
207+
OrderPrice: math.LegacyNewDec(10),
208+
OrderAmount: sdk.NewCoin("uusdc", math.NewInt(200000)),
209+
OrderTargetDenom: "uatom",
210+
}
211+
_, err = msgSrvr.CreateSpotOrder(suite.ctx, openOrderMsg2)
212+
suite.Require().NoError(err)
213+
214+
suite.app.OracleKeeper.SetPrice(suite.ctx, oracletypes.Price{
215+
Asset: "ATOM",
216+
Price: math.LegacyNewDec(5),
217+
Source: "elys",
218+
Provider: oracleProvider.String(),
219+
Timestamp: uint64(suite.ctx.BlockTime().Unix()),
220+
})
221+
222+
// Return message with both order IDs
223+
return &types.MsgExecuteOrders{
224+
Creator: addr[2].String(),
225+
SpotOrderIds: []uint64{1, 2}, // Both orders exist but second will fail during execution
226+
PerpetualOrderIds: []uint64{},
227+
}
228+
},
229+
func() {
230+
// Get events from context
231+
events := suite.ctx.EventManager().Events()
232+
233+
// Find the specific event we're looking for
234+
var foundEvent sdk.Event
235+
for _, event := range events {
236+
if event.Type == types.TypeEvtExecuteLimitBuySpotOrder {
237+
foundEvent = event
238+
break
239+
}
240+
}
241+
242+
// Assert event was emitted for the successful order
243+
suite.Require().NotNil(foundEvent)
244+
245+
// Check event attributes
246+
suite.Require().Equal(types.TypeEvtExecuteLimitBuySpotOrder, foundEvent.Type)
247+
248+
// Check specific attributes
249+
for _, attr := range foundEvent.Attributes {
250+
switch string(attr.Key) {
251+
case "order_id":
252+
suite.Require().Equal("1", string(attr.Value))
253+
case "order_price":
254+
suite.Require().Equal(string(attr.Value), "\"10.000000000000000000\"")
255+
}
256+
}
257+
},
258+
},
183259
}
184260

185261
for _, tc := range testCases {

x/tradeshield/keeper/pending_spot_order.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,9 @@ func (k Keeper) ExecuteLimitSellOrder(ctx sdk.Context, order types.SpotOrder) (*
276276
MinAmount: sdk.NewCoin(order.OrderTargetDenom, sdkmath.ZeroInt()),
277277
MaxAmount: order.OrderAmount,
278278
})
279+
if err != nil {
280+
return res, err
281+
}
279282

280283
params := k.GetParams(ctx)
281284
expectedAmount := marketPrice.Mul(osmomath.BigDecFromSDKInt(order.OrderAmount.Amount))
@@ -289,9 +292,6 @@ func (k Keeper) ExecuteLimitSellOrder(ctx sdk.Context, order types.SpotOrder) (*
289292
if tolerance.GT(params.GetBigDecTolerance()) {
290293
return res, errorsmod.Wrapf(types.ErrHighTolerance, "tolerance: %s", tolerance)
291294
}
292-
if err != nil {
293-
return res, err
294-
}
295295

296296
// Remove the order from the pending order list
297297
k.RemovePendingSpotOrder(ctx, order.OrderId)
@@ -334,6 +334,9 @@ func (k Keeper) ExecuteLimitBuyOrder(ctx sdk.Context, order types.SpotOrder) (*a
334334
MinAmount: sdk.NewCoin(order.OrderTargetDenom, sdkmath.ZeroInt()),
335335
MaxAmount: order.OrderAmount,
336336
})
337+
if err != nil {
338+
return res, err
339+
}
337340

338341
params := k.GetParams(ctx)
339342
expectedAmount := osmomath.BigDecFromSDKInt(order.OrderAmount.Amount).Quo(marketPrice)
@@ -347,9 +350,6 @@ func (k Keeper) ExecuteLimitBuyOrder(ctx sdk.Context, order types.SpotOrder) (*a
347350
if tolerance.GT(params.GetBigDecTolerance()) {
348351
return res, errorsmod.Wrapf(types.ErrHighTolerance, "tolerance: %s", tolerance)
349352
}
350-
if err != nil {
351-
return res, err
352-
}
353353

354354
// Remove the order from the pending order list
355355
k.RemovePendingSpotOrder(ctx, order.OrderId)

0 commit comments

Comments
 (0)