multiversx_chain_vm/host/vm_hooks/vh_handler/
vh_storage.rs1use multiversx_chain_vm_executor::VMHooksEarlyExit;
2
3use crate::{
4 host::vm_hooks::VMHooksContext,
5 types::{RawHandle, VMAddress},
6};
7
8use super::VMHooksHandler;
9
10impl<C: VMHooksContext> VMHooksHandler<C> {
11 pub fn storage_load_managed_buffer_raw(
12 &mut self,
13 key_handle: RawHandle,
14 dest: RawHandle,
15 ) -> Result<(), VMHooksEarlyExit> {
16 self.use_gas(self.gas_schedule().base_ops_api_cost.storage_load)?;
17
18 let value = self
19 .context
20 .storage_read(self.context.m_types_lock().mb_get(key_handle));
21 self.context.m_types_lock().mb_set(dest, value);
22
23 Ok(())
24 }
25
26 pub fn storage_load_from_address(
27 &mut self,
28 address_handle: RawHandle,
29 key_handle: RawHandle,
30 dest: RawHandle,
31 ) -> Result<(), VMHooksEarlyExit> {
32 self.use_gas(self.gas_schedule().base_ops_api_cost.storage_load)?;
33
34 let address = VMAddress::from_slice(self.context.m_types_lock().mb_get(address_handle));
35 let value = self
36 .context
37 .storage_read_any_address(&address, self.context.m_types_lock().mb_get(key_handle));
38 self.context.m_types_lock().mb_set(dest, value);
39
40 Ok(())
41 }
42
43 pub fn storage_store_managed_buffer_raw(
44 &mut self,
45 key_handle: RawHandle,
46 value_handle: RawHandle,
47 ) -> Result<(), VMHooksEarlyExit> {
48 self.use_gas(self.gas_schedule().base_ops_api_cost.storage_store)?;
49
50 let types = self.context.m_types_lock();
51 let key_bytes = types.mb_get_owned(key_handle);
52 let value_bytes = types.mb_get_owned(value_handle);
53 std::mem::drop(types);
54 self.context.storage_write(&key_bytes, &value_bytes)
55 }
56}