nautilus_model/events/funding/
settlement.rs1use nautilus_core::{UUID4, UnixNanos};
17use rust_decimal::Decimal;
18use serde::{Deserialize, Serialize};
19
20use crate::{
21 identifiers::{AccountId, InstrumentId, TraderId},
22 types::{Currency, Price},
23};
24
25#[repr(C)]
27#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
28#[serde(tag = "type")]
29pub struct FundingSettlement {
30 pub trader_id: TraderId,
32 pub instrument_id: InstrumentId,
34 pub account_id: AccountId,
36 pub rate: Decimal,
38 pub settlement_price: Price,
40 pub currency: Currency,
42 pub event_id: UUID4,
44 pub ts_event: UnixNanos,
46 pub ts_init: UnixNanos,
48}
49
50impl FundingSettlement {
51 #[must_use]
53 #[expect(clippy::too_many_arguments)]
54 pub const fn new(
55 trader_id: TraderId,
56 instrument_id: InstrumentId,
57 account_id: AccountId,
58 rate: Decimal,
59 settlement_price: Price,
60 currency: Currency,
61 event_id: UUID4,
62 ts_event: UnixNanos,
63 ts_init: UnixNanos,
64 ) -> Self {
65 Self {
66 trader_id,
67 instrument_id,
68 account_id,
69 rate,
70 settlement_price,
71 currency,
72 event_id,
73 ts_event,
74 ts_init,
75 }
76 }
77}
78
79#[cfg(test)]
80mod tests {
81 use std::str::FromStr;
82
83 use nautilus_core::{UUID4, UnixNanos};
84 use rstest::rstest;
85 use rust_decimal::Decimal;
86
87 use super::*;
88 use crate::{
89 identifiers::{AccountId, InstrumentId, TraderId},
90 types::{Currency, Price},
91 };
92
93 fn create_test_settlement() -> FundingSettlement {
94 FundingSettlement::new(
95 TraderId::from("TRADER-001"),
96 InstrumentId::from("BTCUSDT-PERP.BINANCE"),
97 AccountId::from("BINANCE-001"),
98 Decimal::from_str("0.0001").unwrap(),
99 Price::from("65000.00"),
100 Currency::USDT(),
101 UUID4::default(),
102 UnixNanos::from(1_000_000_000),
103 UnixNanos::from(2_000_000_000),
104 )
105 }
106
107 #[rstest]
108 fn test_funding_settlement_serialization() {
109 let original = create_test_settlement();
110
111 let json = serde_json::to_string(&original).unwrap();
112 let deserialized: FundingSettlement = serde_json::from_str(&json).unwrap();
113
114 assert_eq!(original, deserialized);
115 }
116}