diff --git a/aptos-move/framework/aptos-experimental/doc/market_types.md b/aptos-move/framework/aptos-experimental/doc/market_types.md index e25aab0d85b53..f2d4b00972d2b 100644 --- a/aptos-move/framework/aptos-experimental/doc/market_types.md +++ b/aptos-move/framework/aptos-experimental/doc/market_types.md @@ -52,7 +52,6 @@ - [Function `new_market_config`](#0x7_market_types_new_market_config) - [Function `new_market`](#0x7_market_types_new_market) - [Function `next_order_id`](#0x7_market_types_next_order_id) -- [Function `next_fill_id`](#0x7_market_types_next_fill_id) - [Function `get_order_book`](#0x7_market_types_get_order_book) - [Function `get_market_address`](#0x7_market_types_get_market_address) - [Function `best_bid_price`](#0x7_market_types_best_bid_price) @@ -447,7 +446,7 @@
-settle_trade_f: |&mut market_types::Market<M>, market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, u64, u64, u64|market_types::SettleTradeResult<R> has copy + drop +settle_trade_f: |&mut market_types::Market<M>, market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, u128, u64, u64|market_types::SettleTradeResult<R> has copy + drop
settle_trade_f arguments: market, taker, maker, fill_id, settled_price, settled_size, @@ -539,12 +538,6 @@
Address of the market object of this market. -
-
-next_fill_id: u64 -
-
-
config: market_types::MarketConfig @@ -1327,7 +1320,7 @@ -
public fun new_market_clearinghouse_callbacks<M: copy, drop, store, R: copy, drop, store>(settle_trade_f: |&mut market_types::Market<M>, market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, u64, u64, u64|market_types::SettleTradeResult<R> has copy + drop, validate_order_placement_f: |market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, u64|market_types::ValidationResult has copy + drop, validate_bulk_order_placement_f: |address, vector<u64>, vector<u64>, vector<u64>, vector<u64>, M|market_types::ValidationResult has copy + drop, place_maker_order_f: |market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, u64|market_types::PlaceMakerOrderResult<R> has copy + drop, cleanup_order_f: |market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, u64, bool| has copy + drop, cleanup_bulk_order_at_price_f: |address, order_book_types::OrderIdType, bool, u64, u64| has copy + drop, decrease_order_size_f: |market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, u64| has copy + drop, get_order_metadata_bytes: |M|vector<u8> has copy + drop): market_types::MarketClearinghouseCallbacks<M, R>
+
public fun new_market_clearinghouse_callbacks<M: copy, drop, store, R: copy, drop, store>(settle_trade_f: |&mut market_types::Market<M>, market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, u128, u64, u64|market_types::SettleTradeResult<R> has copy + drop, validate_order_placement_f: |market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, u64|market_types::ValidationResult has copy + drop, validate_bulk_order_placement_f: |address, vector<u64>, vector<u64>, vector<u64>, vector<u64>, M|market_types::ValidationResult has copy + drop, place_maker_order_f: |market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, u64|market_types::PlaceMakerOrderResult<R> has copy + drop, cleanup_order_f: |market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, u64, bool| has copy + drop, cleanup_bulk_order_at_price_f: |address, order_book_types::OrderIdType, bool, u64, u64| has copy + drop, decrease_order_size_f: |market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, u64| has copy + drop, get_order_metadata_bytes: |M|vector<u8> has copy + drop): market_types::MarketClearinghouseCallbacks<M, R>
 
@@ -1337,7 +1330,7 @@
public fun new_market_clearinghouse_callbacks<M: store + copy + drop, R: store + copy + drop>(
-    settle_trade_f:  |&mut Market<M>, MarketClearinghouseOrderInfo<M>,  MarketClearinghouseOrderInfo<M>, u64, u64, u64| SettleTradeResult<R> has drop + copy,
+    settle_trade_f:  |&mut Market<M>, MarketClearinghouseOrderInfo<M>,  MarketClearinghouseOrderInfo<M>, u128, u64, u64| SettleTradeResult<R> has drop + copy,
     validate_order_placement_f: | MarketClearinghouseOrderInfo<M>, u64| ValidationResult has drop + copy,
     validate_bulk_order_placement_f: |address, vector<u64>, vector<u64>, vector<u64>, vector<u64>, M| ValidationResult has drop + copy,
     place_maker_order_f: |MarketClearinghouseOrderInfo<M>, u64| PlaceMakerOrderResult<R> has drop + copy,
@@ -1690,7 +1683,7 @@
 
 
 
#[lint::skip(#[needless_mutable_reference])]
-public fun settle_trade<M: copy, drop, store, R: copy, drop, store>(self: &market_types::MarketClearinghouseCallbacks<M, R>, market: &mut market_types::Market<M>, taker: market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, maker: market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, fill_id: u64, settled_price: u64, settled_size: u64): market_types::SettleTradeResult<R>
+public fun settle_trade<M: copy, drop, store, R: copy, drop, store>(self: &market_types::MarketClearinghouseCallbacks<M, R>, market: &mut market_types::Market<M>, taker: market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, maker: market_clearinghouse_order_info::MarketClearinghouseOrderInfo<M>, fill_id: u128, settled_price: u64, settled_size: u64): market_types::SettleTradeResult<R>
 
@@ -1704,7 +1697,7 @@ market: &mut Market<M>, taker: MarketClearinghouseOrderInfo<M>, maker: MarketClearinghouseOrderInfo<M>, - fill_id: u64, + fill_id: u128, settled_price: u64, settled_size: u64): SettleTradeResult<R> { (self.settle_trade_f)(market, taker, maker, fill_id, settled_price, settled_size) @@ -1973,7 +1966,6 @@ Market::V1 { parent: signer::address_of(parent), market: signer::address_of(market), - next_fill_id: 0, config, order_book: new_order_book(), pre_cancellation_tracker, @@ -2007,32 +1999,6 @@ - - - - -## Function `next_fill_id` - - - -
public fun next_fill_id<M: copy, drop, store>(self: &mut market_types::Market<M>): u64
-
- - - -
-Implementation - - -
public fun next_fill_id<M: store + copy + drop>(self: &mut Market<M>): u64 {
-    let next_fill_id = self.next_fill_id;
-    self.next_fill_id += 1;
-    next_fill_id
-}
-
- - -
diff --git a/aptos-move/framework/aptos-experimental/doc/order_placement.md b/aptos-move/framework/aptos-experimental/doc/order_placement.md index 712373863ae21..bc2642119c5cd 100644 --- a/aptos-move/framework/aptos-experimental/doc/order_placement.md +++ b/aptos-move/framework/aptos-experimental/doc/order_placement.md @@ -85,6 +85,7 @@ TimeBased(time): The order is triggered when the current time is greater than or
use 0x1::option;
 use 0x1::signer;
 use 0x1::string;
+use 0x1::transaction_context;
 use 0x1::vector;
 use 0x7::bulk_order_book_types;
 use 0x7::market_clearinghouse_order_info;
@@ -1216,7 +1217,7 @@ Places a market order - The order is guaranteed to be a taker order and will be
         );
         return (option::none(), new_callback_result_not_available());
     };
-    let fill_id = market.next_fill_id();
+    let fill_id = transaction_context::monotonically_increasing_counter();
     let settle_result = callbacks.settle_trade(
         market,
         new_clearinghouse_order_info(
diff --git a/aptos-move/framework/aptos-experimental/sources/trading/market/market_types.move b/aptos-move/framework/aptos-experimental/sources/trading/market/market_types.move
index df4ef3e295fab..07457cdf0d3e0 100644
--- a/aptos-move/framework/aptos-experimental/sources/trading/market/market_types.move
+++ b/aptos-move/framework/aptos-experimental/sources/trading/market/market_types.move
@@ -7,10 +7,9 @@ module aptos_experimental::market_types {
     use std::option::Option;
     use std::signer;
     use std::string::String;
-    use aptos_std::table;
-    use aptos_std::table::Table;
     use aptos_framework::event;
     use aptos_framework::transaction_context;
+    use std::layout_reference::{LayoutReference, Self};
     use aptos_experimental::market_clearinghouse_order_info::MarketClearinghouseOrderInfo;
     use aptos_experimental::single_order_types::SingleOrder;
     use aptos_experimental::order_book_types::{OrderIdType, new_order_id_type};
@@ -27,8 +26,6 @@ module aptos_experimental::market_types {
     const EINVALID_TIME_IN_FORCE: u64 = 3;
     const EORDER_DOES_NOT_EXIST: u64 = 6;
 
-    const PRE_CANCELLATION_TRACKER_KEY: u8 = 0;
-
     enum OrderStatus has drop, copy, store {
         /// Order has been accepted by the engine.
         OPEN,
@@ -107,7 +104,7 @@ module aptos_experimental::market_types {
     enum MarketClearinghouseCallbacks has drop {
         V1 {
             /// settle_trade_f arguments: market, taker, maker, fill_id, settled_price, settled_size,
-            settle_trade_f:  |&mut Market, MarketClearinghouseOrderInfo,  MarketClearinghouseOrderInfo, u64, u64, u64| SettleTradeResult has drop + copy,
+            settle_trade_f:  |&mut Market, MarketClearinghouseOrderInfo,  MarketClearinghouseOrderInfo, u128, u64, u64| SettleTradeResult has drop + copy,
             /// validate_settlement_update_f arguments: order_info, size
             validate_order_placement_f: | MarketClearinghouseOrderInfo, u64| ValidationResult has drop + copy,
             /// Validate the bulk order placement arguments: account, bids_prices, bids_sizes, asks_prices, asks_sizes
@@ -158,7 +155,7 @@ module aptos_experimental::market_types {
     }
 
     public fun new_market_clearinghouse_callbacks(
-        settle_trade_f:  |&mut Market, MarketClearinghouseOrderInfo,  MarketClearinghouseOrderInfo, u64, u64, u64| SettleTradeResult has drop + copy,
+        settle_trade_f:  |&mut Market, MarketClearinghouseOrderInfo,  MarketClearinghouseOrderInfo, u128, u64, u64| SettleTradeResult has drop + copy,
         validate_order_placement_f: | MarketClearinghouseOrderInfo, u64| ValidationResult has drop + copy,
         validate_bulk_order_placement_f: |address, vector, vector, vector, vector, M| ValidationResult has drop + copy,
         place_maker_order_f: |MarketClearinghouseOrderInfo, u64| PlaceMakerOrderResult has drop + copy,
@@ -245,7 +242,7 @@ module aptos_experimental::market_types {
         market: &mut Market,
         taker: MarketClearinghouseOrderInfo,
         maker: MarketClearinghouseOrderInfo,
-        fill_id: u64,
+        fill_id: u128,
         settled_price: u64,
         settled_size: u64): SettleTradeResult {
         (self.settle_trade_f)(market, taker, maker, fill_id, settled_price, settled_size)
@@ -318,14 +315,12 @@ module aptos_experimental::market_types {
             parent: address,
             /// Address of the market object of this market.
             market: address,
-            // Incremental fill id for matched orders
-            next_fill_id: u64,
             config: MarketConfig,
             order_book: OrderBook,
             /// Pre cancellation tracker for the market, it is wrapped inside a table
             /// as otherwise any insertion/deletion from the tracker would cause conflict
             /// with the order book.
-            pre_cancellation_tracker: Table,
+            pre_cancellation_tracker: LayoutReference,
         }
     }
 
@@ -439,15 +434,10 @@ module aptos_experimental::market_types {
         // requiring signers, and not addresses, purely to guarantee different dexes
         // cannot polute events to each other, accidentally or maliciously.
         let pre_cancellation_window = config.pre_cancellation_window_secs;
-        let pre_cancellation_tracker = table::new();
-        pre_cancellation_tracker.add(
-            PRE_CANCELLATION_TRACKER_KEY,
-            new_pre_cancellation_tracker(pre_cancellation_window)
-        );
+        let pre_cancellation_tracker = layout_reference::new_external_table(new_pre_cancellation_tracker(pre_cancellation_window));
         Market::V1 {
             parent: signer::address_of(parent),
             market: signer::address_of(market),
-            next_fill_id: 0,
             config,
             order_book: new_order_book(),
             pre_cancellation_tracker,
@@ -458,12 +448,6 @@ module aptos_experimental::market_types {
         new_order_id_type(transaction_context::monotonically_increasing_counter())
     }
 
-    public fun next_fill_id(self: &mut Market): u64 {
-        let next_fill_id = self.next_fill_id;
-        self.next_fill_id += 1;
-        next_fill_id
-    }
-
     public fun get_order_book(self: &Market): &OrderBook {
         &self.order_book
     }
@@ -746,7 +730,7 @@ module aptos_experimental::market_types {
     public(friend) fun get_pre_cancellation_tracker_mut(
         self: &mut Market
     ): &mut PreCancellationTracker {
-        self.pre_cancellation_tracker.borrow_mut(PRE_CANCELLATION_TRACKER_KEY)
+        self.pre_cancellation_tracker.borrow_mut()
     }
 
 
@@ -756,14 +740,12 @@ module aptos_experimental::market_types {
         let Market::V1 {
             parent: _parent,
             market: _market,
-            next_fill_id: _next_fill_id,
             config,
             order_book,
             pre_cancellation_tracker,
         } = self;
         let MarketConfig::V1 { allow_self_trade: _, allow_events_emission: _, pre_cancellation_window_secs: _ } = config;
-        destroy_tracker(pre_cancellation_tracker.remove(PRE_CANCELLATION_TRACKER_KEY));
-        pre_cancellation_tracker.drop_unchecked();
+        destroy_tracker(pre_cancellation_tracker.destroy());
         order_book.destroy_order_book()
     }
 
diff --git a/aptos-move/framework/aptos-experimental/sources/trading/market/order_placement.move b/aptos-move/framework/aptos-experimental/sources/trading/market/order_placement.move
index a36a535d8601e..3e0b3c2b77482 100644
--- a/aptos-move/framework/aptos-experimental/sources/trading/market/order_placement.move
+++ b/aptos-move/framework/aptos-experimental/sources/trading/market/order_placement.move
@@ -76,6 +76,7 @@ module aptos_experimental::order_placement {
         MarketClearinghouseCallbacks,
         Market, CallbackResult, new_callback_result_not_available
     };
+    use aptos_framework::transaction_context;
 
     // Error codes
     const EINVALID_ORDER: u64 = 1;
@@ -644,7 +645,7 @@ module aptos_experimental::order_placement {
             );
             return (option::none(), new_callback_result_not_available());
         };
-        let fill_id = market.next_fill_id();
+        let fill_id = transaction_context::monotonically_increasing_counter();
         let settle_result = callbacks.settle_trade(
             market,
             new_clearinghouse_order_info(
diff --git a/aptos-move/framework/aptos-experimental/sources/trading/order_book/order_book.move b/aptos-move/framework/aptos-experimental/sources/trading/order_book/order_book.move
index 2b4db693b18f4..0f8f9373bf085 100644
--- a/aptos-move/framework/aptos-experimental/sources/trading/order_book/order_book.move
+++ b/aptos-move/framework/aptos-experimental/sources/trading/order_book/order_book.move
@@ -7,6 +7,7 @@ module aptos_experimental::order_book {
 
     use std::option::Option;
     use std::string::String;
+    use std::layout_reference::{LayoutReference, Self};
     use aptos_experimental::bulk_order_book_types::{BulkOrder, BulkOrderRequest, BulkOrderPlaceResponse};
     use aptos_experimental::bulk_order_book::{BulkOrderBook, new_bulk_order_book};
     use aptos_experimental::single_order_book::{SingleOrderBook, new_single_order_book, SingleOrderRequest};
@@ -23,7 +24,7 @@ module aptos_experimental::order_book {
     enum OrderBook has store {
         UnifiedV1 {
             single_order_book: SingleOrderBook,
-            bulk_order_book: BulkOrderBook,
+            bulk_order_book: LayoutReference>,
             price_time_idx: PriceTimeIndex,
         }
     }
@@ -31,7 +32,7 @@ module aptos_experimental::order_book {
     public fun new_order_book(): OrderBook {
         OrderBook::UnifiedV1 {
             single_order_book: new_single_order_book(),
-            bulk_order_book: new_bulk_order_book(),
+            bulk_order_book: layout_reference::new_external_table(new_bulk_order_book()),
             price_time_idx: new_price_time_idx(),
         }
     }
@@ -174,7 +175,7 @@ module aptos_experimental::order_book {
         order_creator: address,
         is_bid: bool
     ): u64 {
-        self.bulk_order_book.get_remaining_size(order_creator, is_bid)
+        self.bulk_order_book.borrow().get_remaining_size(order_creator, is_bid)
     }
 
     /// Checks if the order is a taker order i.e., matched immediately with the active order book.
@@ -201,7 +202,7 @@ module aptos_experimental::order_book {
         if (book_type == single_order_type()) {
             self.single_order_book.get_single_match_for_taker(result)
         } else {
-            self.bulk_order_book.get_single_match_for_taker(&mut self.price_time_idx, result, is_bid)
+            self.bulk_order_book.borrow_mut().get_single_match_for_taker(&mut self.price_time_idx, result, is_bid)
         }
     }
 
@@ -217,7 +218,7 @@ module aptos_experimental::order_book {
                 &mut self.price_time_idx, reinsert_order, original_order
             )
         } else {
-            self.bulk_order_book.reinsert_order(
+            self.bulk_order_book.borrow_mut().reinsert_order(
                 &mut self.price_time_idx, reinsert_order, original_order
             );
         }
@@ -227,7 +228,7 @@ module aptos_experimental::order_book {
     public(friend) fun place_bulk_order(
         self: &mut OrderBook, order_req: BulkOrderRequest
     ) : BulkOrderPlaceResponse {
-        self.bulk_order_book.place_bulk_order(
+        self.bulk_order_book.borrow_mut().place_bulk_order(
             &mut self.price_time_idx,
             order_req
         )
@@ -236,13 +237,13 @@ module aptos_experimental::order_book {
     public(friend) fun get_bulk_order(
         self: &OrderBook, order_creator: address
     ): BulkOrder {
-        self.bulk_order_book.get_bulk_order(order_creator)
+        self.bulk_order_book.borrow().get_bulk_order(order_creator)
     }
 
     public(friend) fun cancel_bulk_order(
         self: &mut OrderBook, order_creator: address
     ): BulkOrder {
-        self.bulk_order_book.cancel_bulk_order(&mut self.price_time_idx, order_creator)
+        self.bulk_order_book.borrow_mut().cancel_bulk_order(&mut self.price_time_idx, order_creator)
     }
 
     // ============================= test_only APIs ====================================
@@ -255,7 +256,7 @@ module aptos_experimental::order_book {
             bulk_order_book,
             price_time_idx,
         } = self;
-        bulk_order_book.destroy_bulk_order_book();
+        bulk_order_book.destroy().destroy_bulk_order_book();
         retail_order_book.destroy_single_order_book();
         price_time_idx.destroy_price_time_idx();
     }
diff --git a/aptos-move/framework/aptos-stdlib/sources/data_structures/layout_reference.move b/aptos-move/framework/aptos-stdlib/sources/data_structures/layout_reference.move
new file mode 100644
index 0000000000000..3424accb2f42e
--- /dev/null
+++ b/aptos-move/framework/aptos-stdlib/sources/data_structures/layout_reference.move
@@ -0,0 +1,104 @@
+module aptos_framework::layout_reference {
+    use aptos_framework::object;
+    use aptos_std::table_with_length::{Self, TableWithLength};
+    use std::mem;
+
+    struct ObjectValue has key {
+        value: T,
+    }
+
+    enum LayoutReference has store {
+        Inline{ value: T },
+        // ExternalObject{ addr: address },
+        ExternalTable { table: TableWithLength},
+    }
+
+    public fun new_inline(value: T): LayoutReference {
+        LayoutReference::Inline { value }
+    }
+
+    // public fun new_external_object(value: T): LayoutReference {
+    //     LayoutReference::ExternalObject(store_at_new_address(value))
+    // }
+
+    public fun new_external_table(value: T): LayoutReference {
+        let table = table_with_length::new();
+        table.add(true, value);
+        LayoutReference::ExternalTable { table }
+    }
+
+    public fun borrow(self: &LayoutReference): &T {
+        match (self) {
+            LayoutReference::Inline { value } => value,
+            // LayoutReference::ExternalObject(addr) => &ObjectValue[*addr].value,
+            LayoutReference::ExternalTable { table } => table.borrow(true),
+        }
+    }
+
+    public fun borrow_mut(self: &mut LayoutReference): &mut T {
+        match (self) {
+            LayoutReference::Inline { value } => value,
+            // LayoutReference::ExternalObject(addr) => &mut ObjectValue[*addr].value,
+            LayoutReference::ExternalTable { table } => table.borrow_mut(true),
+        }
+    }
+
+    public fun destroy(self: LayoutReference): T {
+        match (self) {
+            LayoutReference::Inline { value } => value,
+            // LayoutReference::ExternalObject(addr) => {
+            //     let ObjectValue { value } = move_from>(addr);
+            //     value
+            // },
+            LayoutReference::ExternalTable { table } => {
+                let value = table.remove(true);
+                table.destroy_empty();
+                value
+            },
+        }
+    }
+
+    public fun move_to_inline(self: &mut LayoutReference) {
+        match (self) {
+            LayoutReference::Inline { value: _ } => {},
+            // LayoutReference::ExternalObject(addr) => {
+            //     let ObjectValue { value } = move_from>(*addr);
+            //     *self = LayoutReference::Inline(value);
+            // },
+            LayoutReference::ExternalTable { table } => {
+                let value = table.remove(true);
+                let LayoutReference::ExternalTable { table } = mem::replace(self, LayoutReference::Inline { value });
+                table.destroy_empty();
+            },
+        }
+    }
+
+    // public fun move_to_external_object(self: &mut LayoutReference) {
+    //     match (self) {
+    //         LayoutReference::Inline(value) => {
+    //             *self = LayoutReference::ExternalObject(store_at_new_address(value));
+    //         },
+    //         LayoutReference::ExternalObject(_) => {},
+    //         LayoutReference::ExternalTable(table) => table.remove(true),
+    //     }
+    // }
+
+    public fun move_to_external_table(self: &mut LayoutReference) {
+        match (self) {
+            LayoutReference::Inline { value: _ } => {
+                let LayoutReference::Inline { value } = mem::replace(self, LayoutReference::ExternalTable { table: table_with_length::new() });
+                self.table.add(true, value);
+            },
+            // LayoutReference::ExternalObject(_) => {},
+            LayoutReference::ExternalTable { table: _ } => {},
+        }
+    }
+
+    fun store_at_new_address(value: T): address {
+        let constructor_ref = object::create_object(@aptos_framework);
+        let extend_ref = object::generate_extend_ref(&constructor_ref);
+        object::delete(object::generate_delete_ref(&constructor_ref));
+        move_to(&object::generate_signer_for_extending(&extend_ref), ObjectValue { value });
+        object::address_from_extend_ref(&extend_ref)
+    }
+}