@@ -369,7 +369,7 @@ impl EthereumAdapter {
369
369
from : BlockNumber ,
370
370
to : BlockNumber ,
371
371
addresses : Vec < H160 > ,
372
- ) -> impl Stream < Item = Trace , Error = Error > + Send {
372
+ ) -> impl futures03 :: Stream < Item = Result < Trace , Error > > + Send {
373
373
if from > to {
374
374
panic ! (
375
375
"Can not produce a call stream on a backwards block range: from = {}, to = {}" ,
@@ -385,34 +385,37 @@ impl EthereumAdapter {
385
385
386
386
let eth = self ;
387
387
let logger = logger. clone ( ) ;
388
- stream:: unfold ( from, move |start| {
389
- if start > to {
390
- return None ;
391
- }
392
- let end = ( start + step_size - 1 ) . min ( to) ;
393
- let new_start = end + 1 ;
394
- if start == end {
395
- debug ! ( logger, "Requesting traces for block {}" , start) ;
396
- } else {
397
- debug ! ( logger, "Requesting traces for blocks [{}, {}]" , start, end) ;
388
+
389
+ futures03:: stream:: try_unfold ( from, move |start| {
390
+ let eth = eth. clone ( ) ;
391
+ let logger = logger. clone ( ) ;
392
+ let subgraph_metrics = subgraph_metrics. clone ( ) ;
393
+ let addresses = addresses. clone ( ) ;
394
+
395
+ async move {
396
+ if start > to {
397
+ return Ok :: < Option < _ > , Error > ( None ) ;
398
+ }
399
+
400
+ let end = ( start + step_size - 1 ) . min ( to) ;
401
+ let new_start = end + 1 ;
402
+
403
+ if start == end {
404
+ debug ! ( logger, "Requesting traces for block {}" , start) ;
405
+ } else {
406
+ debug ! ( logger, "Requesting traces for blocks [{}, {}]" , start, end) ;
407
+ }
408
+
409
+ let traces = eth
410
+ . traces ( logger, subgraph_metrics, start, end, addresses)
411
+ . await ?;
412
+ Ok ( Some ( (
413
+ futures03:: stream:: iter ( traces. into_iter ( ) . map ( |t| Ok :: < _ , Error > ( t) ) ) ,
414
+ new_start,
415
+ ) ) )
398
416
}
399
- Some ( graph:: futures01:: future:: ok ( (
400
- eth. clone ( )
401
- . traces (
402
- logger. cheap_clone ( ) ,
403
- subgraph_metrics. clone ( ) ,
404
- start,
405
- end,
406
- addresses. clone ( ) ,
407
- )
408
- . boxed ( )
409
- . compat ( ) ,
410
- new_start,
411
- ) ) )
412
417
} )
413
- . buffered ( ENV_VARS . block_batch_size )
414
- . map ( stream:: iter_ok)
415
- . flatten ( )
418
+ . try_flatten ( )
416
419
}
417
420
418
421
fn log_stream (
@@ -899,14 +902,13 @@ impl EthereumAdapter {
899
902
900
903
Box :: new (
901
904
eth. trace_stream ( logger, subgraph_metrics, from, to, addresses)
902
- . filter_map ( |trace| EthereumCall :: try_from_trace ( & trace) )
903
- . filter ( move |call| {
904
- // `trace_filter` can only filter by calls `to` an address and
905
- // a block range. Since subgraphs are subscribing to calls
906
- // for a specific contract function an additional filter needs
907
- // to be applied
908
- call_filter. matches ( call)
909
- } ) ,
905
+ . try_filter_map ( move |trace| {
906
+ let maybe_call = EthereumCall :: try_from_trace ( & trace)
907
+ . filter ( |call| call_filter. matches ( call) ) ;
908
+ futures03:: future:: ready ( Ok ( maybe_call) )
909
+ } )
910
+ . boxed ( )
911
+ . compat ( ) ,
910
912
)
911
913
}
912
914
@@ -989,16 +991,15 @@ impl EthereumAdapter {
989
991
) -> Result < Vec < EthereumCall > , Error > {
990
992
let eth = self . clone ( ) ;
991
993
let addresses = Vec :: new ( ) ;
992
- let traces = eth
994
+ let traces: Vec < Trace > = eth
993
995
. trace_stream (
994
996
logger,
995
997
subgraph_metrics. clone ( ) ,
996
998
block_number,
997
999
block_number,
998
1000
addresses,
999
1001
)
1000
- . collect ( )
1001
- . compat ( )
1002
+ . try_collect ( )
1002
1003
. await ?;
1003
1004
1004
1005
// `trace_stream` returns all of the traces for the block, and this
0 commit comments