address balance extern provided for wasm

This commit is contained in:
fro 2017-10-04 19:09:18 +03:00
parent b7c2a30d7d
commit 6956d218b5
2 changed files with 22 additions and 1 deletions

View File

@ -32,6 +32,11 @@ pub const SIGNATURES: &'static [UserFunctionDescriptor] = &[
&[I32; 2], &[I32; 2],
Some(I32), Some(I32),
), ),
Static(
"_balance",
&[I32; 2],
None,
),
Static( Static(
"_malloc", "_malloc",
&[I32], &[I32],

View File

@ -163,6 +163,19 @@ impl<'a, 'b> Runtime<'a, 'b> {
Ok(Some(0.into())) Ok(Some(0.into()))
} }
/// Fetches balance for address
pub fn balance(&mut self, context: InterpreterCallerContext)
-> Result<Option<interpreter::RuntimeValue>, InterpreterError>
{
let mut context = context;
let return_ptr = context.value_stack.pop_as::<i32>()? 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 /// Pass suicide to state runtime
pub fn suicide(&mut self, context: InterpreterCallerContext) pub fn suicide(&mut self, context: InterpreterCallerContext)
-> Result<Option<interpreter::RuntimeValue>, InterpreterError> -> Result<Option<interpreter::RuntimeValue>, InterpreterError>
@ -664,6 +677,9 @@ impl<'a, 'b> interpreter::UserFunctionExecutor<UserTrap> for Runtime<'a, 'b> {
"_storage_write" => { "_storage_write" => {
self.storage_write(context) self.storage_write(context)
}, },
"_balance" => {
self.balance(context)
},
"_suicide" => { "_suicide" => {
self.suicide(context) self.suicide(context)
}, },