@@ -14,7 +14,7 @@ use linera_sdk::{
1414use matching_engine:: {
1515 MatchingEngineAbi , Message , Operation , Order , OrderNature , Parameters , PendingOrderInfo , Price ,
1616} ;
17- use state:: { MatchingEngineState , ModifyQuantity , Transfer } ;
17+ use state:: { MatchingEngineState , Transfer } ;
1818
1919pub struct MatchingEngineContract {
2020 state : MatchingEngineState ,
@@ -77,7 +77,7 @@ impl Contract for MatchingEngineContract {
7777 . await
7878 . expect ( "Failed to read existing order IDs" ) ;
7979 for order_id in order_ids {
80- match self . state . modify_order ( order_id, ModifyQuantity :: All ) . await {
80+ match self . state . modify_order ( order_id, Amount :: ZERO ) . await {
8181 Some ( transfer) => self . send_to ( transfer) ,
8282 // Orders with amount zero may have been cleared in an earlier iteration.
8383 None => continue ,
@@ -138,24 +138,16 @@ impl Contract for MatchingEngineContract {
138138 . expect ( "Failed to load pending orders" )
139139 . expect ( "Account should have pending orders" ) ;
140140
141- // Update the pending order
142- if let Some ( order) = pending_orders. get_mut ( & order_id) {
143- order. quantity = new_quantity;
141+ if new_quantity == Amount :: ZERO {
142+ // Remove the pending order
143+ pending_orders. remove ( & order_id) ;
144+ } else {
145+ // Update the pending order
146+ if let Some ( order) = pending_orders. get_mut ( & order_id) {
147+ order. quantity = new_quantity;
148+ }
144149 }
145150 }
146- Message :: OrderRemoved { owner, order_id } => {
147- // This message is received on the sender chain from the matching engine
148- let pending_orders = self
149- . state
150- . pending_orders
151- . get_mut ( & owner)
152- . await
153- . expect ( "Failed to load pending orders" )
154- . expect ( "Account should have pending orders" ) ;
155-
156- // Remove the pending order
157- pending_orders. remove ( & order_id) ;
158- }
159151 }
160152 }
161153
@@ -239,9 +231,10 @@ impl MatchingEngineContract {
239231 let matching_engine_chain = self . runtime . chain_id ( ) ;
240232 for ( filled_chain_id, filled_owner, filled_order_id) in filled_orders {
241233 if filled_chain_id != matching_engine_chain {
242- let removal_message = Message :: OrderRemoved {
234+ let removal_message = Message :: OrderUpdated {
243235 owner : filled_owner,
244236 order_id : filled_order_id,
237+ new_quantity : Amount :: ZERO ,
245238 } ;
246239 self . runtime
247240 . prepare_message ( removal_message)
@@ -278,7 +271,11 @@ impl MatchingEngineContract {
278271 }
279272 }
280273 }
281- Order :: Cancel { owner, order_id } => {
274+ Order :: Modify {
275+ owner,
276+ order_id,
277+ new_quantity,
278+ } => {
282279 self . state . check_order_id ( & order_id, & owner) . await ;
283280 let key_book = self
284281 . state
@@ -291,16 +288,21 @@ impl MatchingEngineContract {
291288
292289 let transfer = self
293290 . state
294- . modify_order ( order_id, ModifyQuantity :: All )
291+ . modify_order ( order_id, new_quantity )
295292 . await
296- . expect ( "Order is not present therefore cannot be cancelled " ) ;
293+ . expect ( "Failed to modify order " ) ;
297294 self . send_to ( transfer) ;
298295
299- // Send removal notification to the sender chain (if different from matching engine chain)
296+ // Order still exists with reduced amount
300297 if sender_chain_id != self . runtime . chain_id ( ) {
301- let removal_message = Message :: OrderRemoved { owner, order_id } ;
298+ // Send update notification to the sender chain (if different from matching engine chain)
299+ let update_message = Message :: OrderUpdated {
300+ owner,
301+ order_id,
302+ new_quantity,
303+ } ;
302304 self . runtime
303- . prepare_message ( removal_message )
305+ . prepare_message ( update_message )
304306 . with_authentication ( )
305307 . send_to ( sender_chain_id) ;
306308 } else {
@@ -311,77 +313,9 @@ impl MatchingEngineContract {
311313 . await
312314 . expect ( "Failed to load pending orders" )
313315 . expect ( "Account should have pending orders" ) ;
314- // Remove the pending order
315- pending_orders. remove ( & order_id) ;
316- }
317- }
318- Order :: Modify {
319- owner,
320- order_id,
321- reduce_quantity,
322- } => {
323- self . state . check_order_id ( & order_id, & owner) . await ;
324- let key_book = self
325- . state
326- . orders
327- . get ( & order_id)
328- . await
329- . expect ( "Failed to load order" )
330- . expect ( "Order should exist" ) ;
331- let sender_chain_id = key_book. account . chain_id ;
332-
333- let transfer = self
334- . state
335- . modify_order ( order_id, ModifyQuantity :: Partial ( reduce_quantity) )
336- . await
337- . expect ( "Order is not present therefore cannot be cancelled" ) ;
338- self . send_to ( transfer) ;
339-
340- // Get the remaining quantity after modification
341- if let Some ( new_quantity) = self . state . get_order_quantity ( & order_id) . await {
342- // Order still exists with reduced amount
343- if sender_chain_id != self . runtime . chain_id ( ) {
344- // Send update notification to the sender chain (if different from matching engine chain)
345- let update_message = Message :: OrderUpdated {
346- owner,
347- order_id,
348- new_quantity,
349- } ;
350- self . runtime
351- . prepare_message ( update_message)
352- . with_authentication ( )
353- . send_to ( sender_chain_id) ;
354- } else {
355- let pending_orders = self
356- . state
357- . pending_orders
358- . get_mut ( & owner)
359- . await
360- . expect ( "Failed to load pending orders" )
361- . expect ( "Account should have pending orders" ) ;
362- // Update the pending order
363- if let Some ( order) = pending_orders. get_mut ( & order_id) {
364- order. quantity = new_quantity;
365- }
366- }
367- } else {
368- // Order was fully cancelled
369- if sender_chain_id != self . runtime . chain_id ( ) {
370- let removal_message = Message :: OrderRemoved { owner, order_id } ;
371- self . runtime
372- . prepare_message ( removal_message)
373- . with_authentication ( )
374- . send_to ( sender_chain_id) ;
375- } else {
376- let pending_orders = self
377- . state
378- . pending_orders
379- . get_mut ( & owner)
380- . await
381- . expect ( "Failed to load pending orders" )
382- . expect ( "Account should have pending orders" ) ;
383- // Remove the pending order
384- pending_orders. remove ( & order_id) ;
316+ // Update the pending order
317+ if let Some ( order) = pending_orders. get_mut ( & order_id) {
318+ order. quantity = new_quantity;
385319 }
386320 }
387321 }
0 commit comments