@@ -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 {
0 commit comments