use serde::{Deserialize, Serialize};
use sof_types::SignatureBytes;
#[derive(Debug, Clone, Copy, Eq, PartialEq, Serialize, Deserialize)]
pub enum TxKind {
VoteOnly,
Mixed,
NonVote,
}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
pub enum ForkSlotStatus {
Processed,
Confirmed,
Finalized,
Orphaned,
}
#[derive(
Debug, Clone, Copy, Default, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize,
)]
pub enum TxCommitmentStatus {
#[default]
Processed,
Confirmed,
Finalized,
}
impl TxCommitmentStatus {
#[must_use]
pub fn from_slot(
tx_slot: u64,
confirmed_slot: Option<u64>,
finalized_slot: Option<u64>,
) -> Self {
if finalized_slot.is_some_and(|slot| tx_slot <= slot) {
return Self::Finalized;
}
if confirmed_slot.is_some_and(|slot| tx_slot <= slot) {
return Self::Confirmed;
}
Self::Processed
}
#[must_use]
pub fn satisfies_minimum(self, minimum: Self) -> bool {
self >= minimum
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum TxObservedEvent {
Detailed {
slot: u64,
signature: SignatureBytes,
kind: TxKind,
commitment_status: TxCommitmentStatus,
},
Summary {
slot: u64,
vote_only: u64,
mixed: u64,
non_vote: u64,
},
}
#[cfg(test)]
mod tests {
use super::TxCommitmentStatus;
#[test]
fn commitment_from_slot_prefers_finalized_when_both_match() {
let status = TxCommitmentStatus::from_slot(100, Some(120), Some(150));
assert_eq!(status, TxCommitmentStatus::Finalized);
}
#[test]
fn commitment_from_slot_falls_back_to_processed() {
let status = TxCommitmentStatus::from_slot(120, Some(119), Some(110));
assert_eq!(status, TxCommitmentStatus::Processed);
}
}