#![allow(dead_code)]
use neo_devpack_solidity::ir;
use neo_devpack_solidity::runtime::{ExecutionResult, NeoRuntime, RuntimeConfig};
pub fn execute_bytecode(bytecode: &[u8]) -> ExecutionResult {
let mut runtime = NeoRuntime::new(RuntimeConfig::default()).expect("runtime");
runtime.execute(bytecode, &[]).expect("execution")
}
pub fn execute_bytecode_with_tokens(
bytecode: &[u8],
tokens: &[neo_devpack_solidity::neo::MethodToken],
) -> ExecutionResult {
let mut runtime = NeoRuntime::new(RuntimeConfig::default()).expect("runtime");
runtime
.execute_with_tokens(bytecode, &[], tokens)
.expect("execution")
}
pub fn execute_bytecode_with_input(bytecode: &[u8], input: &[u8]) -> ExecutionResult {
let mut runtime = NeoRuntime::new(RuntimeConfig::default()).expect("runtime");
runtime.execute(bytecode, input).expect("execution")
}
pub fn find_function<'a>(module: &'a ir::Module, name: &str) -> &'a ir::Function {
module
.functions
.iter()
.find(|f| f.name == name)
.unwrap_or_else(|| panic!("function '{name}' not found"))
}
pub fn get_all_instructions(function: &ir::Function) -> Vec<&ir::Instruction> {
function
.basic_blocks
.iter()
.flat_map(|block| block.instructions.iter())
.collect()
}
pub fn has_instruction<F>(function: &ir::Function, predicate: F) -> bool
where
F: Fn(&ir::Instruction) -> bool,
{
get_all_instructions(function).iter().any(|i| predicate(i))
}
pub fn assert_execution_returns(result: &ExecutionResult, expected: i64, message: &str) {
let failure = result
.exception
.as_ref()
.map(|ex| ex.message.as_str())
.unwrap_or("<no exception>");
assert!(result.is_success(), "{message}: got {failure}");
assert_eq!(
result.return_data,
expected.to_le_bytes().to_vec(),
"{message}"
);
}
pub fn assert_execution_success(result: &ExecutionResult, message: &str) {
let failure = result
.exception
.as_ref()
.map(|ex| ex.message.as_str())
.unwrap_or("<no exception>");
assert!(result.is_success(), "{message}: got {failure}");
}
pub fn assert_execution_failed(result: &ExecutionResult, message: &str) {
assert!(
!result.is_success(),
"{message}: expected failure but got success"
);
}