miden_base_sys/bindings/
native_account.rs1use miden_stdlib_sys::{Felt, Word, WordAligned};
2
3use super::types::{AccountId, Asset, Nonce, RawAccountId};
4
5#[allow(improper_ctypes)]
6unsafe extern "C" {
7 #[cfg_attr(target_family = "wasm", linkage = "extern_weak")]
8 #[link_name = "miden::protocol::native_account::add_asset"]
9 fn extern_native_account_add_asset(
10 asset_key_0: Felt,
11 asset_key_1: Felt,
12 asset_key_2: Felt,
13 asset_key_3: Felt,
14 asset_value_0: Felt,
15 asset_value_1: Felt,
16 asset_value_2: Felt,
17 asset_value_3: Felt,
18 ptr: *mut Word,
19 );
20 #[cfg_attr(target_family = "wasm", linkage = "extern_weak")]
21 #[link_name = "miden::protocol::native_account::remove_asset"]
22 fn extern_native_account_remove_asset(
23 asset_key_0: Felt,
24 asset_key_1: Felt,
25 asset_key_2: Felt,
26 asset_key_3: Felt,
27 asset_value_0: Felt,
28 asset_value_1: Felt,
29 asset_value_2: Felt,
30 asset_value_3: Felt,
31 ptr: *mut Word,
32 );
33 #[cfg_attr(target_family = "wasm", linkage = "extern_weak")]
34 #[link_name = "miden::protocol::native_account::get_id"]
35 fn extern_native_account_get_id(ptr: *mut RawAccountId);
36 #[cfg_attr(target_family = "wasm", linkage = "extern_weak")]
37 #[link_name = "miden::protocol::native_account::incr_nonce"]
38 fn extern_native_account_incr_nonce() -> Felt;
39 #[cfg_attr(target_family = "wasm", linkage = "extern_weak")]
40 #[link_name = "miden::protocol::native_account::compute_delta_commitment"]
41 fn extern_native_account_compute_delta_commitment(ptr: *mut Word);
42 #[cfg_attr(target_family = "wasm", linkage = "extern_weak")]
43 #[link_name = "miden::protocol::native_account::was_procedure_called"]
44 fn extern_native_account_was_procedure_called(
45 proc_root_0: Felt,
46 proc_root_1: Felt,
47 proc_root_2: Felt,
48 proc_root_3: Felt,
49 ) -> Felt;
50 #[cfg_attr(target_family = "wasm", linkage = "extern_weak")]
51 #[link_name = "miden::protocol::native_account::get_initial_commitment"]
52 fn extern_native_account_get_initial_commitment(ptr: *mut Word);
53 #[cfg_attr(target_family = "wasm", linkage = "extern_weak")]
54 #[link_name = "miden::protocol::native_account::get_initial_storage_commitment"]
55 fn extern_native_account_get_initial_storage_commitment(ptr: *mut Word);
56 #[cfg_attr(target_family = "wasm", linkage = "extern_weak")]
57 #[link_name = "miden::protocol::native_account::get_initial_vault_root"]
58 fn extern_native_account_get_initial_vault_root(ptr: *mut Word);
59 #[cfg_attr(target_family = "wasm", linkage = "extern_weak")]
60 #[link_name = "miden::protocol::native_account::get_initial_asset"]
61 fn extern_native_account_get_initial_asset(
62 asset_key_0: Felt,
63 asset_key_1: Felt,
64 asset_key_2: Felt,
65 asset_key_3: Felt,
66 ptr: *mut Word,
67 );
68}
69
70pub fn add_asset(asset: Asset) -> Word {
102 unsafe {
103 let mut ret_area = WordAligned::new(::core::mem::MaybeUninit::<Word>::uninit());
104 extern_native_account_add_asset(
105 asset.key[0],
106 asset.key[1],
107 asset.key[2],
108 asset.key[3],
109 asset.value[0],
110 asset.value[1],
111 asset.value[2],
112 asset.value[3],
113 ret_area.as_mut_ptr(),
114 );
115 ret_area.into_inner().assume_init()
116 }
117}
118
119pub fn remove_asset(asset: Asset) -> Word {
126 unsafe {
127 let mut ret_area = WordAligned::new(::core::mem::MaybeUninit::<Word>::uninit());
128 extern_native_account_remove_asset(
129 asset.key[0],
130 asset.key[1],
131 asset.key[2],
132 asset.key[3],
133 asset.value[0],
134 asset.value[1],
135 asset.value[2],
136 asset.value[3],
137 ret_area.as_mut_ptr(),
138 );
139 ret_area.into_inner().assume_init()
140 }
141}
142
143pub fn get_id() -> AccountId {
145 unsafe {
146 let mut ret_area = WordAligned::new(::core::mem::MaybeUninit::<RawAccountId>::uninit());
147 extern_native_account_get_id(ret_area.as_mut_ptr());
148 ret_area.into_inner().assume_init().into_account_id()
149 }
150}
151
152#[inline]
154pub fn incr_nonce() -> Nonce {
155 Nonce {
156 inner: unsafe { extern_native_account_incr_nonce() },
157 }
158}
159
160#[inline]
162pub fn compute_delta_commitment() -> Word {
163 unsafe {
164 let mut ret_area = WordAligned::new(::core::mem::MaybeUninit::<Word>::uninit());
165 extern_native_account_compute_delta_commitment(ret_area.as_mut_ptr());
166 ret_area.into_inner().assume_init()
167 }
168}
169
170#[inline]
172pub fn was_procedure_called(proc_root: Word) -> bool {
173 unsafe {
174 extern_native_account_was_procedure_called(
175 proc_root[0],
176 proc_root[1],
177 proc_root[2],
178 proc_root[3],
179 ) != Felt::new(0).unwrap()
180 }
181}
182
183#[inline]
185pub fn get_initial_commitment() -> Word {
186 unsafe {
187 let mut ret_area = WordAligned::new(::core::mem::MaybeUninit::<Word>::uninit());
188 extern_native_account_get_initial_commitment(ret_area.as_mut_ptr());
189 ret_area.into_inner().assume_init()
190 }
191}
192
193#[inline]
195pub fn get_initial_storage_commitment() -> Word {
196 unsafe {
197 let mut ret_area = WordAligned::new(::core::mem::MaybeUninit::<Word>::uninit());
198 extern_native_account_get_initial_storage_commitment(ret_area.as_mut_ptr());
199 ret_area.into_inner().assume_init()
200 }
201}
202
203#[inline]
205pub fn get_initial_vault_root() -> Word {
206 unsafe {
207 let mut ret_area = WordAligned::new(::core::mem::MaybeUninit::<Word>::uninit());
208 extern_native_account_get_initial_vault_root(ret_area.as_mut_ptr());
209 ret_area.into_inner().assume_init()
210 }
211}
212
213pub fn get_initial_asset(asset_key: Word) -> Word {
215 unsafe {
216 let mut ret_area = WordAligned::new(::core::mem::MaybeUninit::<Word>::uninit());
217 extern_native_account_get_initial_asset(
218 asset_key[0],
219 asset_key[1],
220 asset_key[2],
221 asset_key[3],
222 ret_area.as_mut_ptr(),
223 );
224 ret_area.into_inner().assume_init()
225 }
226}
227
228pub trait NativeAccount {
233 #[inline]
266 fn add_asset(&mut self, asset: Asset) -> Word {
267 add_asset(asset)
268 }
269
270 #[inline]
278 fn remove_asset(&mut self, asset: Asset) -> Word {
279 remove_asset(asset)
280 }
281
282 #[inline]
284 fn incr_nonce(&mut self) -> Nonce {
285 incr_nonce()
286 }
287
288 #[inline]
290 fn compute_delta_commitment(&self) -> Word {
291 compute_delta_commitment()
292 }
293
294 #[inline]
296 fn was_procedure_called(&self, proc_root: Word) -> bool {
297 was_procedure_called(proc_root)
298 }
299}