pub use radix_engine_interface::types::{Buffer, BufferId, Slice};
use sbor::rust::vec::Vec;
pub fn copy_buffer(buffer: Buffer) -> Vec<u8> {
let len = buffer.len() as usize;
let mut vec = Vec::<u8>::with_capacity(len);
unsafe {
buffer::buffer_consume(buffer.id(), vec.as_mut_ptr());
vec.set_len(len);
};
vec
}
pub fn forget_vec(vec: Vec<u8>) -> Slice {
let ptr = vec.as_ptr() as usize;
let len = vec.len();
assert!(ptr <= 0xffffffff && len <= 0xffffffff);
sbor::rust::mem::forget(vec);
Slice::new(ptr as u32, len as u32)
}
pub mod blueprint {
pub use radix_engine_interface::types::{Buffer, BufferId, Slice};
super::wasm_extern_c! {
pub fn blueprint_call(
package_address_ptr: *const u8,
package_address_len: usize,
blueprint_name_ptr: *const u8,
blueprint_name_len: usize,
ident_ptr: *const u8,
ident_len: usize,
args_ptr: *const u8,
args_len: usize,
) -> Buffer;
}
}
pub mod addr {
pub use radix_engine_interface::types::{Buffer, BufferId, Slice};
super::wasm_extern_c! {
pub fn address_allocate(
package_address_ptr: *const u8,
package_address_len: usize,
blueprint_name_ptr: *const u8,
blueprint_name_len: usize,
) -> Buffer;
pub fn address_get_reservation_address(
address_id_ptr: *const u8,
address_id_len: usize,
) -> Buffer;
}
}
pub mod object {
pub use radix_engine_interface::types::{Buffer, BufferId, Slice};
super::wasm_extern_c! {
pub fn object_new(
blueprint_name_ptr: *const u8,
blueprint_name_len: usize,
obj_fields_ptr: *const u8,
obj_fields_len: usize,
) -> Buffer;
pub fn object_globalize(
obj_id_ptr: *const u8,
obj_id_len: usize,
modules_ptr: *const u8,
modules_len: usize,
address_id_ptr: *const u8,
address_id_len: usize,
) -> Buffer;
pub fn object_instance_of(
obj_id_ptr: *const u8,
obj_id_len: usize,
package_address_ptr: *const u8,
package_address_len: usize,
blueprint_name_ptr: *const u8,
blueprint_name_len: usize,
) -> u32;
pub fn object_get_blueprint_id(
obj_id_ptr: *const u8,
obj_id_len: usize,
) -> Buffer;
pub fn object_get_outer_object(obj_id_ptr: *const u8, obj_id_len: usize) -> Buffer;
pub fn object_call(
obj_id_ptr: *const u8,
obj_id_len: usize,
ident_ptr: *const u8,
ident_len: usize,
args_ptr: *const u8,
args_len: usize,
) -> Buffer;
pub fn object_call_direct(
obj_id_ptr: *const u8,
obj_id_len: usize,
ident_ptr: *const u8,
ident_len: usize,
args_ptr: *const u8,
args_len: usize,
) -> Buffer;
pub fn object_call_module(
obj_id_ptr: *const u8,
obj_id_len: usize,
module_id: u32,
ident_ptr: *const u8,
ident_len: usize,
args_ptr: *const u8,
args_len: usize,
) -> Buffer;
}
}
pub mod actor {
use radix_engine_interface::api::field_api::FieldHandle;
use radix_engine_interface::api::{ActorRefHandle, ActorStateHandle};
pub use radix_engine_interface::types::{Buffer, BufferId, Slice};
super::wasm_extern_c! {
pub fn actor_get_package_address() -> Buffer;
pub fn actor_get_blueprint_name() -> Buffer;
pub fn actor_get_object_id(actor_ref_handle: ActorRefHandle) -> Buffer;
pub fn actor_open_field(
actor_state_handle: ActorStateHandle,
field_index: u32,
flags: u32,
) -> FieldHandle;
pub fn actor_emit_event(
event_name_ptr: *const u8,
event_name_len: usize,
event_data_ptr: *const u8,
event_data_len: usize,
event_flags: u32,
);
}
}
pub mod kv_store {
pub use radix_engine_interface::types::{Buffer, BufferId, Slice};
super::wasm_extern_c! {
pub fn kv_store_new(schema_ptr: *const u8, schema_len: usize) -> Buffer;
pub fn kv_store_open_entry(
key_value_store_id_ptr: *const u8,
key_value_store_id_len: usize,
key_ptr: *const u8,
key_len: usize,
flags: u32,
) -> u32;
pub fn kv_store_remove_entry(
key_value_store_id_ptr: *const u8,
key_value_store_id_len: usize,
key: *const u8,
key_len: usize,
) -> Buffer;
}
}
pub mod kv_entry {
pub use radix_engine_interface::types::{Buffer, BufferId, Slice};
super::wasm_extern_c! {
pub fn kv_entry_read(kv_entry_handle: u32) -> Buffer;
pub fn kv_entry_write(kv_entry_handle: u32, buffer_ptr: *const u8, buffer_len: usize);
pub fn kv_entry_remove(kv_entry_handle: u32) -> Buffer;
pub fn kv_entry_close(kv_entry_handle: u32);
}
}
pub mod field_entry {
pub use radix_engine_interface::types::{Buffer, BufferId, Slice};
super::wasm_extern_c! {
pub fn field_entry_read(handle: u32) -> Buffer;
pub fn field_entry_write(handle: u32, data_ptr: *const u8, data_len: usize);
pub fn field_entry_close(handle: u32);
}
}
pub mod costing {
pub use radix_engine_interface::types::{Buffer, BufferId, Slice};
super::wasm_extern_c! {
pub fn costing_get_execution_cost_unit_limit() -> u32;
pub fn costing_get_execution_cost_unit_price() -> Buffer;
pub fn costing_get_finalization_cost_unit_limit() -> u32;
pub fn costing_get_finalization_cost_unit_price() -> Buffer;
pub fn costing_get_usd_price() -> Buffer;
pub fn costing_get_tip_percentage() -> u32;
pub fn costing_get_fee_balance() -> Buffer;
}
}
pub mod system {
pub use radix_engine_interface::types::{Buffer, BufferId, Slice};
super::wasm_extern_c! {
pub fn sys_log(
level_ptr: *const u8,
level_len: usize,
message_ptr: *const u8,
message_len: usize,
);
pub fn sys_bech32_encode_address(address_ptr: *const u8, address_len: usize) -> Buffer;
pub fn sys_get_transaction_hash() -> Buffer;
pub fn sys_generate_ruid() -> Buffer;
pub fn sys_panic(message_ptr: *const u8, message_len: usize);
}
}
pub mod crypto_utils {
pub use radix_engine_interface::types::{Buffer, BufferId, Slice};
super::wasm_extern_c! {
pub fn crypto_utils_bls12381_v1_verify(
message_ptr: *const u8,
message_len: usize,
public_key_ptr: *const u8,
public_key_len: usize,
signature_ptr: *const u8,
signature_len: usize) -> u32;
pub fn crypto_utils_bls12381_v1_aggregate_verify(
pub_keys_and_msgs_ptr: *const u8,
pub_keys_and_msgs_len: usize,
signature_ptr: *const u8,
signature_len: usize) -> u32;
pub fn crypto_utils_bls12381_v1_fast_aggregate_verify(
messages_ptr: *const u8,
messages_len: usize,
public_keys_ptr: *const u8,
public_keys_len: usize,
signature_ptr: *const u8,
signature_len: usize) -> u32;
pub fn crypto_utils_bls12381_g2_signature_aggregate(
signatures_ptr: *const u8,
signatures_len: usize) -> Buffer;
pub fn crypto_utils_keccak256_hash(
message_ptr: *const u8,
message_len: usize) -> Buffer;
}
}
pub mod buffer {
pub use radix_engine_interface::types::{Buffer, BufferId, Slice};
super::wasm_extern_c! {
pub fn buffer_consume(buffer_id: BufferId, destination_ptr: *mut u8);
}
}
macro_rules! wasm_extern_c {
(
$(
$(#[$meta:meta])*
pub fn $fn_ident: ident ( $($arg_name: ident: $arg_type: ty),* $(,)? ) $(-> $rtn_type: ty)?;
)*
) => {
#[cfg(target_arch = "wasm32")]
extern "C" {
$(
$(#[$meta])*
pub fn $fn_ident ( $($arg_name: $arg_type),* ) $(-> $rtn_type)?;
)*
}
$(
#[cfg(not(target_arch = "wasm32"))]
$(#[$meta])*
pub unsafe fn $fn_ident ( $(_: $arg_type),* ) $(-> $rtn_type)? {
unimplemented!("Not implemented for non-wasm targets")
}
)*
};
}
use wasm_extern_c;