From 0e049c00ca9746241c9e758233188150b022412c Mon Sep 17 00:00:00 2001 From: Karun Matharu Date: Thu, 22 Jan 2026 11:53:58 +0000 Subject: [PATCH 1/3] add system order type to RFQs --- types/src/order.rs | 15 +++++++++++++++ types/src/rfq.rs | 4 +++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/types/src/order.rs b/types/src/order.rs index 90d7329..9bf0a2e 100644 --- a/types/src/order.rs +++ b/types/src/order.rs @@ -213,6 +213,21 @@ pub enum OrderStatus { TriggerPending, } +#[derive( + Debug, Display, Clone, Copy, Serialize, Deserialize, Default, EnumString, PartialEq, Eq, Hash, +)] +#[strum(serialize_all = "PascalCase")] +#[serde(rename_all = "PascalCase")] +pub enum SystemOrderType { + #[default] + LiquidatePositionOnBook, + LiquidatePositionOnBackstop, + LiquidatePositionOnAdl, + CollateralConversion, + FutureExpiry, + OrderBookClosed, +} + #[derive( Debug, Display, Clone, Copy, Serialize, Deserialize, Default, EnumString, PartialEq, Eq, Hash, )] diff --git a/types/src/rfq.rs b/types/src/rfq.rs index 2d99a41..3e2fb75 100644 --- a/types/src/rfq.rs +++ b/types/src/rfq.rs @@ -2,7 +2,7 @@ use rust_decimal::Decimal; use serde::{Deserialize, Serialize}; use strum::{Display, EnumString}; -use crate::order::{OrderStatus, Side}; +use crate::order::{OrderStatus, Side, SystemOrderType}; #[derive( Debug, Display, Clone, Copy, Serialize, Deserialize, Default, EnumString, PartialEq, Eq, Hash, @@ -305,6 +305,8 @@ pub struct RequestForQuote { pub status: OrderStatus, pub execution_mode: RfqExecutionMode, pub created_at: i64, + #[serde(default)] + pub system_order_type: Option, } impl QuotePayload { From b58a49ef729a1334ffc0ca59eec402ebb4f5fbb9 Mon Sep 17 00:00:00 2001 From: Karun Matharu Date: Thu, 22 Jan 2026 16:29:49 +0000 Subject: [PATCH 2/3] system order type --- types/src/rfq.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/types/src/rfq.rs b/types/src/rfq.rs index 3e2fb75..64a15cf 100644 --- a/types/src/rfq.rs +++ b/types/src/rfq.rs @@ -106,6 +106,8 @@ pub enum RequestForQuoteUpdate { order_status: OrderStatus, #[serde(rename = "T")] timestamp: i64, + #[serde(rename = "o", default)] + system_order_type: Option, }, RfqRefreshed { #[serde(rename = "E")] @@ -130,6 +132,8 @@ pub enum RequestForQuoteUpdate { order_status: OrderStatus, #[serde(rename = "T")] timestamp: i64, + #[serde(rename = "o", default)] + system_order_type: Option, }, RfqAccepted { #[serde(rename = "E")] @@ -154,6 +158,8 @@ pub enum RequestForQuoteUpdate { order_status: OrderStatus, #[serde(rename = "T")] timestamp: i64, + #[serde(rename = "o", default)] + system_order_type: Option, }, RfqCancelled { #[serde(rename = "E")] @@ -178,6 +184,8 @@ pub enum RequestForQuoteUpdate { order_status: OrderStatus, #[serde(rename = "T")] timestamp: i64, + #[serde(rename = "o", default)] + system_order_type: Option, }, QuoteAccepted { #[serde(rename = "E")] @@ -262,6 +270,8 @@ pub enum RequestForQuoteUpdate { order_status: OrderStatus, #[serde(rename = "T")] timestamp: i64, + #[serde(rename = "o", default)] + system_order_type: Option, }, } From 6b2ca8c17365510c8d9d7cad20d35120e5569ca2 Mon Sep 17 00:00:00 2001 From: Karun Matharu Date: Thu, 22 Jan 2026 16:57:43 +0000 Subject: [PATCH 3/3] add tests --- types/src/rfq.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/types/src/rfq.rs b/types/src/rfq.rs index 64a15cf..fbe12ed 100644 --- a/types/src/rfq.rs +++ b/types/src/rfq.rs @@ -358,3 +358,39 @@ impl QuotePayload { self } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn rfq_active_without_system_order_type() { + let data = r#"{"e":"rfqActive","E":1234567890,"R":123,"s":"BTC_USDC","q":"1.5","w":1234567890,"W":1234567899,"X":"New","T":1234567890}"#; + let update: RequestForQuoteUpdate = serde_json::from_str(data).unwrap(); + match update { + RequestForQuoteUpdate::RfqActive { + system_order_type, .. + } => { + assert!(system_order_type.is_none()); + } + _ => panic!("Expected RfqActive"), + } + } + + #[test] + fn rfq_active_with_system_order_type() { + let data = r#"{"e":"rfqActive","E":1234567890,"R":123,"s":"BTC_USDC","q":"1.5","w":1234567890,"W":1234567899,"X":"New","T":1234567890,"o":"CollateralConversion"}"#; + let update: RequestForQuoteUpdate = serde_json::from_str(data).unwrap(); + match update { + RequestForQuoteUpdate::RfqActive { + system_order_type, .. + } => { + assert_eq!( + system_order_type, + Some(SystemOrderType::CollateralConversion) + ); + } + _ => panic!("Expected RfqActive"), + } + } +}