use chia_sha2::Sha256;
use dig_protocol::Bytes32;
use serde::{Deserialize, Serialize};
use crate::pending::AppealOutcome;
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub enum AppealSustainReason {
HeadersIdentical,
ProposerIndexMismatch,
SignatureAInvalid,
SignatureBInvalid,
SlotMismatch,
ValidatorNotActiveAtEpoch,
AttestationsIdentical,
NotSlashableByPredicate,
EmptyIntersection,
AttesterSignatureAInvalid,
AttesterSignatureBInvalid,
InvalidIndexedAttestationStructure,
ValidatorNotInIntersection,
BlockActuallyValid,
ProposerSignatureInvalid,
FailureReasonMismatch,
EvidenceEpochMismatch,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub enum AppealRejectReason {
GroundDoesNotHold,
MalformedWitness,
MissingOracle,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub enum AppealVerdict {
Sustained {
reason: AppealSustainReason,
},
Rejected {
reason: AppealRejectReason,
},
}
impl AppealVerdict {
#[must_use]
pub fn to_appeal_outcome(&self) -> AppealOutcome {
match self {
AppealVerdict::Sustained { .. } => AppealOutcome::Won,
AppealVerdict::Rejected { reason } => {
let mut h = Sha256::new();
let encoded =
bincode::serialize(reason).expect("AppealRejectReason bincode must not fail");
h.update(&encoded);
let out: [u8; 32] = h.finalize();
AppealOutcome::Lost {
reason_hash: Bytes32::new(out),
}
}
}
}
}