From 9cd5de2ea68f7c1d67562ffa54f7ddf49ef7deb0 Mon Sep 17 00:00:00 2001 From: jordy25519 Date: Mon, 19 May 2025 10:40:07 +0800 Subject: [PATCH 1/4] increase AccountsListBuilder oracle account capacity --- crates/src/math/account_list_builder.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/src/math/account_list_builder.rs b/crates/src/math/account_list_builder.rs index 3371612..c312697 100644 --- a/crates/src/math/account_list_builder.rs +++ b/crates/src/math/account_list_builder.rs @@ -22,7 +22,7 @@ pub struct AccountsListBuilder { /// placeholder account values populated with real market & oracle account data perp_accounts: ArrayVec, spot_accounts: ArrayVec, - oracle_accounts: ArrayVec, + oracle_accounts: ArrayVec, } impl AccountsListBuilder { From 2f222e9e8ba883af95193541f027324dcd25c2e7 Mon Sep 17 00:00:00 2001 From: jordy25519 Date: Mon, 2 Jun 2025 10:56:17 +0800 Subject: [PATCH 2/4] TransactionBuilder include HLM account when user.margin_mode is HLM --- crates/src/lib.rs | 12 ++++++++---- crates/src/types.rs | 4 ++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/crates/src/lib.rs b/crates/src/lib.rs index 84d881f..9215514 100644 --- a/crates/src/lib.rs +++ b/crates/src/lib.rs @@ -1705,7 +1705,9 @@ impl<'a> TransactionBuilder<'a> { self.force_markets.writeable.iter(), ); - if orders.iter().any(|x| x.high_leverage_mode()) { + if self.account_data.margin_mode == MarginMode::HighLeverage + || orders.iter().any(|x| x.high_leverage_mode()) + { accounts.push(AccountMeta::new(*high_leverage_mode_account(), false)); } @@ -1935,7 +1937,7 @@ impl<'a> TransactionBuilder<'a> { .chain(self.force_markets.writeable.iter()), ); - if order.high_leverage_mode() { + if order.high_leverage_mode() || taker_info.1.margin_mode == MarginMode::HighLeverage { accounts.push(AccountMeta::new(*high_leverage_mode_account(), false)); } @@ -2013,7 +2015,7 @@ impl<'a> TransactionBuilder<'a> { .chain(self.force_markets.writeable.iter()), ); - if order.high_leverage_mode() { + if order.high_leverage_mode() || maker_info.1.margin_mode == MarginMode::HighLeverage { accounts.push(AccountMeta::new(*high_leverage_mode_account(), false)); } @@ -2153,7 +2155,9 @@ impl<'a> TransactionBuilder<'a> { self.force_markets.writeable.iter(), ); - if signed_order_info.order_params().high_leverage_mode() { + if signed_order_info.order_params().high_leverage_mode() + || taker_account.margin_mode == MarginMode::HighLeverage + { accounts.push(AccountMeta::new(*high_leverage_mode_account(), false)); } diff --git a/crates/src/types.rs b/crates/src/types.rs index a614c31..ee9388e 100644 --- a/crates/src/types.rs +++ b/crates/src/types.rs @@ -551,11 +551,11 @@ impl ReferrerInfo { impl OrderParams { /// true if 'immediate or cancel' bit is set pub fn immediate_or_cancel(&self) -> bool { - (self.bit_flags & 0b0000_00001) > 0 + (self.bit_flags & 0b0000_0001) > 0 } /// true if HLM bit is set pub fn high_leverage_mode(&self) -> bool { - (self.bit_flags & 0b0000_00010) > 0 + (self.bit_flags & 0b0000_0010) > 0 } } From ba66ae0d5c6f0ff7d0c57274db1ca310c35b560e Mon Sep 17 00:00:00 2001 From: jordy25519 Date: Mon, 2 Jun 2025 11:04:01 +0800 Subject: [PATCH 3/4] fix --- crates/src/lib.rs | 64 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/crates/src/lib.rs b/crates/src/lib.rs index 9215514..7d66bee 100644 --- a/crates/src/lib.rs +++ b/crates/src/lib.rs @@ -2015,7 +2015,9 @@ impl<'a> TransactionBuilder<'a> { .chain(self.force_markets.writeable.iter()), ); - if order.high_leverage_mode() || maker_info.1.margin_mode == MarginMode::HighLeverage { + if order.high_leverage_mode() + || maker_info.is_some_and(|(_, m)| m.margin_mode == MarginMode::HighLeverage) + { accounts.push(AccountMeta::new(*high_leverage_mode_account(), false)); } @@ -2785,4 +2787,64 @@ mod tests { assert_eq!(spot.len(), 1); assert_eq!(perp.len(), 1); } + + #[tokio::test] + async fn test_place_orders_high_leverage() { + use solana_sdk::pubkey::Pubkey; + use std::borrow::Cow; + use types::accounts::{MarginMode, MarketType, OrderParams, OrderType, PositionDirection}; + + // Create a test user with high leverage mode + let mut user = User::default(); + user.margin_mode = MarginMode::HighLeverage; + let user = Cow::Owned(user); + + // Create program data + let program_data = ProgramData::uninitialized(); + let sub_account = Pubkey::new_unique(); + + // Create transaction builder + let builder = TransactionBuilder::new(&program_data, sub_account, user, false); + + // Test case 1: Place orders with high leverage mode account included due to user margin mode + let orders = vec![OrderParams { + market_index: 0, + market_type: MarketType::Perp, + direction: PositionDirection::Long, + order_type: OrderType::Limit, + ..Default::default() + }]; + + let tx = builder.place_orders(orders).build(); + + // Check that high leverage mode account is included + let high_leverage_account = *high_leverage_mode_account(); + assert!(tx + .message + .static_account_keys() + .contains(&high_leverage_account)); + + // Test case 2: Place orders with high leverage mode account included due to order params + let mut user = User::default(); + user.margin_mode = MarginMode::Cross; // Not high leverage + let user = Cow::Owned(user); + let builder = TransactionBuilder::new(&program_data, sub_account, user, false); + + let orders = vec![OrderParams { + market_index: 0, + market_type: MarketType::Perp, + direction: PositionDirection::Long, + order_type: OrderType::Limit, + high_leverage: true, // Enable high leverage for this order + ..Default::default() + }]; + + let tx = builder.place_orders(orders).build(); + + // Check that high leverage mode account is included + assert!(tx + .message + .static_account_keys() + .contains(&high_leverage_account)); + } } From 8cbf3a4e8da5a8f53d991d2490f2fafa483fccf2 Mon Sep 17 00:00:00 2001 From: jordy25519 Date: Mon, 2 Jun 2025 11:25:02 +0800 Subject: [PATCH 4/4] aagain --- crates/src/lib.rs | 25 ++++++++++--------------- crates/src/types.rs | 6 ++++-- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/crates/src/lib.rs b/crates/src/lib.rs index 7d66bee..267ae84 100644 --- a/crates/src/lib.rs +++ b/crates/src/lib.rs @@ -2790,17 +2790,18 @@ mod tests { #[tokio::test] async fn test_place_orders_high_leverage() { - use solana_sdk::pubkey::Pubkey; - use std::borrow::Cow; - use types::accounts::{MarginMode, MarketType, OrderParams, OrderType, PositionDirection}; - // Create a test user with high leverage mode let mut user = User::default(); user.margin_mode = MarginMode::HighLeverage; let user = Cow::Owned(user); // Create program data - let program_data = ProgramData::uninitialized(); + let program_data = ProgramData::new( + vec![SpotMarket::default()], + vec![PerpMarket::default()], + vec![], + State::default(), + ); let sub_account = Pubkey::new_unique(); // Create transaction builder @@ -2819,14 +2820,11 @@ mod tests { // Check that high leverage mode account is included let high_leverage_account = *high_leverage_mode_account(); - assert!(tx - .message - .static_account_keys() - .contains(&high_leverage_account)); + assert!(tx.static_account_keys().contains(&high_leverage_account)); // Test case 2: Place orders with high leverage mode account included due to order params let mut user = User::default(); - user.margin_mode = MarginMode::Cross; // Not high leverage + user.margin_mode = MarginMode::Default; // Not high leverage let user = Cow::Owned(user); let builder = TransactionBuilder::new(&program_data, sub_account, user, false); @@ -2835,16 +2833,13 @@ mod tests { market_type: MarketType::Perp, direction: PositionDirection::Long, order_type: OrderType::Limit, - high_leverage: true, // Enable high leverage for this order + bit_flags: OrderParams::HIGH_LEVERAGE_MODE_FLAG, ..Default::default() }]; let tx = builder.place_orders(orders).build(); // Check that high leverage mode account is included - assert!(tx - .message - .static_account_keys() - .contains(&high_leverage_account)); + assert!(tx.static_account_keys().contains(&high_leverage_account)); } } diff --git a/crates/src/types.rs b/crates/src/types.rs index ee9388e..270900c 100644 --- a/crates/src/types.rs +++ b/crates/src/types.rs @@ -549,13 +549,15 @@ impl ReferrerInfo { } impl OrderParams { + pub const IMMEDIATE_OR_CANCEL_FLAG: u8 = 0b0000_0001; + pub const HIGH_LEVERAGE_MODE_FLAG: u8 = 0b0000_0010; /// true if 'immediate or cancel' bit is set pub fn immediate_or_cancel(&self) -> bool { - (self.bit_flags & 0b0000_0001) > 0 + (self.bit_flags & Self::IMMEDIATE_OR_CANCEL_FLAG) > 0 } /// true if HLM bit is set pub fn high_leverage_mode(&self) -> bool { - (self.bit_flags & 0b0000_0010) > 0 + (self.bit_flags & Self::HIGH_LEVERAGE_MODE_FLAG) > 0 } }