Skip to content

Commit 99d5c8d

Browse files
authored
[Orderbook] Cleanup client order id mapping when taking ready time based order (#18417)
1 parent 5755d5e commit 99d5c8d

File tree

4 files changed

+67
-1
lines changed

4 files changed

+67
-1
lines changed

aptos-move/framework/aptos-experimental/doc/single_order_book.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,12 +1255,21 @@ Removes and returns the orders that are ready to be executed based on the time c
12551255
self: &<b>mut</b> <a href="single_order_book.md#0x7_single_order_book_SingleOrderBook">SingleOrderBook</a>&lt;M&gt;, order_limit: u64
12561256
): <a href="../../aptos-framework/../aptos-stdlib/../move-stdlib/doc/vector.md#0x1_vector">vector</a>&lt;SingleOrder&lt;M&gt;&gt; {
12571257
<b>let</b> self_orders = &<b>mut</b> self.orders;
1258+
<b>let</b> self_client_order_ids = &<b>mut</b> self.client_order_ids;
12581259
<b>let</b> order_ids = self.pending_orders.<a href="single_order_book.md#0x7_single_order_book_take_ready_time_based_orders">take_ready_time_based_orders</a>(order_limit);
12591260
<b>let</b> orders = <a href="../../aptos-framework/../aptos-stdlib/../move-stdlib/doc/vector.md#0x1_vector_empty">vector::empty</a>();
12601261

12611262
order_ids.for_each(|order_id| {
12621263
<b>let</b> order_with_state = self_orders.remove(&order_id);
12631264
<b>let</b> (order, _) = order_with_state.destroy_order_from_state();
1265+
<b>let</b> client_order_id = order.get_client_order_id();
1266+
<b>if</b> (client_order_id.is_some()) {
1267+
self_client_order_ids.remove(
1268+
&new_account_client_order_id(
1269+
order.get_account(), client_order_id.destroy_some()
1270+
)
1271+
);
1272+
};
12641273
orders.push_back(order);
12651274
});
12661275
orders

aptos-move/framework/aptos-experimental/sources/trading/order_book/single_order_book.move

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,12 +537,21 @@ module aptos_experimental::single_order_book {
537537
self: &mut SingleOrderBook<M>, order_limit: u64
538538
): vector<SingleOrder<M>> {
539539
let self_orders = &mut self.orders;
540+
let self_client_order_ids = &mut self.client_order_ids;
540541
let order_ids = self.pending_orders.take_ready_time_based_orders(order_limit);
541542
let orders = vector::empty();
542543

543544
order_ids.for_each(|order_id| {
544545
let order_with_state = self_orders.remove(&order_id);
545546
let (order, _) = order_with_state.destroy_order_from_state();
547+
let client_order_id = order.get_client_order_id();
548+
if (client_order_id.is_some()) {
549+
self_client_order_ids.remove(
550+
&new_account_client_order_id(
551+
order.get_account(), client_order_id.destroy_some()
552+
)
553+
);
554+
};
546555
orders.push_back(order);
547556
});
548557
orders

aptos-move/framework/aptos-experimental/sources/trading/tests/order_book/order_book_client_order_id.move

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
module aptos_experimental::order_book_client_order_id {
33
use std::option;
44
use std::signer;
5-
use aptos_experimental::order_book_types::{new_order_id_type, price_move_up_condition};
5+
use aptos_framework::timestamp;
6+
use aptos_experimental::order_book_types::{new_order_id_type, price_move_up_condition, new_time_based_trigger_condition};
67
use aptos_experimental::order_book_types::good_till_cancelled;
78
use aptos_experimental::order_book::{new_single_order_request, destroy_order_book, set_up_test_with_id};
89

@@ -535,4 +536,51 @@ module aptos_experimental::order_book_client_order_id {
535536
order_book.destroy_order_book();
536537
}
537538

539+
#[test(user1 = @0x456, aptos = @0x1)]
540+
public fun test_client_order_id_cleanup_for_time_based_pending_order(
541+
user1: &signer,
542+
aptos: &signer
543+
) {
544+
// Setup timestamp for time-based triggers
545+
timestamp::set_time_has_started_for_testing(aptos);
546+
timestamp::update_global_time_for_test_secs(1000);
547+
548+
// Setup a basic order book
549+
let order_book = set_up_test_with_id();
550+
let user1_addr = signer::address_of(user1);
551+
let client_order_id = std::string::utf8(b"time_order_1");
552+
let order_id = new_order_id_type(1);
553+
554+
// Create an order request with client order ID and time-based trigger
555+
let order_req =
556+
new_single_order_request(
557+
user1_addr,
558+
order_id,
559+
option::some(client_order_id),
560+
1000, // price
561+
100, // orig_size
562+
100, // remaining_size
563+
true, // is_bid
564+
option::some(new_time_based_trigger_condition(1500)), // trigger_condition - time-based
565+
good_till_cancelled(),
566+
42 // metadata
567+
);
568+
569+
// Place the maker order
570+
order_book.place_maker_order(order_req);
571+
572+
// Advance time to trigger the condition
573+
timestamp::update_global_time_for_test_secs(1600);
574+
575+
// This should remove the pending order from the pending orders map
576+
order_book.take_ready_time_based_orders(1);
577+
578+
// Try cancelling the order - should return none since it was already removed from pending orders
579+
let cancel_result =
580+
order_book.try_cancel_single_order_with_client_order_id(user1_addr, client_order_id);
581+
assert!(cancel_result.is_none());
582+
583+
order_book.destroy_order_book();
584+
}
585+
538586
}
0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)