crates/sui-framework/docs/deepbook/clob.md
PoolCreatedOrderPlacedV2OrderCanceledOrderFilledV2OrderTickLevelPoolOrderPlacedOrderFilleddestroy_empty_levelcreate_accountcreate_pooldeposit_basedeposit_quotewithdraw_basewithdraw_quoteswap_exact_base_for_quoteswap_exact_quote_for_baseplace_market_orderplace_limit_orderorder_is_bidemit_order_canceledcancel_orderremove_ordercancel_all_ordersbatch_cancel_orderlist_open_ordersaccount_balanceget_market_priceget_level2_book_status_bid_sideget_level2_book_status_ask_sideget_level2_book_statusget_order_status<a name="deepbook_clob_PoolCreated"></a>
PoolCreatedEmitted when a new pool is created
<pre><code><b>public</b> <b>struct</b> <a href="../deepbook/clob.md#deepbook_clob_PoolCreated">PoolCreated</a> <b>has</b> <b>copy</b>, drop, store </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>pool_id: <a href="../sui/object.md#sui_object_ID">sui::object::ID</a></code> </dt> <dd> object ID of the newly created pool </dd> <dt> <code>base_asset: <a href="../std/type_name.md#std_type_name_TypeName">std::type_name::TypeName</a></code> </dt> <dd> </dd> <dt> <code>quote_asset: <a href="../std/type_name.md#std_type_name_TypeName">std::type_name::TypeName</a></code> </dt> <dd> </dd> <dt> <code>taker_fee_rate: u64</code> </dt> <dd> </dd> <dt> <code>maker_rebate_rate: u64</code> </dt> <dd> </dd> <dt> <code>tick_size: u64</code> </dt> <dd> </dd> <dt> <code>lot_size: u64</code> </dt> <dd> </dd> </dl> </details><a name="deepbook_clob_OrderPlacedV2"></a>
OrderPlacedV2Emitted when a maker order is injected into the order book.
<pre><code><b>public</b> <b>struct</b> <a href="../deepbook/clob.md#deepbook_clob_OrderPlacedV2">OrderPlacedV2</a><<b>phantom</b> BaseAsset, <b>phantom</b> QuoteAsset> <b>has</b> <b>copy</b>, drop, store </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>pool_id: <a href="../sui/object.md#sui_object_ID">sui::object::ID</a></code> </dt> <dd> object ID of the pool the order was placed on </dd> <dt> <code>order_id: u64</code> </dt> <dd> ID of the order within the pool </dd> <dt> <code>is_bid: bool</code> </dt> <dd> </dd> <dt> <code>owner: <a href="../sui/object.md#sui_object_ID">sui::object::ID</a></code> </dt> <dd> object ID of the <code>AccountCap</code> that placed the order </dd> <dt> <code>base_asset_quantity_placed: u64</code> </dt> <dd> </dd> <dt> <code>price: u64</code> </dt> <dd> </dd> <dt> <code>expire_timestamp: u64</code> </dt> <dd> </dd> </dl> </details><a name="deepbook_clob_OrderCanceled"></a>
OrderCanceledEmitted when a maker order is canceled.
<pre><code><b>public</b> <b>struct</b> <a href="../deepbook/clob.md#deepbook_clob_OrderCanceled">OrderCanceled</a><<b>phantom</b> BaseAsset, <b>phantom</b> QuoteAsset> <b>has</b> <b>copy</b>, drop, store </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>pool_id: <a href="../sui/object.md#sui_object_ID">sui::object::ID</a></code> </dt> <dd> object ID of the pool the order was placed on </dd> <dt> <code>order_id: u64</code> </dt> <dd> ID of the order within the pool </dd> <dt> <code>is_bid: bool</code> </dt> <dd> </dd> <dt> <code>owner: <a href="../sui/object.md#sui_object_ID">sui::object::ID</a></code> </dt> <dd> object ID of the <code>AccountCap</code> that placed the order </dd> <dt> <code>base_asset_quantity_canceled: u64</code> </dt> <dd> </dd> <dt> <code>price: u64</code> </dt> <dd> </dd> </dl> </details><a name="deepbook_clob_OrderFilledV2"></a>
OrderFilledV2Emitted only when a maker order is filled.
<pre><code><b>public</b> <b>struct</b> <a href="../deepbook/clob.md#deepbook_clob_OrderFilledV2">OrderFilledV2</a><<b>phantom</b> BaseAsset, <b>phantom</b> QuoteAsset> <b>has</b> <b>copy</b>, drop, store </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>pool_id: <a href="../sui/object.md#sui_object_ID">sui::object::ID</a></code> </dt> <dd> object ID of the pool the order was placed on </dd> <dt> <code>order_id: u64</code> </dt> <dd> ID of the order within the pool </dd> <dt> <code>is_bid: bool</code> </dt> <dd> </dd> <dt> <code>owner: <a href="../sui/object.md#sui_object_ID">sui::object::ID</a></code> </dt> <dd> object ID of the <code>AccountCap</code> that placed the order </dd> <dt> <code>total_quantity: u64</code> </dt> <dd> </dd> <dt> <code>base_asset_quantity_filled: u64</code> </dt> <dd> </dd> <dt> <code>base_asset_quantity_remaining: u64</code> </dt> <dd> </dd> <dt> <code>price: u64</code> </dt> <dd> </dd> <dt> <code>taker_commission: u64</code> </dt> <dd> </dd> <dt> <code>maker_rebates: u64</code> </dt> <dd> </dd> </dl> </details><a name="deepbook_clob_Order"></a>
Order<a name="deepbook_clob_TickLevel"></a>
TickLevel<a name="deepbook_clob_Pool"></a>
Pool<a name="deepbook_clob_OrderPlaced"></a>
OrderPlacedDeprecated since v1.0.0, use <code><a href="../deepbook/clob.md#deepbook_clob_OrderPlacedV2">OrderPlacedV2</a></code> instead.
<pre><code><b>public</b> <b>struct</b> <a href="../deepbook/clob.md#deepbook_clob_OrderPlaced">OrderPlaced</a><<b>phantom</b> BaseAsset, <b>phantom</b> QuoteAsset> <b>has</b> <b>copy</b>, drop, store </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>pool_id: <a href="../sui/object.md#sui_object_ID">sui::object::ID</a></code> </dt> <dd> object ID of the pool the order was placed on </dd> <dt> <code>order_id: u64</code> </dt> <dd> ID of the order within the pool </dd> <dt> <code>is_bid: bool</code> </dt> <dd> </dd> <dt> <code>owner: <a href="../sui/object.md#sui_object_ID">sui::object::ID</a></code> </dt> <dd> object ID of the <code>AccountCap</code> that placed the order </dd> <dt> <code>base_asset_quantity_placed: u64</code> </dt> <dd> </dd> <dt> <code>price: u64</code> </dt> <dd> </dd> </dl> </details><a name="deepbook_clob_OrderFilled"></a>
OrderFilledDeprecated since v1.0.0, use <code><a href="../deepbook/clob.md#deepbook_clob_OrderFilledV2">OrderFilledV2</a></code> instead.
<pre><code><b>public</b> <b>struct</b> <a href="../deepbook/clob.md#deepbook_clob_OrderFilled">OrderFilled</a><<b>phantom</b> BaseAsset, <b>phantom</b> QuoteAsset> <b>has</b> <b>copy</b>, drop, store </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>pool_id: <a href="../sui/object.md#sui_object_ID">sui::object::ID</a></code> </dt> <dd> object ID of the pool the order was placed on </dd> <dt> <code>order_id: u64</code> </dt> <dd> ID of the order within the pool </dd> <dt> <code>is_bid: bool</code> </dt> <dd> </dd> <dt> <code>owner: <a href="../sui/object.md#sui_object_ID">sui::object::ID</a></code> </dt> <dd> object ID of the <code>AccountCap</code> that placed the order </dd> <dt> <code>total_quantity: u64</code> </dt> <dd> </dd> <dt> <code>base_asset_quantity_filled: u64</code> </dt> <dd> </dd> <dt> <code>base_asset_quantity_remaining: u64</code> </dt> <dd> </dd> <dt> <code>price: u64</code> </dt> <dd> </dd> </dl> </details><a name="@Constants_0"></a>
<a name="deepbook_clob_DEPRECATED"></a>
<pre><code><b>const</b> <a href="../deepbook/clob.md#deepbook_clob_DEPRECATED">DEPRECATED</a>: u64 = 0; </code></pre><a name="deepbook_clob_EInvalidOrderId"></a>
<pre><code><b>const</b> <a href="../deepbook/clob.md#deepbook_clob_EInvalidOrderId">EInvalidOrderId</a>: u64 = 3; </code></pre><a name="deepbook_clob_EUnauthorizedCancel"></a>
<pre><code><b>const</b> <a href="../deepbook/clob.md#deepbook_clob_EUnauthorizedCancel">EUnauthorizedCancel</a>: u64 = 4; </code></pre><a name="deepbook_clob_EInvalidQuantity"></a>
<pre><code><b>const</b> <a href="../deepbook/clob.md#deepbook_clob_EInvalidQuantity">EInvalidQuantity</a>: u64 = 6; </code></pre><a name="deepbook_clob_EInvalidTickPrice"></a>
<pre><code><b>const</b> <a href="../deepbook/clob.md#deepbook_clob_EInvalidTickPrice">EInvalidTickPrice</a>: u64 = 11; </code></pre><a name="deepbook_clob_EInvalidUser"></a>
<pre><code><b>const</b> <a href="../deepbook/clob.md#deepbook_clob_EInvalidUser">EInvalidUser</a>: u64 = 12; </code></pre><a name="deepbook_clob_MIN_ASK_ORDER_ID"></a>
<pre><code><b>const</b> <a href="../deepbook/clob.md#deepbook_clob_MIN_ASK_ORDER_ID">MIN_ASK_ORDER_ID</a>: u64 = 9223372036854775808; </code></pre><a name="deepbook_clob_destroy_empty_level"></a>
destroy_empty_level<a name="deepbook_clob_create_account"></a>
create_account<a name="deepbook_clob_create_pool"></a>
create_pool<a name="deepbook_clob_deposit_base"></a>
deposit_base<a name="deepbook_clob_deposit_quote"></a>
deposit_quote<a name="deepbook_clob_withdraw_base"></a>
withdraw_base<a name="deepbook_clob_withdraw_quote"></a>
withdraw_quote<a name="deepbook_clob_swap_exact_base_for_quote"></a>
swap_exact_base_for_quote<a name="deepbook_clob_swap_exact_quote_for_base"></a>
swap_exact_quote_for_base<a name="deepbook_clob_place_market_order"></a>
place_market_orderPlace a market order to the order book.
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_place_market_order">place_market_order</a><BaseAsset, QuoteAsset>(_pool: &<b>mut</b> <a href="../deepbook/clob.md#deepbook_clob_Pool">deepbook::clob::Pool</a><BaseAsset, QuoteAsset>, _quantity: u64, _is_bid: bool, _base_coin: <a href="../sui/coin.md#sui_coin_Coin">sui::coin::Coin</a><BaseAsset>, _quote_coin: <a href="../sui/coin.md#sui_coin_Coin">sui::coin::Coin</a><QuoteAsset>, _clock: &<a href="../sui/clock.md#sui_clock_Clock">sui::clock::Clock</a>, _ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>): (<a href="../sui/coin.md#sui_coin_Coin">sui::coin::Coin</a><BaseAsset>, <a href="../sui/coin.md#sui_coin_Coin">sui::coin::Coin</a><QuoteAsset>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_place_market_order">place_market_order</a><BaseAsset, QuoteAsset>( _pool: &<b>mut</b> <a href="../deepbook/clob.md#deepbook_clob_Pool">Pool</a><BaseAsset, QuoteAsset>, _quantity: u64, _is_bid: bool, <b>mut</b> _base_coin: Coin<BaseAsset>, <b>mut</b> _quote_coin: Coin<QuoteAsset>, _clock: &Clock, _ctx: &<b>mut</b> TxContext, ): (Coin<BaseAsset>, Coin<QuoteAsset>) { <b>abort</b> 1337 } </code></pre> </details><a name="deepbook_clob_place_limit_order"></a>
place_limit_orderPlace a limit order to the order book. Returns (base quantity filled, quote quantity filled, whether a maker order is being placed, order id of the maker order). When the limit order is not successfully placed, we return false to indicate that and also returns a meaningless order_id 0. When the limit order is successfully placed, we return true to indicate that and also the corresponding order_id. So please check that boolean value first before using the order id.
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_place_limit_order">place_limit_order</a><BaseAsset, QuoteAsset>(_pool: &<b>mut</b> <a href="../deepbook/clob.md#deepbook_clob_Pool">deepbook::clob::Pool</a><BaseAsset, QuoteAsset>, _price: u64, _quantity: u64, _is_bid: bool, _expire_timestamp: u64, _restriction: u8, _clock: &<a href="../sui/clock.md#sui_clock_Clock">sui::clock::Clock</a>, _account_cap: &<a href="../deepbook/custodian.md#deepbook_custodian_AccountCap">deepbook::custodian::AccountCap</a>, _ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>): (u64, u64, bool, u64) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_place_limit_order">place_limit_order</a><BaseAsset, QuoteAsset>( _pool: &<b>mut</b> <a href="../deepbook/clob.md#deepbook_clob_Pool">Pool</a><BaseAsset, QuoteAsset>, _price: u64, _quantity: u64, _is_bid: bool, _expire_timestamp: u64, // Expiration timestamp in ms in absolute value inclusive. _restriction: u8, _clock: &Clock, _account_cap: &AccountCap, _ctx: &<b>mut</b> TxContext ): (u64, u64, bool, u64) { <b>abort</b> 1337 } </code></pre> </details><a name="deepbook_clob_order_is_bid"></a>
order_is_bid<a name="deepbook_clob_emit_order_canceled"></a>
emit_order_canceled<a name="deepbook_clob_cancel_order"></a>
cancel_orderCancel and opening order. Abort if order_id is invalid or if the order is not submitted by the transaction sender.
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_cancel_order">cancel_order</a><BaseAsset, QuoteAsset>(pool: &<b>mut</b> <a href="../deepbook/clob.md#deepbook_clob_Pool">deepbook::clob::Pool</a><BaseAsset, QuoteAsset>, order_id: u64, account_cap: &<a href="../deepbook/custodian.md#deepbook_custodian_AccountCap">deepbook::custodian::AccountCap</a>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_cancel_order">cancel_order</a><BaseAsset, QuoteAsset>( pool: &<b>mut</b> <a href="../deepbook/clob.md#deepbook_clob_Pool">Pool</a><BaseAsset, QuoteAsset>, order_id: u64, account_cap: &AccountCap ) { // First check the highest bit of the order id to see whether it's bid or ask. // Then retrieve the price using the order id. // Using the price to retrieve the corresponding PriceLevel from the bids / asks Critbit Tree. // Retrieve and remove the order from open orders of the PriceLevel. <b>let</b> user = object::id(account_cap); <b>assert</b>!(contains(&pool.usr_open_orders, user), <a href="../deepbook/clob.md#deepbook_clob_EInvalidUser">EInvalidUser</a>); <b>let</b> usr_open_orders = borrow_mut(&<b>mut</b> pool.usr_open_orders, user); <b>assert</b>!(linked_table::contains(usr_open_orders, order_id), <a href="../deepbook/clob.md#deepbook_clob_EInvalidOrderId">EInvalidOrderId</a>); <b>let</b> tick_price = *linked_table::borrow(usr_open_orders, order_id); <b>let</b> is_bid = <a href="../deepbook/clob.md#deepbook_clob_order_is_bid">order_is_bid</a>(order_id); <b>let</b> (tick_exists, tick_index) = find_leaf( <b>if</b> (is_bid) { &pool.bids } <b>else</b> { &pool.asks }, tick_price); <b>assert</b>!(tick_exists, <a href="../deepbook/clob.md#deepbook_clob_EInvalidOrderId">EInvalidOrderId</a>); <b>let</b> order = <a href="../deepbook/clob.md#deepbook_clob_remove_order">remove_order</a>( <b>if</b> (is_bid) { &<b>mut</b> pool.bids } <b>else</b> { &<b>mut</b> pool.asks }, usr_open_orders, tick_index, order_id, user ); <b>if</b> (is_bid) { <b>let</b> balance_locked = clob_math::mul(order.quantity, order.price); <a href="../deepbook/custodian.md#deepbook_custodian_unlock_balance">custodian::unlock_balance</a>(&<b>mut</b> pool.quote_custodian, user, balance_locked); } <b>else</b> { <a href="../deepbook/custodian.md#deepbook_custodian_unlock_balance">custodian::unlock_balance</a>(&<b>mut</b> pool.base_custodian, user, order.quantity); }; <a href="../deepbook/clob.md#deepbook_clob_emit_order_canceled">emit_order_canceled</a><BaseAsset, QuoteAsset>(*object::uid_as_inner(&pool.id), &order); } </code></pre> </details><a name="deepbook_clob_remove_order"></a>
remove_order<a name="deepbook_clob_cancel_all_orders"></a>
cancel_all_orders<a name="deepbook_clob_batch_cancel_order"></a>
batch_cancel_orderBatch cancel limit orders to save gas cost. Abort if any of the order_ids are not submitted by the sender. Skip any order_id that is invalid. Note that this function can reduce gas cost even further if caller has multiple orders at the same price level, and if orders with the same price are grouped together in the vector. For example, if we have the following order_id to price mapping, {0: 100., 1: 200., 2: 100., 3: 200.}. Grouping order_ids like [0, 2, 1, 3] would make it the most gas efficient.
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_batch_cancel_order">batch_cancel_order</a><BaseAsset, QuoteAsset>(pool: &<b>mut</b> <a href="../deepbook/clob.md#deepbook_clob_Pool">deepbook::clob::Pool</a><BaseAsset, QuoteAsset>, order_ids: vector<u64>, account_cap: &<a href="../deepbook/custodian.md#deepbook_custodian_AccountCap">deepbook::custodian::AccountCap</a>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_batch_cancel_order">batch_cancel_order</a><BaseAsset, QuoteAsset>( pool: &<b>mut</b> <a href="../deepbook/clob.md#deepbook_clob_Pool">Pool</a><BaseAsset, QuoteAsset>, order_ids: vector<u64>, account_cap: &AccountCap ) { <b>let</b> pool_id = *object::uid_as_inner(&pool.id); // First group the order ids according to price level, // so that we don't have to retrieve the PriceLevel multiple times <b>if</b> there are orders at the same price level. // Iterate over each price level, retrieve the corresponding PriceLevel. // Iterate over the order ids that need to be canceled at that price level, // retrieve and remove the order from open orders of the PriceLevel. <b>let</b> user = object::id(account_cap); <b>assert</b>!(contains(&pool.usr_open_orders, user), 0); <b>let</b> <b>mut</b> tick_index: u64 = 0; <b>let</b> <b>mut</b> tick_price: u64 = 0; <b>let</b> n_order = vector::length(&order_ids); <b>let</b> <b>mut</b> i_order = 0; <b>let</b> usr_open_orders = borrow_mut(&<b>mut</b> pool.usr_open_orders, user); <b>while</b> (i_order < n_order) { <b>let</b> order_id = *vector::borrow(&order_ids, i_order); <b>assert</b>!(linked_table::contains(usr_open_orders, order_id), <a href="../deepbook/clob.md#deepbook_clob_EInvalidOrderId">EInvalidOrderId</a>); <b>let</b> new_tick_price = *linked_table::borrow(usr_open_orders, order_id); <b>let</b> is_bid = <a href="../deepbook/clob.md#deepbook_clob_order_is_bid">order_is_bid</a>(order_id); <b>if</b> (new_tick_price != tick_price) { tick_price = new_tick_price; <b>let</b> (tick_exists, new_tick_index) = find_leaf( <b>if</b> (is_bid) { &pool.bids } <b>else</b> { &pool.asks }, tick_price ); <b>assert</b>!(tick_exists, <a href="../deepbook/clob.md#deepbook_clob_EInvalidTickPrice">EInvalidTickPrice</a>); tick_index = new_tick_index; }; <b>let</b> order = <a href="../deepbook/clob.md#deepbook_clob_remove_order">remove_order</a>( <b>if</b> (is_bid) { &<b>mut</b> pool.bids } <b>else</b> { &<b>mut</b> pool.asks }, usr_open_orders, tick_index, order_id, user ); <b>if</b> (is_bid) { <b>let</b> balance_locked = clob_math::mul(order.quantity, order.price); <a href="../deepbook/custodian.md#deepbook_custodian_unlock_balance">custodian::unlock_balance</a>(&<b>mut</b> pool.quote_custodian, user, balance_locked); } <b>else</b> { <a href="../deepbook/custodian.md#deepbook_custodian_unlock_balance">custodian::unlock_balance</a>(&<b>mut</b> pool.base_custodian, user, order.quantity); }; <a href="../deepbook/clob.md#deepbook_clob_emit_order_canceled">emit_order_canceled</a><BaseAsset, QuoteAsset>(pool_id, &order); i_order = i_order + 1; } } </code></pre> </details><a name="deepbook_clob_list_open_orders"></a>
list_open_orders<a name="deepbook_clob_account_balance"></a>
account_balancequery user balance inside custodian
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_account_balance">account_balance</a><BaseAsset, QuoteAsset>(pool: &<a href="../deepbook/clob.md#deepbook_clob_Pool">deepbook::clob::Pool</a><BaseAsset, QuoteAsset>, account_cap: &<a href="../deepbook/custodian.md#deepbook_custodian_AccountCap">deepbook::custodian::AccountCap</a>): (u64, u64, u64, u64) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_account_balance">account_balance</a><BaseAsset, QuoteAsset>( pool: &<a href="../deepbook/clob.md#deepbook_clob_Pool">Pool</a><BaseAsset, QuoteAsset>, account_cap: &AccountCap ): (u64, u64, u64, u64) { <b>let</b> user = object::id(account_cap); <b>let</b> (base_avail, base_locked) = <a href="../deepbook/custodian.md#deepbook_custodian_account_balance">custodian::account_balance</a>(&pool.base_custodian, user); <b>let</b> (quote_avail, quote_locked) = <a href="../deepbook/custodian.md#deepbook_custodian_account_balance">custodian::account_balance</a>(&pool.quote_custodian, user); (base_avail, base_locked, quote_avail, quote_locked) } </code></pre> </details><a name="deepbook_clob_get_market_price"></a>
get_market_priceQuery the market price of order book returns (best_bid_price, best_ask_price)
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_get_market_price">get_market_price</a><BaseAsset, QuoteAsset>(pool: &<a href="../deepbook/clob.md#deepbook_clob_Pool">deepbook::clob::Pool</a><BaseAsset, QuoteAsset>): (u64, u64) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_get_market_price">get_market_price</a><BaseAsset, QuoteAsset>( pool: &<a href="../deepbook/clob.md#deepbook_clob_Pool">Pool</a><BaseAsset, QuoteAsset> ): (u64, u64){ <b>let</b> (bid_price, _) = <a href="../deepbook/critbit.md#deepbook_critbit_max_leaf">critbit::max_leaf</a>(&pool.bids); <b>let</b> (ask_price, _) = <a href="../deepbook/critbit.md#deepbook_critbit_min_leaf">critbit::min_leaf</a>(&pool.asks); <b>return</b> (bid_price, ask_price) } </code></pre> </details><a name="deepbook_clob_get_level2_book_status_bid_side"></a>
get_level2_book_status_bid_sideEnter a price range and return the level2 order depth of all valid prices within this price range in bid side returns two vectors of u64 The previous is a list of all valid prices The latter is the corresponding depth list
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_get_level2_book_status_bid_side">get_level2_book_status_bid_side</a><BaseAsset, QuoteAsset>(pool: &<a href="../deepbook/clob.md#deepbook_clob_Pool">deepbook::clob::Pool</a><BaseAsset, QuoteAsset>, price_low: u64, price_high: u64, clock: &<a href="../sui/clock.md#sui_clock_Clock">sui::clock::Clock</a>): (vector<u64>, vector<u64>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_get_level2_book_status_bid_side">get_level2_book_status_bid_side</a><BaseAsset, QuoteAsset>( pool: &<a href="../deepbook/clob.md#deepbook_clob_Pool">Pool</a><BaseAsset, QuoteAsset>, <b>mut</b> price_low: u64, <b>mut</b> price_high: u64, clock: &Clock ): (vector<u64>, vector<u64>) { <b>let</b> (price_low_, _) = <a href="../deepbook/critbit.md#deepbook_critbit_min_leaf">critbit::min_leaf</a>(&pool.bids); <b>if</b> (price_low < price_low_) price_low = price_low_; <b>let</b> (price_high_, _) = <a href="../deepbook/critbit.md#deepbook_critbit_max_leaf">critbit::max_leaf</a>(&pool.bids); <b>if</b> (price_high > price_high_) price_high = price_high_; price_low = <a href="../deepbook/critbit.md#deepbook_critbit_find_closest_key">critbit::find_closest_key</a>(&pool.bids, price_low); price_high = <a href="../deepbook/critbit.md#deepbook_critbit_find_closest_key">critbit::find_closest_key</a>(&pool.bids, price_high); <b>let</b> <b>mut</b> price_vec = vector::empty<u64>(); <b>let</b> <b>mut</b> depth_vec = vector::empty<u64>(); <b>if</b> (price_low == 0) { <b>return</b> (price_vec, depth_vec) }; <b>while</b> (price_low <= price_high) { <b>let</b> depth = <a href="../deepbook/clob.md#deepbook_clob_get_level2_book_status">get_level2_book_status</a>( &pool.bids, price_low, clock::timestamp_ms(clock) ); vector::push_back(&<b>mut</b> price_vec, price_low); vector::push_back(&<b>mut</b> depth_vec, depth); <b>let</b> (next_price, _) = <a href="../deepbook/critbit.md#deepbook_critbit_next_leaf">critbit::next_leaf</a>(&pool.bids, price_low); <b>if</b> (next_price == 0) { <b>break</b> } <b>else</b> { price_low = next_price }; }; (price_vec, depth_vec) } </code></pre> </details><a name="deepbook_clob_get_level2_book_status_ask_side"></a>
get_level2_book_status_ask_sideEnter a price range and return the level2 order depth of all valid prices within this price range in ask side returns two vectors of u64 The previous is a list of all valid prices The latter is the corresponding depth list
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_get_level2_book_status_ask_side">get_level2_book_status_ask_side</a><BaseAsset, QuoteAsset>(pool: &<a href="../deepbook/clob.md#deepbook_clob_Pool">deepbook::clob::Pool</a><BaseAsset, QuoteAsset>, price_low: u64, price_high: u64, clock: &<a href="../sui/clock.md#sui_clock_Clock">sui::clock::Clock</a>): (vector<u64>, vector<u64>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_get_level2_book_status_ask_side">get_level2_book_status_ask_side</a><BaseAsset, QuoteAsset>( pool: &<a href="../deepbook/clob.md#deepbook_clob_Pool">Pool</a><BaseAsset, QuoteAsset>, <b>mut</b> price_low: u64, <b>mut</b> price_high: u64, clock: &Clock ): (vector<u64>, vector<u64>) { <b>let</b> (price_low_, _) = <a href="../deepbook/critbit.md#deepbook_critbit_min_leaf">critbit::min_leaf</a>(&pool.asks); <b>if</b> (price_low < price_low_) price_low = price_low_; <b>let</b> (price_high_, _) = <a href="../deepbook/critbit.md#deepbook_critbit_max_leaf">critbit::max_leaf</a>(&pool.asks); <b>if</b> (price_high > price_high_) price_high = price_high_; price_low = <a href="../deepbook/critbit.md#deepbook_critbit_find_closest_key">critbit::find_closest_key</a>(&pool.asks, price_low); price_high = <a href="../deepbook/critbit.md#deepbook_critbit_find_closest_key">critbit::find_closest_key</a>(&pool.asks, price_high); <b>let</b> <b>mut</b> price_vec = vector::empty<u64>(); <b>let</b> <b>mut</b> depth_vec = vector::empty<u64>(); <b>if</b> (price_low == 0) { <b>return</b> (price_vec, depth_vec) }; <b>while</b> (price_low <= price_high) { <b>let</b> depth = <a href="../deepbook/clob.md#deepbook_clob_get_level2_book_status">get_level2_book_status</a>( &pool.asks, price_low, clock::timestamp_ms(clock) ); vector::push_back(&<b>mut</b> price_vec, price_low); vector::push_back(&<b>mut</b> depth_vec, depth); <b>let</b> (next_price, _) = <a href="../deepbook/critbit.md#deepbook_critbit_next_leaf">critbit::next_leaf</a>(&pool.asks, price_low); <b>if</b> (next_price == 0) { <b>break</b> } <b>else</b> { price_low = next_price }; }; (price_vec, depth_vec) } </code></pre> </details><a name="deepbook_clob_get_level2_book_status"></a>
get_level2_book_statusinternal func to retrieve single depth of a tick price
<pre><code><b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_get_level2_book_status">get_level2_book_status</a>(open_orders: &<a href="../deepbook/critbit.md#deepbook_critbit_CritbitTree">deepbook::critbit::CritbitTree</a><<a href="../deepbook/clob.md#deepbook_clob_TickLevel">deepbook::clob::TickLevel</a>>, price: u64, time_stamp: u64): u64 </code></pre> <details> <summary>Implementation</summary> <pre><code><b>fun</b> <a href="../deepbook/clob.md#deepbook_clob_get_level2_book_status">get_level2_book_status</a>( open_orders: &CritbitTree<<a href="../deepbook/clob.md#deepbook_clob_TickLevel">TickLevel</a>>, price: u64, time_stamp: u64 ): u64 { <b>let</b> tick_level = <a href="../deepbook/critbit.md#deepbook_critbit_borrow_leaf_by_key">critbit::borrow_leaf_by_key</a>(open_orders, price); <b>let</b> tick_open_orders = &tick_level.open_orders; <b>let</b> <b>mut</b> depth = 0; <b>let</b> <b>mut</b> order_id = linked_table::front(tick_open_orders); <b>let</b> <b>mut</b> order: &<a href="../deepbook/clob.md#deepbook_clob_Order">Order</a>; <b>while</b> (!option::is_none(order_id)) { order = linked_table::borrow(tick_open_orders, *option::borrow(order_id)); <b>if</b> (order.expire_timestamp > time_stamp) depth = depth + order.quantity; order_id = linked_table::next(tick_open_orders, *option::borrow(order_id)); }; depth } </code></pre> </details><a name="deepbook_clob_get_order_status"></a>
get_order_status