l1x_sys/
lib.rs

1#![no_std]
2
3// Registers are a nice abstraction that allows developers to store data without moving it outside of VM.
4type RegisterId = u64;
5// An address in virtual memory.
6type MemoryAddress = u64;
7type ReturnCode = u64;
8
9extern "C" {
10    /*
11     * Register API
12     */
13    pub fn read_register(register_id: RegisterId, result_addr: MemoryAddress);
14    pub fn register_len(register_id: RegisterId) -> u64;
15    pub fn write_register(register_id: RegisterId, data_addr: MemoryAddress, data_len: u64);
16    /*
17     * Storage API
18     */
19    // 0 or 1 depending on whether anything was replaced
20    pub fn storage_write(
21        key_addr: MemoryAddress,
22        key_len: u64,
23        value_addr: MemoryAddress,
24        value_len: u64,
25        evicted_register_id: RegisterId,
26    ) -> ReturnCode;
27    // 0 or 1 depending on whether anything was read
28    pub fn storage_read(
29        key_addr: MemoryAddress,
30        key_len: u64,
31        register_id: RegisterId,
32    ) -> ReturnCode;
33    // 0 or 1 depending on whether anything was removed
34    pub fn storage_remove(
35        key_addr: MemoryAddress,
36        key_len: u64,
37        register_id: RegisterId,
38    ) -> ReturnCode;
39    // 0 or 1 depending on whether the contract has write permissions
40    pub fn storage_write_perm() -> ReturnCode;
41    /*
42     * Context API
43     */
44    pub fn current_runtime_version() -> u64;
45    pub fn input(result_register_id: RegisterId);
46    pub fn output(output_addr: MemoryAddress, output_len: u64);
47    pub fn contract_owner_address(register_id: u64);
48    pub fn caller_address(register_id: u64);
49    pub fn contract_instance_address(register_id: u64);
50    pub fn contract_owner_address_of(
51        address_ptr: MemoryAddress,
52        len: u64,
53        result_register_id: RegisterId,
54    );
55    pub fn contract_code_owner_address_of(
56        address_ptr: MemoryAddress,
57        len: u64,
58        result_register_id: RegisterId,
59    );
60    pub fn contract_code_address_of(
61        address_ptr: MemoryAddress,
62        len: u64,
63        result_register_id: RegisterId,
64    );
65    pub fn block_hash(output_addr: MemoryAddress, output_len: u64);
66    pub fn block_number(output_addr: MemoryAddress, output_len: u64);
67    pub fn block_timestamp(output_addr: MemoryAddress, output_len: u64);
68    pub fn gas_limit() -> u64;
69    pub fn gas_left() -> u64;
70    pub fn deposit(output_addr: MemoryAddress, output_len: u64);
71
72    /*
73     * Economics API
74     */
75    pub fn address_balance(
76        address_ptr: MemoryAddress,
77        address_len: u64,
78        result_register_id: RegisterId,
79    );
80    pub fn transfer_to(
81        to_address_ptr: MemoryAddress,
82        to_address_len: u64,
83        amount_ptr: MemoryAddress,
84        amount_len: u64,
85    ) -> ReturnCode;
86    pub fn transfer_from_caller(amount_ptr: MemoryAddress, amount_len: u64) -> ReturnCode;
87    /*
88     * Misc API
89     */
90    pub fn panic() -> !;
91    pub fn panic_msg(msg_addr: MemoryAddress, msg_len: u64) -> !;
92    pub fn msg(addr: MemoryAddress, len: u64);
93
94    pub fn call_contract(
95        call_addr: MemoryAddress,
96        len: u64,
97        result_register_id: RegisterId,
98    ) -> ReturnCode;
99    pub fn call_contract2(
100        call_addr: MemoryAddress,
101        len: u64,
102        result_register_id: RegisterId,
103    ) -> ReturnCode;
104
105    pub fn emit_event_experimental(data_addr: MemoryAddress, len: u64) -> ReturnCode;
106}