1- use super :: { EthereumRPC , DebugRPC , Either , RPCTransaction , RPCTrace , RPCStep , RPCBlock , RPCLog , RPCReceipt , RPCLogFilter , RPCBlockTrace , RPCDump , RPCDumpAccount , RPCTraceConfig } ;
1+ use super :: { EthereumRPC , FilterRPC , DebugRPC , Either , RPCTransaction , RPCTrace , RPCStep , RPCBlock , RPCLog , RPCReceipt , RPCLogFilter , RPCBlockTrace , RPCDump , RPCDumpAccount , RPCTraceConfig } ;
22use super :: util:: * ;
33use super :: filter:: * ;
44use super :: serialize:: * ;
@@ -23,31 +23,44 @@ use std::marker::PhantomData;
2323use jsonrpc_macros:: Trailing ;
2424
2525pub struct MinerEthereumRPC < P : Patch + Send > {
26- filter : Mutex < FilterManager > ,
2726 state : Arc < Mutex < MinerState > > ,
2827 channel : Sender < bool > ,
2928 _patch : PhantomData < P > ,
3029}
3130
31+ pub struct MinerFilterRPC < P : Patch + Send > {
32+ filter : Mutex < FilterManager > ,
33+ _patch : PhantomData < P > ,
34+ }
35+
3236pub struct MinerDebugRPC < P : Patch + Send > {
3337 state : Arc < Mutex < MinerState > > ,
3438 _patch : PhantomData < P > ,
3539}
3640
3741unsafe impl < P : Patch + Send > Sync for MinerEthereumRPC < P > { }
42+ unsafe impl < P : Patch + Send > Sync for MinerFilterRPC < P > { }
3843unsafe impl < P : Patch + Send > Sync for MinerDebugRPC < P > { }
3944
4045impl < P : Patch + Send > MinerEthereumRPC < P > {
4146 pub fn new ( state : Arc < Mutex < MinerState > > , channel : Sender < bool > ) -> Self {
4247 MinerEthereumRPC {
43- filter : Mutex :: new ( FilterManager :: new ( state. clone ( ) ) ) ,
4448 channel,
4549 state,
4650 _patch : PhantomData ,
4751 }
4852 }
4953}
5054
55+ impl < P : Patch + Send > MinerFilterRPC < P > {
56+ pub fn new ( state : Arc < Mutex < MinerState > > ) -> Self {
57+ MinerFilterRPC {
58+ filter : Mutex :: new ( FilterManager :: new ( state) ) ,
59+ _patch : PhantomData ,
60+ }
61+ }
62+ }
63+
5164impl < P : Patch + Send > MinerDebugRPC < P > {
5265 pub fn new ( state : Arc < Mutex < MinerState > > ) -> Self {
5366 MinerDebugRPC {
@@ -517,12 +530,21 @@ impl<P: 'static + Patch + Send> EthereumRPC for MinerEthereumRPC<P> {
517530 Ok ( Vec :: new ( ) )
518531 }
519532
533+ fn logs ( & self , log : RPCLogFilter ) -> Result < Vec < RPCLog > , Error > {
534+ let state = self . state . lock ( ) . unwrap ( ) ;
535+
536+ match from_log_filter ( & state, log) {
537+ Ok ( filter) => Ok ( get_logs ( & state, filter) ?) ,
538+ Err ( _) => Ok ( Vec :: new ( ) ) ,
539+ }
540+ }
541+ }
542+
543+ impl < P : ' static + Patch + Send > FilterRPC for MinerFilterRPC < P > {
520544 fn new_filter ( & self , log : RPCLogFilter ) -> Result < String , Error > {
521- let filter = {
522- let state = self . state . lock ( ) . unwrap ( ) ;
523- from_log_filter ( & state, log) ?
524- } ;
525- let id = self . filter . lock ( ) . unwrap ( ) . install_log_filter ( filter) ;
545+ let mut filter = self . filter . lock ( ) . unwrap ( ) ;
546+ let log_filter = filter. from_log_filter ( log) ?;
547+ let id = filter. install_log_filter ( log_filter) ;
526548 Ok ( format ! ( "0x{:x}" , id) )
527549 }
528550
@@ -551,15 +573,6 @@ impl<P: 'static + Patch + Send> EthereumRPC for MinerEthereumRPC<P> {
551573 let id = U256 :: from_str ( & id) ?. as_usize ( ) ;
552574 Ok ( self . filter . lock ( ) . unwrap ( ) . get_logs ( id) ?)
553575 }
554-
555- fn logs ( & self , log : RPCLogFilter ) -> Result < Vec < RPCLog > , Error > {
556- let state = self . state . lock ( ) . unwrap ( ) ;
557-
558- match from_log_filter ( & state, log) {
559- Ok ( filter) => Ok ( get_logs ( & state, filter) ?) ,
560- Err ( _) => Ok ( Vec :: new ( ) ) ,
561- }
562- }
563576}
564577
565578impl < P : ' static + Patch + Send > DebugRPC for MinerDebugRPC < P > {
0 commit comments