multiversx_sc/api/external_view/
ev_storage_api.rs

1use crate::api::{
2    const_handles, managed_types::HandleConstraints, use_raw_handle, ManagedBufferApiImpl,
3    StaticVarApiImpl, StorageReadApi, StorageReadApiImpl, VMApi,
4};
5
6use super::ExternalViewApi;
7
8pub const EXTERNAL_VIEW_TARGET_ADDRESS_KEY: &[u8] = b"external-view-target-address";
9
10impl<A> StorageReadApi for ExternalViewApi<A>
11where
12    A: VMApi,
13{
14    type StorageReadApiImpl = ExternalViewApi<A>;
15
16    fn storage_read_api_impl() -> Self::StorageReadApiImpl {
17        ExternalViewApi::new()
18    }
19}
20
21impl<A> ExternalViewApi<A>
22where
23    A: VMApi,
24{
25    /// Reads what lies in storage at `external-view-target-address` and loads into a managed buffer.
26    /// The same managed buffer will be used for all reads in the tx.
27    fn load_external_view_target_key_handle(&self) {
28        let external_view_target_key_handle: A::ManagedBufferHandle =
29            use_raw_handle(const_handles::MBUF_TEMPORARY_1);
30        A::managed_type_impl().mb_overwrite(
31            external_view_target_key_handle.clone(),
32            EXTERNAL_VIEW_TARGET_ADDRESS_KEY,
33        );
34        let external_view_target_address_handle: A::ManagedBufferHandle =
35            use_raw_handle(A::static_var_api_impl().next_handle());
36        A::storage_read_api_impl().storage_load_managed_buffer_raw(
37            external_view_target_key_handle,
38            external_view_target_address_handle.clone(),
39        );
40        A::static_var_api_impl().set_external_view_target_address_handle(
41            external_view_target_address_handle.get_raw_handle(),
42        );
43    }
44}
45
46impl<A: VMApi> StorageReadApiImpl for ExternalViewApi<A> {
47    fn storage_read_api_init(&self) {
48        self.load_external_view_target_key_handle();
49    }
50
51    fn storage_load_managed_buffer_raw(
52        &self,
53        key_handle: Self::ManagedBufferHandle,
54        dest: Self::ManagedBufferHandle,
55    ) {
56        let target_address_handle =
57            use_raw_handle(A::static_var_api_impl().get_external_view_target_address_handle());
58        A::storage_read_api_impl().storage_load_from_address(
59            target_address_handle,
60            key_handle,
61            dest,
62        );
63    }
64
65    fn storage_load_from_address(
66        &self,
67        address_handle: Self::ManagedBufferHandle,
68        key_handle: Self::ManagedBufferHandle,
69        dest: Self::ManagedBufferHandle,
70    ) {
71        A::storage_read_api_impl().storage_load_from_address(address_handle, key_handle, dest);
72    }
73}