@@ -14,6 +14,7 @@ use graph::data_source::CausalityRegion;
14
14
use graph:: prelude:: { async_trait, BigInt , BlockHash , BlockNumber , Logger , Value } ;
15
15
use graph:: prelude:: { BigDecimal , BlockPtr } ;
16
16
use graph:: schema:: InputSchema ;
17
+ use graph:: slog:: error;
17
18
use graph:: substreams:: Clock ;
18
19
use prost:: Message ;
19
20
@@ -42,7 +43,7 @@ impl BlockStreamMapper<Chain> for WasmBlockMapper {
42
43
43
44
async fn handle_substreams_block (
44
45
& self ,
45
- _logger : & Logger ,
46
+ logger : & Logger ,
46
47
clock : Clock ,
47
48
cursor : FirehoseCursor ,
48
49
block : Vec < u8 > ,
@@ -60,12 +61,20 @@ impl BlockStreamMapper<Chain> for WasmBlockMapper {
60
61
61
62
let block_data = block. into_boxed_slice ( ) ;
62
63
63
- // This is not a great idea: we really always need a timestamp; if
64
- // substreams doesn't give us one, we use a fixed one which will
65
- // lead to all kinds of strange behavior
66
- let timestamp = timestamp
67
- . map ( |ts| BlockTime :: since_epoch ( ts. seconds , ts. nanos as u32 ) )
68
- . unwrap_or ( BlockTime :: NONE ) ;
64
+ // `timestamp` is an `Option`, but it should always be set
65
+ let timestamp = match timestamp {
66
+ None => {
67
+ error ! ( logger,
68
+ "Substream block is missing a timestamp" ;
69
+ "cursor" => cursor. to_string( ) ,
70
+ "number" => number,
71
+ ) ;
72
+ return Err ( anyhow ! (
73
+ "Substream block is missing a timestamp at cursor {cursor}, block number {number}"
74
+ ) ) ;
75
+ }
76
+ Some ( ts) => BlockTime :: since_epoch ( ts. seconds , ts. nanos as u32 ) ,
77
+ } ;
69
78
70
79
Ok ( BlockStreamEvent :: ProcessWasmBlock (
71
80
block_ptr,
0 commit comments