@@ -21,9 +21,9 @@ use std::{
2121 sync:: Arc ,
2222} ;
2323
24- use graph:: blockchain:: { Block , BlockHash , ChainIdentifier } ;
24+ use graph:: blockchain:: { Block , BlockHash , BlockPtrExt , ChainIdentifier } ;
2525use graph:: cheap_clone:: CheapClone ;
26- use graph:: prelude:: web3:: types:: H256 ;
26+ use graph:: prelude:: web3:: types:: { H256 , U256 } ;
2727use graph:: prelude:: {
2828 async_trait, serde_json as json, transaction_receipt:: LightTransactionReceipt , BlockNumber ,
2929 BlockPtr , CachedEthereumCall , CancelableError , ChainStore as ChainStoreTrait , Error ,
@@ -53,6 +53,14 @@ impl JsonBlock {
5353 data,
5454 }
5555 }
56+
57+ fn timestamp ( & self ) -> Option < U256 > {
58+ self . data
59+ . as_ref ( )
60+ . and_then ( |data| data. get ( "timestamp" ) )
61+ . and_then ( |ts| ts. as_str ( ) )
62+ . and_then ( |ts| U256 :: from_dec_str ( ts) . ok ( ) )
63+ }
5664}
5765
5866/// Tables in the 'public' database schema that store chain-specific data
@@ -1949,6 +1957,16 @@ impl ChainStore {
19491957 }
19501958}
19511959
1960+ fn json_block_to_block_ptr_ext ( json_block : & JsonBlock ) -> Result < BlockPtrExt , Error > {
1961+ let hash = json_block. ptr . hash . clone ( ) ;
1962+ let number = json_block. ptr . number ;
1963+ let parent_hash = json_block. parent_hash . clone ( ) ;
1964+ let timestamp = json_block. timestamp ( ) . unwrap ( ) ;
1965+ let ptr = BlockPtrExt :: try_from ( ( hash. as_h256 ( ) , number, parent_hash. as_h256 ( ) , timestamp) ) ?;
1966+
1967+ Ok ( ptr)
1968+ }
1969+
19521970#[ async_trait]
19531971impl ChainStoreTrait for ChainStore {
19541972 fn genesis_block_ptr ( & self ) -> Result < BlockPtr , Error > {
@@ -2145,23 +2163,11 @@ impl ChainStoreTrait for ChainStore {
21452163 async fn block_ptrs_by_numbers (
21462164 self : Arc < Self > ,
21472165 numbers : Vec < BlockNumber > ,
2148- ) -> Result < BTreeMap < BlockNumber , Vec < json:: Value > > , Error > {
2149- if ENV_VARS . store . disable_block_cache_for_lookup {
2150- let values = self
2151- . blocks_from_store_by_numbers ( numbers)
2152- . await ?
2153- . into_iter ( )
2154- . map ( |( num, blocks) | {
2155- (
2156- num,
2157- blocks
2158- . into_iter ( )
2159- . filter_map ( |block| block. data )
2160- . collect :: < Vec < _ > > ( ) ,
2161- )
2162- } )
2163- . collect ( ) ;
2164- Ok ( values)
2166+ ) -> Result < BTreeMap < BlockNumber , Vec < BlockPtrExt > > , Error > {
2167+ let result = if ENV_VARS . store . disable_block_cache_for_lookup {
2168+ let values = self . blocks_from_store_by_numbers ( numbers) . await ?;
2169+
2170+ values
21652171 } else {
21662172 let cached = self . recent_blocks_cache . get_block_ptrs_by_numbers ( & numbers) ;
21672173
@@ -2209,16 +2215,28 @@ impl ChainStoreTrait for ChainStore {
22092215 . map ( |( ptr, data) | ( ptr. block_number ( ) , vec ! [ data] ) )
22102216 . collect :: < BTreeMap < _ , _ > > ( ) ;
22112217
2212- let mut result: BTreeMap < BlockNumber , Vec < json :: Value > > = cached_map;
2218+ let mut result = cached_map;
22132219 for ( num, blocks) in stored {
2214- result
2215- . entry ( num)
2216- . or_default ( )
2217- . extend ( blocks. into_iter ( ) . filter_map ( |block| block. data ) ) ;
2220+ if !result. contains_key ( & num) {
2221+ result. insert ( num, blocks) ;
2222+ }
22182223 }
22192224
2220- Ok ( result)
2221- }
2225+ result
2226+ } ;
2227+
2228+ let ptrs = result
2229+ . into_iter ( )
2230+ . map ( |( num, blocks) | {
2231+ let ptrs = blocks
2232+ . into_iter ( )
2233+ . filter_map ( |block| json_block_to_block_ptr_ext ( & block) . ok ( ) )
2234+ . collect ( ) ;
2235+ ( num, ptrs)
2236+ } )
2237+ . collect ( ) ;
2238+
2239+ Ok ( ptrs)
22222240 }
22232241
22242242 async fn blocks ( self : Arc < Self > , hashes : Vec < BlockHash > ) -> Result < Vec < json:: Value > , Error > {
@@ -2520,10 +2538,8 @@ mod recent_blocks_cache {
25202538 . and_then ( |block| block. data . as_ref ( ) . map ( |data| ( & block. ptr , data) ) )
25212539 }
25222540
2523- fn get_block_by_number ( & self , number : BlockNumber ) -> Option < ( & BlockPtr , & json:: Value ) > {
2524- self . blocks
2525- . get ( & number)
2526- . and_then ( |block| block. data . as_ref ( ) . map ( |data| ( & block. ptr , data) ) )
2541+ fn get_block_by_number ( & self , number : BlockNumber ) -> Option < & JsonBlock > {
2542+ self . blocks . get ( & number)
25272543 }
25282544
25292545 fn get_ancestor (
@@ -2651,13 +2667,13 @@ mod recent_blocks_cache {
26512667 pub fn get_block_ptrs_by_numbers (
26522668 & self ,
26532669 numbers : & [ BlockNumber ] ,
2654- ) -> Vec < ( BlockPtr , json :: Value ) > {
2670+ ) -> Vec < ( BlockPtr , JsonBlock ) > {
26552671 let inner = self . inner . read ( ) ;
2656- let mut blocks: Vec < ( BlockPtr , json :: Value ) > = Vec :: new ( ) ;
2672+ let mut blocks: Vec < ( BlockPtr , JsonBlock ) > = Vec :: new ( ) ;
26572673
26582674 for & number in numbers {
2659- if let Some ( ( ptr , block) ) = inner. get_block_by_number ( number) {
2660- blocks. push ( ( ptr. clone ( ) , block. clone ( ) ) ) ;
2675+ if let Some ( block) = inner. get_block_by_number ( number) {
2676+ blocks. push ( ( block . ptr . clone ( ) , block. clone ( ) ) ) ;
26612677 }
26622678 }
26632679
0 commit comments