From fed853593bc7863a0d16b4146181f1fe72d962f0 Mon Sep 17 00:00:00 2001 From: Marek Kotewicz Date: Sun, 10 Apr 2016 20:42:03 +0200 Subject: [PATCH] fixed eth_getLogs (#915) * fixed eth_getLogs * removed empty lines --- rpc/src/v1/helpers/poll_manager.rs | 1 - rpc/src/v1/impls/eth.rs | 23 +++++++++++++++++++++-- rpc/src/v1/traits/eth.rs | 5 ++++- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/rpc/src/v1/helpers/poll_manager.rs b/rpc/src/v1/helpers/poll_manager.rs index 9735d7d5d..bc3518830 100644 --- a/rpc/src/v1/helpers/poll_manager.rs +++ b/rpc/src/v1/helpers/poll_manager.rs @@ -61,7 +61,6 @@ impl PollManager where T: Timer { } // Implementation is always using `poll_mut` - #[cfg(test)] /// Get a reference to stored poll filter pub fn poll(&mut self, id: &PollId) -> Option<&F> { self.polls.prune(); diff --git a/rpc/src/v1/impls/eth.rs b/rpc/src/v1/impls/eth.rs index ad4b037df..8e1ca72fb 100644 --- a/rpc/src/v1/impls/eth.rs +++ b/rpc/src/v1/impls/eth.rs @@ -636,10 +636,11 @@ impl EthFilter for EthFilterClient to_value(&diff) }, - PollFilter::Logs(ref mut block_number, ref mut filter) => { + PollFilter::Logs(ref mut block_number, ref filter) => { + let mut filter = filter.clone(); filter.from_block = BlockId::Number(*block_number); filter.to_block = BlockId::Latest; - let logs = client.logs(filter.clone()) + let logs = client.logs(filter) .into_iter() .map(From::from) .collect::>(); @@ -654,6 +655,24 @@ impl EthFilter for EthFilterClient }) } + fn filter_logs(&self, params: Params) -> Result { + from_params::<(Index,)>(params) + .and_then(|(index,)| { + let mut polls = self.polls.lock().unwrap(); + match polls.poll(&index.value()) { + Some(&PollFilter::Logs(ref _block_number, ref filter)) => { + let logs = take_weak!(self.client).logs(filter.clone()) + .into_iter() + .map(From::from) + .collect::>(); + to_value(&logs) + }, + // just empty array + _ => Ok(Value::Array(vec![] as Vec)), + } + }) + } + fn uninstall_filter(&self, params: Params) -> Result { from_params::<(Index,)>(params) .and_then(|(index,)| { diff --git a/rpc/src/v1/traits/eth.rs b/rpc/src/v1/traits/eth.rs index 5d36da670..a28f72c5c 100644 --- a/rpc/src/v1/traits/eth.rs +++ b/rpc/src/v1/traits/eth.rs @@ -190,6 +190,9 @@ pub trait EthFilter: Sized + Send + Sync + 'static { /// Returns filter changes since last poll. fn filter_changes(&self, _: Params) -> Result { rpc_unimplemented!() } + /// Returns all logs matching given filter (in a range 'from' - 'to'). + fn filter_logs(&self, _: Params) -> Result { rpc_unimplemented!() } + /// Uninstalls filter. fn uninstall_filter(&self, _: Params) -> Result { rpc_unimplemented!() } @@ -200,7 +203,7 @@ pub trait EthFilter: Sized + Send + Sync + 'static { delegate.add_method("eth_newBlockFilter", EthFilter::new_block_filter); delegate.add_method("eth_newPendingTransactionFilter", EthFilter::new_pending_transaction_filter); delegate.add_method("eth_getFilterChanges", EthFilter::filter_changes); - delegate.add_method("eth_getFilterLogs", EthFilter::filter_changes); + delegate.add_method("eth_getFilterLogs", EthFilter::filter_logs); delegate.add_method("eth_uninstallFilter", EthFilter::uninstall_filter); delegate }