use crate::output_manager_service::error::OutputManagerStorageError;
use std::cmp::Ordering;
use tari_core::{
tari_utilities::hash::Hashable,
transactions::{
transaction::UnblindedOutput,
types::{Commitment, CryptoFactories, HashOutput},
},
};
use tari_crypto::commitment::HomomorphicCommitmentFactory;
#[derive(Debug, Clone)]
pub struct DbUnblindedOutput {
pub commitment: Commitment,
pub unblinded_output: UnblindedOutput,
pub hash: HashOutput,
}
impl DbUnblindedOutput {
pub fn from_unblinded_output(
output: UnblindedOutput,
factory: &CryptoFactories,
) -> Result<DbUnblindedOutput, OutputManagerStorageError>
{
let hash = output.as_transaction_output(factory)?.hash();
Ok(DbUnblindedOutput {
commitment: factory.commitment.commit(&output.spending_key, &output.value.into()),
unblinded_output: output,
hash,
})
}
}
impl From<DbUnblindedOutput> for UnblindedOutput {
fn from(value: DbUnblindedOutput) -> UnblindedOutput {
value.unblinded_output
}
}
impl PartialEq for DbUnblindedOutput {
fn eq(&self, other: &DbUnblindedOutput) -> bool {
self.unblinded_output.value == other.unblinded_output.value
}
}
impl PartialOrd<DbUnblindedOutput> for DbUnblindedOutput {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
self.unblinded_output.value.partial_cmp(&other.unblinded_output.value)
}
}
impl Ord for DbUnblindedOutput {
fn cmp(&self, other: &Self) -> Ordering {
self.unblinded_output.value.cmp(&other.unblinded_output.value)
}
}
impl Eq for DbUnblindedOutput {}