snark/work_verify/
snark_work_verify_actions.rs

1use openmina_core::{snark::SnarkJobId, SubstateAccess};
2use serde::{Deserialize, Serialize};
3
4use openmina_core::{snark::Snark, ActionEvent};
5
6use super::{SnarkWorkVerifyError, SnarkWorkVerifyId};
7
8pub type SnarkWorkVerifyActionWithMeta = redux::ActionWithMeta<SnarkWorkVerifyAction>;
9pub type SnarkWorkVerifyActionWithMetaRef<'a> = redux::ActionWithMeta<&'a SnarkWorkVerifyAction>;
10
11#[derive(Serialize, Deserialize, Debug, Clone, ActionEvent)]
12#[action_event(level = trace, fields(display(req_id), display(error)))]
13pub enum SnarkWorkVerifyAction {
14    #[action_event(level = info)]
15    Init {
16        req_id: SnarkWorkVerifyId,
17        batch: Vec<Snark>,
18        sender: String,
19        on_success: redux::Callback<(SnarkWorkVerifyId, String, Vec<Snark>)>,
20        on_error: redux::Callback<(SnarkWorkVerifyId, String, Vec<SnarkJobId>)>,
21    },
22    Pending {
23        req_id: SnarkWorkVerifyId,
24    },
25    Error {
26        req_id: SnarkWorkVerifyId,
27        error: SnarkWorkVerifyError,
28    },
29    #[action_event(level = info)]
30    Success {
31        req_id: SnarkWorkVerifyId,
32    },
33    Finish {
34        req_id: SnarkWorkVerifyId,
35    },
36}
37
38impl redux::EnablingCondition<crate::SnarkState> for SnarkWorkVerifyAction {
39    fn is_enabled(&self, state: &crate::SnarkState, _time: redux::Timestamp) -> bool {
40        match self {
41            SnarkWorkVerifyAction::Init { req_id, batch, .. } => {
42                !batch.is_empty() && state.work_verify.jobs.next_req_id() == *req_id
43            }
44            SnarkWorkVerifyAction::Pending { req_id } => state
45                .work_verify
46                .jobs
47                .get(*req_id)
48                .is_some_and(|v| v.is_init()),
49            SnarkWorkVerifyAction::Error { req_id, .. }
50            | SnarkWorkVerifyAction::Success { req_id } => state
51                .work_verify
52                .jobs
53                .get(*req_id)
54                .is_some_and(|v| v.is_pending()),
55            SnarkWorkVerifyAction::Finish { req_id } => state
56                .work_verify
57                .jobs
58                .get(*req_id)
59                .is_some_and(|v| v.is_finished()),
60        }
61    }
62}
63
64impl<T> redux::EnablingCondition<T> for SnarkWorkVerifyAction
65where
66    T: SubstateAccess<crate::SnarkState>,
67{
68    fn is_enabled(&self, state: &T, time: redux::Timestamp) -> bool {
69        state
70            .substate()
71            .is_ok_and(|state| self.is_enabled(state, time))
72    }
73}