use serde::{Deserialize, Serialize};
use sn_transfers::SpendAddress;
use thiserror::Error;
#[derive(Error, Debug, PartialEq, Eq, Clone, Serialize, Deserialize, Hash, PartialOrd, Ord)]
pub enum DagError {
#[error("DAG has no source at {0:?}")]
MissingSource(SpendAddress),
#[error("DAG is incoherent at {0:?}: {1}")]
IncoherentDag(SpendAddress, String),
#[error("DAG with root {0:?} contains a cycle")]
DagContainsCycle(SpendAddress),
}
#[derive(Error, Debug, PartialEq, Eq, Clone, Serialize, Deserialize, Hash, PartialOrd, Ord)]
pub enum SpendFault {
#[error("Double Spend at {0:?}")]
DoubleSpend(SpendAddress),
#[error("Spend at {addr:?} has a missing ancestor at {ancestor:?}, until this ancestor is added to the DAG, it cannot be verified")]
MissingAncestry {
addr: SpendAddress,
ancestor: SpendAddress,
},
#[error(
"Spend at {addr:?} has a double spent ancestor at {ancestor:?}, making it unspendable"
)]
DoubleSpentAncestor {
addr: SpendAddress,
ancestor: SpendAddress,
},
#[error("Invalid transaction for spend at {0:?}: {1}")]
InvalidTransaction(SpendAddress, String),
#[error("Poisoned ancestry for spend at {0:?}: {1}")]
PoisonedAncestry(SpendAddress, String),
#[error("Spend at {addr:?} does not descend from given source: {src:?}")]
OrphanSpend {
addr: SpendAddress,
src: SpendAddress,
},
}
impl DagError {
pub fn spend_address(&self) -> SpendAddress {
match self {
DagError::MissingSource(addr)
| DagError::IncoherentDag(addr, _)
| DagError::DagContainsCycle(addr) => *addr,
}
}
}
impl SpendFault {
pub fn spend_address(&self) -> SpendAddress {
match self {
SpendFault::DoubleSpend(addr)
| SpendFault::MissingAncestry { addr, .. }
| SpendFault::DoubleSpentAncestor { addr, .. }
| SpendFault::InvalidTransaction(addr, _)
| SpendFault::PoisonedAncestry(addr, _)
| SpendFault::OrphanSpend { addr, .. } => *addr,
}
}
}