diff --git a/ethcore/wasm/src/env.rs b/ethcore/wasm/src/env.rs index 8f4fa264f..a09ceea86 100644 --- a/ethcore/wasm/src/env.rs +++ b/ethcore/wasm/src/env.rs @@ -32,6 +32,11 @@ pub const SIGNATURES: &'static [UserFunctionDescriptor] = &[ &[I32; 2], Some(I32), ), + Static( + "_balance", + &[I32; 2], + None, + ), Static( "_malloc", &[I32], @@ -163,4 +168,4 @@ pub fn native_bindings<'a>(runtime: &'a mut Runtime) -> interpreter::UserDefined globals: ::std::collections::HashMap::new(), functions: ::std::borrow::Cow::from(SIGNATURES), } -} \ No newline at end of file +} diff --git a/ethcore/wasm/src/runtime.rs b/ethcore/wasm/src/runtime.rs index 5e18ce216..fa30d7753 100644 --- a/ethcore/wasm/src/runtime.rs +++ b/ethcore/wasm/src/runtime.rs @@ -163,6 +163,19 @@ impl<'a, 'b> Runtime<'a, 'b> { Ok(Some(0.into())) } + /// Fetches balance for address + pub fn balance(&mut self, context: InterpreterCallerContext) + -> Result, InterpreterError> + { + let mut context = context; + let return_ptr = context.value_stack.pop_as::()? as u32; + let address = self.pop_address(&mut context)?; + let balance = self.ext.balance(&address).map_err(|_| UserTrap::BalanceQueryError)?; + let value: H256 = balance.into(); + self.memory.set(return_ptr, &*value)?; + Ok(None) + } + /// Pass suicide to state runtime pub fn suicide(&mut self, context: InterpreterCallerContext) -> Result, InterpreterError> @@ -664,6 +677,9 @@ impl<'a, 'b> interpreter::UserFunctionExecutor for Runtime<'a, 'b> { "_storage_write" => { self.storage_write(context) }, + "_balance" => { + self.balance(context) + }, "_suicide" => { self.suicide(context) },