multiversx_chain_vm/vm_hooks/vh_handler/
vh_call_value.rs

1use crate::{types::RawHandle, vm_err_msg, vm_hooks::VMHooksHandlerSource};
2use num_traits::Zero;
3
4use super::VMHooksManagedTypes;
5
6pub trait VMHooksCallValue: VMHooksHandlerSource + VMHooksManagedTypes {
7    fn check_not_payable(&self) {
8        if self.input_ref().egld_value > num_bigint::BigUint::zero() {
9            self.vm_error(vm_err_msg::NON_PAYABLE_FUNC_EGLD);
10        }
11        if self.esdt_num_transfers() > 0 {
12            self.vm_error(vm_err_msg::NON_PAYABLE_FUNC_ESDT);
13        }
14    }
15
16    fn load_egld_value(&self, dest: RawHandle) {
17        let value = self.input_ref().received_egld().clone();
18        self.m_types_lock().bi_overwrite(dest, value.into());
19    }
20
21    fn load_all_esdt_transfers(&self, dest_handle: RawHandle) {
22        let transfers = self.input_ref().received_esdt();
23        self.m_types_lock()
24            .mb_set_vec_of_esdt_payments(dest_handle, transfers);
25    }
26
27    fn esdt_num_transfers(&self) -> usize {
28        self.input_ref().received_esdt().len()
29    }
30}