#[allow(unused_imports)]
use borsh::{BorshDeserialize, BorshSerialize};
use phoenix::state::OrderPacket;
pub fn decode_order_packet(bytes: &[u8]) -> anyhow::Result<OrderPacket> {
let order_packet = match OrderPacket::try_from_slice(bytes) {
Ok(order_packet) => order_packet,
Err(_) => {
let padded_bytes = [bytes, &[0, 0]].concat();
OrderPacket::try_from_slice(&padded_bytes)?
}
};
Ok(order_packet)
}
#[test]
fn test_decode_order_packet() {
let post_only_op = OrderPacket::new_post_only_default(phoenix::state::Side::Ask, 10000, 10);
let bytes = post_only_op.try_to_vec().unwrap();
let decoded_normal = decode_order_packet(&bytes).unwrap();
let decoded_inferred = decode_order_packet(&bytes[..bytes.len() - 2]).unwrap();
assert_eq!(post_only_op, decoded_normal);
assert_eq!(decoded_normal, decoded_inferred);
let limit_op = OrderPacket::new_limit_order_default(phoenix::state::Side::Ask, 10000, 10);
let bytes = limit_op.try_to_vec().unwrap();
let decoded_normal = decode_order_packet(&bytes).unwrap();
let decoded_inferred = decode_order_packet(&bytes[..bytes.len() - 2]).unwrap();
assert_eq!(limit_op, decoded_normal);
assert_eq!(decoded_normal, decoded_inferred);
let ioc_op = OrderPacket::new_ioc(
phoenix::state::Side::Ask,
Some(10000),
10,
0,
0,
0,
phoenix::state::SelfTradeBehavior::Abort,
None,
0,
false,
None,
None,
);
let bytes = ioc_op.try_to_vec().unwrap();
let decoded_normal = decode_order_packet(&bytes).unwrap();
let decoded_inferred = decode_order_packet(&bytes[..bytes.len() - 2]).unwrap();
assert_eq!(ioc_op, decoded_normal);
assert_eq!(decoded_normal, decoded_inferred);
}