snark/block_verify/
snark_block_verify_actions.rs

1use openmina_core::{block::BlockHash, ActionEvent, SubstateAccess};
2use serde::{Deserialize, Serialize};
3
4use super::{SnarkBlockVerifyError, SnarkBlockVerifyId, VerifiableBlockWithHash};
5
6pub type SnarkBlockVerifyActionWithMeta = redux::ActionWithMeta<SnarkBlockVerifyAction>;
7pub type SnarkBlockVerifyActionWithMetaRef<'a> = redux::ActionWithMeta<&'a SnarkBlockVerifyAction>;
8
9#[derive(Serialize, Deserialize, Debug, Clone, ActionEvent)]
10pub enum SnarkBlockVerifyAction {
11    Init {
12        block: VerifiableBlockWithHash,
13
14        on_init: redux::Callback<(BlockHash, SnarkBlockVerifyId)>,
15        on_success: redux::Callback<BlockHash>,
16        on_error: redux::Callback<(BlockHash, SnarkBlockVerifyError)>,
17    },
18    Pending {
19        req_id: SnarkBlockVerifyId,
20    },
21    Error {
22        req_id: SnarkBlockVerifyId,
23        error: SnarkBlockVerifyError,
24    },
25    Success {
26        req_id: SnarkBlockVerifyId,
27    },
28    Finish {
29        req_id: SnarkBlockVerifyId,
30    },
31}
32
33impl redux::EnablingCondition<crate::SnarkState> for SnarkBlockVerifyAction {
34    fn is_enabled(&self, state: &crate::SnarkState, _time: redux::Timestamp) -> bool {
35        match self {
36            SnarkBlockVerifyAction::Init { .. } => true,
37            SnarkBlockVerifyAction::Pending { req_id } => state
38                .block_verify
39                .jobs
40                .get(*req_id)
41                .is_some_and(|v| v.is_init()),
42            SnarkBlockVerifyAction::Error { req_id, .. } => state
43                .block_verify
44                .jobs
45                .get(*req_id)
46                .is_some_and(|v| v.is_pending()),
47            SnarkBlockVerifyAction::Success { req_id } => state
48                .block_verify
49                .jobs
50                .get(*req_id)
51                .is_some_and(|v| v.is_pending()),
52            SnarkBlockVerifyAction::Finish { req_id } => state
53                .block_verify
54                .jobs
55                .get(*req_id)
56                .is_some_and(|v| v.is_finished()),
57        }
58    }
59}
60
61impl<T> redux::EnablingCondition<T> for SnarkBlockVerifyAction
62where
63    T: SubstateAccess<crate::SnarkState>,
64{
65    fn is_enabled(&self, state: &T, time: redux::Timestamp) -> bool {
66        state
67            .substate()
68            .is_ok_and(|state| self.is_enabled(state, time))
69    }
70}