miden_protocol/note/
recipient.rs1use core::fmt::Debug;
2
3use super::{
4 ByteReader,
5 ByteWriter,
6 Deserializable,
7 DeserializationError,
8 Hasher,
9 NoteScript,
10 NoteStorage,
11 Serializable,
12 Word,
13};
14
15#[derive(Clone, Debug, PartialEq, Eq)]
26pub struct NoteRecipient {
27 serial_num: Word,
28 script: NoteScript,
29 storage: NoteStorage,
30 digest: Word,
31}
32
33impl NoteRecipient {
34 pub fn new(serial_num: Word, script: NoteScript, storage: NoteStorage) -> Self {
35 let digest = compute_recipient_digest(serial_num, &script, &storage);
36 Self { serial_num, script, storage, digest }
37 }
38
39 pub fn serial_num(&self) -> Word {
44 self.serial_num
45 }
46
47 pub fn script(&self) -> &NoteScript {
49 &self.script
50 }
51
52 pub fn storage(&self) -> &NoteStorage {
54 &self.storage
55 }
56
57 pub fn digest(&self) -> Word {
61 self.digest
62 }
63
64 pub fn minify_script(&mut self) {
69 self.script.clear_debug_info();
70 }
71
72 pub fn into_parts(self) -> (Word, NoteScript, NoteStorage) {
74 (self.serial_num, self.script, self.storage)
75 }
76}
77
78fn compute_recipient_digest(serial_num: Word, script: &NoteScript, storage: &NoteStorage) -> Word {
79 let serial_num_hash = Hasher::merge(&[serial_num, Word::empty()]);
80 let merge_script = Hasher::merge(&[serial_num_hash, script.root()]);
81 Hasher::merge(&[merge_script, storage.commitment()])
82}
83
84impl Serializable for NoteRecipient {
88 fn write_into<W: ByteWriter>(&self, target: &mut W) {
89 let Self {
90 script,
91 storage,
92 serial_num,
93
94 digest: _,
97 } = self;
98
99 script.write_into(target);
100 storage.write_into(target);
101 serial_num.write_into(target);
102 }
103
104 fn get_size_hint(&self) -> usize {
105 self.script.get_size_hint() + self.storage.get_size_hint() + Word::SERIALIZED_SIZE
106 }
107}
108
109impl Deserializable for NoteRecipient {
110 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
111 let script = NoteScript::read_from(source)?;
112 let storage = NoteStorage::read_from(source)?;
113 let serial_num = Word::read_from(source)?;
114
115 Ok(Self::new(serial_num, script, storage))
116 }
117}