1use crate::dto::prelude::*;
2
3pub use crate::cdk::types::{BC, Cycles, CyclesConversionError, CyclesParseError, KC, MC, QC, TC};
4pub use crate::domain::cycles::CycleTopupEventStatus;
5
6#[derive(CandidType, Deserialize)]
11pub struct CycleTrackerEntry {
12 pub timestamp_secs: u64,
13 pub cycles: Cycles,
14}
15
16#[derive(CandidType, Deserialize)]
21pub struct CycleTopupEvent {
22 pub timestamp_secs: u64,
23 pub sequence: u32,
24 pub requested_cycles: Cycles,
25 pub transferred_cycles: Option<Cycles>,
26 pub status: CycleTopupEventStatus,
27 pub error: Option<String>,
28}
29
30#[cfg(test)]
31mod tests {
32 use super::*;
33
34 #[test]
35 fn reexported_topup_status_roundtrips_through_candid() {
36 let event = CycleTopupEvent {
37 timestamp_secs: 42,
38 sequence: 7,
39 requested_cycles: Cycles::new(1_000_000),
40 transferred_cycles: Some(Cycles::new(999_000)),
41 status: crate::domain::cycles::CycleTopupEventStatus::RequestOk,
42 error: None,
43 };
44
45 let bytes = candid::encode_one(&event).expect("encode cycle top-up event");
46 let decoded: CycleTopupEvent =
47 candid::decode_one(&bytes).expect("decode cycle top-up event");
48
49 let dto_status: CycleTopupEventStatus =
50 crate::domain::cycles::CycleTopupEventStatus::RequestOk;
51
52 assert_eq!(decoded.timestamp_secs, 42);
53 assert_eq!(decoded.sequence, 7);
54 assert_eq!(decoded.requested_cycles, Cycles::new(1_000_000));
55 assert_eq!(decoded.transferred_cycles, Some(Cycles::new(999_000)));
56 assert_eq!(decoded.status, dto_status);
57 assert_eq!(decoded.error, None);
58 }
59}