@@ -62,7 +62,7 @@ use crate::state::user::{
62
62
MarginMode , MarketType , OrderStatus , OrderTriggerCondition , OrderType , User , UserStats ,
63
63
} ;
64
64
use crate :: state:: user_map:: { load_user_map, load_user_maps, UserMap , UserStatsMap } ;
65
- use crate :: validation:: sig_verification:: verify_ed25519_msg ;
65
+ use crate :: validation:: sig_verification:: verify_and_decode_ed25519_msg ;
66
66
use crate :: validation:: user:: { validate_user_deletion, validate_user_is_idle} ;
67
67
use crate :: {
68
68
controller, load, math, print_error, safe_decrement, OracleSource , GOV_SPOT_MARKET_INDEX ,
@@ -665,44 +665,51 @@ pub fn place_signed_msg_taker_order<'c: 'info, 'info>(
665
665
// Verify data from verify ix
666
666
let ix: Instruction = load_instruction_at_checked ( ix_idx as usize - 1 , ix_sysvar) ?;
667
667
668
- let signer = match is_delegate_signer {
669
- true => taker. delegate . to_bytes ( ) ,
670
- false => taker. authority . to_bytes ( ) ,
668
+ let signer = if is_delegate_signer {
669
+ taker. delegate . to_bytes ( )
670
+ } else {
671
+ taker. authority . to_bytes ( )
671
672
} ;
672
- let verified_message_and_signature = verify_ed25519_msg (
673
+ let verified_message_and_signature = verify_and_decode_ed25519_msg (
673
674
& ix,
674
675
ix_sysvar,
675
676
ix_idx,
676
677
& signer,
677
678
& taker_order_params_message_bytes[ ..] ,
679
+ is_delegate_signer,
678
680
) ?;
679
681
680
- let taker_order_params_message: SignedMsgOrderParamsMessage =
681
- verified_message_and_signature. signed_msg_order_params_message ;
682
-
683
- // Verify taker passed to the ix matches pda derived from subaccount id + authority
684
- let taker_pda = Pubkey :: find_program_address (
685
- & [
686
- "user" . as_bytes ( ) ,
687
- & taker. authority . to_bytes ( ) ,
688
- & taker_order_params_message. sub_account_id . to_le_bytes ( ) ,
689
- ] ,
690
- & ID ,
691
- ) ;
692
- if taker_pda. 0 != taker_key {
693
- msg ! (
694
- "Taker key {:?} does not match pda {:?}" ,
695
- taker_key,
696
- taker_pda. 0
682
+ if is_delegate_signer {
683
+ validate ! (
684
+ verified_message_and_signature. delegate_signed_taker_pubkey == Some ( taker_key) ,
685
+ ErrorCode :: SignedMsgUserContextUserMismatch ,
686
+ "Delegate signed msg for taker pubkey different than supplied pubkey"
687
+ ) ?;
688
+ } else {
689
+ // Verify taker passed to the ix matches pda derived from subaccount id + authority
690
+ let taker_pda = Pubkey :: find_program_address (
691
+ & [
692
+ "user" . as_bytes ( ) ,
693
+ & taker. authority . to_bytes ( ) ,
694
+ & verified_message_and_signature
695
+ . sub_account_id
696
+ . unwrap ( )
697
+ . to_le_bytes ( ) ,
698
+ ] ,
699
+ & ID ,
697
700
) ;
698
- return Err ( ErrorCode :: SignedMsgUserContextUserMismatch . into ( ) ) ;
699
- }
701
+ validate ! (
702
+ taker_pda. 0 == taker_key,
703
+ ErrorCode :: SignedMsgUserContextUserMismatch ,
704
+ "Taker key does not match pda"
705
+ ) ?;
706
+ } ;
700
707
701
708
let signature = verified_message_and_signature. signature ;
702
709
let clock = & Clock :: get ( ) ?;
703
710
704
711
// First order must be a taker order
705
- let matching_taker_order_params = & taker_order_params_message . signed_msg_order_params ;
712
+ let matching_taker_order_params = & verified_message_and_signature . signed_msg_order_params ;
706
713
if matching_taker_order_params. market_type != MarketType :: Perp
707
714
|| !matching_taker_order_params. has_valid_auction_params ( ) ?
708
715
{
@@ -720,7 +727,7 @@ pub fn place_signed_msg_taker_order<'c: 'info, 'info>(
720
727
}
721
728
722
729
// Set max slot for the order early so we set correct signed msg order id
723
- let order_slot = taker_order_params_message . slot ;
730
+ let order_slot = verified_message_and_signature . slot ;
724
731
if order_slot < clock. slot . saturating_sub ( 500 ) {
725
732
msg ! (
726
733
"SignedMsg order slot {} is too old: must be within 500 slots of current slot" ,
@@ -749,7 +756,7 @@ pub fn place_signed_msg_taker_order<'c: 'info, 'info>(
749
756
// Dont place order if signed msg order already exists
750
757
let mut taker_order_id_to_use = taker. next_order_id ;
751
758
let mut signed_msg_order_id =
752
- SignedMsgOrderId :: new ( taker_order_params_message . uuid , max_slot, 0 ) ;
759
+ SignedMsgOrderId :: new ( verified_message_and_signature . uuid , max_slot, 0 ) ;
753
760
if signed_msg_account
754
761
. check_exists_and_prune_stale_signed_msg_order_ids ( signed_msg_order_id, clock. slot )
755
762
{
@@ -758,7 +765,7 @@ pub fn place_signed_msg_taker_order<'c: 'info, 'info>(
758
765
}
759
766
760
767
// Good to place orders, do stop loss and take profit orders first
761
- if let Some ( stop_loss_order_params) = taker_order_params_message . stop_loss_order_params {
768
+ if let Some ( stop_loss_order_params) = verified_message_and_signature . stop_loss_order_params {
762
769
taker_order_id_to_use += 1 ;
763
770
let stop_loss_order = OrderParams {
764
771
order_type : OrderType :: TriggerMarket ,
@@ -793,7 +800,8 @@ pub fn place_signed_msg_taker_order<'c: 'info, 'info>(
793
800
) ?;
794
801
}
795
802
796
- if let Some ( take_profit_order_params) = taker_order_params_message. take_profit_order_params {
803
+ if let Some ( take_profit_order_params) = verified_message_and_signature. take_profit_order_params
804
+ {
797
805
taker_order_id_to_use += 1 ;
798
806
let take_profit_order = OrderParams {
799
807
order_type : OrderType :: TriggerMarket ,
0 commit comments