diff --git a/src/evm/env.rs b/src/evm/env.rs index 2724159a4..7d6acadb4 100644 --- a/src/evm/env.rs +++ b/src/evm/env.rs @@ -1,4 +1,5 @@ use util::hash::*; +use util::uint::*; pub struct Env; @@ -18,6 +19,35 @@ impl Env { //unimplemented!(); } + + pub fn balance(&self, _address: &Address) -> U256 { + unimplemented!(); + } + + pub fn blockhash(&self, _number: &U256) -> H256 { + unimplemented!(); + } + + /// Creates new contract + /// Returns new contract address gas used + pub fn create(&self, _gas: u64, _endowment: &U256, _code: &[u8]) -> (Address, u64) { + unimplemented!(); + } + + /// Calls existing contract + /// Returns call output and gas used + pub fn call(&self, _gas: u64, _call_gas: u64, _receive_address: &H256, _value: &U256, _data: &[u8], _code_address: &Address) -> Option<(Vec, u64)>{ + unimplemented!(); + } + + /// Returns code at given address + pub fn extcode(&self, _address: &Address) -> Vec { + unimplemented!(); + } + + pub fn log(&self, _topics: &[H256], _data: &[u8]) { + unimplemented!(); + } } diff --git a/src/evm/jit.rs b/src/evm/jit.rs index ac796e0f1..3af980207 100644 --- a/src/evm/jit.rs +++ b/src/evm/jit.rs @@ -34,6 +34,12 @@ impl<'a> FromJit<&'a evmjit::I256> for H256 { } } +impl<'a> FromJit<&'a evmjit::I256> for Address { + fn from_jit(input: &'a evmjit::I256) -> Self { + Address::from(H256::from_jit(input)) + } +} + impl IntoJit for U256 { fn into_jit(self) -> evmjit::I256 { let mut res: evmjit::I256 = unsafe { mem::uninitialized() }; @@ -115,12 +121,20 @@ impl<'a> evmjit::Env for EnvAdapter<'a> { } } - fn balance(&self, _address: *const evmjit::I256, _out_value: *mut evmjit::I256) { - unimplemented!(); + fn balance(&self, address: *const evmjit::I256, out_value: *mut evmjit::I256) { + unsafe { + let a = Address::from_jit(&*address); + let o = self.env.balance(&a); + *out_value = o.into_jit(); + } } - fn blockhash(&self, _number: *const evmjit::I256, _out_hash: *mut evmjit::I256) { - unimplemented!(); + fn blockhash(&self, number: *const evmjit::I256, out_hash: *mut evmjit::I256) { + unsafe { + let n = U256::from_jit(&*number); + let o = self.env.blockhash(&n); + *out_hash = o.into_jit(); + } } fn create(&mut self, @@ -212,6 +226,16 @@ mod tests { assert_eq!(h, h2); } + #[test] + fn test_to_and_from_address() { + use std::str::FromStr; + + let a = Address::from_str("2adc25665018aa1fe0e6bc666dac8fc2697ff9ba").unwrap(); + let j = a.clone().into_jit(); + let a2 = Address::from_jit(&j); + assert_eq!(a, a2); + } + #[test] fn test_env_adapter() {