generic basic account fetcher, nonce RPC

This commit is contained in:
Robert Habermeier 2017-02-03 17:53:48 +01:00
parent 024e69138a
commit e460421deb

View File

@ -27,6 +27,7 @@ use light::on_demand::{request, OnDemand};
use light::net::LightProtocol;
use ethcore::account_provider::{AccountProvider, DappId};
use ethcore::basic_account::BasicAccount;
use ethcore::encoded;
use ethcore::ids::BlockId;
use ethsync::LightSync;
@ -44,6 +45,8 @@ use v1::types::{
};
use v1::metadata::Metadata;
use util::Address;
/// Light client `ETH` RPC.
pub struct EthClient {
sync: Arc<LightSync>,
@ -106,6 +109,20 @@ impl EthClient {
None => future::err(err_no_context()).boxed()
}
}
// helper for getting account info.
fn account(&self, address: Address, id: BlockId) -> BoxFuture<BasicAccount, Error> {
let (sync, on_demand) = (self.sync.clone(), self.on_demand.clone());
self.header(id).and_then(move |header| {
sync.with_context(|ctx| on_demand.account(ctx, request::Account {
header: header,
address: address,
}))
.map(|x| x.map_err(errors::from_on_demand_error).boxed())
.unwrap_or_else(|| future::err(err_no_context()).boxed())
}).boxed()
}
}
impl Eth for EthClient {
@ -152,19 +169,7 @@ impl Eth for EthClient {
}
fn balance(&self, address: RpcH160, num: Trailing<BlockNumber>) -> BoxFuture<RpcU256, Error> {
let address = address.into();
let sync = self.sync.clone();
let on_demand = self.on_demand.clone();
self.header(num.0.into()).and_then(move |header| {
sync.with_context(|ctx| on_demand.account(ctx, request::Account {
header: header,
address: address,
}))
.map(|x| x.map_err(errors::from_on_demand_error).boxed())
.unwrap_or_else(|| future::err(err_no_context()).boxed())
}).map(|acc| acc.balance.into()).boxed()
self.account(address.into(), num.0.into()).map(|acc| acc.balance.into()).boxed()
}
fn storage_at(&self, address: RpcH160, key: RpcU256, num: Trailing<BlockNumber>) -> BoxFuture<RpcH256, Error> {
@ -180,7 +185,7 @@ impl Eth for EthClient {
}
fn transaction_count(&self, address: RpcH160, num: Trailing<BlockNumber>) -> BoxFuture<RpcU256, Error> {
future::err(errors::unimplemented(None)).boxed()
self.account(address.into(), num.0.into()).map(|acc| acc.nonce.into()).boxed()
}
fn block_transaction_count_by_hash(&self, hash: RpcH256) -> BoxFuture<Option<RpcU256>, Error> {