fuel-vm 0.35.4

FuelVM interpreter.
Documentation
use super::*;
use crate::{
    interpreter::{
        memory::Memory,
        PanicContext,
    },
    storage::MemoryStorage,
};
use fuel_tx::Contract;

#[test]
fn test_load_contract() -> Result<(), RuntimeError> {
    let mut storage = MemoryStorage::new(Default::default(), Default::default());
    let mut memory: Memory<MEM_SIZE> = vec![1u8; MEM_SIZE].try_into().unwrap();
    let mut pc = 4;
    let hp = 2000;
    let mut ssp = 1000;
    let mut sp = 1000;
    let fp = 0;

    let contract_id = ContractId::from([4u8; 32]);

    let contract_id_mem_address: Word = 32;
    let offset = 20;
    let num_bytes = 40;

    memory[contract_id_mem_address as usize
        ..contract_id_mem_address as usize + ContractId::LEN]
        .copy_from_slice(contract_id.as_ref());
    storage
        .storage_contract_insert(&contract_id, &Contract::from(vec![5u8; 400]))
        .unwrap();

    let mut panic_context = PanicContext::None;
    let input_contracts = vec![contract_id];
    let input = LoadContractCodeCtx {
        contract_max_size: 100,
        storage: &storage,
        memory: &mut memory,
        input_contracts: InputContracts::new(input_contracts.iter(), &mut panic_context),
        ssp: RegMut::new(&mut ssp),
        sp: RegMut::new(&mut sp),
        fp: Reg::new(&fp),
        hp: Reg::new(&hp),
        pc: RegMut::new(&mut pc),
    };
    input.load_contract_code(contract_id_mem_address, offset, num_bytes)?;
    assert_eq!(pc, 8);

    Ok(())
}

#[test]
fn test_code_copy() -> Result<(), RuntimeError> {
    let mut storage = MemoryStorage::new(Default::default(), Default::default());
    let mut memory: Memory<MEM_SIZE> = vec![1u8; MEM_SIZE].try_into().unwrap();
    let mut pc = 4;

    let contract_id = ContractId::from([4u8; 32]);

    let dest_mem_address = 2001;
    let contract_id_mem_address: Word = 32;
    let offset = 20;
    let num_bytes = 40;

    memory[contract_id_mem_address as usize
        ..contract_id_mem_address as usize + ContractId::LEN]
        .copy_from_slice(contract_id.as_ref());
    storage
        .storage_contract_insert(&contract_id, &Contract::from(vec![5u8; 400]))
        .unwrap();

    let input_contracts = vec![contract_id];
    let mut panic_context = PanicContext::None;
    let input = CodeCopyCtx {
        storage: &storage,
        memory: &mut memory,
        input_contracts: InputContracts::new(input_contracts.iter(), &mut panic_context),
        pc: RegMut::new(&mut pc),
        owner: OwnershipRegisters {
            sp: 1000,
            ssp: 1000,
            hp: 2000,
            prev_hp: VM_MAX_RAM - 1,
            context: Context::Call {
                block_height: Default::default(),
            },
        },
    };
    input.code_copy(dest_mem_address, contract_id_mem_address, offset, num_bytes)?;
    assert_eq!(pc, 8);

    Ok(())
}