From 11cd3363bf468fbc15a8eb773f808570916b8ade Mon Sep 17 00:00:00 2001 From: skrrb Date: Thu, 13 Jul 2023 12:35:54 +0300 Subject: [PATCH 1/2] OrderWithAmounts return u64 --- programs/openbook-v2/src/instructions/place_order.rs | 4 ++-- programs/openbook-v2/src/state/orderbook/book.rs | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/programs/openbook-v2/src/instructions/place_order.rs b/programs/openbook-v2/src/instructions/place_order.rs index abfb4e0b..268382d6 100644 --- a/programs/openbook-v2/src/instructions/place_order.rs +++ b/programs/openbook-v2/src/instructions/place_order.rs @@ -79,7 +79,7 @@ pub fn place_order(ctx: Context, order: Order, limit: u8) -> Result< Side::Bid => { let free_quote = position.quote_free_native; let max_quote_including_fees = - total_quote_taken_native + posted_quote_native as u64 + maker_fees; + total_quote_taken_native + posted_quote_native + maker_fees; let free_qty_to_lock = cmp::min(max_quote_including_fees, free_quote); let deposit_amount = max_quote_including_fees - free_qty_to_lock; @@ -93,7 +93,7 @@ pub fn place_order(ctx: Context, order: Order, limit: u8) -> Result< Side::Ask => { let free_assets_native = position.base_free_native; - let max_base_native = total_base_taken_native + posted_base_native as u64; + let max_base_native = total_base_taken_native + posted_base_native; let free_qty_to_lock = cmp::min(max_base_native, free_assets_native); let deposit_amount = max_base_native - free_qty_to_lock; diff --git a/programs/openbook-v2/src/state/orderbook/book.rs b/programs/openbook-v2/src/state/orderbook/book.rs index 7498752f..edc29bb3 100644 --- a/programs/openbook-v2/src/state/orderbook/book.rs +++ b/programs/openbook-v2/src/state/orderbook/book.rs @@ -22,8 +22,8 @@ pub struct Orderbook<'a> { pub struct OrderWithAmounts { pub order_id: Option, - pub posted_base_native: i64, - pub posted_quote_native: i64, + pub posted_base_native: u64, + pub posted_quote_native: u64, pub total_base_taken_native: u64, pub total_quote_taken_native: u64, pub maker_fees: u64, @@ -450,8 +450,8 @@ impl<'a> Orderbook<'a> { Ok(OrderWithAmounts { order_id: placed_order_id, - posted_base_native, - posted_quote_native, + posted_base_native: posted_base_native as u64, + posted_quote_native: posted_quote_native as u64, total_base_taken_native, total_quote_taken_native, referrer_amount, From 32480e04b5c3ed864163bcbe575dc81111d86082 Mon Sep 17 00:00:00 2001 From: skrrb Date: Thu, 13 Jul 2023 13:23:50 +0300 Subject: [PATCH 2/2] dont use penalty --- .../src/instructions/create_market.rs | 4 - programs/openbook-v2/src/lib.rs | 2 - programs/openbook-v2/src/state/market.rs | 12 +- .../openbook-v2/src/state/orderbook/book.rs | 3 - .../openbook-v2/src/state/orderbook/mod.rs | 111 ------------------ .../openbook-v2/src/state/orderbook/order.rs | 8 -- programs/openbook-v2/tests/cases/test_fees.rs | 39 ------ programs/openbook-v2/tests/cases/test_ioc.rs | 1 - .../openbook-v2/tests/program_test/client.rs | 1 - 9 files changed, 1 insertion(+), 180 deletions(-) diff --git a/programs/openbook-v2/src/instructions/create_market.rs b/programs/openbook-v2/src/instructions/create_market.rs index f9d96eda..79d0e5ca 100644 --- a/programs/openbook-v2/src/instructions/create_market.rs +++ b/programs/openbook-v2/src/instructions/create_market.rs @@ -18,7 +18,6 @@ pub fn create_market( base_lot_size: i64, maker_fee: i64, taker_fee: i64, - fee_penalty: u64, time_expiry: i64, ) -> Result<()> { let now_ts: u64 = Clock::get()?.unix_timestamp.try_into().unwrap(); @@ -87,11 +86,8 @@ pub fn create_market( base_lot_size, seq_num: 0, registration_time: now_ts, - maker_fee, taker_fee, - fee_penalty, - fees_accrued: 0, fees_to_referrers: 0, taker_volume_wo_oo: 0, diff --git a/programs/openbook-v2/src/lib.rs b/programs/openbook-v2/src/lib.rs index c921e7de..a27455a0 100644 --- a/programs/openbook-v2/src/lib.rs +++ b/programs/openbook-v2/src/lib.rs @@ -43,7 +43,6 @@ pub mod openbook_v2 { base_lot_size: i64, maker_fee: i64, taker_fee: i64, - fee_penalty: u64, time_expiry: i64, ) -> Result<()> { #[cfg(feature = "enable-gpl")] @@ -56,7 +55,6 @@ pub mod openbook_v2 { base_lot_size, maker_fee, taker_fee, - fee_penalty, time_expiry, )?; Ok(()) diff --git a/programs/openbook-v2/src/state/market.rs b/programs/openbook-v2/src/state/market.rs index d0e4fc94..b930b994 100644 --- a/programs/openbook-v2/src/state/market.rs +++ b/programs/openbook-v2/src/state/market.rs @@ -85,8 +85,6 @@ pub struct Market { pub maker_fee: i64, /// Fee (in 10^-6) for taker orders, always >= 0. pub taker_fee: i64, - /// Fee (in quote native) to charge for ioc orders that don't match to avoid spam - pub fee_penalty: u64, /// Total fees accrued in native quote pub fees_accrued: u64, @@ -133,7 +131,6 @@ const_assert_eq!( 8 + // registration_time 8 + // maker_fee 8 + // taker_fee - 8 + // fee_penalty 8 + // fees_accrued 8 + // fees_to_referrers 8 + // taker_volume_wo_oo @@ -144,7 +141,7 @@ const_assert_eq!( 8 + // referrer_rebates_accrued 1768 // reserved ); -const_assert_eq!(size_of::(), 2392); +const_assert_eq!(size_of::(), 2384); const_assert_eq!(size_of::() % 8, 0); impl Market { @@ -200,13 +197,6 @@ impl Market { ) } - /// Update the market's quote fees acrued and returns the penalty fee - pub fn apply_penalty(&mut self) -> u64 { - self.quote_fees_accrued += self.fee_penalty; - self.fees_accrued += self.fee_penalty; - self.fee_penalty - } - pub fn subtract_taker_fees(&self, quote: i64) -> i64 { ((quote as i128) * FEES_SCALE_FACTOR / (FEES_SCALE_FACTOR + (self.taker_fee as i128))) .try_into() diff --git a/programs/openbook-v2/src/state/orderbook/book.rs b/programs/openbook-v2/src/state/orderbook/book.rs index edc29bb3..705b9039 100644 --- a/programs/openbook-v2/src/state/orderbook/book.rs +++ b/programs/openbook-v2/src/state/orderbook/book.rs @@ -294,9 +294,6 @@ impl<'a> Orderbook<'a> { total_quantity_received, fees: taker_fees, }); - } else if order.needs_penalty_fee() { - // IOC orders have a fee penalty applied if not match to avoid spam - total_quote_taken_native += market.apply_penalty(); } // Update remaining based on quote_lots taken. If nothing taken, same as the beginning diff --git a/programs/openbook-v2/src/state/orderbook/mod.rs b/programs/openbook-v2/src/state/orderbook/mod.rs index 68f5863e..54078b4b 100644 --- a/programs/openbook-v2/src/state/orderbook/mod.rs +++ b/programs/openbook-v2/src/state/orderbook/mod.rs @@ -428,117 +428,6 @@ mod queue; // ); // } -// #[test] -// fn test_fee_penalty_applied_only_on_limit_order() -> Result<()> { -// let (mut market, oracle_price, mut event_queue, book_accs) = test_setup(1000.0); -// let mut book = book_accs.orderbook(); - -// let buffer = OpenOrdersAccount::default_for_tests().try_to_vec().unwrap(); -// let mut account = OpenOrdersAccountValue::from_bytes(&buffer).unwrap(); -// let taker_pk = Pubkey::new_unique(); -// let now_ts = 1000000; - -// market.taker_fee = I80F48::from_num(0.01); -// market.fee_penalty = 5.0; -// account.ensure_position(market.market_index, 0)?; - -// // Passive order -// book.new_order( -// Order { -// side: Side::Ask, -// max_base_lots: 2, -// max_quote_lots_including_fees: i64::MAX, -// client_order_id: 43, -// time_in_force: 0, -// params: OrderParams::Fixed { -// price_lots: 1000, -// order_type: PostOrderType::Limit, -// }, -// }, -// &mut market, -// &mut event_queue, -// oracle_price, -// &mut account.borrow_mut(), -// &taker_pk, -// now_ts, -// u8::MAX, -// ) -// .unwrap(); - -// // Partial taker -// book.new_order( -// Order { -// side: Side::Bid, -// max_base_lots: 1, -// max_quote_lots_including_fees: i64::MAX, -// client_order_id: 43, -// time_in_force: 0, -// params: OrderParams::Fixed { -// price_lots: 1000, -// order_type: PostOrderType::Limit, -// }, -// }, -// &mut market, -// &mut event_queue, -// oracle_price, -// &mut account.borrow_mut(), -// &taker_pk, -// now_ts, -// u8::MAX, -// ) -// .unwrap(); - -// let pos = account.position(market.market_index)?; - -// assert_eq!( -// pos.quote_position_native().round(), -// I80F48::from_num(-10), -// "Regular fees applied on limit order" -// ); - -// assert_eq!( -// market.fees_accrued.round(), -// I80F48::from_num(10), -// "Fees moved to market" -// ); - -// // Full taker -// book.new_order( -// Order { -// side: Side::Bid, -// max_base_lots: 1, -// max_quote_lots_including_fees: i64::MAX, -// client_order_id: 43, -// time_in_force: 0, -// params: OrderParams::ImmediateOrCancel { price_lots: 1000 }, -// }, -// &mut market, -// &mut event_queue, -// oracle_price, -// &mut account.borrow_mut(), -// &taker_pk, -// now_ts, -// u8::MAX, -// ) -// .unwrap(); - -// let pos = account.position(market.market_index)?; - -// assert_eq!( -// pos.quote_position_native().round(), -// I80F48::from_num(-25), // -10 - 5 -// "Regular fees + fixed penalty applied on IOC order" -// ); - -// assert_eq!( -// market.fees_accrued.round(), -// I80F48::from_num(25), // 10 + 5 -// "Fees moved to market" -// ); - -// Ok(()) -// } - // // Check that there are no zero-quantity fills when max_quote_lots is not // // enough for a single lot // #[test] diff --git a/programs/openbook-v2/src/state/orderbook/order.rs b/programs/openbook-v2/src/state/orderbook/order.rs index 9d34246b..5004f20d 100644 --- a/programs/openbook-v2/src/state/orderbook/order.rs +++ b/programs/openbook-v2/src/state/orderbook/order.rs @@ -62,14 +62,6 @@ impl Order { } } - /// Should this order be penalized with an extra fee? - /// - /// Some programs opportunistically call ioc orders, wasting lots of compute. This - /// is intended to encourage people to be smarter about it. - pub fn needs_penalty_fee(&self) -> bool { - matches!(self.params, OrderParams::ImmediateOrCancel { .. }) - } - /// Is this order required to be posted to the orderbook? It will fail if it would take. pub fn is_post_only(&self) -> bool { let order_type = match self.params { diff --git a/programs/openbook-v2/tests/cases/test_fees.rs b/programs/openbook-v2/tests/cases/test_fees.rs index 11b84d04..d6083464 100644 --- a/programs/openbook-v2/tests/cases/test_fees.rs +++ b/programs/openbook-v2/tests/cases/test_fees.rs @@ -2,7 +2,6 @@ use super::*; #[tokio::test] async fn test_fees_accrued() -> Result<(), TransportError> { - let fee_penalty = 1000; let TestInitialize { context, collect_fee_admin, @@ -19,7 +18,6 @@ async fn test_fees_accrued() -> Result<(), TransportError> { account_1, .. } = TestContext::new_with_market(TestNewMarketInitialize { - fee_penalty, maker_fee: -100, taker_fee: 200, ..TestNewMarketInitialize::default() @@ -161,43 +159,6 @@ async fn test_fees_accrued() -> Result<(), TransportError> { assert_eq!(market.fees_to_referrers, 0); } - let balance_quote = solana.token_account_balance(owner_token_1).await; - - // Order with penalty fees - send_tx( - solana, - PlaceOrderInstruction { - open_orders_account: account_1, - open_orders_admin: None, - market, - owner, - token_deposit_account: owner_token_1, - market_vault: quote_vault, - side: Side::Bid, - price_lots: price_lots - 1000, - max_base_lots: 1, - max_quote_lots_including_fees: 10000, - client_order_id: 0, - expiry_timestamp: 0, - order_type: PlaceOrderType::ImmediateOrCancel, - self_trade_behavior: SelfTradeBehavior::default(), - remainings: vec![], - }, - ) - .await - .unwrap(); - - { - let market = solana.get_account::(market).await; - assert_eq!(market.quote_fees_accrued, 1000); - assert_eq!(market.fees_accrued, 10 + market.fee_penalty); - assert_eq!(market.fees_to_referrers, 0); - assert_eq!( - balance_quote - fee_penalty, - solana.token_account_balance(owner_token_1).await - ); - } - Ok(()) } diff --git a/programs/openbook-v2/tests/cases/test_ioc.rs b/programs/openbook-v2/tests/cases/test_ioc.rs index 02f1f9dd..58a4143c 100644 --- a/programs/openbook-v2/tests/cases/test_ioc.rs +++ b/programs/openbook-v2/tests/cases/test_ioc.rs @@ -19,7 +19,6 @@ async fn test_ioc() -> Result<(), TransportError> { account_1, .. } = TestContext::new_with_market(TestNewMarketInitialize { - fee_penalty, maker_fee: 200, taker_fee: 200, ..TestNewMarketInitialize::default() diff --git a/programs/openbook-v2/tests/program_test/client.rs b/programs/openbook-v2/tests/program_test/client.rs index ae2c6778..e564641a 100644 --- a/programs/openbook-v2/tests/program_test/client.rs +++ b/programs/openbook-v2/tests/program_test/client.rs @@ -256,7 +256,6 @@ impl ClientInstruction for CreateMarketInstruction { base_lot_size: self.base_lot_size, maker_fee: self.maker_fee, taker_fee: self.taker_fee, - fee_penalty: self.fee_penalty, time_expiry: self.time_expiry, };