@@ -21,6 +21,8 @@ pub struct SignedOrderTypeWithLen {
2121 pub signed_len : usize ,
2222 /// signed order message
2323 pub order : SignedOrderType ,
24+ /// Original message bytes for ed25519
25+ pub original_message : Vec < u8 > ,
2426}
2527
2628/// Deserialize hex-ified, borsh bytes as a `SignedOrderType`
@@ -46,20 +48,24 @@ where
4648 faster_hex:: hex_decode ( payload. as_bytes ( ) , & mut borsh_buf[ ..borsh_len] )
4749 . map_err ( serde:: de:: Error :: custom) ?;
4850
51+ let original_message = payload. as_bytes ( ) . to_vec ( ) ;
52+
4953 // this is basically the same as if we derived AnchorDeserialize on `SignedOrderType` _expect_ it does not
5054 // add a u8 to distinguish the enum
5155 if borsh_buf[ ..8 ] == SWIFT_DELEGATE_MSG_PREFIX {
5256 AnchorDeserialize :: deserialize ( & mut & borsh_buf[ 8 ..] )
5357 . map ( |o| SignedOrderTypeWithLen {
5458 signed_len : borsh_len,
5559 order : SignedOrderType :: Delegated ( o) ,
60+ original_message,
5661 } )
5762 . map_err ( serde:: de:: Error :: custom)
5863 } else {
5964 AnchorDeserialize :: deserialize ( & mut & borsh_buf[ 8 ..] )
6065 . map ( |o| SignedOrderTypeWithLen {
6166 signed_len : borsh_len,
6267 order : SignedOrderType :: Authority ( o) ,
68+ original_message,
6369 } )
6470 . map_err ( serde:: de:: Error :: custom)
6571 }
@@ -101,15 +107,8 @@ impl IncomingSignedMessage {
101107 PublicKey :: from_bytes ( self . taker_pubkey . as_array ( ) )
102108 } ?;
103109
104- // client hex encodes msg before signing so use that as comparison
105- // since we allow older clients with potentially shorter messages than the current IDL
106- // need to truncate the message to the size the client signed (exclude default padded bytes)
107- let msg_data = & self . order ( ) . to_borsh ( ) [ ..self . message . signed_len ] ;
108- let mut hex_bytes = vec ! [ 0 ; msg_data. len( ) * 2 ] ; // 2 hex bytes per msg byte
109- let _ = faster_hex:: hex_encode ( msg_data, & mut hex_bytes) . expect ( "hexified" ) ;
110-
111110 pubkey
112- . verify ( & hex_bytes , & self . signature )
111+ . verify ( & self . message . original_message , & self . signature )
113112 . context ( "Signature did not verify" )
114113 }
115114 pub fn verify_and_get_signed_message ( & self ) -> Result < & SignedOrderType > {
@@ -122,7 +121,9 @@ impl IncomingSignedMessage {
122121pub struct OrderMetadataAndMessage {
123122 pub signing_authority : Pubkey ,
124123 pub taker_authority : Pubkey ,
125- pub order_message : SignedOrderType ,
124+ #[ max_len( 2 * ( SignedMsgOrderParamsDelegateMessage :: INIT_SPACE + 8 ) ) ]
125+ pub order_message : Vec < u8 > ,
126+ pub deserialized_order_message : SignedOrderType ,
126127 pub order_signature : [ u8 ; 64 ] ,
127128 pub uuid : [ u8 ; 8 ] ,
128129 pub ts : u64 ,
@@ -156,16 +157,25 @@ impl OrderMetadataAndMessage {
156157 }
157158
158159 pub fn jsonify ( & self ) -> serde_json:: Value {
159- let taker_order_params = self . order_message . info ( & self . taker_authority ) . order_params ;
160- let signed_msg_borsh = self . order_message . to_borsh ( ) ;
160+ let taker_order_params = self
161+ . deserialized_order_message
162+ . info ( & self . taker_authority )
163+ . order_params ;
164+
165+ let order_message_str = match core:: str:: from_utf8 ( & self . order_message ) {
166+ Ok ( s) if s. as_bytes ( ) . iter ( ) . all ( u8:: is_ascii_hexdigit) && ( s. len ( ) % 2 == 0 ) => {
167+ s. to_string ( )
168+ }
169+ _ => faster_hex:: hex_string ( self . order_message . as_slice ( ) ) ,
170+ } ;
161171
162172 json ! ( {
163173 "market_type" : match taker_order_params. market_type {
164174 MarketType :: Perp => "perp" ,
165175 MarketType :: Spot => "spot" ,
166176 } ,
167177 "market_index" : taker_order_params. market_index,
168- "order_message" : faster_hex :: hex_string ( signed_msg_borsh . as_slice ( ) ) ,
178+ "order_message" : order_message_str ,
169179 "order_signature" : base64:: prelude:: BASE64_STANDARD . encode( self . order_signature) ,
170180 "taker_authority" : self . taker_authority. to_string( ) ,
171181 "signing_authority" : self . signing_authority. to_string( ) ,
@@ -521,7 +531,8 @@ mod tests {
521531 let encoded = OrderMetadataAndMessage {
522532 signing_authority : Pubkey :: new_unique ( ) ,
523533 taker_authority : Pubkey :: new_unique ( ) ,
524- order_message : SignedOrderType :: Authority ( Default :: default ( ) ) ,
534+ order_message : vec ! [ 0u8 ; 2 * ( SignedMsgOrderParamsDelegateMessage :: INIT_SPACE + 8 ) ] ,
535+ deserialized_order_message : SignedOrderType :: Authority ( Default :: default ( ) ) ,
525536 order_signature : [ 1u8 ; 64 ] ,
526537 ts : 55555 ,
527538 uuid : nanoid ! ( 8 ) . as_bytes ( ) . try_into ( ) . unwrap ( ) ,
@@ -531,7 +542,7 @@ mod tests {
531542 let order_metadata = OrderMetadataAndMessage :: decode ( & encoded) . unwrap ( ) ;
532543 dbg ! ( base64:: prelude:: BASE64_STANDARD . encode(
533544 & order_metadata
534- . order_message
545+ . deserialized_order_message
535546 . try_to_vec( )
536547 . unwrap( )
537548 . as_slice( )
@@ -560,13 +571,15 @@ mod tests {
560571 } ;
561572
562573 let signed_order_message = SignedOrderType :: Authority ( order_params) ;
574+ let hex_msg = faster_hex:: hex_string ( signed_order_message. to_borsh ( ) . as_slice ( ) ) ;
563575
564576 let order_metadata_json = OrderMetadataAndMessage {
565577 signing_authority,
566578 taker_authority,
579+ order_message : hex_msg. as_bytes ( ) . to_vec ( ) ,
567580 order_signature,
568581 uuid : order_params. uuid ,
569- order_message : signed_order_message. clone ( ) ,
582+ deserialized_order_message : signed_order_message. clone ( ) ,
570583 ts : 55555 ,
571584 will_sanitize : false ,
572585 }
@@ -585,10 +598,7 @@ mod tests {
585598 base64:: prelude:: BASE64_STANDARD . encode( order_signature) ,
586599 ) ;
587600
588- assert_eq ! (
589- order_metadata_json[ "order_message" ] ,
590- faster_hex:: hex_string( signed_order_message. to_borsh( ) . as_slice( ) ) ,
591- ) ;
601+ assert_eq ! ( order_metadata_json[ "order_message" ] , hex_msg, ) ;
592602
593603 assert_eq ! ( order_metadata_json[ "ts" ] , 55555 ) ;
594604
0 commit comments