multiversx_chain_vm/host/vm_hooks/vh_handler/
vh_error.rs

1use multiversx_chain_core::types::ReturnCode;
2use multiversx_chain_vm_executor::VMHooksEarlyExit;
3
4use crate::{
5    host::vm_hooks::{vh_early_exit::early_exit_vm_error, VMHooksContext},
6    types::RawHandle,
7};
8
9use super::VMHooksHandler;
10
11impl<C: VMHooksContext> VMHooksHandler<C> {
12    pub fn signal_error(&mut self, message: &[u8]) -> Result<(), VMHooksEarlyExit> {
13        match String::from_utf8(message.to_owned()) {
14            Ok(message_string) => {
15                self.error_trace(&message_string);
16                Err(VMHooksEarlyExit::new(ReturnCode::UserError.as_u64())
17                    .with_message(message_string))
18            }
19            Err(_) => Err(early_exit_vm_error("error message utf-8 error")),
20        }
21    }
22
23    pub fn signal_error_from_buffer(
24        &mut self,
25        message_handle: RawHandle,
26    ) -> Result<(), VMHooksEarlyExit> {
27        let bytes = self.context.m_types_lock().mb_get_owned(message_handle);
28        self.signal_error(&bytes)
29    }
30}