extern crate alloc;
use alloc::vec::Vec;
use miden_stdlib_sys::{Felt, Word};
use super::{AccountId, Asset, NoteMetadata, RawAccountId, Recipient};
#[allow(improper_ctypes)]
unsafe extern "C" {
#[link_name = "miden::protocol::active_note::get_storage"]
fn extern_note_get_storage(ptr: *mut Felt) -> usize;
#[link_name = "miden::protocol::active_note::get_assets"]
fn extern_note_get_assets(ptr: *mut Felt) -> usize;
#[link_name = "miden::protocol::active_note::get_sender"]
fn extern_note_get_sender(ptr: *mut RawAccountId);
#[link_name = "miden::protocol::active_note::get_recipient"]
fn extern_note_get_recipient(ptr: *mut Recipient);
#[link_name = "miden::protocol::active_note::get_script_root"]
fn extern_note_get_script_root(ptr: *mut Word);
#[link_name = "miden::protocol::active_note::get_serial_number"]
fn extern_note_get_serial_number(ptr: *mut Word);
#[link_name = "miden::protocol::active_note::get_metadata"]
fn extern_note_get_metadata(ptr: *mut NoteMetadata);
}
pub fn get_storage() -> Vec<Felt> {
const MAX_INPUTS: usize = 1024;
let mut inputs: Vec<Felt> = Vec::with_capacity(MAX_INPUTS);
let num_inputs = unsafe {
let ptr = (inputs.as_mut_ptr() as usize) / 4;
extern_note_get_storage(ptr as *mut Felt)
};
unsafe {
inputs.set_len(num_inputs);
}
inputs
}
pub fn get_assets() -> Vec<Asset> {
const MAX_INPUTS: usize = 256;
let mut inputs: Vec<Asset> = Vec::with_capacity(MAX_INPUTS);
let num_inputs = unsafe {
let ptr = (inputs.as_mut_ptr() as usize) / 4;
extern_note_get_assets(ptr as *mut Felt)
};
unsafe {
inputs.set_len(num_inputs);
}
inputs
}
pub fn get_sender() -> AccountId {
unsafe {
let mut ret_area = ::core::mem::MaybeUninit::<RawAccountId>::uninit();
extern_note_get_sender(ret_area.as_mut_ptr());
ret_area.assume_init().into_account_id()
}
}
pub fn get_recipient() -> Recipient {
unsafe {
let mut ret_area = ::core::mem::MaybeUninit::<Recipient>::uninit();
extern_note_get_recipient(ret_area.as_mut_ptr());
ret_area.assume_init()
}
}
pub fn get_script_root() -> Word {
unsafe {
let mut ret_area = ::core::mem::MaybeUninit::<Word>::uninit();
extern_note_get_script_root(ret_area.as_mut_ptr());
ret_area.assume_init()
}
}
pub fn get_serial_number() -> Word {
unsafe {
let mut ret_area = ::core::mem::MaybeUninit::<Word>::uninit();
extern_note_get_serial_number(ret_area.as_mut_ptr());
ret_area.assume_init()
}
}
pub fn get_metadata() -> NoteMetadata {
unsafe {
let mut ret_area = ::core::mem::MaybeUninit::<NoteMetadata>::uninit();
extern_note_get_metadata(ret_area.as_mut_ptr());
ret_area.assume_init()
}
}