diff --git a/CHANGELOG.md b/CHANGELOG.md index f66acb9f71..214ac37868 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,7 +34,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - program: post only respects reduce only ([#1878](https://github.com/drift-labs/protocol-v2/pull/1878)) - program: add sequence id to exchange/mm oracle ([#1834](https://github.com/drift-labs/protocol-v2/pull/1834)) - program: perp position max margin ratio ([#1847](https://github.com/drift-labs/protocol-v2/pull/1847)) -- program: add padding to swift messages ([#1845](https://github.com/drift-labs/protocol-v2/pull/1845)) - program: rm lp ([#1755](https://github.com/drift-labs/protocol-v2/pull/1755)) ### Fixes diff --git a/programs/drift/src/instructions/keeper.rs b/programs/drift/src/instructions/keeper.rs index 4e66b0fcee..d5b0523d3e 100644 --- a/programs/drift/src/instructions/keeper.rs +++ b/programs/drift/src/instructions/keeper.rs @@ -760,10 +760,6 @@ pub fn place_signed_msg_taker_order<'c: 'info, 'info>( return Ok(()); } - if let Some(max_margin_ratio) = verified_message_and_signature.max_margin_ratio { - taker.update_perp_position_max_margin_ratio(market_index, max_margin_ratio)?; - } - // Dont place order if signed msg order already exists let mut taker_order_id_to_use = taker.next_order_id; let mut signed_msg_order_id = diff --git a/programs/drift/src/state/order_params.rs b/programs/drift/src/state/order_params.rs index 3b3431a38c..9c74fa1406 100644 --- a/programs/drift/src/state/order_params.rs +++ b/programs/drift/src/state/order_params.rs @@ -872,7 +872,6 @@ pub struct SignedMsgOrderParamsMessage { pub uuid: [u8; 8], pub take_profit_order_params: Option, pub stop_loss_order_params: Option, - pub max_margin_ratio: Option, } #[derive(AnchorSerialize, AnchorDeserialize, Clone, Default, Eq, PartialEq, Debug)] @@ -883,7 +882,6 @@ pub struct SignedMsgOrderParamsDelegateMessage { pub uuid: [u8; 8], pub take_profit_order_params: Option, pub stop_loss_order_params: Option, - pub max_margin_ratio: Option, } #[derive(AnchorSerialize, AnchorDeserialize, Clone, Default, Eq, PartialEq, Debug)] diff --git a/programs/drift/src/validation/sig_verification.rs b/programs/drift/src/validation/sig_verification.rs index 66ba1cab98..3349c7d5d7 100644 --- a/programs/drift/src/validation/sig_verification.rs +++ b/programs/drift/src/validation/sig_verification.rs @@ -14,9 +14,6 @@ use solana_program::program_memory::sol_memcmp; use solana_program::sysvar; use std::convert::TryInto; -#[cfg(test)] -mod tests; - const ED25519_PROGRAM_INPUT_HEADER_LEN: usize = 2; const SIGNATURE_LEN: u16 = 64; @@ -48,7 +45,6 @@ pub struct Ed25519SignatureOffsets { pub message_instruction_index: u16, } -#[derive(Debug)] pub struct VerifiedMessage { pub signed_msg_order_params: OrderParams, pub sub_account_id: Option, @@ -57,7 +53,6 @@ pub struct VerifiedMessage { pub uuid: [u8; 8], pub take_profit_order_params: Option, pub stop_loss_order_params: Option, - pub max_margin_ratio: Option, pub signature: [u8; 64], } @@ -65,69 +60,6 @@ fn slice_eq(a: &[u8], b: &[u8]) -> bool { a.len() == b.len() && sol_memcmp(a, b, a.len()) == 0 } -pub fn deserialize_into_verified_message( - payload: Vec, - signature: &[u8; 64], - is_delegate_signer: bool, -) -> Result { - if is_delegate_signer { - if payload.len() < 8 { - return Err(SignatureVerificationError::InvalidMessageDataSize.into()); - } - let min_len: usize = std::mem::size_of::(); - let mut owned = payload; - if owned.len() < min_len { - owned.resize(min_len, 0); - } - let deserialized = SignedMsgOrderParamsDelegateMessage::deserialize( - &mut &owned[8..], // 8 byte manual discriminator - ) - .map_err(|_| { - msg!("Invalid message encoding for is_delegate_signer = true"); - SignatureVerificationError::InvalidMessageDataSize - })?; - - return Ok(VerifiedMessage { - signed_msg_order_params: deserialized.signed_msg_order_params, - sub_account_id: None, - delegate_signed_taker_pubkey: Some(deserialized.taker_pubkey), - slot: deserialized.slot, - uuid: deserialized.uuid, - take_profit_order_params: deserialized.take_profit_order_params, - stop_loss_order_params: deserialized.stop_loss_order_params, - max_margin_ratio: deserialized.max_margin_ratio, - signature: *signature, - }); - } else { - if payload.len() < 8 { - return Err(SignatureVerificationError::InvalidMessageDataSize.into()); - } - let min_len: usize = std::mem::size_of::(); - let mut owned = payload; - if owned.len() < min_len { - owned.resize(min_len, 0); - } - let deserialized = SignedMsgOrderParamsMessage::deserialize( - &mut &owned[8..], // 8 byte manual discriminator - ) - .map_err(|_| { - msg!("Invalid delegate message encoding for with is_delegate_signer = false"); - SignatureVerificationError::InvalidMessageDataSize - })?; - return Ok(VerifiedMessage { - signed_msg_order_params: deserialized.signed_msg_order_params, - sub_account_id: Some(deserialized.sub_account_id), - delegate_signed_taker_pubkey: None, - slot: deserialized.slot, - uuid: deserialized.uuid, - take_profit_order_params: deserialized.take_profit_order_params, - stop_loss_order_params: deserialized.stop_loss_order_params, - max_margin_ratio: deserialized.max_margin_ratio, - signature: *signature, - }); - } -} - /// Check Ed25519Program instruction data verifies the given msg /// /// `ix` an Ed25519Program instruction [see](https://github.com/solana-labs/solana/blob/master/sdk/src/ed25519_instruction.rs)) @@ -300,7 +232,45 @@ pub fn verify_and_decode_ed25519_msg( let payload = hex::decode(payload).map_err(|_| SignatureVerificationError::InvalidMessageHex)?; - deserialize_into_verified_message(payload, signature, is_delegate_signer) + if is_delegate_signer { + let deserialized = SignedMsgOrderParamsDelegateMessage::deserialize( + &mut &payload[8..], // 8 byte manual discriminator + ) + .map_err(|_| { + msg!("Invalid message encoding for is_delegate_signer = true"); + SignatureVerificationError::InvalidMessageDataSize + })?; + + return Ok(VerifiedMessage { + signed_msg_order_params: deserialized.signed_msg_order_params, + sub_account_id: None, + delegate_signed_taker_pubkey: Some(deserialized.taker_pubkey), + slot: deserialized.slot, + uuid: deserialized.uuid, + take_profit_order_params: deserialized.take_profit_order_params, + stop_loss_order_params: deserialized.stop_loss_order_params, + signature: *signature, + }); + } else { + let deserialized = SignedMsgOrderParamsMessage::deserialize( + &mut &payload[8..], // 8 byte manual discriminator + ) + .map_err(|_| { + msg!("Invalid delegate message encoding for with is_delegate_signer = false"); + SignatureVerificationError::InvalidMessageDataSize + })?; + + return Ok(VerifiedMessage { + signed_msg_order_params: deserialized.signed_msg_order_params, + sub_account_id: Some(deserialized.sub_account_id), + delegate_signed_taker_pubkey: None, + slot: deserialized.slot, + uuid: deserialized.uuid, + take_profit_order_params: deserialized.take_profit_order_params, + stop_loss_order_params: deserialized.stop_loss_order_params, + signature: *signature, + }); + } } #[error_code] diff --git a/programs/drift/src/validation/sig_verification/tests.rs b/programs/drift/src/validation/sig_verification/tests.rs deleted file mode 100644 index fae2456b43..0000000000 --- a/programs/drift/src/validation/sig_verification/tests.rs +++ /dev/null @@ -1,293 +0,0 @@ -mod sig_verification { - use std::str::FromStr; - - use anchor_lang::prelude::Pubkey; - - use crate::controller::position::PositionDirection; - use crate::validation::sig_verification::deserialize_into_verified_message; - - #[test] - fn test_deserialize_into_verified_message_non_delegate() { - let signature = [1u8; 64]; - let payload = vec![ - 200, 213, 166, 94, 34, 52, 245, 93, 0, 1, 0, 1, 0, 202, 154, 59, 0, 0, 0, 0, 0, 248, - 89, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10, 1, 192, 181, 74, 13, 0, 0, 0, 0, - 1, 0, 248, 89, 13, 0, 0, 0, 0, 0, 0, 232, 3, 0, 0, 0, 0, 0, 0, 72, 112, 54, 84, 106, - 83, 48, 107, 0, 0, - ]; - - // Test deserialization with non-delegate signer - let result = deserialize_into_verified_message(payload, &signature, false); - assert!(result.is_ok()); - - let verified_message = result.unwrap(); - - // Verify the deserialized message has expected structure - assert_eq!(verified_message.signature, signature); - assert_eq!(verified_message.sub_account_id, Some(0)); - assert_eq!(verified_message.delegate_signed_taker_pubkey, None); - assert_eq!(verified_message.slot, 1000); - assert_eq!(verified_message.uuid, [72, 112, 54, 84, 106, 83, 48, 107]); - assert!(verified_message.take_profit_order_params.is_none()); - assert!(verified_message.stop_loss_order_params.is_none()); - assert!(verified_message.max_margin_ratio.is_none()); - // Verify order params - let order_params = &verified_message.signed_msg_order_params; - assert_eq!(order_params.user_order_id, 1); - assert_eq!(order_params.direction, PositionDirection::Long); - assert_eq!(order_params.base_asset_amount, 1000000000u64); - assert_eq!(order_params.price, 224000000u64); - assert_eq!(order_params.market_index, 0); - assert_eq!(order_params.reduce_only, false); - assert_eq!(order_params.auction_duration, Some(10)); - assert_eq!(order_params.auction_start_price, Some(223000000i64)); - assert_eq!(order_params.auction_end_price, Some(224000000i64)); - } - - #[test] - fn test_deserialize_into_verified_message_non_delegate_with_tpsl() { - let signature = [1u8; 64]; - let payload = vec![ - 200, 213, 166, 94, 34, 52, 245, 93, 0, 1, 0, 3, 0, 96, 254, 205, 0, 0, 0, 0, 64, 85, - 32, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10, 1, 128, 133, 181, 13, 0, 0, 0, 0, - 1, 64, 85, 32, 14, 0, 0, 0, 0, 2, 0, 41, 9, 0, 0, 0, 0, 0, 0, 67, 82, 79, 51, 105, 114, - 71, 49, 1, 0, 28, 78, 14, 0, 0, 0, 0, 0, 96, 254, 205, 0, 0, 0, 0, 1, 64, 58, 105, 13, - 0, 0, 0, 0, 0, 96, 254, 205, 0, 0, 0, 0, - ]; - - // Test deserialization with delegate signer - let result = deserialize_into_verified_message(payload, &signature, false); - assert!(result.is_ok()); - - let verified_message = result.unwrap(); - - // Verify the deserialized message has expected structure - assert_eq!(verified_message.signature, signature); - assert_eq!(verified_message.sub_account_id, Some(2)); - assert_eq!(verified_message.delegate_signed_taker_pubkey, None); - assert_eq!(verified_message.slot, 2345); - assert_eq!(verified_message.uuid, [67, 82, 79, 51, 105, 114, 71, 49]); - assert!(verified_message.max_margin_ratio.is_none()); - - assert!(verified_message.take_profit_order_params.is_some()); - let tp = verified_message.take_profit_order_params.unwrap(); - assert_eq!(tp.base_asset_amount, 3456000000u64); - assert_eq!(tp.trigger_price, 240000000u64); - - assert!(verified_message.stop_loss_order_params.is_some()); - let sl = verified_message.stop_loss_order_params.unwrap(); - assert_eq!(sl.base_asset_amount, 3456000000u64); - assert_eq!(sl.trigger_price, 225000000u64); - - // Verify order params - let order_params = &verified_message.signed_msg_order_params; - assert_eq!(order_params.user_order_id, 3); - assert_eq!(order_params.direction, PositionDirection::Long); - assert_eq!(order_params.base_asset_amount, 3456000000u64); - assert_eq!(order_params.price, 237000000u64); - assert_eq!(order_params.market_index, 0); - assert_eq!(order_params.reduce_only, false); - assert_eq!(order_params.auction_duration, Some(10)); - assert_eq!(order_params.auction_start_price, Some(230000000i64)); - assert_eq!(order_params.auction_end_price, Some(237000000i64)); - } - - #[test] - fn test_deserialize_into_verified_message_non_delegate_with_max_margin_ratio() { - let signature = [1u8; 64]; - let payload = vec![ - 200, 213, 166, 94, 34, 52, 245, 93, 0, 1, 0, 3, 0, 96, 254, 205, 0, 0, 0, 0, 64, 85, - 32, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10, 1, 128, 133, 181, 13, 0, 0, 0, 0, - 1, 64, 85, 32, 14, 0, 0, 0, 0, 2, 0, 41, 9, 0, 0, 0, 0, 0, 0, 67, 82, 79, 51, 105, 114, - 71, 49, 1, 0, 28, 78, 14, 0, 0, 0, 0, 0, 96, 254, 205, 0, 0, 0, 0, 1, 64, 58, 105, 13, - 0, 0, 0, 0, 0, 96, 254, 205, 0, 0, 0, 0, 1, 1, - ]; - - // Test deserialization with delegate signer - let result = deserialize_into_verified_message(payload, &signature, false); - assert!(result.is_ok()); - - let verified_message = result.unwrap(); - - // Verify the deserialized message has expected structure - assert_eq!(verified_message.signature, signature); - assert_eq!(verified_message.sub_account_id, Some(2)); - assert_eq!(verified_message.delegate_signed_taker_pubkey, None); - assert_eq!(verified_message.slot, 2345); - assert_eq!(verified_message.uuid, [67, 82, 79, 51, 105, 114, 71, 49]); - assert!(verified_message.max_margin_ratio.is_some()); - assert_eq!(verified_message.max_margin_ratio.unwrap(), 1); - - assert!(verified_message.take_profit_order_params.is_some()); - let tp = verified_message.take_profit_order_params.unwrap(); - assert_eq!(tp.base_asset_amount, 3456000000u64); - assert_eq!(tp.trigger_price, 240000000u64); - - assert!(verified_message.stop_loss_order_params.is_some()); - let sl = verified_message.stop_loss_order_params.unwrap(); - assert_eq!(sl.base_asset_amount, 3456000000u64); - assert_eq!(sl.trigger_price, 225000000u64); - - // Verify order params - let order_params = &verified_message.signed_msg_order_params; - assert_eq!(order_params.user_order_id, 3); - assert_eq!(order_params.direction, PositionDirection::Long); - assert_eq!(order_params.base_asset_amount, 3456000000u64); - assert_eq!(order_params.price, 237000000u64); - assert_eq!(order_params.market_index, 0); - assert_eq!(order_params.reduce_only, false); - assert_eq!(order_params.auction_duration, Some(10)); - assert_eq!(order_params.auction_start_price, Some(230000000i64)); - assert_eq!(order_params.auction_end_price, Some(237000000i64)); - } - - #[test] - fn test_deserialize_into_verified_message_delegate() { - let signature = [1u8; 64]; - let payload = vec![ - 66, 101, 102, 56, 199, 37, 158, 35, 0, 1, 1, 2, 0, 202, 154, 59, 0, 0, 0, 0, 64, 85, - 32, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10, 1, 0, 28, 78, 14, 0, 0, 0, 0, 1, - 128, 151, 47, 14, 0, 0, 0, 0, 242, 208, 117, 159, 92, 135, 34, 224, 147, 14, 64, 92, 7, - 25, 145, 237, 79, 35, 72, 24, 140, 13, 25, 189, 134, 243, 232, 5, 89, 37, 166, 242, 41, - 9, 0, 0, 0, 0, 0, 0, 67, 82, 79, 51, 105, 114, 71, 49, 0, 0, - ]; - - // Test deserialization with delegate signer - let result = deserialize_into_verified_message(payload, &signature, true); - assert!(result.is_ok()); - - let verified_message = result.unwrap(); - - // Verify the deserialized message has expected structure - assert_eq!(verified_message.signature, signature); - assert_eq!(verified_message.sub_account_id, None); - assert_eq!( - verified_message.delegate_signed_taker_pubkey, - Some(Pubkey::from_str("HLr2UfL422cakKkaBG4z1bMZrcyhmzX2pHdegjM6fYXB").unwrap()) - ); - assert_eq!(verified_message.slot, 2345); - assert_eq!(verified_message.uuid, [67, 82, 79, 51, 105, 114, 71, 49]); - assert!(verified_message.take_profit_order_params.is_none()); - assert!(verified_message.stop_loss_order_params.is_none()); - assert!(verified_message.max_margin_ratio.is_none()); - - // Verify order params - let order_params = &verified_message.signed_msg_order_params; - assert_eq!(order_params.user_order_id, 2); - assert_eq!(order_params.direction, PositionDirection::Short); - assert_eq!(order_params.base_asset_amount, 1000000000u64); - assert_eq!(order_params.price, 237000000u64); - assert_eq!(order_params.market_index, 0); - assert_eq!(order_params.reduce_only, false); - assert_eq!(order_params.auction_duration, Some(10)); - assert_eq!(order_params.auction_start_price, Some(240000000i64)); - assert_eq!(order_params.auction_end_price, Some(238000000i64)); - } - - #[test] - fn test_deserialize_into_verified_message_delegate_with_tpsl() { - let signature = [1u8; 64]; - let payload = vec![ - 66, 101, 102, 56, 199, 37, 158, 35, 0, 1, 1, 2, 0, 202, 154, 59, 0, 0, 0, 0, 64, 85, - 32, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10, 1, 0, 28, 78, 14, 0, 0, 0, 0, 1, - 128, 151, 47, 14, 0, 0, 0, 0, 241, 148, 164, 10, 232, 65, 33, 157, 18, 12, 251, 132, - 245, 208, 37, 127, 112, 55, 83, 186, 54, 139, 1, 135, 220, 180, 208, 219, 189, 94, 79, - 148, 41, 9, 0, 0, 0, 0, 0, 0, 67, 82, 79, 51, 105, 114, 71, 49, 1, 128, 133, 181, 13, - 0, 0, 0, 0, 0, 202, 154, 59, 0, 0, 0, 0, 1, 128, 178, 230, 14, 0, 0, 0, 0, 0, 202, 154, - 59, 0, 0, 0, 0, - ]; - - // Test deserialization with delegate signer - let result = deserialize_into_verified_message(payload, &signature, true); - assert!(result.is_ok()); - - let verified_message = result.unwrap(); - - // Verify the deserialized message has expected structure - assert_eq!(verified_message.signature, signature); - assert_eq!(verified_message.sub_account_id, None); - assert_eq!( - verified_message.delegate_signed_taker_pubkey, - Some(Pubkey::from_str("HG2iQKnRkkasrLptwMZewV6wT7KPstw9wkA8yyu8Nx3m").unwrap()) - ); - assert_eq!(verified_message.slot, 2345); - assert_eq!(verified_message.uuid, [67, 82, 79, 51, 105, 114, 71, 49]); - assert!(verified_message.max_margin_ratio.is_none()); - - assert!(verified_message.take_profit_order_params.is_some()); - let tp = verified_message.take_profit_order_params.unwrap(); - assert_eq!(tp.base_asset_amount, 1000000000u64); - assert_eq!(tp.trigger_price, 230000000u64); - - assert!(verified_message.stop_loss_order_params.is_some()); - let sl = verified_message.stop_loss_order_params.unwrap(); - assert_eq!(sl.base_asset_amount, 1000000000u64); - assert_eq!(sl.trigger_price, 250000000u64); - - // Verify order params - let order_params = &verified_message.signed_msg_order_params; - assert_eq!(order_params.user_order_id, 2); - assert_eq!(order_params.direction, PositionDirection::Short); - assert_eq!(order_params.base_asset_amount, 1000000000u64); - assert_eq!(order_params.price, 237000000u64); - assert_eq!(order_params.market_index, 0); - assert_eq!(order_params.reduce_only, false); - assert_eq!(order_params.auction_duration, Some(10)); - assert_eq!(order_params.auction_start_price, Some(240000000i64)); - assert_eq!(order_params.auction_end_price, Some(238000000i64)); - } - - #[test] - fn test_deserialize_into_verified_message_delegate_with_max_margin_ratio() { - let signature = [1u8; 64]; - let payload = vec![ - 66, 101, 102, 56, 199, 37, 158, 35, 0, 1, 1, 2, 0, 202, 154, 59, 0, 0, 0, 0, 64, 85, - 32, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 10, 1, 0, 28, 78, 14, 0, 0, 0, 0, 1, - 128, 151, 47, 14, 0, 0, 0, 0, 241, 148, 164, 10, 232, 65, 33, 157, 18, 12, 251, 132, - 245, 208, 37, 127, 112, 55, 83, 186, 54, 139, 1, 135, 220, 180, 208, 219, 189, 94, 79, - 148, 41, 9, 0, 0, 0, 0, 0, 0, 67, 82, 79, 51, 105, 114, 71, 49, 1, 128, 133, 181, 13, - 0, 0, 0, 0, 0, 202, 154, 59, 0, 0, 0, 0, 1, 128, 178, 230, 14, 0, 0, 0, 0, 0, 202, 154, - 59, 0, 0, 0, 0, 1, 1, - ]; - - // Test deserialization with delegate signer - let result = deserialize_into_verified_message(payload, &signature, true); - assert!(result.is_ok()); - - let verified_message = result.unwrap(); - - // Verify the deserialized message has expected structure - assert_eq!(verified_message.signature, signature); - assert_eq!(verified_message.sub_account_id, None); - assert_eq!( - verified_message.delegate_signed_taker_pubkey, - Some(Pubkey::from_str("HG2iQKnRkkasrLptwMZewV6wT7KPstw9wkA8yyu8Nx3m").unwrap()) - ); - assert_eq!(verified_message.slot, 2345); - assert_eq!(verified_message.uuid, [67, 82, 79, 51, 105, 114, 71, 49]); - assert!(verified_message.max_margin_ratio.is_some()); - assert_eq!(verified_message.max_margin_ratio.unwrap(), 1); - - assert!(verified_message.take_profit_order_params.is_some()); - let tp = verified_message.take_profit_order_params.unwrap(); - assert_eq!(tp.base_asset_amount, 1000000000u64); - assert_eq!(tp.trigger_price, 230000000u64); - - assert!(verified_message.stop_loss_order_params.is_some()); - let sl = verified_message.stop_loss_order_params.unwrap(); - assert_eq!(sl.base_asset_amount, 1000000000u64); - assert_eq!(sl.trigger_price, 250000000u64); - - // Verify order params - let order_params = &verified_message.signed_msg_order_params; - assert_eq!(order_params.user_order_id, 2); - assert_eq!(order_params.direction, PositionDirection::Short); - assert_eq!(order_params.base_asset_amount, 1000000000u64); - assert_eq!(order_params.price, 237000000u64); - assert_eq!(order_params.market_index, 0); - assert_eq!(order_params.reduce_only, false); - assert_eq!(order_params.auction_duration, Some(10)); - assert_eq!(order_params.auction_start_price, Some(240000000i64)); - assert_eq!(order_params.auction_end_price, Some(238000000i64)); - } -} diff --git a/sdk/src/driftClient.ts b/sdk/src/driftClient.ts index 4d39ae6d0f..0c2732dfa4 100644 --- a/sdk/src/driftClient.ts +++ b/sdk/src/driftClient.ts @@ -6541,10 +6541,6 @@ export class DriftClient { | SignedMsgOrderParamsDelegateMessage, delegateSigner?: boolean ): Buffer { - if (orderParamsMessage.maxMarginRatio === undefined) { - orderParamsMessage.maxMarginRatio = null; - } - const anchorIxName = delegateSigner ? 'global' + ':' + 'SignedMsgOrderParamsDelegateMessage' : 'global' + ':' + 'SignedMsgOrderParamsMessage'; @@ -6565,10 +6561,7 @@ export class DriftClient { } /* - * Decode signedMsg taker order params from borsh buffer. Zero pads the message in case the - * received message was encoded by an outdated IDL (size will be too small and decode will throw). - * Note: the 128 will be problematic if the type we are expecting to deserializze into is 128 bytes - * larger than the message we are receiving (unlikely, especially if all new fields are Options). + * Decode signedMsg taker order params from borsh buffer */ public decodeSignedMsgOrderParamsMessage( encodedMessage: Buffer, @@ -6579,10 +6572,7 @@ export class DriftClient { : 'SignedMsgOrderParamsMessage'; return this.program.coder.types.decode( decodeStr, - Buffer.concat([ - encodedMessage.slice(8), // strip out discriminator - Buffer.alloc(128), // pad on 128 bytes, this is most efficient way to messages that are too small - ]) + encodedMessage.slice(8) // assumes discriminator ); } diff --git a/sdk/src/idl/drift.json b/sdk/src/idl/drift.json index 6c25dcaf1c..9de5626ba3 100644 --- a/sdk/src/idl/drift.json +++ b/sdk/src/idl/drift.json @@ -10118,12 +10118,6 @@ "defined": "SignedMsgTriggerOrderParams" } } - }, - { - "name": "maxMarginRatio", - "type": { - "option": "u16" - } } ] } @@ -10171,12 +10165,6 @@ "defined": "SignedMsgTriggerOrderParams" } } - }, - { - "name": "maxMarginRatio", - "type": { - "option": "u16" - } } ] } @@ -16218,5 +16206,8 @@ "name": "InvalidIfRebalanceSwap", "msg": "Invalid If Rebalance Swap" } - ] -} \ No newline at end of file + ], + "metadata": { + "address": "dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH" + } +} diff --git a/sdk/src/types.ts b/sdk/src/types.ts index 2d49e61b58..6ec791c873 100644 --- a/sdk/src/types.ts +++ b/sdk/src/types.ts @@ -1309,7 +1309,6 @@ export type SignedMsgOrderParamsMessage = { uuid: Uint8Array; takeProfitOrderParams: SignedMsgTriggerOrderParams | null; stopLossOrderParams: SignedMsgTriggerOrderParams | null; - maxMarginRatio?: number | null; }; export type SignedMsgOrderParamsDelegateMessage = { @@ -1319,7 +1318,6 @@ export type SignedMsgOrderParamsDelegateMessage = { takerPubkey: PublicKey; takeProfitOrderParams: SignedMsgTriggerOrderParams | null; stopLossOrderParams: SignedMsgTriggerOrderParams | null; - maxMarginRatio?: number | null; }; export type SignedMsgTriggerOrderParams = { diff --git a/tests/placeAndMakeSignedMsgBankrun.ts b/tests/placeAndMakeSignedMsgBankrun.ts index 3b23722445..173e1364c4 100644 --- a/tests/placeAndMakeSignedMsgBankrun.ts +++ b/tests/placeAndMakeSignedMsgBankrun.ts @@ -1539,7 +1539,7 @@ describe('place and make signedMsg order', () => { ); assert.fail('should fail'); } catch (e) { - assert(e.toString().includes('0x18a5')); // SignedMsgUserContextUserMismatch + assert(e.toString().includes('0x1776')); const takerOrders = takerDriftClient.getUser().getOpenOrders(); assert(takerOrders.length == 0); } @@ -1604,105 +1604,6 @@ describe('place and make signedMsg order', () => { await takerDriftClientUser.unsubscribe(); await takerDriftClient.unsubscribe(); }); - - it('fills signedMsg with max margin ratio ', async () => { - slot = new BN( - await bankrunContextWrapper.connection.toConnection().getSlot() - ); - const [takerDriftClient, takerDriftClientUser] = - await initializeNewTakerClientAndUser( - bankrunContextWrapper, - chProgram, - usdcMint, - usdcAmount, - marketIndexes, - spotMarketIndexes, - oracleInfos, - bulkAccountLoader - ); - await takerDriftClientUser.fetchAccounts(); - - const marketIndex = 0; - const baseAssetAmount = BASE_PRECISION; - const takerOrderParams = getMarketOrderParams({ - marketIndex, - direction: PositionDirection.LONG, - baseAssetAmount, - price: new BN(224).mul(PRICE_PRECISION), - auctionStartPrice: new BN(223).mul(PRICE_PRECISION), - auctionEndPrice: new BN(224).mul(PRICE_PRECISION), - auctionDuration: 10, - userOrderId: 1, - postOnly: PostOnlyParams.NONE, - marketType: MarketType.PERP, - }) as OrderParams; - - await takerDriftClientUser.fetchAccounts(); - const makerOrderParams = getLimitOrderParams({ - marketIndex, - direction: PositionDirection.SHORT, - baseAssetAmount, - price: new BN(223).mul(PRICE_PRECISION), - postOnly: PostOnlyParams.MUST_POST_ONLY, - bitFlags: 1, - marketType: MarketType.PERP, - }) as OrderParams; - - const uuid = Uint8Array.from(Buffer.from(nanoid(8))); - const takerOrderParamsMessage: SignedMsgOrderParamsMessage = { - signedMsgOrderParams: takerOrderParams, - subAccountId: 0, - slot, - uuid, - stopLossOrderParams: null, - takeProfitOrderParams: null, - maxMarginRatio: 100, - }; - - const signedOrderParams = takerDriftClient.signSignedMsgOrderParamsMessage( - takerOrderParamsMessage - ); - - const ixs = await makerDriftClient.getPlaceAndMakeSignedMsgPerpOrderIxs( - signedOrderParams, - uuid, - { - taker: await takerDriftClient.getUserAccountPublicKey(), - takerUserAccount: takerDriftClient.getUserAccount(), - takerStats: takerDriftClient.getUserStatsAccountPublicKey(), - signingAuthority: takerDriftClient.wallet.publicKey, - }, - makerOrderParams, - undefined, - undefined, - undefined, - 2 - ); - - /* - Transaction size should be largest for filling with trigger orders w/ place and take - Max size: 1232 - We currently trade on sol market w/ sol oracle so would be better with LUT, so -64 bytes + 2 bytes - We dont have referrers for maker so need to add 64 bytes - We want to allow for positions to be full with maximally different markets for maker/taker and spot/perp, - so add 30 bytes for market/oracle for taker and 30 bytes for maker - Add 32 bytes for LUT - size of transaction + 32 + 2 + 30 + 30 < 1232 - */ - assert(getSizeOfTransaction(ixs, false) < 1138); - - const tx = await makerDriftClient.buildTransaction(ixs); - await makerDriftClient.sendTransaction(tx as Transaction); - - const takerPosition = takerDriftClient.getUser().getPerpPosition(0); - - // All orders are placed and one is - // @ts-ignore - assert(takerPosition.maxMarginRatio === 100); - - await takerDriftClientUser.unsubscribe(); - await takerDriftClient.unsubscribe(); - }); }); async function initializeNewTakerClientAndUser(