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
121impl From<[Felt; 4]> for Recipient {
122 fn from(value: [Felt; 4]) -> Self {
123 Recipient {
124 inner: Word::from(value),
125 }
126 }
127}
128
129impl From<Word> for Recipient {
130 fn from(value: Word) -> Self {
131 Recipient { inner: value }
132 }
133}
134
135#[derive(Clone, Copy, Debug, PartialEq, Eq)]
136#[repr(transparent)]
137pub struct Tag {
138 pub inner: Felt,
139}
140
141impl From<Felt> for Tag {
142 fn from(value: Felt) -> Self {
143 Tag { inner: value }
144 }
145}
146
147#[derive(Clone, Copy, Debug, PartialEq, Eq)]
148#[repr(transparent)]
149pub struct NoteIdx {
150 pub inner: Felt,
151}
152
153#[derive(Clone, Copy, Debug, PartialEq, Eq)]
154#[repr(transparent)]
155pub struct NoteType {
156 pub inner: Felt,
157}
158
159impl From<Felt> for NoteType {
160 fn from(value: Felt) -> Self {
161 NoteType { inner: value }
162 }
163}
164
165#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
172pub struct StorageSlotId {
173 suffix: Felt,
174 prefix: Felt,
175}
176
177impl StorageSlotId {
178 pub fn new(suffix: Felt, prefix: Felt) -> Self {
183 Self { suffix, prefix }
184 }
185
186 pub fn from_prefix_suffix(prefix: Felt, suffix: Felt) -> Self {
190 Self { suffix, prefix }
191 }
192
193 pub fn to_prefix_suffix(&self) -> (Felt, Felt) {
195 (self.prefix, self.suffix)
196 }
197
198 pub fn suffix(&self) -> Felt {
200 self.suffix
201 }
202
203 pub fn prefix(&self) -> Felt {
205 self.prefix
206 }
207}