snark/work_verify/
snark_work_verify_actions.rs1use 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}