Skip to main content

canic_core/dto/
cycles.rs

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//
7// CycleTrackerEntry
8//
9
10#[derive(CandidType, Deserialize)]
11pub struct CycleTrackerEntry {
12    pub timestamp_secs: u64,
13    pub cycles: Cycles,
14}
15
16//
17// CycleTopupEvent
18//
19
20#[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/// Exact parent funding failure; its containing event supplies the failure time.
32#[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}