use core::fmt::Debug;
use super::{
ByteReader,
ByteWriter,
Deserializable,
DeserializationError,
Hasher,
NoteInputs,
NoteScript,
Serializable,
Word,
};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct NoteRecipient {
serial_num: Word,
script: NoteScript,
inputs: NoteInputs,
digest: Word,
}
impl NoteRecipient {
pub fn new(serial_num: Word, script: NoteScript, inputs: NoteInputs) -> Self {
let digest = compute_recipient_digest(serial_num, &script, &inputs);
Self { serial_num, script, inputs, digest }
}
pub fn serial_num(&self) -> Word {
self.serial_num
}
pub fn script(&self) -> &NoteScript {
&self.script
}
pub fn inputs(&self) -> &NoteInputs {
&self.inputs
}
pub fn digest(&self) -> Word {
self.digest
}
}
fn compute_recipient_digest(serial_num: Word, script: &NoteScript, inputs: &NoteInputs) -> Word {
let serial_num_hash = Hasher::merge(&[serial_num, Word::empty()]);
let merge_script = Hasher::merge(&[serial_num_hash, script.root()]);
Hasher::merge(&[merge_script, inputs.commitment()])
}
impl Serializable for NoteRecipient {
fn write_into<W: ByteWriter>(&self, target: &mut W) {
let Self {
script,
inputs,
serial_num,
digest: _,
} = self;
script.write_into(target);
inputs.write_into(target);
serial_num.write_into(target);
}
}
impl Deserializable for NoteRecipient {
fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
let script = NoteScript::read_from(source)?;
let inputs = NoteInputs::read_from(source)?;
let serial_num = Word::read_from(source)?;
Ok(Self::new(serial_num, script, inputs))
}
}