Skip to content

Commit 5827fec

Browse files
committed
fix building and deserialization tests pass
1 parent 8606466 commit 5827fec

File tree

4 files changed

+35
-24
lines changed

4 files changed

+35
-24
lines changed

Cargo.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ bincode = "1"
2626
clap = { version = "4.0", features = ["derive"] }
2727
dashmap = "6.1.0"
2828
dotenv = "0.15.0"
29-
drift-rs = { git = "https://github.com/drift-labs/drift-rs.git" , rev = "cd60371" }
29+
drift-rs = { git = "https://github.com/drift-labs/drift-rs.git" , rev = "bd276394fcf1ff3d076607cd8dde922ebd7038c7" }
3030
ed25519-dalek = "1.0.1"
3131
env_logger = "0.11"
3232
faster-hex = "0.10.0"

src/swift_server.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,8 @@ pub async fn process_order(
320320
let order_metadata = OrderMetadataAndMessage {
321321
signing_authority: signing_pubkey,
322322
taker_authority,
323-
order_message: *signed_msg,
323+
order_message: incoming_message.message.original_message.clone(),
324+
deserialized_order_message: *signed_msg,
324325
order_signature: taker_signature.into(),
325326
ts: context.recv_ts,
326327
uuid,

src/types/messages.rs

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {
122121
pub 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

Comments
 (0)