use codec::{Decode, Encode};
pub type Timestamp = u64;
#[derive(Debug, Clone, Copy, Encode, Decode, PartialEq)]
pub enum DisputeStatus {
#[codec(index = 0)]
Active,
#[codec(index = 1)]
ConcludedFor(Timestamp),
#[codec(index = 2)]
ConcludedAgainst(Timestamp),
#[codec(index = 3)]
Confirmed,
}
impl DisputeStatus {
pub fn active() -> DisputeStatus {
DisputeStatus::Active
}
pub fn confirm(self) -> DisputeStatus {
match self {
DisputeStatus::Active => DisputeStatus::Confirmed,
DisputeStatus::Confirmed => DisputeStatus::Confirmed,
DisputeStatus::ConcludedFor(_) | DisputeStatus::ConcludedAgainst(_) => self,
}
}
pub fn is_confirmed_concluded(&self) -> bool {
match self {
&DisputeStatus::Confirmed |
&DisputeStatus::ConcludedFor(_) |
DisputeStatus::ConcludedAgainst(_) => true,
&DisputeStatus::Active => false,
}
}
pub fn has_concluded_for(&self) -> bool {
match self {
&DisputeStatus::ConcludedFor(_) => true,
_ => false,
}
}
pub fn has_concluded_against(&self) -> bool {
match self {
&DisputeStatus::ConcludedAgainst(_) => true,
_ => false,
}
}
pub fn conclude_for(self, now: Timestamp) -> DisputeStatus {
match self {
DisputeStatus::Active | DisputeStatus::Confirmed => DisputeStatus::ConcludedFor(now),
DisputeStatus::ConcludedFor(at) => DisputeStatus::ConcludedFor(std::cmp::min(at, now)),
against => against,
}
}
pub fn conclude_against(self, now: Timestamp) -> DisputeStatus {
match self {
DisputeStatus::Active | DisputeStatus::Confirmed => {
DisputeStatus::ConcludedAgainst(now)
},
DisputeStatus::ConcludedFor(at) => {
DisputeStatus::ConcludedAgainst(std::cmp::min(at, now))
},
DisputeStatus::ConcludedAgainst(at) => {
DisputeStatus::ConcludedAgainst(std::cmp::min(at, now))
},
}
}
pub fn is_possibly_invalid(&self) -> bool {
match self {
DisputeStatus::Active |
DisputeStatus::Confirmed |
DisputeStatus::ConcludedAgainst(_) => true,
DisputeStatus::ConcludedFor(_) => false,
}
}
pub fn concluded_at(&self) -> Option<Timestamp> {
match self {
DisputeStatus::Active | DisputeStatus::Confirmed => None,
DisputeStatus::ConcludedFor(at) | DisputeStatus::ConcludedAgainst(at) => Some(*at),
}
}
}
pub const ACTIVE_DURATION_SECS: Timestamp = 180;
pub fn dispute_is_inactive(status: &DisputeStatus, now: &Timestamp) -> bool {
let at = status.concluded_at();
at.is_some() && at.unwrap() + ACTIVE_DURATION_SECS < *now
}