multiversx_sc/api/
blockchain_api.rs

1use 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
19/// Interface to be used by the actual smart contract code.
20///
21/// Note: contracts and the api are not mutable.
22/// They simply pass on/retrieve data to/from the protocol.
23/// When mocking the blockchain state, we use the Rc/RefCell pattern
24/// to isolate mock state mutability from the contract interface.
25pub 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}