multiversx_chain_vm/host/vm_hooks/vh_handler/
vh_endpoint_finish.rs1use multiversx_chain_vm_executor::VMHooksEarlyExit;
2use num_bigint::{BigInt, BigUint};
3
4use crate::{host::vm_hooks::VMHooksContext, types::RawHandle};
5
6use super::VMHooksHandler;
7
8impl<C: VMHooksContext> VMHooksHandler<C> {
11 pub fn finish_slice_u8(&mut self, slice: &[u8]) -> Result<(), VMHooksEarlyExit> {
12 let mut v = vec![0u8; slice.len()];
13 v.copy_from_slice(slice);
14 let mut tx_result = self.context.result_lock();
15 tx_result.result_values.push(v);
16
17 Ok(())
18 }
19
20 pub fn finish_big_int_raw(&mut self, handle: RawHandle) -> Result<(), VMHooksEarlyExit> {
21 let bi_bytes = self.bi_get_signed_bytes(handle)?;
22 let mut tx_result = self.context.result_lock();
23
24 tx_result.result_values.push(bi_bytes);
25
26 Ok(())
27 }
28
29 pub fn finish_big_uint_raw(&mut self, handle: RawHandle) -> Result<(), VMHooksEarlyExit> {
30 let bu_bytes = self.bi_get_unsigned_bytes(handle)?;
31 let mut tx_result = self.context.result_lock();
32 tx_result.result_values.push(bu_bytes);
33
34 Ok(())
35 }
36
37 pub fn finish_managed_buffer_raw(&mut self, handle: RawHandle) -> Result<(), VMHooksEarlyExit> {
38 self.use_gas(
39 self.gas_schedule()
40 .managed_buffer_api_cost
41 .m_buffer_get_bytes,
42 )?;
43
44 let bytes = self.context.m_types_lock().mb_get_owned(handle);
45 self.finish_slice_u8(&bytes)
46 }
47
48 pub fn finish_i64(&mut self, value: i64) -> Result<(), VMHooksEarlyExit> {
49 if value == 0 {
50 self.finish_slice_u8(&[])
51 } else {
52 self.finish_slice_u8(BigInt::from(value).to_signed_bytes_be().as_slice())
53 }
54 }
55
56 pub fn finish_u64(&mut self, value: u64) -> Result<(), VMHooksEarlyExit> {
57 if value == 0 {
58 self.finish_slice_u8(&[])
59 } else {
60 self.finish_slice_u8(BigUint::from(value).to_bytes_be().as_slice())
61 }
62 }
63}