node/transition_frontier/genesis/
transition_frontier_genesis_actions.rs

1use std::sync::Arc;
2
3use mina_p2p_messages::v2;
4use openmina_core::ActionEvent;
5use serde::{Deserialize, Serialize};
6
7use super::{GenesisConfigLoaded, TransitionFrontierGenesisState};
8
9pub type TransitionFrontierGenesisActionWithMeta =
10    redux::ActionWithMeta<TransitionFrontierGenesisAction>;
11pub type TransitionFrontierGenesisActionWithMetaRef<'a> =
12    redux::ActionWithMeta<&'a TransitionFrontierGenesisAction>;
13
14#[derive(derive_more::From, Serialize, Deserialize, Debug, Clone, ActionEvent)]
15#[action_event(level = trace)]
16pub enum TransitionFrontierGenesisAction {
17    LedgerLoadInit,
18    LedgerLoadPending,
19    LedgerLoadSuccess {
20        data: GenesisConfigLoaded,
21    },
22    Produce,
23    ProveInit,
24    /// Proving genesis block.
25    #[action_event(level = info)]
26    ProvePending,
27    /// Genesis block proved.
28    #[action_event(level = info)]
29    ProveSuccess {
30        proof: Arc<v2::MinaBaseProofStableV2>,
31    },
32    // TODO(refactor): add prove error
33}
34
35impl redux::EnablingCondition<crate::State> for TransitionFrontierGenesisAction {
36    fn is_enabled(&self, state: &crate::State, _time: redux::Timestamp) -> bool {
37        let genesis_state = &state.transition_frontier.genesis;
38        match self {
39            TransitionFrontierGenesisAction::LedgerLoadInit => {
40                matches!(genesis_state, TransitionFrontierGenesisState::Idle { .. })
41            }
42            TransitionFrontierGenesisAction::LedgerLoadPending => {
43                matches!(genesis_state, TransitionFrontierGenesisState::Idle { .. })
44            }
45            TransitionFrontierGenesisAction::LedgerLoadSuccess { .. } => {
46                matches!(
47                    genesis_state,
48                    TransitionFrontierGenesisState::LedgerLoadPending { .. }
49                )
50            }
51            TransitionFrontierGenesisAction::Produce => matches!(
52                genesis_state,
53                TransitionFrontierGenesisState::LedgerLoadSuccess { .. }
54            ),
55            TransitionFrontierGenesisAction::ProveInit => {
56                state.producing_block_after_genesis()
57                    && matches!(
58                        genesis_state,
59                        TransitionFrontierGenesisState::Produced { .. }
60                    )
61            }
62            TransitionFrontierGenesisAction::ProvePending => matches!(
63                genesis_state,
64                TransitionFrontierGenesisState::Produced { .. }
65            ),
66            TransitionFrontierGenesisAction::ProveSuccess { .. } => matches!(
67                genesis_state,
68                TransitionFrontierGenesisState::ProvePending { .. }
69            ),
70        }
71    }
72}
73
74impl From<TransitionFrontierGenesisAction> for crate::Action {
75    fn from(value: TransitionFrontierGenesisAction) -> Self {
76        crate::transition_frontier::TransitionFrontierAction::Genesis(value).into()
77    }
78}