Skip to main content

solders_primitives/
clock.rs

1use derive_more::{From, Into};
2use pyo3::prelude::*;
3use serde::{Deserialize, Serialize};
4use solana_program::clock::{
5    Clock as ClockOriginal, Epoch, Slot, UnixTimestamp, DEFAULT_DEV_SLOTS_PER_EPOCH,
6    DEFAULT_HASHES_PER_SECOND, DEFAULT_HASHES_PER_TICK, DEFAULT_MS_PER_SLOT,
7    DEFAULT_SLOTS_PER_EPOCH, DEFAULT_S_PER_SLOT, DEFAULT_TICKS_PER_SECOND, DEFAULT_TICKS_PER_SLOT,
8    FORWARD_TRANSACTIONS_TO_LEADER_AT_SLOT_OFFSET, GENESIS_EPOCH, HOLD_TRANSACTIONS_SLOT_OFFSET,
9    INITIAL_RENT_EPOCH, MAX_HASH_AGE_IN_SECONDS, MAX_PROCESSING_AGE, MAX_RECENT_BLOCKHASHES,
10    MAX_TRANSACTION_FORWARDING_DELAY, MAX_TRANSACTION_FORWARDING_DELAY_GPU, MS_PER_TICK,
11    NUM_CONSECUTIVE_LEADER_SLOTS, SECONDS_PER_DAY, TICKS_PER_DAY,
12};
13use solders_traits_core::transaction_status_boilerplate;
14
15/// A representation of network time.
16///
17/// All members of ``Clock`` start from 0 upon network boot.
18#[pyclass(module = "solders.account", subclass)]
19#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Default, From, Into)]
20pub struct Clock(pub ClockOriginal);
21
22transaction_status_boilerplate!(Clock);
23
24#[solders_macros::richcmp_eq_only]
25#[solders_macros::common_methods]
26#[pymethods]
27impl Clock {
28    #[new]
29    fn new(
30        slot: Slot,
31        epoch_start_timestamp: UnixTimestamp,
32        epoch: Epoch,
33        leader_schedule_epoch: Epoch,
34        unix_timestamp: UnixTimestamp,
35    ) -> Self {
36        ClockOriginal {
37            slot,
38            epoch_start_timestamp,
39            epoch,
40            leader_schedule_epoch,
41            unix_timestamp,
42        }
43        .into()
44    }
45
46    /// int: The current Slot.
47    #[getter]
48    pub fn slot(&self) -> Slot {
49        self.0.slot
50    }
51
52    /// int: The timestamp of the first ``Slot`` in this ``Epoch``.
53    #[getter]
54    pub fn epoch_start_timestamp(&self) -> UnixTimestamp {
55        self.0.epoch_start_timestamp
56    }
57
58    /// int: The current epoch.
59    #[getter]
60    pub fn epoch(&self) -> Epoch {
61        self.0.epoch
62    }
63
64    /// int: The future Epoch for which the leader schedule has most recently been calculated.
65    #[getter]
66    pub fn leader_schedule_epoch(&self) -> Epoch {
67        self.0.leader_schedule_epoch
68    }
69
70    /// int: The approximate real world time of the current slot.
71    #[getter]
72    pub fn unix_timestamp(&self) -> UnixTimestamp {
73        self.0.unix_timestamp
74    }
75}
76
77pub fn create_clock_mod(py: Python<'_>) -> PyResult<&PyModule> {
78    let m = PyModule::new(py, "clock")?;
79    m.add_class::<Clock>()?;
80    m.add("DEFAULT_DEV_SLOTS_PER_EPOCH", DEFAULT_DEV_SLOTS_PER_EPOCH)?;
81    m.add("DEFAULT_HASHES_PER_SECOND", DEFAULT_HASHES_PER_SECOND)?;
82    m.add("DEFAULT_HASHES_PER_TICK", DEFAULT_HASHES_PER_TICK)?;
83    m.add("DEFAULT_MS_PER_SLOT", DEFAULT_MS_PER_SLOT)?;
84    m.add("DEFAULT_SLOTS_PER_EPOCH", DEFAULT_SLOTS_PER_EPOCH)?;
85    m.add("DEFAULT_S_PER_SLOT", DEFAULT_S_PER_SLOT)?;
86    m.add("DEFAULT_TICKS_PER_SECOND", DEFAULT_TICKS_PER_SECOND)?;
87    m.add("DEFAULT_TICKS_PER_SLOT", DEFAULT_TICKS_PER_SLOT)?;
88    m.add(
89        "FORWARD_TRANSACTIONS_TO_LEADER_AT_SLOT_OFFSET",
90        FORWARD_TRANSACTIONS_TO_LEADER_AT_SLOT_OFFSET,
91    )?;
92    m.add("GENESIS_EPOCH", GENESIS_EPOCH)?;
93    m.add(
94        "HOLD_TRANSACTIONS_SLOT_OFFSET",
95        HOLD_TRANSACTIONS_SLOT_OFFSET,
96    )?;
97    m.add("INITIAL_RENT_EPOCH", INITIAL_RENT_EPOCH)?;
98    m.add("MAX_HASH_AGE_IN_SECONDS", MAX_HASH_AGE_IN_SECONDS)?;
99    m.add("MAX_PROCESSING_AGE", MAX_PROCESSING_AGE)?;
100    m.add("MAX_RECENT_BLOCKHASHES", MAX_RECENT_BLOCKHASHES)?;
101    m.add(
102        "MAX_TRANSACTION_FORWARDING_DELAY",
103        MAX_TRANSACTION_FORWARDING_DELAY,
104    )?;
105    m.add(
106        "MAX_TRANSACTION_FORWARDING_DELAY_GPU",
107        MAX_TRANSACTION_FORWARDING_DELAY_GPU,
108    )?;
109    m.add("MS_PER_TICK", MS_PER_TICK)?;
110    m.add("NUM_CONSECUTIVE_LEADER_SLOTS", NUM_CONSECUTIVE_LEADER_SLOTS)?;
111    m.add("SECONDS_PER_DAY", SECONDS_PER_DAY)?;
112    m.add("TICKS_PER_DAY", TICKS_PER_DAY)?;
113    Ok(m)
114}