1use crate::dto::prelude::*;
2
3pub use crate::cdk::types::{BC, Cycles, CyclesConversionError, CyclesParseError, KC, MC, QC, TC};
4pub use crate::domain::cycles::{CycleTopupEventStatus, CycleTopupFailureDisposition};
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 pub parent_failure: Option<CycleTopupFailure>,
29}
30
31#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
33pub struct CycleTopupFailure {
34 pub parent: Principal,
35 pub operation_id: [u8; 32],
36 pub public_error_code: u16,
37 pub disposition: CycleTopupFailureDisposition,
38}
39
40#[cfg(test)]
41mod tests {
42 use super::*;
43
44 #[test]
45 fn reexported_topup_status_roundtrips_through_candid() {
46 let event = CycleTopupEvent {
47 timestamp_secs: 42,
48 sequence: 7,
49 requested_cycles: Cycles::new(1_000_000),
50 transferred_cycles: Some(Cycles::new(999_000)),
51 status: crate::domain::cycles::CycleTopupEventStatus::RequestOk,
52 error: None,
53 parent_failure: None,
54 };
55
56 let bytes = candid::encode_one(&event).expect("encode cycle top-up event");
57 let decoded: CycleTopupEvent =
58 candid::decode_one(&bytes).expect("decode cycle top-up event");
59
60 let dto_status: CycleTopupEventStatus =
61 crate::domain::cycles::CycleTopupEventStatus::RequestOk;
62
63 assert_eq!(decoded.timestamp_secs, 42);
64 assert_eq!(decoded.sequence, 7);
65 assert_eq!(decoded.requested_cycles, Cycles::new(1_000_000));
66 assert_eq!(decoded.transferred_cycles, Some(Cycles::new(999_000)));
67 assert_eq!(decoded.status, dto_status);
68 assert_eq!(decoded.error, None);
69 }
70}