#![warn(
elided_lifetimes_in_paths,
missing_debug_implementations,
unsafe_op_in_unsafe_fn,
clippy::undocumented_unsafe_blocks,
clippy::missing_safety_doc
)]
use std::mem::MaybeUninit;
pub mod sys;
#[inline]
pub fn msg_arg_data_size() -> usize {
unsafe { sys::msg_arg_data_size() }
}
#[inline]
pub fn msg_arg_data_copy(dst: &mut [u8], offset: usize) {
unsafe { sys::msg_arg_data_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn msg_arg_data_copy_uninit(dst: &mut [MaybeUninit<u8>], offset: usize) {
unsafe { sys::msg_arg_data_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn msg_caller_size() -> usize {
unsafe { sys::msg_caller_size() }
}
#[inline]
pub fn msg_caller_copy(dst: &mut [u8], offset: usize) {
unsafe { sys::msg_caller_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn msg_caller_copy_uninit(dst: &mut [MaybeUninit<u8>], offset: usize) {
unsafe { sys::msg_caller_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn msg_caller_info_data_size() -> usize {
unsafe { sys::msg_caller_info_data_size() }
}
#[inline]
pub fn msg_caller_info_data_copy(dst: &mut [u8], offset: usize) {
unsafe { sys::msg_caller_info_data_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn msg_caller_info_data_copy_uninit(dst: &mut [MaybeUninit<u8>], offset: usize) {
unsafe { sys::msg_caller_info_data_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn msg_caller_info_signer_size() -> usize {
unsafe { sys::msg_caller_info_signer_size() }
}
#[inline]
pub fn msg_caller_info_signer_copy(dst: &mut [u8], offset: usize) {
unsafe { sys::msg_caller_info_signer_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn msg_caller_info_signer_copy_uninit(dst: &mut [MaybeUninit<u8>], offset: usize) {
unsafe { sys::msg_caller_info_signer_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn msg_reject_code() -> u32 {
unsafe { sys::msg_reject_code() }
}
#[inline]
pub fn msg_reject_msg_size() -> usize {
unsafe { sys::msg_reject_msg_size() }
}
#[inline]
pub fn msg_reject_msg_copy(dst: &mut [u8], offset: usize) {
unsafe { sys::msg_reject_msg_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn msg_reject_msg_copy_uninit(dst: &mut [MaybeUninit<u8>], offset: usize) {
unsafe { sys::msg_reject_msg_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn msg_deadline() -> u64 {
unsafe { sys::msg_deadline() }
}
#[inline]
pub fn msg_reply_data_append(data: &[u8]) {
unsafe { sys::msg_reply_data_append(data.as_ptr() as usize, data.len()) }
}
#[inline]
pub fn msg_reply() {
unsafe { sys::msg_reply() }
}
#[inline]
pub fn msg_reject(message: &[u8]) {
unsafe { sys::msg_reject(message.as_ptr() as usize, message.len()) }
}
#[inline]
pub fn msg_cycles_available128() -> u128 {
let mut dst_bytes = [0_u8; 16];
unsafe {
sys::msg_cycles_available128(dst_bytes.as_mut_ptr() as usize);
}
u128::from_le_bytes(dst_bytes)
}
#[inline]
pub fn msg_cycles_refunded128() -> u128 {
let mut dst_bytes = [0_u8; 16];
unsafe {
sys::msg_cycles_refunded128(dst_bytes.as_mut_ptr() as usize);
}
u128::from_le_bytes(dst_bytes)
}
#[inline]
pub fn msg_cycles_accept128(max: u128) -> u128 {
let (high, low) = to_high_low(max);
let mut dst_bytes = [0_u8; 16];
unsafe {
sys::msg_cycles_accept128(high, low, dst_bytes.as_mut_ptr() as usize);
}
u128::from_le_bytes(dst_bytes)
}
#[inline]
pub fn cycles_burn128(amount: u128) -> u128 {
let (high, low) = to_high_low(amount);
let mut dst_bytes = [0_u8; 16];
unsafe {
sys::cycles_burn128(high, low, dst_bytes.as_mut_ptr() as usize);
}
u128::from_le_bytes(dst_bytes)
}
#[inline]
pub fn canister_self_size() -> usize {
unsafe { sys::canister_self_size() }
}
#[inline]
pub fn canister_self_copy(dst: &mut [u8], offset: usize) {
unsafe { sys::canister_self_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn canister_cycle_balance128() -> u128 {
let mut dst_bytes = [0_u8; 16];
unsafe {
sys::canister_cycle_balance128(dst_bytes.as_mut_ptr() as usize);
}
u128::from_le_bytes(dst_bytes)
}
#[inline]
pub fn canister_liquid_cycle_balance128() -> u128 {
let mut dst_bytes = [0_u8; 16];
unsafe {
sys::canister_liquid_cycle_balance128(dst_bytes.as_mut_ptr() as usize);
}
u128::from_le_bytes(dst_bytes)
}
#[inline]
pub fn canister_status() -> u32 {
unsafe { sys::canister_status() }
}
#[inline]
pub fn canister_version() -> u64 {
unsafe { sys::canister_version() }
}
#[inline]
pub fn subnet_self_size() -> usize {
unsafe { sys::subnet_self_size() }
}
#[inline]
pub fn subnet_self_copy(dst: &mut [u8], offset: usize) {
unsafe { sys::subnet_self_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn subnet_self_copy_uninit(dst: &mut [MaybeUninit<u8>], offset: usize) {
unsafe { sys::subnet_self_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn msg_method_name_size() -> usize {
unsafe { sys::msg_method_name_size() }
}
#[inline]
pub fn msg_method_name_copy(dst: &mut [u8], offset: usize) {
unsafe { sys::msg_method_name_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn msg_method_name_copy_uninit(dst: &mut [MaybeUninit<u8>], offset: usize) {
unsafe { sys::msg_method_name_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn accept_message() {
unsafe { sys::accept_message() }
}
#[inline]
pub unsafe fn call_new(
callee: &[u8],
name: &str,
reply_fn: unsafe extern "C" fn(env: usize),
reply_env: usize,
reject_fn: unsafe extern "C" fn(env: usize),
reject_env: usize,
) {
unsafe {
sys::call_new(
callee.as_ptr() as usize,
callee.len(),
name.as_ptr() as usize,
name.len(),
reply_fn as usize,
reply_env,
reject_fn as usize,
reject_env,
);
}
}
#[inline]
pub fn call_new_oneway(callee: &[u8], name: &str) {
unsafe {
sys::call_new(
callee.as_ptr() as usize,
callee.len(),
name.as_ptr() as usize,
name.len(),
usize::MAX,
usize::MAX,
usize::MAX,
usize::MAX,
);
}
}
#[inline]
pub unsafe fn call_on_cleanup(cleanup_fn: unsafe extern "C" fn(env: usize), cleanup_env: usize) {
unsafe {
sys::call_on_cleanup(cleanup_fn as usize, cleanup_env);
}
}
#[inline]
pub fn call_data_append(data: &[u8]) {
unsafe { sys::call_data_append(data.as_ptr() as usize, data.len()) }
}
#[inline]
pub fn call_with_best_effort_response(timeout_seconds: u32) {
unsafe { sys::call_with_best_effort_response(timeout_seconds) }
}
#[inline]
pub fn call_cycles_add128(amount: u128) {
let (high, low) = to_high_low(amount);
unsafe { sys::call_cycles_add128(high, low) }
}
#[inline]
pub fn call_perform() -> u32 {
unsafe { sys::call_perform() }
}
#[inline]
pub fn stable64_size() -> u64 {
unsafe { sys::stable64_size() }
}
#[inline]
pub fn stable64_grow(new_pages: u64) -> u64 {
unsafe { sys::stable64_grow(new_pages) }
}
#[inline]
pub fn stable64_write(data: &[u8], offset: u64) {
unsafe { sys::stable64_write(offset, data.as_ptr() as usize as u64, data.len() as u64) }
}
#[inline]
pub fn stable64_read(dst: &mut [u8], offset: u64) {
unsafe { sys::stable64_read(dst.as_mut_ptr() as usize as u64, offset, dst.len() as u64) }
}
#[inline]
pub fn stable64_read_uninit(dst: &mut [MaybeUninit<u8>], offset: u64) {
unsafe { sys::stable64_read(dst.as_mut_ptr() as usize as u64, offset, dst.len() as u64) }
}
#[inline]
pub fn root_key_size() -> usize {
unsafe { sys::root_key_size() }
}
#[inline]
pub fn root_key_copy(dst: &mut [u8], offset: usize) {
unsafe { sys::root_key_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn root_key_copy_uninit(dst: &mut [MaybeUninit<u8>], offset: usize) {
unsafe { sys::root_key_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn certified_data_set(data: &[u8]) {
unsafe { sys::certified_data_set(data.as_ptr() as usize, data.len()) }
}
#[inline]
pub fn data_certificate_present() -> u32 {
unsafe { sys::data_certificate_present() }
}
#[inline]
pub fn data_certificate_size() -> usize {
unsafe { sys::data_certificate_size() }
}
#[inline]
pub fn data_certificate_copy(dst: &mut [u8], offset: usize) {
unsafe { sys::data_certificate_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn data_certificate_copy_uninit(dst: &mut [MaybeUninit<u8>], offset: usize) {
unsafe { sys::data_certificate_copy(dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn time() -> u64 {
unsafe { sys::time() }
}
#[inline]
pub fn global_timer_set(timestamp: u64) -> u64 {
unsafe { sys::global_timer_set(timestamp) }
}
#[inline]
pub fn performance_counter(counter_type: u32) -> u64 {
unsafe { sys::performance_counter(counter_type) }
}
#[inline]
pub fn is_controller(principal: &[u8]) -> u32 {
unsafe { sys::is_controller(principal.as_ptr() as usize, principal.len()) }
}
#[inline]
pub fn in_replicated_execution() -> u32 {
unsafe { sys::in_replicated_execution() }
}
#[inline]
pub fn cost_call(method_name_size: u64, payload_size: u64) -> u128 {
let mut dst_bytes = [0_u8; 16];
unsafe {
sys::cost_call(
method_name_size,
payload_size,
dst_bytes.as_mut_ptr() as usize,
);
}
u128::from_le_bytes(dst_bytes)
}
#[inline]
pub fn cost_create_canister() -> u128 {
let mut dst_bytes = [0_u8; 16];
unsafe {
sys::cost_create_canister(dst_bytes.as_mut_ptr() as usize);
}
u128::from_le_bytes(dst_bytes)
}
#[inline]
pub fn cost_http_request(request_size: u64, max_res_bytes: u64) -> u128 {
let mut dst_bytes = [0_u8; 16];
unsafe {
sys::cost_http_request(request_size, max_res_bytes, dst_bytes.as_mut_ptr() as usize);
}
u128::from_le_bytes(dst_bytes)
}
#[inline]
pub fn cost_sign_with_ecdsa(key_name: &str, ecdsa_curve: u32) -> (u128, u32) {
let mut dst_bytes = [0_u8; 16];
let code = unsafe {
sys::cost_sign_with_ecdsa(
key_name.as_ptr() as usize,
key_name.len(),
ecdsa_curve,
dst_bytes.as_mut_ptr() as usize,
)
};
(u128::from_le_bytes(dst_bytes), code)
}
#[inline]
pub fn cost_sign_with_schnorr(key_name: &str, algorithm: u32) -> (u128, u32) {
let mut dst_bytes = [0_u8; 16];
let code = unsafe {
sys::cost_sign_with_schnorr(
key_name.as_ptr() as usize,
key_name.len(),
algorithm,
dst_bytes.as_mut_ptr() as usize,
)
};
(u128::from_le_bytes(dst_bytes), code)
}
#[inline]
pub fn cost_vetkd_derive_key(key_name: &str, vetkd_curve: u32) -> (u128, u32) {
let mut dst_bytes = [0_u8; 16];
let code = unsafe {
sys::cost_vetkd_derive_key(
key_name.as_ptr() as usize,
key_name.len(),
vetkd_curve,
dst_bytes.as_mut_ptr() as usize,
)
};
(u128::from_le_bytes(dst_bytes), code)
}
#[inline]
pub fn env_var_count() -> usize {
unsafe { sys::env_var_count() }
}
#[inline]
pub fn env_var_name_size(index: usize) -> usize {
unsafe { sys::env_var_name_size(index) }
}
#[inline]
pub fn env_var_name_copy(index: usize, dst: &mut [u8], offset: usize) {
unsafe { sys::env_var_name_copy(index, dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn env_var_name_copy_uninit(index: usize, dst: &mut [MaybeUninit<u8>], offset: usize) {
unsafe { sys::env_var_name_copy(index, dst.as_mut_ptr() as usize, offset, dst.len()) }
}
#[inline]
pub fn env_var_name_exists(name: &str) -> u32 {
unsafe { sys::env_var_name_exists(name.as_ptr() as usize, name.len()) }
}
#[inline]
pub fn env_var_value_size(name: &str) -> usize {
unsafe { sys::env_var_value_size(name.as_ptr() as usize, name.len()) }
}
#[inline]
pub fn env_var_value_copy(name: &str, dst: &mut [u8], offset: usize) {
unsafe {
sys::env_var_value_copy(
name.as_ptr() as usize,
name.len(),
dst.as_mut_ptr() as usize,
offset,
dst.len(),
)
}
}
#[inline]
pub fn env_var_value_copy_uninit(name: &str, dst: &mut [MaybeUninit<u8>], offset: usize) {
unsafe {
sys::env_var_value_copy(
name.as_ptr() as usize,
name.len(),
dst.as_mut_ptr() as usize,
offset,
dst.len(),
)
}
}
#[inline]
pub fn debug_print(message: &[u8]) {
unsafe { sys::debug_print(message.as_ptr() as usize, message.len()) }
}
#[inline]
pub fn trap(message: &[u8]) -> ! {
unsafe { sys::trap(message.as_ptr() as usize, message.len()) }
unreachable!("trap should halt execution immediately")
}
#[inline]
fn to_high_low(x: u128) -> (u64, u64) {
let high = (x >> 64) as u64;
let low = (x & u128::from(u64::MAX)) as u64;
(high, low)
}