multiversx_chain_vm/vm_hooks/
vh_source.rsuse std::{fmt::Debug, sync::MutexGuard};
use multiversx_chain_core::types::ReturnCode;
use crate::{
tx_mock::{BackTransfers, TxFunctionName, TxInput, TxLog, TxManagedTypes, TxResult},
types::{VMAddress, VMCodeMetadata, H256},
world_mock::{AccountData, BlockInfo},
};
pub trait VMHooksHandlerSource: Debug {
fn m_types_lock(&self) -> MutexGuard<TxManagedTypes>;
fn halt_with_error(&self, status: ReturnCode, message: &str) -> !;
fn vm_error(&self, message: &str) -> ! {
self.halt_with_error(ReturnCode::ExecutionFailed, message)
}
fn input_ref(&self) -> &TxInput;
fn current_address(&self) -> &VMAddress {
&self.input_ref().to
}
fn tx_hash(&self) -> H256 {
self.input_ref().tx_hash.clone()
}
fn random_next_bytes(&self, length: usize) -> Vec<u8>;
fn result_lock(&self) -> MutexGuard<TxResult>;
fn push_tx_log(&self, tx_log: TxLog) {
self.result_lock().result_logs.push(tx_log);
}
fn storage_read(&self, key: &[u8]) -> Vec<u8> {
self.storage_read_any_address(self.current_address(), key)
}
fn storage_read_any_address(&self, address: &VMAddress, key: &[u8]) -> Vec<u8>;
fn storage_write(&self, key: &[u8], value: &[u8]);
fn get_previous_block_info(&self) -> &BlockInfo;
fn get_current_block_info(&self) -> &BlockInfo;
fn back_transfers_lock(&self) -> MutexGuard<BackTransfers>;
fn account_data(&self, address: &VMAddress) -> Option<AccountData>;
fn current_account_data(&self) -> AccountData {
self.account_data(&self.input_ref().to)
.expect("missing current account")
}
fn account_code(&self, address: &VMAddress) -> Vec<u8>;
fn perform_async_call(
&self,
to: VMAddress,
egld_value: num_bigint::BigUint,
func_name: TxFunctionName,
args: Vec<Vec<u8>>,
) -> !;
fn perform_execute_on_dest_context(
&self,
to: VMAddress,
egld_value: num_bigint::BigUint,
func_name: TxFunctionName,
args: Vec<Vec<u8>>,
) -> Vec<Vec<u8>>;
fn perform_deploy(
&self,
egld_value: num_bigint::BigUint,
contract_code: Vec<u8>,
code_metadata: VMCodeMetadata,
args: Vec<Vec<u8>>,
) -> (VMAddress, Vec<Vec<u8>>);
fn perform_transfer_execute(
&self,
to: VMAddress,
egld_value: num_bigint::BigUint,
func_name: TxFunctionName,
arguments: Vec<Vec<u8>>,
);
}