multiversx_sc/api/
blockchain_api.rs1use super::{HandleTypeInfo, ManagedTypeApi, ManagedTypeApiImpl, RawHandle};
2use crate::types::{
3 heap::{Address, Box, H256},
4 EsdtLocalRoleFlags,
5};
6
7pub trait BlockchainApi: ManagedTypeApi {
8 type BlockchainApiImpl: BlockchainApiImpl
9 + HandleTypeInfo<
10 ManagedBufferHandle = Self::ManagedBufferHandle,
11 BigIntHandle = Self::BigIntHandle,
12 BigFloatHandle = Self::BigFloatHandle,
13 EllipticCurveHandle = Self::EllipticCurveHandle,
14 >;
15
16 fn blockchain_api_impl() -> Self::BlockchainApiImpl;
17}
18
19pub trait BlockchainApiImpl: ManagedTypeApiImpl {
26 fn get_caller_legacy(&self) -> Address;
27
28 fn load_caller_managed(&self, dest: Self::ManagedBufferHandle) {
29 self.mb_overwrite(dest, self.get_caller_legacy().as_bytes());
30 }
31
32 fn get_sc_address_legacy(&self) -> Address;
33
34 fn load_sc_address_managed(&self, dest: Self::ManagedBufferHandle) {
35 self.mb_overwrite(dest, self.get_sc_address_legacy().as_bytes())
36 }
37
38 fn load_owner_address_managed(&self, dest: Self::ManagedBufferHandle);
39
40 fn get_shard_of_address_legacy(&self, address: &Address) -> u32;
41
42 fn get_shard_of_address(&self, address_handle: Self::ManagedBufferHandle) -> u32 {
43 let mut address = Address::zero();
44 let _ = self.mb_load_slice(address_handle, 0, address.as_mut());
45 self.get_shard_of_address_legacy(&address)
46 }
47
48 fn is_smart_contract_legacy(&self, address: &Address) -> bool;
49
50 fn is_smart_contract(&self, address_handle: Self::ManagedBufferHandle) -> bool {
51 let mut address = Address::zero();
52 let _ = self.mb_load_slice(address_handle, 0, address.as_mut());
53 self.is_smart_contract_legacy(&address)
54 }
55
56 fn load_balance_legacy(&self, dest: Self::BigIntHandle, address: &Address);
57
58 fn load_balance(&self, dest: Self::BigIntHandle, address_handle: Self::ManagedBufferHandle) {
59 let mut address = Address::zero();
60 let _ = self.mb_load_slice(address_handle, 0, address.as_mut());
61 self.load_balance_legacy(dest, &address);
62 }
63
64 fn load_state_root_hash_managed(&self, dest: Self::ManagedBufferHandle);
65
66 fn get_tx_hash_legacy(&self) -> H256;
67
68 fn load_tx_hash_managed(&self, dest: Self::ManagedBufferHandle) {
69 self.mb_overwrite(dest, self.get_tx_hash_legacy().as_bytes());
70 }
71
72 fn get_gas_left(&self) -> u64;
73
74 fn get_block_timestamp(&self) -> u64;
75
76 fn get_block_timestamp_ms(&self) -> u64;
77
78 fn get_block_nonce(&self) -> u64;
79
80 fn get_block_round(&self) -> u64;
81
82 fn get_block_epoch(&self) -> u64;
83
84 fn load_block_random_seed_managed(&self, dest: Self::ManagedBufferHandle);
85
86 fn get_prev_block_timestamp(&self) -> u64;
87
88 fn get_prev_block_timestamp_ms(&self) -> u64;
89
90 fn get_prev_block_nonce(&self) -> u64;
91
92 fn get_prev_block_round(&self) -> u64;
93
94 fn get_prev_block_epoch(&self) -> u64;
95
96 fn get_prev_block_random_seed_legacy(&self) -> Box<[u8; 48]>;
97
98 fn load_prev_block_random_seed_managed(&self, dest: Self::ManagedBufferHandle) {
99 self.mb_overwrite(dest, self.get_prev_block_random_seed_legacy().as_slice());
100 }
101
102 fn get_block_round_time_ms(&self) -> u64;
103
104 fn epoch_start_block_timestamp_ms(&self) -> u64;
105
106 fn epoch_start_block_nonce(&self) -> u64;
107
108 fn epoch_start_block_round(&self) -> u64;
109
110 fn get_current_esdt_nft_nonce(
111 &self,
112 address_handle: Self::ManagedBufferHandle,
113 token_id_handle: Self::ManagedBufferHandle,
114 ) -> u64;
115
116 fn load_esdt_balance(
117 &self,
118 address_handle: Self::ManagedBufferHandle,
119 token_id_handle: Self::ManagedBufferHandle,
120 nonce: u64,
121 dest: Self::BigIntHandle,
122 );
123
124 #[allow(clippy::too_many_arguments)]
125 fn managed_get_esdt_token_data(
126 &self,
127 address_handle: RawHandle,
128 token_id_handle: RawHandle,
129 nonce: u64,
130 value_handle: RawHandle,
131 properties_handle: RawHandle,
132 hash_handle: RawHandle,
133 name_handle: RawHandle,
134 attributes_handle: RawHandle,
135 creator_handle: RawHandle,
136 royalties_handle: RawHandle,
137 uris_handle: RawHandle,
138 );
139
140 fn managed_get_back_transfers(
141 &self,
142 esdt_transfer_value_handle: RawHandle,
143 call_value_handle: RawHandle,
144 );
145
146 fn check_esdt_frozen(
147 &self,
148 address_handle: Self::ManagedBufferHandle,
149 token_id_handle: Self::ManagedBufferHandle,
150 nonce: u64,
151 ) -> bool;
152
153 fn check_esdt_paused(&self, token_id_handle: Self::ManagedBufferHandle) -> bool;
154
155 fn check_esdt_limited_transfer(&self, token_id_handle: Self::ManagedBufferHandle) -> bool;
156
157 fn load_esdt_local_roles(
158 &self,
159 token_id_handle: Self::ManagedBufferHandle,
160 ) -> EsdtLocalRoleFlags;
161
162 fn managed_get_code_metadata(
163 &self,
164 address_handle: Self::ManagedBufferHandle,
165 response_handle: Self::ManagedBufferHandle,
166 );
167
168 fn managed_get_code_hash(
169 &self,
170 address_handle: Self::ManagedBufferHandle,
171 code_hash_handle: Self::ManagedBufferHandle,
172 );
173
174 fn managed_is_builtin_function(&self, function_name_handle: Self::ManagedBufferHandle) -> bool;
175
176 fn managed_get_esdt_token_type(
177 &self,
178 address_handle: Self::ManagedBufferHandle,
179 token_id_handle: Self::ManagedBufferHandle,
180 nonce: u64,
181 dest_handle: Self::BigIntHandle,
182 );
183}