@@ -361,6 +361,7 @@ mod tests {
361361 use drift_rs:: types:: {
362362 OrderParams , OrderTriggerCondition , OrderType , PositionDirection , PostOnlyParam ,
363363 SignedMsgOrderParamsDelegateMessage , SignedMsgOrderParamsMessage ,
364+ SignedMsgTriggerOrderParams ,
364365 } ;
365366 use nanoid:: nanoid;
366367
@@ -598,4 +599,112 @@ mod tests {
598599
599600 assert_eq ! ( order_metadata_json[ "will_sanitize" ] , false , ) ;
600601 }
602+
603+ #[ test]
604+ fn deser_signed_msg_type_with_len_from_raw_bytes_v0 ( ) {
605+ // v0 message, before we started adding fields to the message
606+ let payload: Vec < u8 > = vec ! [
607+ 200 , 213 , 166 , 94 , 34 , 52 , 245 , 93 , 0 , 1 , 0 , 3 , 0 , 96 , 254 , 205 , 0 , 0 , 0 , 0 , 64 , 85 ,
608+ 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 ,
609+ 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 ,
610+ 71 , 49 , 1 , 0 , 28 , 78 , 14 , 0 , 0 , 0 , 0 , 0 , 96 , 254 , 205 , 0 , 0 , 0 , 0 , 1 , 64 , 58 , 105 , 13 ,
611+ 0 , 0 , 0 , 0 , 0 , 96 , 254 , 205 , 0 , 0 , 0 , 0 ,
612+ ] ;
613+
614+ let hex = faster_hex:: hex_string ( & payload) ;
615+
616+ #[ derive( serde:: Deserialize ) ]
617+ struct Wrapper {
618+ #[ serde( deserialize_with = "deser_signed_msg_type_with_len" ) ]
619+ message : SignedOrderTypeWithLen ,
620+ }
621+
622+ let json = format ! ( r#"{{"message":"{}"}}"# , hex) ;
623+ let wrapper: Wrapper = serde_json:: from_str ( & json) . expect ( "deserializes" ) ;
624+
625+ assert_eq ! ( wrapper. message. signed_len, payload. len( ) ) ;
626+
627+ match wrapper. message . order {
628+ SignedOrderType :: Authority ( m) => {
629+ assert_eq ! ( m. signed_msg_order_params. auction_duration, Some ( 10 ) ) ;
630+ assert_eq ! (
631+ m. signed_msg_order_params. auction_start_price,
632+ Some ( 230000000 )
633+ ) ;
634+ assert_eq ! ( m. signed_msg_order_params. auction_end_price, Some ( 237000000 ) ) ;
635+ assert_eq ! ( m. sub_account_id, 2 ) ;
636+ assert_eq ! ( m. slot, 2345 ) ;
637+ assert_eq ! (
638+ m. take_profit_order_params,
639+ Some ( SignedMsgTriggerOrderParams {
640+ trigger_price: 240000000 ,
641+ base_asset_amount: 3456000000 ,
642+ } )
643+ ) ;
644+ assert_eq ! (
645+ m. stop_loss_order_params,
646+ Some ( SignedMsgTriggerOrderParams {
647+ trigger_price: 225000000 ,
648+ base_asset_amount: 3456000000 ,
649+ } )
650+ ) ;
651+ assert_eq ! ( m. max_margin_ratio, None ) ;
652+ }
653+ SignedOrderType :: Delegated ( _) => panic ! ( "expected Authority variant" ) ,
654+ }
655+ }
656+
657+ #[ test]
658+ fn deser_signed_msg_type_with_len_from_raw_bytes_v1 ( ) {
659+ // v1 message, added max_margin_ratio field
660+ let payload: Vec < u8 > = vec ! [
661+ 200 , 213 , 166 , 94 , 34 , 52 , 245 , 93 , 0 , 1 , 0 , 3 , 0 , 96 , 254 , 205 , 0 , 0 , 0 , 0 , 64 , 85 ,
662+ 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 ,
663+ 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 ,
664+ 71 , 49 , 1 , 0 , 28 , 78 , 14 , 0 , 0 , 0 , 0 , 0 , 96 , 254 , 205 , 0 , 0 , 0 , 0 , 1 , 64 , 58 , 105 , 13 ,
665+ 0 , 0 , 0 , 0 , 0 , 96 , 254 , 205 , 0 , 0 , 0 , 0 , 1 , 255 , 255 ,
666+ ] ;
667+
668+ let hex = faster_hex:: hex_string ( & payload) ;
669+
670+ #[ derive( serde:: Deserialize ) ]
671+ struct Wrapper {
672+ #[ serde( deserialize_with = "deser_signed_msg_type_with_len" ) ]
673+ message : SignedOrderTypeWithLen ,
674+ }
675+
676+ let json = format ! ( r#"{{"message":"{}"}}"# , hex) ;
677+ let wrapper: Wrapper = serde_json:: from_str ( & json) . expect ( "deserializes" ) ;
678+
679+ assert_eq ! ( wrapper. message. signed_len, payload. len( ) ) ;
680+
681+ match wrapper. message . order {
682+ SignedOrderType :: Authority ( m) => {
683+ assert_eq ! ( m. signed_msg_order_params. auction_duration, Some ( 10 ) ) ;
684+ assert_eq ! (
685+ m. signed_msg_order_params. auction_start_price,
686+ Some ( 230000000 )
687+ ) ;
688+ assert_eq ! ( m. signed_msg_order_params. auction_end_price, Some ( 237000000 ) ) ;
689+ assert_eq ! ( m. sub_account_id, 2 ) ;
690+ assert_eq ! ( m. slot, 2345 ) ;
691+ assert_eq ! (
692+ m. take_profit_order_params,
693+ Some ( SignedMsgTriggerOrderParams {
694+ trigger_price: 240000000 ,
695+ base_asset_amount: 3456000000 ,
696+ } )
697+ ) ;
698+ assert_eq ! (
699+ m. stop_loss_order_params,
700+ Some ( SignedMsgTriggerOrderParams {
701+ trigger_price: 225000000 ,
702+ base_asset_amount: 3456000000 ,
703+ } )
704+ ) ;
705+ assert_eq ! ( m. max_margin_ratio, Some ( 65535 ) ) ;
706+ }
707+ SignedOrderType :: Delegated ( _) => panic ! ( "expected Authority variant" ) ,
708+ }
709+ }
601710}
0 commit comments