crates/sui-framework/docs/deepbook/clob_v2.md
PoolCreatedOrderPlacedOrderCanceledAllOrdersCanceledComponentAllOrdersCanceledOrderFilledDepositAssetWithdrawAssetMatchedOrderMetadataOrderTickLevelPoolPoolOwnerCapusr_open_orders_existusr_open_orders_for_addressusr_open_orderswithdraw_feesdelete_pool_owner_capdestroy_empty_levelcreate_accountcreate_poolcreate_customized_poolcreate_pool_with_returncreate_customized_pool_with_returncreate_customized_pool_v2deposit_basedeposit_quotewithdraw_basewithdraw_quoteswap_exact_base_for_quoteswap_exact_base_for_quote_with_metadataswap_exact_quote_for_baseswap_exact_quote_for_base_with_metadataplace_market_orderplace_market_order_with_metadataplace_limit_orderplace_limit_order_with_metadataorder_is_bidemit_order_canceledcancel_orderremove_ordercancel_all_ordersbatch_cancel_orderclean_up_expired_orderslist_open_ordersaccount_balanceget_market_priceget_level2_book_status_bid_sideget_level2_book_status_ask_sideget_level2_book_statusget_order_statusmatched_order_metadata_infoasksbidstick_sizemaker_rebate_ratetaker_fee_ratepool_sizeopen_ordersorder_idtick_leveloriginal_quantityquantityis_bidownerexpire_timestampquote_asset_trading_fees_valueclone_order<a name="deepbook_clob_v2_PoolCreated"></a>
PoolCreatedEmitted when a new pool is created
<pre><code><b>public</b> <b>struct</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_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><a href="../deepbook/clob_v2.md#deepbook_clob_v2_taker_fee_rate">taker_fee_rate</a>: u64</code> </dt> <dd> </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_maker_rebate_rate">maker_rebate_rate</a>: u64</code> </dt> <dd> </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_tick_size">tick_size</a>: u64</code> </dt> <dd> </dd> <dt> <code>lot_size: u64</code> </dt> <dd> </dd> </dl> </details><a name="deepbook_clob_v2_OrderPlaced"></a>
OrderPlacedEmitted when a maker order is injected into the order book.
<pre><code><b>public</b> <b>struct</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_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><a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>: u64</code> </dt> <dd> ID of the order within the pool </dd> <dt> <code>client_order_id: u64</code> </dt> <dd> ID of the order defined by client </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>: bool</code> </dt> <dd> </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>: <b>address</b></code> </dt> <dd> owner ID of the <code>AccountCap</code> that placed the order </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_original_quantity">original_quantity</a>: u64</code> </dt> <dd> </dd> <dt> <code>base_asset_quantity_placed: u64</code> </dt> <dd> </dd> <dt> <code>price: u64</code> </dt> <dd> </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_expire_timestamp">expire_timestamp</a>: u64</code> </dt> <dd> </dd> </dl> </details><a name="deepbook_clob_v2_OrderCanceled"></a>
OrderCanceledEmitted when a maker order is canceled.
<pre><code><b>public</b> <b>struct</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_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><a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>: u64</code> </dt> <dd> ID of the order within the pool </dd> <dt> <code>client_order_id: u64</code> </dt> <dd> ID of the order defined by client </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>: bool</code> </dt> <dd> </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>: <b>address</b></code> </dt> <dd> owner ID of the <code>AccountCap</code> that canceled the order </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_original_quantity">original_quantity</a>: u64</code> </dt> <dd> </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_v2_AllOrdersCanceledComponent"></a>
AllOrdersCanceledComponentA struct to make all orders canceled a more efficient struct
<pre><code><b>public</b> <b>struct</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_AllOrdersCanceledComponent">AllOrdersCanceledComponent</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><a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>: u64</code> </dt> <dd> ID of the order within the pool </dd> <dt> <code>client_order_id: u64</code> </dt> <dd> ID of the order defined by client </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>: bool</code> </dt> <dd> </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>: <b>address</b></code> </dt> <dd> owner ID of the <code>AccountCap</code> that canceled the order </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_original_quantity">original_quantity</a>: u64</code> </dt> <dd> </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_v2_AllOrdersCanceled"></a>
AllOrdersCanceledEmitted when batch of orders are canceled.
<pre><code><b>public</b> <b>struct</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_AllOrdersCanceled">AllOrdersCanceled</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>orders_canceled: vector<<a href="../deepbook/clob_v2.md#deepbook_clob_v2_AllOrdersCanceledComponent">deepbook::clob_v2::AllOrdersCanceledComponent</a><BaseAsset, QuoteAsset>></code> </dt> <dd> </dd> </dl> </details><a name="deepbook_clob_v2_OrderFilled"></a>
OrderFilledEmitted only when a maker order is filled.
<pre><code><b>public</b> <b>struct</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_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><a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>: u64</code> </dt> <dd> ID of the order within the pool </dd> <dt> <code>taker_client_order_id: u64</code> </dt> <dd> ID of the order defined by taker client </dd> <dt> <code>maker_client_order_id: u64</code> </dt> <dd> ID of the order defined by maker client </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>: bool</code> </dt> <dd> </dd> <dt> <code>taker_address: <b>address</b></code> </dt> <dd> owner ID of the <code>AccountCap</code> that filled the order </dd> <dt> <code>maker_address: <b>address</b></code> </dt> <dd> owner ID of the <code>AccountCap</code> that placed the order </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_original_quantity">original_quantity</a>: 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_v2_DepositAsset"></a>
DepositAssetEmitted when user deposit asset to custodian
<pre><code><b>public</b> <b>struct</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_DepositAsset">DepositAsset</a><<b>phantom</b> Asset> <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 that asset deposit to </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_quantity">quantity</a>: u64</code> </dt> <dd> quantity of the asset deposited </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>: <b>address</b></code> </dt> <dd> owner address of the <code>AccountCap</code> that deposit the asset </dd> </dl> </details><a name="deepbook_clob_v2_WithdrawAsset"></a>
WithdrawAssetEmitted when user withdraw asset from custodian
<pre><code><b>public</b> <b>struct</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_WithdrawAsset">WithdrawAsset</a><<b>phantom</b> Asset> <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 that asset withdraw from </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_quantity">quantity</a>: u64</code> </dt> <dd> quantity of the asset user withdrew </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>: <b>address</b></code> </dt> <dd> owner ID of the <code>AccountCap</code> that withdrew the asset </dd> </dl> </details><a name="deepbook_clob_v2_MatchedOrderMetadata"></a>
MatchedOrderMetadataReturned as metadata only when a maker order is filled from place order functions.
<pre><code><b>public</b> <b>struct</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_MatchedOrderMetadata">MatchedOrderMetadata</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><a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>: u64</code> </dt> <dd> ID of the order within the pool </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>: bool</code> </dt> <dd> Direction of order. </dd> <dt> <code>taker_address: <b>address</b></code> </dt> <dd> owner ID of the <code>AccountCap</code> that filled the order </dd> <dt> <code>maker_address: <b>address</b></code> </dt> <dd> owner ID of the <code>AccountCap</code> that placed the order </dd> <dt> <code>base_asset_quantity_filled: u64</code> </dt> <dd> qty of base asset filled. </dd> <dt> <code>price: u64</code> </dt> <dd> price at which basset asset filled. </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_v2_Order"></a>
Order<a name="deepbook_clob_v2_TickLevel"></a>
TickLevel<a name="deepbook_clob_v2_Pool"></a>
Pool<a name="deepbook_clob_v2_PoolOwnerCap"></a>
PoolOwnerCapCapability granting permission to access an entry in <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">Pool</a>.quote_asset_trading_fees</code>. The pool objects created for older pools do not have a PoolOwnerCap because they were created prior to the addition of this feature. Here is a list of 11 pools on mainnet that do not have this capability: 0x31d1790e617eef7f516555124155b28d663e5c600317c769a75ee6336a54c07f 0x6e417ee1c12ad5f2600a66bc80c7bd52ff3cb7c072d508700d17cf1325324527 0x17625f1a241d34d2da0dc113086f67a2b832e3e8cd8006887c195cd24d3598a3 0x276ff4d99ecb3175091ba4baffa9b07590f84e2344e3f16e95d30d2c1678b84c 0xd1f0a9baacc1864ab19534e2d4c5d6c14f2e071a1f075e8e7f9d51f2c17dc238 0x4405b50d791fd3346754e8171aaab6bc2ed26c2c46efdd033c14b30ae507ac33 0xf0f663cf87f1eb124da2fc9be813e0ce262146f3df60bc2052d738eb41a25899 0xd9e45ab5440d61cc52e3b2bd915cdd643146f7593d587c715bc7bfa48311d826 0x5deafda22b6b86127ea4299503362638bea0ca33bb212ea3a67b029356b8b955 0x7f526b1263c4b91b43c9e646419b5696f424de28dda3c1e6658cc0a54558baa7 0x18d871e3c3da99046dfc0d3de612c5d88859bc03b8f0568bd127d0e70dbc58be
<pre><code><b>public</b> <b>struct</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_PoolOwnerCap">PoolOwnerCap</a> <b>has</b> key, store </code></pre> <details> <summary>Fields</summary> <dl> <dt> <code>id: <a href="../sui/object.md#sui_object_UID">sui::object::UID</a></code> </dt> <dd> </dd> <dt> <code><a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>: <b>address</b></code> </dt> <dd> The owner of this AccountCap. Note: this is derived from an object ID, not a user address </dd> </dl> </details><a name="@Constants_0"></a>
<a name="deepbook_clob_v2_EIncorrectPoolOwner"></a>
<pre><code><b>const</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_EIncorrectPoolOwner">EIncorrectPoolOwner</a>: u64 = 1; </code></pre><a name="deepbook_clob_v2_EInvalidOrderId"></a>
<pre><code><b>const</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_EInvalidOrderId">EInvalidOrderId</a>: u64 = 3; </code></pre><a name="deepbook_clob_v2_EUnauthorizedCancel"></a>
<pre><code><b>const</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_EUnauthorizedCancel">EUnauthorizedCancel</a>: u64 = 4; </code></pre><a name="deepbook_clob_v2_EInvalidQuantity"></a>
<pre><code><b>const</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_EInvalidQuantity">EInvalidQuantity</a>: u64 = 6; </code></pre><a name="deepbook_clob_v2_EInvalidTickPrice"></a>
<pre><code><b>const</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_EInvalidTickPrice">EInvalidTickPrice</a>: u64 = 11; </code></pre><a name="deepbook_clob_v2_EInvalidUser"></a>
<pre><code><b>const</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_EInvalidUser">EInvalidUser</a>: u64 = 12; </code></pre><a name="deepbook_clob_v2_ENotEqual"></a>
<pre><code><b>const</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_ENotEqual">ENotEqual</a>: u64 = 13; </code></pre><a name="deepbook_clob_v2_EInvalidExpireTimestamp"></a>
<pre><code><b>const</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_EInvalidExpireTimestamp">EInvalidExpireTimestamp</a>: u64 = 19; </code></pre><a name="deepbook_clob_v2_MIN_ASK_ORDER_ID"></a>
<pre><code><b>const</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_MIN_ASK_ORDER_ID">MIN_ASK_ORDER_ID</a>: u64 = 9223372036854775808; </code></pre><a name="deepbook_clob_v2_usr_open_orders_exist"></a>
usr_open_orders_existAccessor functions
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders_exist">usr_open_orders_exist</a><BaseAsset, QuoteAsset>(pool: &<a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">deepbook::clob_v2::Pool</a><BaseAsset, QuoteAsset>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>: <b>address</b>): bool </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders_exist">usr_open_orders_exist</a><BaseAsset, QuoteAsset>( pool: &<a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">Pool</a><BaseAsset, QuoteAsset>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>: <b>address</b> ): bool { table::contains(&pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>) } </code></pre> </details><a name="deepbook_clob_v2_usr_open_orders_for_address"></a>
usr_open_orders_for_address<a name="deepbook_clob_v2_usr_open_orders"></a>
usr_open_orders<a name="deepbook_clob_v2_withdraw_fees"></a>
withdraw_feesFunction to withdraw fees created from a pool
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_withdraw_fees">withdraw_fees</a><BaseAsset, QuoteAsset>(pool_owner_cap: &<a href="../deepbook/clob_v2.md#deepbook_clob_v2_PoolOwnerCap">deepbook::clob_v2::PoolOwnerCap</a>, pool: &<b>mut</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">deepbook::clob_v2::Pool</a><BaseAsset, QuoteAsset>, 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><QuoteAsset> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_withdraw_fees">withdraw_fees</a><BaseAsset, QuoteAsset>( pool_owner_cap: &<a href="../deepbook/clob_v2.md#deepbook_clob_v2_PoolOwnerCap">PoolOwnerCap</a>, pool: &<b>mut</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">Pool</a><BaseAsset, QuoteAsset>, ctx: &<b>mut</b> TxContext, ): Coin<QuoteAsset> { <b>assert</b>!(pool_owner_cap.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a> == object::uid_to_address(&pool.id), <a href="../deepbook/clob_v2.md#deepbook_clob_v2_EIncorrectPoolOwner">EIncorrectPoolOwner</a>); <b>let</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_quantity">quantity</a> = <a href="../deepbook/clob_v2.md#deepbook_clob_v2_quote_asset_trading_fees_value">quote_asset_trading_fees_value</a>(pool); <b>let</b> to_withdraw = balance::split(&<b>mut</b> pool.quote_asset_trading_fees, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_quantity">quantity</a>); coin::from_balance(to_withdraw, ctx) } </code></pre> </details><a name="deepbook_clob_v2_delete_pool_owner_cap"></a>
delete_pool_owner_capDestroy the given <code>pool_owner_cap</code> object
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_delete_pool_owner_cap">delete_pool_owner_cap</a>(pool_owner_cap: <a href="../deepbook/clob_v2.md#deepbook_clob_v2_PoolOwnerCap">deepbook::clob_v2::PoolOwnerCap</a>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_delete_pool_owner_cap">delete_pool_owner_cap</a>(pool_owner_cap: <a href="../deepbook/clob_v2.md#deepbook_clob_v2_PoolOwnerCap">PoolOwnerCap</a>) { <b>let</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_PoolOwnerCap">PoolOwnerCap</a> { id, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>: _ } = pool_owner_cap; object::delete(id) } </code></pre> </details><a name="deepbook_clob_v2_destroy_empty_level"></a>
destroy_empty_level<a name="deepbook_clob_v2_create_account"></a>
create_account<a name="deepbook_clob_v2_create_pool"></a>
create_pool<a name="deepbook_clob_v2_create_customized_pool"></a>
create_customized_poolFunction for creating pool with customized taker fee rate and maker rebate rate. The taker_fee_rate should be greater than or equal to the maker_rebate_rate, and both should have a scaling of 10^9. Taker_fee_rate of 0.25% should be 2_500_000 for example
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_create_customized_pool">create_customized_pool</a><BaseAsset, QuoteAsset>(_tick_size: u64, _lot_size: u64, _taker_fee_rate: u64, _maker_rebate_rate: u64, _creation_fee: <a href="../sui/coin.md#sui_coin_Coin">sui::coin::Coin</a><<a href="../sui/sui.md#sui_sui_SUI">sui::sui::SUI</a>>, _ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_create_customized_pool">create_customized_pool</a><BaseAsset, QuoteAsset>( _tick_size: u64, _lot_size: u64, _taker_fee_rate: u64, _maker_rebate_rate: u64, _creation_fee: Coin<SUI>, _ctx: &<b>mut</b> TxContext, ) { <b>abort</b> 1337 } </code></pre> </details><a name="deepbook_clob_v2_create_pool_with_return"></a>
create_pool_with_returnFunction for creating an external pool. This API can be used to wrap deepbook pools into other objects.
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_create_pool_with_return">create_pool_with_return</a><BaseAsset, QuoteAsset>(_tick_size: u64, _lot_size: u64, _creation_fee: <a href="../sui/coin.md#sui_coin_Coin">sui::coin::Coin</a><<a href="../sui/sui.md#sui_sui_SUI">sui::sui::SUI</a>>, _ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>): <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">deepbook::clob_v2::Pool</a><BaseAsset, QuoteAsset> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_create_pool_with_return">create_pool_with_return</a><BaseAsset, QuoteAsset>( _tick_size: u64, _lot_size: u64, _creation_fee: Coin<SUI>, _ctx: &<b>mut</b> TxContext, ): <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">Pool</a><BaseAsset, QuoteAsset> { <b>abort</b> 1337 } </code></pre> </details><a name="deepbook_clob_v2_create_customized_pool_with_return"></a>
create_customized_pool_with_returnFunction for creating pool with customized taker fee rate and maker rebate rate. The taker_fee_rate should be greater than or equal to the maker_rebate_rate, and both should have a scaling of 10^9. Taker_fee_rate of 0.25% should be 2_500_000 for example
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_create_customized_pool_with_return">create_customized_pool_with_return</a><BaseAsset, QuoteAsset>(_tick_size: u64, _lot_size: u64, _taker_fee_rate: u64, _maker_rebate_rate: u64, _creation_fee: <a href="../sui/coin.md#sui_coin_Coin">sui::coin::Coin</a><<a href="../sui/sui.md#sui_sui_SUI">sui::sui::SUI</a>>, _ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>): <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">deepbook::clob_v2::Pool</a><BaseAsset, QuoteAsset> </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_create_customized_pool_with_return">create_customized_pool_with_return</a><BaseAsset, QuoteAsset>( _tick_size: u64, _lot_size: u64, _taker_fee_rate: u64, _maker_rebate_rate: u64, _creation_fee: Coin<SUI>, _ctx: &<b>mut</b> TxContext, ) : <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">Pool</a><BaseAsset, QuoteAsset> { <b>abort</b> 1337 } </code></pre> </details><a name="deepbook_clob_v2_create_customized_pool_v2"></a>
create_customized_pool_v2A V2 function for creating customized pools for better PTB friendliness/compostability. If a user wants to create a pool and then destroy/lock the pool_owner_cap one can do so with this function.
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_create_customized_pool_v2">create_customized_pool_v2</a><BaseAsset, QuoteAsset>(_tick_size: u64, _lot_size: u64, _taker_fee_rate: u64, _maker_rebate_rate: u64, _creation_fee: <a href="../sui/coin.md#sui_coin_Coin">sui::coin::Coin</a><<a href="../sui/sui.md#sui_sui_SUI">sui::sui::SUI</a>>, _ctx: &<b>mut</b> <a href="../sui/tx_context.md#sui_tx_context_TxContext">sui::tx_context::TxContext</a>): (<a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">deepbook::clob_v2::Pool</a><BaseAsset, QuoteAsset>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_PoolOwnerCap">deepbook::clob_v2::PoolOwnerCap</a>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_create_customized_pool_v2">create_customized_pool_v2</a><BaseAsset, QuoteAsset>( _tick_size: u64, _lot_size: u64, _taker_fee_rate: u64, _maker_rebate_rate: u64, _creation_fee: Coin<SUI>, _ctx: &<b>mut</b> TxContext, ) : (<a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">Pool</a><BaseAsset, QuoteAsset>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_PoolOwnerCap">PoolOwnerCap</a>) { <b>abort</b> 1337 } </code></pre> </details><a name="deepbook_clob_v2_deposit_base"></a>
deposit_base<a name="deepbook_clob_v2_deposit_quote"></a>
deposit_quote<a name="deepbook_clob_v2_withdraw_base"></a>
withdraw_base<a name="deepbook_clob_v2_withdraw_quote"></a>
withdraw_quote<a name="deepbook_clob_v2_swap_exact_base_for_quote"></a>
swap_exact_base_for_quote<a name="deepbook_clob_v2_swap_exact_base_for_quote_with_metadata"></a>
swap_exact_base_for_quote_with_metadata<a name="deepbook_clob_v2_swap_exact_quote_for_base"></a>
swap_exact_quote_for_base<a name="deepbook_clob_v2_swap_exact_quote_for_base_with_metadata"></a>
swap_exact_quote_for_base_with_metadata<a name="deepbook_clob_v2_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_v2.md#deepbook_clob_v2_place_market_order">place_market_order</a><BaseAsset, QuoteAsset>(_pool: &<b>mut</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">deepbook::clob_v2::Pool</a><BaseAsset, QuoteAsset>, _account_cap: &<a href="../deepbook/custodian_v2.md#deepbook_custodian_v2_AccountCap">deepbook::custodian_v2::AccountCap</a>, _client_order_id: u64, _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_v2.md#deepbook_clob_v2_place_market_order">place_market_order</a><BaseAsset, QuoteAsset>( _pool: &<b>mut</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">Pool</a><BaseAsset, QuoteAsset>, _account_cap: &AccountCap, _client_order_id: u64, _quantity: u64, _is_bid: bool, _base_coin: Coin<BaseAsset>, _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_v2_place_market_order_with_metadata"></a>
place_market_order_with_metadata<a name="deepbook_clob_v2_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_v2.md#deepbook_clob_v2_place_limit_order">place_limit_order</a><BaseAsset, QuoteAsset>(_pool: &<b>mut</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">deepbook::clob_v2::Pool</a><BaseAsset, QuoteAsset>, _client_order_id: u64, _price: u64, _quantity: u64, _self_matching_prevention: u8, _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_v2.md#deepbook_custodian_v2_AccountCap">deepbook::custodian_v2::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_v2.md#deepbook_clob_v2_place_limit_order">place_limit_order</a><BaseAsset, QuoteAsset>( _pool: &<b>mut</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">Pool</a><BaseAsset, QuoteAsset>, _client_order_id: u64, _price: u64, _quantity: u64, _self_matching_prevention: u8, _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_v2_place_limit_order_with_metadata"></a>
place_limit_order_with_metadataPlace 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_v2.md#deepbook_clob_v2_place_limit_order_with_metadata">place_limit_order_with_metadata</a><BaseAsset, QuoteAsset>(_pool: &<b>mut</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">deepbook::clob_v2::Pool</a><BaseAsset, QuoteAsset>, _client_order_id: u64, _price: u64, _quantity: u64, _self_matching_prevention: u8, _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_v2.md#deepbook_custodian_v2_AccountCap">deepbook::custodian_v2::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, vector<<a href="../deepbook/clob_v2.md#deepbook_clob_v2_MatchedOrderMetadata">deepbook::clob_v2::MatchedOrderMetadata</a><BaseAsset, QuoteAsset>>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_place_limit_order_with_metadata">place_limit_order_with_metadata</a><BaseAsset, QuoteAsset>( _pool: &<b>mut</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">Pool</a><BaseAsset, QuoteAsset>, _client_order_id: u64, _price: u64, _quantity: u64, _self_matching_prevention: u8, _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, vector<<a href="../deepbook/clob_v2.md#deepbook_clob_v2_MatchedOrderMetadata">MatchedOrderMetadata</a><BaseAsset, QuoteAsset>>) { <b>abort</b> 1337 } </code></pre> </details><a name="deepbook_clob_v2_order_is_bid"></a>
order_is_bid<a name="deepbook_clob_v2_emit_order_canceled"></a>
emit_order_canceled<a name="deepbook_clob_v2_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_v2.md#deepbook_clob_v2_cancel_order">cancel_order</a><BaseAsset, QuoteAsset>(pool: &<b>mut</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">deepbook::clob_v2::Pool</a><BaseAsset, QuoteAsset>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>: u64, account_cap: &<a href="../deepbook/custodian_v2.md#deepbook_custodian_v2_AccountCap">deepbook::custodian_v2::AccountCap</a>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_cancel_order">cancel_order</a><BaseAsset, QuoteAsset>( pool: &<b>mut</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">Pool</a><BaseAsset, QuoteAsset>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>: 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 <a href="../deepbook/clob_v2.md#deepbook_clob_v2_bids">bids</a> / <a href="../deepbook/clob_v2.md#deepbook_clob_v2_asks">asks</a> Critbit Tree. // Retrieve and remove the order from open orders of the PriceLevel. <b>let</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a> = account_owner(account_cap); <b>assert</b>!(contains(&pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>), <a href="../deepbook/clob_v2.md#deepbook_clob_v2_EInvalidUser">EInvalidUser</a>); <b>let</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a> = borrow_mut(&<b>mut</b> pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>); <b>assert</b>!(linked_table::contains(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>), <a href="../deepbook/clob_v2.md#deepbook_clob_v2_EInvalidOrderId">EInvalidOrderId</a>); <b>let</b> tick_price = *linked_table::borrow(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>); <b>let</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a> = <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_is_bid">order_is_bid</a>(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>); <b>let</b> (tick_exists, tick_index) = find_leaf( <b>if</b> (<a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>) { &pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_bids">bids</a> } <b>else</b> { &pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_asks">asks</a> }, tick_price); <b>assert</b>!(tick_exists, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_EInvalidOrderId">EInvalidOrderId</a>); <b>let</b> order = <a href="../deepbook/clob_v2.md#deepbook_clob_v2_remove_order">remove_order</a>( <b>if</b> (<a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>) { &<b>mut</b> pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_bids">bids</a> } <b>else</b> { &<b>mut</b> pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_asks">asks</a> }, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a>, tick_index, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a> ); <b>if</b> (<a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>) { <b>let</b> (_, balance_locked) = clob_math::unsafe_mul_round(order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_quantity">quantity</a>, order.price); <a href="../deepbook/custodian.md#deepbook_custodian_unlock_balance">custodian::unlock_balance</a>(&<b>mut</b> pool.quote_custodian, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>, balance_locked); } <b>else</b> { <a href="../deepbook/custodian.md#deepbook_custodian_unlock_balance">custodian::unlock_balance</a>(&<b>mut</b> pool.base_custodian, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>, order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_quantity">quantity</a>); }; <a href="../deepbook/clob_v2.md#deepbook_clob_v2_emit_order_canceled">emit_order_canceled</a><BaseAsset, QuoteAsset>(*object::uid_as_inner(&pool.id), &order); } </code></pre> </details><a name="deepbook_clob_v2_remove_order"></a>
remove_order<a name="deepbook_clob_v2_cancel_all_orders"></a>
cancel_all_orders<a name="deepbook_clob_v2_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_v2.md#deepbook_clob_v2_batch_cancel_order">batch_cancel_order</a><BaseAsset, QuoteAsset>(pool: &<b>mut</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">deepbook::clob_v2::Pool</a><BaseAsset, QuoteAsset>, order_ids: vector<u64>, account_cap: &<a href="../deepbook/custodian_v2.md#deepbook_custodian_v2_AccountCap">deepbook::custodian_v2::AccountCap</a>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_batch_cancel_order">batch_cancel_order</a><BaseAsset, QuoteAsset>( pool: &<b>mut</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_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> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a> = account_owner(account_cap); <b>assert</b>!(contains(&pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>), 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> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a> = borrow_mut(&<b>mut</b> pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>); <b>let</b> <b>mut</b> canceled_order_events = vector[]; <b>while</b> (i_order < n_order) { <b>let</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a> = *vector::borrow(&order_ids, i_order); <b>assert</b>!(linked_table::contains(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>), <a href="../deepbook/clob_v2.md#deepbook_clob_v2_EInvalidOrderId">EInvalidOrderId</a>); <b>let</b> new_tick_price = *linked_table::borrow(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>); <b>let</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a> = <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_is_bid">order_is_bid</a>(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>); <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> (<a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>) { &pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_bids">bids</a> } <b>else</b> { &pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_asks">asks</a> }, tick_price ); <b>assert</b>!(tick_exists, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_EInvalidTickPrice">EInvalidTickPrice</a>); tick_index = new_tick_index; }; <b>let</b> order = <a href="../deepbook/clob_v2.md#deepbook_clob_v2_remove_order">remove_order</a>( <b>if</b> (<a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>) { &<b>mut</b> pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_bids">bids</a> } <b>else</b> { &<b>mut</b> pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_asks">asks</a> }, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a>, tick_index, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a> ); <b>if</b> (<a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>) { <b>let</b> (_is_round_down, balance_locked) = clob_math::unsafe_mul_round(order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_quantity">quantity</a>, order.price); <a href="../deepbook/custodian.md#deepbook_custodian_unlock_balance">custodian::unlock_balance</a>(&<b>mut</b> pool.quote_custodian, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>, balance_locked); } <b>else</b> { <a href="../deepbook/custodian.md#deepbook_custodian_unlock_balance">custodian::unlock_balance</a>(&<b>mut</b> pool.base_custodian, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>, order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_quantity">quantity</a>); }; <b>let</b> canceled_order_event = <a href="../deepbook/clob_v2.md#deepbook_clob_v2_AllOrdersCanceledComponent">AllOrdersCanceledComponent</a><BaseAsset, QuoteAsset> { client_order_id: order.client_order_id, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>: order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>: order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>: order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_original_quantity">original_quantity</a>: order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_original_quantity">original_quantity</a>, base_asset_quantity_canceled: order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_quantity">quantity</a>, price: order.price }; vector::push_back(&<b>mut</b> canceled_order_events, canceled_order_event); i_order = i_order + 1; }; <b>if</b> (!vector::is_empty(&canceled_order_events)) { event::emit(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_AllOrdersCanceled">AllOrdersCanceled</a><BaseAsset, QuoteAsset> { pool_id, orders_canceled: canceled_order_events, }); }; } </code></pre> </details><a name="deepbook_clob_v2_clean_up_expired_orders"></a>
clean_up_expired_ordersClean up expired orders Note that this function can reduce gas cost if orders with the same price are grouped together in the vector because we would not need the computation to find the tick_index. 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. Order owners should be the owner addresses from the account capacities which placed the orders, and they should correspond to the order IDs one by one.
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_clean_up_expired_orders">clean_up_expired_orders</a><BaseAsset, QuoteAsset>(pool: &<b>mut</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">deepbook::clob_v2::Pool</a><BaseAsset, QuoteAsset>, clock: &<a href="../sui/clock.md#sui_clock_Clock">sui::clock::Clock</a>, order_ids: vector<u64>, order_owners: vector<<b>address</b>>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_clean_up_expired_orders">clean_up_expired_orders</a><BaseAsset, QuoteAsset>( pool: &<b>mut</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">Pool</a><BaseAsset, QuoteAsset>, clock: &Clock, order_ids: vector<u64>, order_owners: vector<<b>address</b>> ) { <b>let</b> pool_id = *object::uid_as_inner(&pool.id); <b>let</b> now = clock::timestamp_ms(clock); <b>let</b> n_order = vector::length(&order_ids); <b>assert</b>!(n_order == vector::length(&order_owners), <a href="../deepbook/clob_v2.md#deepbook_clob_v2_ENotEqual">ENotEqual</a>); <b>let</b> <b>mut</b> i_order = 0; <b>let</b> <b>mut</b> tick_index: u64 = 0; <b>let</b> <b>mut</b> tick_price: u64 = 0; <b>let</b> <b>mut</b> canceled_order_events = vector[]; <b>while</b> (i_order < n_order) { <b>let</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a> = *vector::borrow(&order_ids, i_order); <b>let</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a> = *vector::borrow(&order_owners, i_order); <b>if</b> (!table::contains(&pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>)) { <b>continue</b> }; <b>let</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a> = borrow_mut(&<b>mut</b> pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>); <b>if</b> (!linked_table::contains(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>)) { <b>continue</b> }; <b>let</b> new_tick_price = *linked_table::borrow(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>); <b>let</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a> = <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_is_bid">order_is_bid</a>(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>); <b>let</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_open_orders">open_orders</a> = <b>if</b> (<a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>) { &<b>mut</b> pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_bids">bids</a> } <b>else</b> { &<b>mut</b> pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_asks">asks</a> }; <b>if</b> (new_tick_price != tick_price) { tick_price = new_tick_price; <b>let</b> (tick_exists, new_tick_index) = find_leaf( <a href="../deepbook/clob_v2.md#deepbook_clob_v2_open_orders">open_orders</a>, tick_price ); <b>assert</b>!(tick_exists, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_EInvalidTickPrice">EInvalidTickPrice</a>); tick_index = new_tick_index; }; <b>let</b> order = <a href="../deepbook/clob_v2.md#deepbook_clob_v2_remove_order">remove_order</a>(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_open_orders">open_orders</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_usr_open_orders">usr_open_orders</a>, tick_index, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>); <b>assert</b>!(order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_expire_timestamp">expire_timestamp</a> < now, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_EInvalidExpireTimestamp">EInvalidExpireTimestamp</a>); <b>if</b> (<a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>) { <b>let</b> (_is_round_down, balance_locked) = clob_math::unsafe_mul_round(order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_quantity">quantity</a>, order.price); <a href="../deepbook/custodian.md#deepbook_custodian_unlock_balance">custodian::unlock_balance</a>(&<b>mut</b> pool.quote_custodian, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>, balance_locked); } <b>else</b> { <a href="../deepbook/custodian.md#deepbook_custodian_unlock_balance">custodian::unlock_balance</a>(&<b>mut</b> pool.base_custodian, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>, order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_quantity">quantity</a>); }; <b>let</b> canceled_order_event = <a href="../deepbook/clob_v2.md#deepbook_clob_v2_AllOrdersCanceledComponent">AllOrdersCanceledComponent</a><BaseAsset, QuoteAsset> { client_order_id: order.client_order_id, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>: order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>: order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_is_bid">is_bid</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>: order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_original_quantity">original_quantity</a>: order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_original_quantity">original_quantity</a>, base_asset_quantity_canceled: order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_quantity">quantity</a>, price: order.price }; vector::push_back(&<b>mut</b> canceled_order_events, canceled_order_event); i_order = i_order + 1; }; <b>if</b> (!vector::is_empty(&canceled_order_events)) { event::emit(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_AllOrdersCanceled">AllOrdersCanceled</a><BaseAsset, QuoteAsset> { pool_id, orders_canceled: canceled_order_events, }); }; } </code></pre> </details><a name="deepbook_clob_v2_list_open_orders"></a>
list_open_orders<a name="deepbook_clob_v2_account_balance"></a>
account_balancequery user balance inside custodian
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_account_balance">account_balance</a><BaseAsset, QuoteAsset>(pool: &<a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">deepbook::clob_v2::Pool</a><BaseAsset, QuoteAsset>, account_cap: &<a href="../deepbook/custodian_v2.md#deepbook_custodian_v2_AccountCap">deepbook::custodian_v2::AccountCap</a>): (u64, u64, u64, u64) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_account_balance">account_balance</a><BaseAsset, QuoteAsset>( pool: &<a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">Pool</a><BaseAsset, QuoteAsset>, account_cap: &AccountCap ): (u64, u64, u64, u64) { <b>let</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a> = account_owner(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, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>); <b>let</b> (quote_avail, quote_locked) = <a href="../deepbook/custodian.md#deepbook_custodian_account_balance">custodian::account_balance</a>(&pool.quote_custodian, <a href="../deepbook/clob_v2.md#deepbook_clob_v2_owner">owner</a>); (base_avail, base_locked, quote_avail, quote_locked) } </code></pre> </details><a name="deepbook_clob_v2_get_market_price"></a>
get_market_priceQuery the market price of order book returns (best_bid_price, best_ask_price) if there exists bid/ask order in the order book, otherwise returns None
<pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_get_market_price">get_market_price</a><BaseAsset, QuoteAsset>(pool: &<a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">deepbook::clob_v2::Pool</a><BaseAsset, QuoteAsset>): (<a href="../std/option.md#std_option_Option">std::option::Option</a><u64>, <a href="../std/option.md#std_option_Option">std::option::Option</a><u64>) </code></pre> <details> <summary>Implementation</summary> <pre><code><b>public</b> <b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_get_market_price">get_market_price</a><BaseAsset, QuoteAsset>( pool: &<a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">Pool</a><BaseAsset, QuoteAsset> ): (Option<u64>, Option<u64>){ <b>let</b> bid_price = <b>if</b> (!<a href="../deepbook/critbit.md#deepbook_critbit_is_empty">critbit::is_empty</a>(&pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_bids">bids</a>)) { <b>let</b> (result, _) = <a href="../deepbook/critbit.md#deepbook_critbit_max_leaf">critbit::max_leaf</a>(&pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_bids">bids</a>); option::some<u64>(result) } <b>else</b> { option::none<u64>() }; <b>let</b> ask_price = <b>if</b> (!<a href="../deepbook/critbit.md#deepbook_critbit_is_empty">critbit::is_empty</a>(&pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_asks">asks</a>)) { <b>let</b> (result, _) = <a href="../deepbook/critbit.md#deepbook_critbit_min_leaf">critbit::min_leaf</a>(&pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_asks">asks</a>); option::some<u64>(result) } <b>else</b> { option::none<u64>() }; <b>return</b> (bid_price, ask_price) } </code></pre> </details><a name="deepbook_clob_v2_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_v2.md#deepbook_clob_v2_get_level2_book_status_bid_side">get_level2_book_status_bid_side</a><BaseAsset, QuoteAsset>(pool: &<a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">deepbook::clob_v2::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_v2.md#deepbook_clob_v2_get_level2_book_status_bid_side">get_level2_book_status_bid_side</a><BaseAsset, QuoteAsset>( pool: &<a href="../deepbook/clob_v2.md#deepbook_clob_v2_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> <b>mut</b> price_vec = vector::empty<u64>(); <b>let</b> <b>mut</b> depth_vec = vector::empty<u64>(); <b>if</b> (<a href="../deepbook/critbit.md#deepbook_critbit_is_empty">critbit::is_empty</a>(&pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_bids">bids</a>)) { <b>return</b> (price_vec, depth_vec) }; <b>let</b> (price_low_, _) = <a href="../deepbook/critbit.md#deepbook_critbit_min_leaf">critbit::min_leaf</a>(&pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_bids">bids</a>); <b>let</b> (price_high_, _) = <a href="../deepbook/critbit.md#deepbook_critbit_max_leaf">critbit::max_leaf</a>(&pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_bids">bids</a>); // If price_low is greater than the highest element in the tree, we <b>return</b> empty <b>if</b> (price_low > price_high_) { <b>return</b> (price_vec, depth_vec) }; <b>if</b> (price_low < price_low_) price_low = price_low_; <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.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_bids">bids</a>, price_low); price_high = <a href="../deepbook/critbit.md#deepbook_critbit_find_closest_key">critbit::find_closest_key</a>(&pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_bids">bids</a>, price_high); <b>while</b> (price_low <= price_high) { <b>let</b> depth = <a href="../deepbook/clob_v2.md#deepbook_clob_v2_get_level2_book_status">get_level2_book_status</a>( &pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_bids">bids</a>, price_low, clock::timestamp_ms(clock) ); <b>if</b> (depth != 0) { 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.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_bids">bids</a>, 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_v2_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_v2.md#deepbook_clob_v2_get_level2_book_status_ask_side">get_level2_book_status_ask_side</a><BaseAsset, QuoteAsset>(pool: &<a href="../deepbook/clob_v2.md#deepbook_clob_v2_Pool">deepbook::clob_v2::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_v2.md#deepbook_clob_v2_get_level2_book_status_ask_side">get_level2_book_status_ask_side</a><BaseAsset, QuoteAsset>( pool: &<a href="../deepbook/clob_v2.md#deepbook_clob_v2_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> <b>mut</b> price_vec = vector::empty<u64>(); <b>let</b> <b>mut</b> depth_vec = vector::empty<u64>(); <b>if</b> (<a href="../deepbook/critbit.md#deepbook_critbit_is_empty">critbit::is_empty</a>(&pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_asks">asks</a>)) { <b>return</b> (price_vec, depth_vec) }; <b>let</b> (price_low_, _) = <a href="../deepbook/critbit.md#deepbook_critbit_min_leaf">critbit::min_leaf</a>(&pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_asks">asks</a>); // Price_high is less than the lowest leaf in the tree then we <b>return</b> an empty array <b>if</b> (price_high < price_low_) { <b>return</b> (price_vec, depth_vec) }; <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.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_asks">asks</a>); <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.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_asks">asks</a>, price_low); price_high = <a href="../deepbook/critbit.md#deepbook_critbit_find_closest_key">critbit::find_closest_key</a>(&pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_asks">asks</a>, price_high); <b>while</b> (price_low <= price_high) { <b>let</b> depth = <a href="../deepbook/clob_v2.md#deepbook_clob_v2_get_level2_book_status">get_level2_book_status</a>( &pool.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_asks">asks</a>, price_low, clock::timestamp_ms(clock) ); <b>if</b> (depth != 0) { 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.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_asks">asks</a>, 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_v2_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_v2.md#deepbook_clob_v2_get_level2_book_status">get_level2_book_status</a>(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_open_orders">open_orders</a>: &<a href="../deepbook/critbit.md#deepbook_critbit_CritbitTree">deepbook::critbit::CritbitTree</a><<a href="../deepbook/clob_v2.md#deepbook_clob_v2_TickLevel">deepbook::clob_v2::TickLevel</a>>, price: u64, time_stamp: u64): u64 </code></pre> <details> <summary>Implementation</summary> <pre><code><b>fun</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_get_level2_book_status">get_level2_book_status</a>( <a href="../deepbook/clob_v2.md#deepbook_clob_v2_open_orders">open_orders</a>: &CritbitTree<<a href="../deepbook/clob_v2.md#deepbook_clob_v2_TickLevel">TickLevel</a>>, price: u64, time_stamp: u64 ): u64 { <b>let</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_tick_level">tick_level</a> = <a href="../deepbook/critbit.md#deepbook_critbit_borrow_leaf_by_key">critbit::borrow_leaf_by_key</a>(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_open_orders">open_orders</a>, price); <b>let</b> tick_open_orders = &<a href="../deepbook/clob_v2.md#deepbook_clob_v2_tick_level">tick_level</a>.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_open_orders">open_orders</a>; <b>let</b> <b>mut</b> depth = 0; <b>let</b> <b>mut</b> <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a> = linked_table::front(tick_open_orders); <b>let</b> <b>mut</b> order: &<a href="../deepbook/clob_v2.md#deepbook_clob_v2_Order">Order</a>; <b>while</b> (!option::is_none(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>)) { order = linked_table::borrow(tick_open_orders, *option::borrow(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>)); <b>if</b> (order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_expire_timestamp">expire_timestamp</a> > time_stamp) depth = depth + order.<a href="../deepbook/clob_v2.md#deepbook_clob_v2_quantity">quantity</a>; <a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a> = linked_table::next(tick_open_orders, *option::borrow(<a href="../deepbook/clob_v2.md#deepbook_clob_v2_order_id">order_id</a>)); }; depth } </code></pre> </details><a name="deepbook_clob_v2_get_order_status"></a>
get_order_status<a name="deepbook_clob_v2_matched_order_metadata_info"></a>
matched_order_metadata_info<a name="deepbook_clob_v2_asks"></a>
asks<a name="deepbook_clob_v2_bids"></a>
bids<a name="deepbook_clob_v2_tick_size"></a>
tick_size<a name="deepbook_clob_v2_maker_rebate_rate"></a>
maker_rebate_rate<a name="deepbook_clob_v2_taker_fee_rate"></a>
taker_fee_rate<a name="deepbook_clob_v2_pool_size"></a>
pool_size<a name="deepbook_clob_v2_open_orders"></a>
open_orders<a name="deepbook_clob_v2_order_id"></a>
order_id<a name="deepbook_clob_v2_tick_level"></a>
tick_level<a name="deepbook_clob_v2_original_quantity"></a>
original_quantity<a name="deepbook_clob_v2_quantity"></a>
quantity<a name="deepbook_clob_v2_is_bid"></a>
is_bid<a name="deepbook_clob_v2_owner"></a>
owner<a name="deepbook_clob_v2_expire_timestamp"></a>
expire_timestamp<a name="deepbook_clob_v2_quote_asset_trading_fees_value"></a>
quote_asset_trading_fees_value<a name="deepbook_clob_v2_clone_order"></a>
clone_order