node/daemon_json/
json_genesis.rs

1use serde::{Deserialize, Serialize};
2use time::{format_description::well_known::Rfc3339, OffsetDateTime};
3
4use mina_p2p_messages::v2::{
5    BlockTimeTimeStableV1, MinaBaseProtocolConstantsCheckedValueStableV1,
6    UnsignedExtendedUInt32StableV1,
7};
8use openmina_core::constants::PROTOCOL_CONSTANTS;
9
10#[serde_with::serde_as]
11#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct Genesis {
13    k: Option<u32>,
14    slots_per_epoch: Option<u32>,
15    slots_per_sub_window: Option<u32>,
16    grace_period_slots: Option<u32>,
17    delta: Option<u32>,
18    #[serde_as(as = "Option<Rfc3339>")]
19    genesis_state_timestamp: Option<OffsetDateTime>,
20}
21
22macro_rules! value_or_protocol_default {
23    ($name:ident, $ty:ty) => {
24        pub fn $name(&self) -> $ty {
25            self.$name.map_or(PROTOCOL_CONSTANTS.$name, Into::into)
26        }
27    };
28}
29
30impl Genesis {
31    value_or_protocol_default!(k, UnsignedExtendedUInt32StableV1);
32    value_or_protocol_default!(slots_per_epoch, UnsignedExtendedUInt32StableV1);
33    value_or_protocol_default!(slots_per_sub_window, UnsignedExtendedUInt32StableV1);
34    value_or_protocol_default!(grace_period_slots, UnsignedExtendedUInt32StableV1);
35    value_or_protocol_default!(delta, UnsignedExtendedUInt32StableV1);
36    value_or_protocol_default!(genesis_state_timestamp, BlockTimeTimeStableV1);
37
38    pub fn protocol_constants(&self) -> MinaBaseProtocolConstantsCheckedValueStableV1 {
39        MinaBaseProtocolConstantsCheckedValueStableV1 {
40            k: self.k(),
41            slots_per_epoch: self.slots_per_epoch(),
42            slots_per_sub_window: self.slots_per_sub_window(),
43            grace_period_slots: self.grace_period_slots(),
44            delta: self.delta(),
45            genesis_state_timestamp: self.genesis_state_timestamp(),
46        }
47    }
48}