Arch Network Logo
Program

Syscalls

A syscall is a VM-provided function that an Arch program can call to perform runtime operations such as CPI, PDA derivation, logging, hashing, Bitcoin lookups, and transaction signing.

The signatures below mirror the public syscall definitions exposed by arch_program.

CPI and Return Data

define_syscall!(fn sol_invoke_signed_rust(
    instruction_addr: *const u8,
    account_infos_addr: *const u8,
    account_infos_len: u64,
    signers_seeds_addr: *const u8,
    signers_seeds_len: u64,
) -> u64);

define_syscall!(fn sol_set_return_data(data: *const u8, length: u64));
define_syscall!(fn sol_get_return_data(data: *mut u8, length: u64, program_id: *mut Pubkey) -> u64);

sol_invoke_signed_rust receives serialized instruction data, serialized account infos, and serialized signer seed groups for CPI and PDA signing.

PDA Helpers

define_syscall!(fn sol_try_find_program_address(
    seeds_addr: *const u8,
    seeds_len: u64,
    program_id_addr: *const u8,
    address_bytes_addr: *const u8,
    bump_seed_addr: *const u8,
) -> u64);

define_syscall!(fn sol_create_program_address(
    seeds_addr: *const u8,
    seeds_len: u64,
    program_id_addr: *const u8,
    address_addr: *mut u8,
) -> u64);

Compute, Clock, and Stack

define_syscall!(fn get_remaining_compute_units() -> u64);
define_syscall!(fn arch_get_clock(clock: *mut Clock) -> u64);
define_syscall!(fn arch_get_stack_height() -> u64);

Transaction Signing

define_syscall!(fn arch_set_transaction_to_sign(transaction_to_sign: *const u8, length: u64) -> u64);
define_syscall!(fn arch_get_transaction_to_sign(transaction_to_sign: *mut u8, length: u64) -> u64);
define_syscall!(fn arch_set_inputs_to_sign(inputs_to_sign: *const u8, length: u64) -> u64);

Transaction signing syscalls operate on serialized byte buffers and explicit lengths.

Bitcoin and Runes

define_syscall!(fn arch_get_bitcoin_tx(data: *mut u8, length: u64, txid: &[u8; 32]) -> u64);
define_syscall!(fn arch_get_runes_from_output(data: *mut u8, length: u64, txid: &[u8; 32], output_index: u32) -> u64);
define_syscall!(fn arch_get_rune_info(data: *mut u8, length: u64, block: u64, tx: u64) -> u64);
define_syscall!(fn arch_get_bitcoin_tx_confirmation(txid: &[u8; 32], result: *mut u8) -> u64);
define_syscall!(fn arch_get_network_xonly_pubkey(data: *mut u8) -> u64);
define_syscall!(fn arch_validate_utxo_ownership(utxo: *const UtxoMeta, owner: *const Pubkey) -> u64);
define_syscall!(fn arch_get_account_script_pubkey(script: *mut u8, pubkey: *const Pubkey) -> u64);
define_syscall!(fn arch_get_bitcoin_block_height() -> u64);

Crypto

define_syscall!(fn sol_secp256k1_recover(
    hash_addr: *const u8,
    recovery_id_val: u64,
    signature_addr: *const u8,
    result_addr: *mut u8,
) -> u64);

define_syscall!(fn sol_keccak256(data: *const u8, length: u64, result: *mut u8) -> u64);
define_syscall!(fn sol_sha256(data: *const u8, length: u64, result: *mut u8) -> u64);

Logging and Memory

define_syscall!(fn sol_log_(message: *const u8, len: u64));
define_syscall!(fn sol_log_64_(arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64));
define_syscall!(fn sol_log_compute_units_());
define_syscall!(fn sol_log_pubkey(pubkey_addr: *const u8));
define_syscall!(fn sol_log_data(data: *const u8, data_len: u64));

define_syscall!(fn sol_memcmp_(data1: *const u8, data2: *const u8, len: u64, result: *mut i32) -> u64);
define_syscall!(fn sol_memcpy_(dest: *mut u8, src: *const u8, len: u64) -> u64);
define_syscall!(fn sol_memset_(dest: *mut u8, val: u8, len: u64) -> u64);
define_syscall!(fn sol_memmove_(dest: *mut u8, src: *const u8, len: u64) -> u64);