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
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)
+ }
+}