generic basic account fetcher, nonce RPC
This commit is contained in:
		
							parent
							
								
									024e69138a
								
							
						
					
					
						commit
						e460421deb
					
				@ -27,6 +27,7 @@ use light::on_demand::{request, OnDemand};
 | 
				
			|||||||
use light::net::LightProtocol;
 | 
					use light::net::LightProtocol;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use ethcore::account_provider::{AccountProvider, DappId};
 | 
					use ethcore::account_provider::{AccountProvider, DappId};
 | 
				
			||||||
 | 
					use ethcore::basic_account::BasicAccount;
 | 
				
			||||||
use ethcore::encoded;
 | 
					use ethcore::encoded;
 | 
				
			||||||
use ethcore::ids::BlockId;
 | 
					use ethcore::ids::BlockId;
 | 
				
			||||||
use ethsync::LightSync;
 | 
					use ethsync::LightSync;
 | 
				
			||||||
@ -44,6 +45,8 @@ use v1::types::{
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
use v1::metadata::Metadata;
 | 
					use v1::metadata::Metadata;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use util::Address;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Light client `ETH` RPC.
 | 
					/// Light client `ETH` RPC.
 | 
				
			||||||
pub struct EthClient {
 | 
					pub struct EthClient {
 | 
				
			||||||
	sync: Arc<LightSync>,
 | 
						sync: Arc<LightSync>,
 | 
				
			||||||
@ -106,6 +109,20 @@ impl EthClient {
 | 
				
			|||||||
			None => future::err(err_no_context()).boxed()
 | 
								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 {
 | 
					impl Eth for EthClient {
 | 
				
			||||||
@ -152,19 +169,7 @@ impl Eth for EthClient {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn balance(&self, address: RpcH160, num: Trailing<BlockNumber>) -> BoxFuture<RpcU256, Error> {
 | 
						fn balance(&self, address: RpcH160, num: Trailing<BlockNumber>) -> BoxFuture<RpcU256, Error> {
 | 
				
			||||||
		let address = address.into();
 | 
							self.account(address.into(), num.0.into()).map(|acc| acc.balance.into()).boxed()
 | 
				
			||||||
 | 
					 | 
				
			||||||
		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()
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fn storage_at(&self, address: RpcH160, key: RpcU256, num: Trailing<BlockNumber>) -> BoxFuture<RpcH256, Error> {
 | 
						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> {
 | 
						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> {
 | 
						fn block_transaction_count_by_hash(&self, hash: RpcH256) -> BoxFuture<Option<RpcU256>, Error> {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user