Skip to content

Commit 8b515b6

Browse files
authored
Merge pull request #89 from drift-labs/wphan/add_deser_signed_msg_tests
2 parents 5930f15 + 4d1068e commit 8b515b6

File tree

2 files changed

+152
-3
lines changed

2 files changed

+152
-3
lines changed

README.md

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,56 @@ graph TD
3131
C -->|Place taker + fill txs| I
3232
```
3333

34-
## Build
34+
## Dependency setup
3535

3636
ensure an x86_64 toolchain is configured for building `swift-server`
3737

3838
```shell
39-
rustup install 1.83.0-x86_64-apple-darwin
39+
rustup install 1.87.0-x86_64-apple-darwin
4040
# run inside swift-server directory
41-
rustup override set 1.83.0-x86_64-apple-darwin
41+
rustup override set 1.87.0-x86_64-apple-darwin
42+
```
43+
44+
if on a newer ARM mac, need to install x86 libraries to run tests and build locally
45+
```shell
46+
# install x86-64 brew
47+
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
48+
49+
# install x86 deps
50+
arch -x86_64 /usr/local/bin/brew install librdkafka cyrus-sasl pkg-config zstd lz4 openssl@3
51+
```
52+
53+
run tests:
54+
```shell
55+
# Ensure Intel Homebrew is used first
56+
export PATH="/usr/local/bin:/usr/local/sbin:$PATH"
57+
58+
# Make sure no ARM include/lib paths are leaking in
59+
unset CPATH CFLAGS CXXFLAGS CPPFLAGS SDKROOT LIBRARY_PATH DYLD_LIBRARY_PATH
60+
61+
# Run tests under Rosetta with dynamic linking to Intel librdkafka
62+
arch -x86_64 env \
63+
RUSTUP_TOOLCHAIN=1.87.0-x86_64-apple-darwin \
64+
RDKAFKA_BUILD=0 \
65+
RDKAFKA_STATIC=0 \
66+
PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:/usr/local/opt/openssl@3/lib/pkgconfig" \
67+
DYLD_FALLBACK_LIBRARY_PATH="/usr/local/lib:/usr/local/opt/librdkafka/lib:/usr/local/opt/cyrus-sasl/lib" \
68+
cargo test
69+
70+
# Run a specific test
71+
arch -x86_64 env \
72+
RUSTUP_TOOLCHAIN=1.87.0-x86_64-apple-darwin \
73+
RDKAFKA_BUILD=0 \
74+
RDKAFKA_STATIC=0 \
75+
PKG_CONFIG_PATH="/usr/local/lib/pkgconfig:/usr/local/opt/openssl@3/lib/pkgconfig" \
76+
DYLD_FALLBACK_LIBRARY_PATH="/usr/local/lib:/usr/local/opt/librdkafka/lib:/usr/local/opt/cyrus-sasl/lib" \
77+
cargo test \
78+
types::messages::tests -- --nocapture
4279
```
4380

81+
82+
## Build
83+
4484
```shell
4585
cargo build --release
4686
```

src/types/messages.rs

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)