use miden_stdlib_sys::{Felt, Word};
use super::types::Asset;
#[allow(improper_ctypes)]
unsafe extern "C" {
#[link_name = "miden::protocol::native_account::add_asset"]
fn extern_native_account_add_asset(
asset_key_0: Felt,
asset_key_1: Felt,
asset_key_2: Felt,
asset_key_3: Felt,
asset_value_0: Felt,
asset_value_1: Felt,
asset_value_2: Felt,
asset_value_3: Felt,
ptr: *mut Word,
);
#[link_name = "miden::protocol::native_account::remove_asset"]
fn extern_native_account_remove_asset(
asset_key_0: Felt,
asset_key_1: Felt,
asset_key_2: Felt,
asset_key_3: Felt,
asset_value_0: Felt,
asset_value_1: Felt,
asset_value_2: Felt,
asset_value_3: Felt,
ptr: *mut Word,
);
#[link_name = "miden::protocol::native_account::incr_nonce"]
fn extern_native_account_incr_nonce() -> Felt;
#[link_name = "miden::protocol::native_account::compute_delta_commitment"]
fn extern_native_account_compute_delta_commitment(ptr: *mut Word);
#[link_name = "miden::protocol::native_account::was_procedure_called"]
fn extern_native_account_was_procedure_called(
proc_root_0: Felt,
proc_root_1: Felt,
proc_root_2: Felt,
proc_root_3: Felt,
) -> Felt;
}
pub fn add_asset(asset: Asset) -> Word {
unsafe {
let mut ret_area = ::core::mem::MaybeUninit::<Word>::uninit();
extern_native_account_add_asset(
asset.key[0],
asset.key[1],
asset.key[2],
asset.key[3],
asset.value[0],
asset.value[1],
asset.value[2],
asset.value[3],
ret_area.as_mut_ptr(),
);
ret_area.assume_init()
}
}
pub fn remove_asset(asset: Asset) -> Word {
unsafe {
let mut ret_area = ::core::mem::MaybeUninit::<Word>::uninit();
extern_native_account_remove_asset(
asset.key[0],
asset.key[1],
asset.key[2],
asset.key[3],
asset.value[0],
asset.value[1],
asset.value[2],
asset.value[3],
ret_area.as_mut_ptr(),
);
ret_area.assume_init()
}
}
#[inline]
pub fn incr_nonce() -> Felt {
unsafe { extern_native_account_incr_nonce() }
}
#[inline]
pub fn compute_delta_commitment() -> Word {
unsafe {
let mut ret_area = ::core::mem::MaybeUninit::<Word>::uninit();
extern_native_account_compute_delta_commitment(ret_area.as_mut_ptr());
ret_area.assume_init()
}
}
#[inline]
pub fn was_procedure_called(proc_root: Word) -> bool {
unsafe {
extern_native_account_was_procedure_called(
proc_root[0],
proc_root[1],
proc_root[2],
proc_root[3],
) != Felt::new(0)
}
}
pub trait NativeAccount {
#[inline]
fn add_asset(&mut self, asset: Asset) -> Word {
add_asset(asset)
}
#[inline]
fn remove_asset(&mut self, asset: Asset) -> Word {
remove_asset(asset)
}
#[inline]
fn incr_nonce(&mut self) -> Felt {
incr_nonce()
}
#[inline]
fn compute_delta_commitment(&self) -> Word {
compute_delta_commitment()
}
#[inline]
fn was_procedure_called(&self, proc_root: Word) -> bool {
was_procedure_called(proc_root)
}
}