multiversx_chain_vm/host/vm_hooks/vh_handler/
vh_storage.rs

1use 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}