miden_objects/note/
recipient.rs1use alloc::vec::Vec;
2use core::fmt::Debug;
3
4use miden_crypto::Felt;
5
6use super::{
7 ByteReader,
8 ByteWriter,
9 Deserializable,
10 DeserializationError,
11 Hasher,
12 NoteInputs,
13 NoteScript,
14 Serializable,
15 Word,
16};
17
18#[derive(Clone, Debug, PartialEq, Eq)]
29pub struct NoteRecipient {
30 serial_num: Word,
31 script: NoteScript,
32 inputs: NoteInputs,
33 digest: Word,
34}
35
36impl NoteRecipient {
37 pub fn new(serial_num: Word, script: NoteScript, inputs: NoteInputs) -> Self {
38 let digest = compute_recipient_digest(serial_num, &script, &inputs);
39 Self { serial_num, script, inputs, digest }
40 }
41
42 pub fn serial_num(&self) -> Word {
47 self.serial_num
48 }
49
50 pub fn script(&self) -> &NoteScript {
52 &self.script
53 }
54
55 pub fn inputs(&self) -> &NoteInputs {
57 &self.inputs
58 }
59
60 pub fn digest(&self) -> Word {
64 self.digest
65 }
66
67 pub fn format_for_advice(&self) -> Vec<Felt> {
77 let mut result = Vec::with_capacity(13);
78 result.push(self.inputs.num_values().into());
79 result.extend(self.inputs.commitment());
80 result.extend(self.script.root());
81 result.extend(self.serial_num);
82 result
83 }
84}
85
86fn compute_recipient_digest(serial_num: Word, script: &NoteScript, inputs: &NoteInputs) -> Word {
87 let serial_num_hash = Hasher::merge(&[serial_num, Word::empty()]);
88 let merge_script = Hasher::merge(&[serial_num_hash, script.root()]);
89 Hasher::merge(&[merge_script, inputs.commitment()])
90}
91
92impl Serializable for NoteRecipient {
96 fn write_into<W: ByteWriter>(&self, target: &mut W) {
97 let Self {
98 script,
99 inputs,
100 serial_num,
101
102 digest: _,
105 } = self;
106
107 script.write_into(target);
108 inputs.write_into(target);
109 serial_num.write_into(target);
110 }
111}
112
113impl Deserializable for NoteRecipient {
114 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
115 let script = NoteScript::read_from(source)?;
116 let inputs = NoteInputs::read_from(source)?;
117 let serial_num = Word::read_from(source)?;
118
119 Ok(Self::new(serial_num, script, inputs))
120 }
121}