miden_base_sys/bindings/
types.rs1extern crate alloc;
2
3use alloc::vec::Vec;
4
5use miden_field_repr::FromFeltRepr;
6use miden_stdlib_sys::{Digest, Felt, Word, hash_elements, intrinsics::crypto::merge};
7
8#[derive(Copy, Clone, Debug, PartialEq, Eq, FromFeltRepr)]
10pub struct AccountId {
11 pub prefix: Felt,
12 pub suffix: Felt,
13}
14
15impl AccountId {
16 pub fn new(prefix: Felt, suffix: Felt) -> Self {
18 Self { prefix, suffix }
19 }
20}
21
22#[derive(Copy, Clone, Debug, PartialEq, Eq)]
51#[repr(transparent)]
52pub struct Asset {
53 pub inner: Word,
54}
55
56impl Asset {
57 pub fn new(word: impl Into<Word>) -> Self {
58 Asset { inner: word.into() }
59 }
60
61 pub fn as_word(&self) -> &Word {
62 &self.inner
63 }
64
65 #[inline]
66 pub(crate) fn reverse(&self) -> Self {
67 Self {
68 inner: self.inner.reverse(),
69 }
70 }
71}
72
73impl From<Word> for Asset {
74 fn from(value: Word) -> Self {
75 Self::new(value)
76 }
77}
78
79impl From<[Felt; 4]> for Asset {
80 fn from(value: [Felt; 4]) -> Self {
81 Asset::new(Word::from(value))
82 }
83}
84
85impl From<Asset> for Word {
86 fn from(val: Asset) -> Self {
87 val.inner
88 }
89}
90
91impl AsRef<Word> for Asset {
92 fn as_ref(&self) -> &Word {
93 &self.inner
94 }
95}
96
97#[derive(Clone, Debug, PartialEq, Eq)]
98#[repr(transparent)]
99pub struct Recipient {
100 pub inner: Word,
101}
102
103impl Recipient {
104 pub fn compute(serial_num: Word, script_digest: Digest, inputs: Vec<Felt>) -> Self {
111 let empty_word = Word::from_u64_unchecked(0, 0, 0, 0);
112
113 let serial_num_hash = merge([Digest::from_word(serial_num), Digest::from_word(empty_word)]);
114 let merge_script = merge([serial_num_hash, script_digest]);
115 let digest: Word = merge([merge_script, hash_elements(inputs)]).into();
116
117 Self { inner: digest }
118 }
119}
120
121#[derive(Copy, Clone, Debug, PartialEq, Eq)]
126#[repr(C)]
127pub struct NoteMetadata {
128 pub attachment: Word,
130 pub header: Word,
132}
133
134impl NoteMetadata {
135 pub fn new(attachment: Word, header: Word) -> Self {
137 Self { attachment, header }
138 }
139
140 #[inline]
141 pub(crate) fn reverse(self) -> Self {
142 Self {
143 attachment: self.attachment.reverse(),
144 header: self.header.reverse(),
145 }
146 }
147}
148
149impl From<[Felt; 4]> for Recipient {
150 fn from(value: [Felt; 4]) -> Self {
151 Recipient {
152 inner: Word::from(value),
153 }
154 }
155}
156
157impl From<Word> for Recipient {
158 fn from(value: Word) -> Self {
159 Recipient { inner: value }
160 }
161}
162
163#[derive(Clone, Copy, Debug, PartialEq, Eq)]
164#[repr(transparent)]
165pub struct Tag {
166 pub inner: Felt,
167}
168
169impl From<Felt> for Tag {
170 fn from(value: Felt) -> Self {
171 Tag { inner: value }
172 }
173}
174
175#[derive(Clone, Copy, Debug, PartialEq, Eq)]
176#[repr(transparent)]
177pub struct NoteIdx {
178 pub inner: Felt,
179}
180
181#[derive(Clone, Copy, Debug, PartialEq, Eq)]
182#[repr(transparent)]
183pub struct NoteType {
184 pub inner: Felt,
185}
186
187impl From<Felt> for NoteType {
188 fn from(value: Felt) -> Self {
189 NoteType { inner: value }
190 }
191}
192
193#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
200pub struct StorageSlotId {
201 suffix: Felt,
202 prefix: Felt,
203}
204
205impl StorageSlotId {
206 pub fn new(suffix: Felt, prefix: Felt) -> Self {
211 Self { suffix, prefix }
212 }
213
214 pub fn from_prefix_suffix(prefix: Felt, suffix: Felt) -> Self {
218 Self { suffix, prefix }
219 }
220
221 pub fn to_prefix_suffix(&self) -> (Felt, Felt) {
223 (self.prefix, self.suffix)
224 }
225
226 pub fn suffix(&self) -> Felt {
228 self.suffix
229 }
230
231 pub fn prefix(&self) -> Felt {
233 self.prefix
234 }
235}