11use alloy:: primitives:: { B256 , B64 } ;
22use alloy:: providers:: { Provider , ProviderBuilder } ;
3- use alloy_rpc_types:: BlockTransactions ;
3+ use alloy_rpc_types:: { BlockTransactions , FilterBlockOption } ;
44use futures03:: { future:: BoxFuture , stream:: FuturesUnordered } ;
55use graph:: abi;
66use graph:: abi:: DynSolValueExt ;
@@ -338,6 +338,27 @@ impl EthereumAdapter {
338338
339339 async move {
340340 let start = Instant :: now ( ) ;
341+ let block_option = FilterBlockOption :: default ( )
342+ . with_from_block ( ( from as u64 ) . into ( ) )
343+ . with_to_block ( ( to as u64 ) . into ( ) ) ;
344+ let address: alloy_rpc_types:: FilterSet < alloy:: primitives:: Address > = filter
345+ . contracts
346+ . iter ( )
347+ . map ( |c| h160_to_address ( c) )
348+ . collect ( ) ;
349+ let topic0 = convert_topic ( & Some ( filter. event_signatures . clone ( ) ) ) ;
350+ let topic1 = convert_topic ( & filter. topic1 ) ;
351+ let topic2 = convert_topic ( & filter. topic2 ) ;
352+ let topic3 = convert_topic ( & filter. topic3 ) ;
353+ let topics = [ topic0, topic1, topic2, topic3] ;
354+ let filter2 = alloy_rpc_types:: Filter {
355+ block_option,
356+ address,
357+ topics,
358+ } ;
359+ let result1 = eth_adapter. alloy . get_logs ( & filter2) . await . unwrap ( ) ;
360+ let result2 = convert_log ( & result1) ;
361+
341362 // Create a log filter
342363 let log_filter: Filter = FilterBuilder :: default ( )
343364 . from_block ( from. into ( ) )
@@ -352,15 +373,20 @@ impl EthereumAdapter {
352373 . build ( ) ;
353374
354375 // Request logs from client
355- let result = eth_adapter. web3 . eth ( ) . logs ( log_filter) . boxed ( ) . await ;
376+ let result3 = eth_adapter. web3 . eth ( ) . logs ( log_filter) . boxed ( ) . await ;
377+ match & result3 {
378+ Ok ( res) => assert_eq ! ( & result2, res) ,
379+ Err ( _) => { }
380+ }
381+ // assert_eq!(Ok(result2), result3);
356382 let elapsed = start. elapsed ( ) . as_secs_f64 ( ) ;
357383 provider_metrics. observe_request ( elapsed, "eth_getLogs" , & provider) ;
358384 subgraph_metrics. observe_request ( elapsed, "eth_getLogs" , & provider) ;
359- if result . is_err ( ) {
385+ if result3 . is_err ( ) {
360386 provider_metrics. add_error ( "eth_getLogs" , & provider) ;
361387 subgraph_metrics. add_error ( "eth_getLogs" , & provider) ;
362388 }
363- result
389+ Ok ( result2 )
364390 }
365391 } )
366392 . await
@@ -1066,19 +1092,9 @@ impl EthereumAdapter {
10661092 to : BlockNumber ,
10671093 log_filter : EthereumLogFilter ,
10681094 ) -> DynTryFuture < ' static , Vec < Log > , Error > {
1069- info ! ( logger, "!!!! logs_in_block_range" ) ;
10701095 let eth: Self = self . cheap_clone ( ) ;
10711096 let logger = logger. clone ( ) ;
10721097
1073- info ! ( logger, "FILTERS1: {:?}" , log_filter) ;
1074- for f in log_filter. clone ( ) . eth_get_logs_filters ( ) {
1075- info ! ( logger, "F2: {}" , f)
1076- }
1077- // info!(logger, "FILTERS1:");
1078- // for f in &log_filter {
1079- // info!(logger, "F1: {}", f)
1080- // }
1081-
10821098 futures03:: stream:: iter ( log_filter. eth_get_logs_filters ( ) . map ( move |filter| {
10831099 eth. cheap_clone ( ) . log_stream (
10841100 logger. cheap_clone ( ) ,
@@ -1692,7 +1708,6 @@ impl EthereumAdapterTrait for EthereumAdapter {
16921708 logger : & Logger ,
16931709 block : LightEthereumBlock ,
16941710 ) -> Result < EthereumBlock , IngestorError > {
1695- info ! ( logger, "!!!! load_full_block" ) ;
16961711 let web3 = Arc :: clone ( & self . web3 ) ;
16971712 let logger = logger. clone ( ) ;
16981713 let block_hash = block. hash . expect ( "block is missing block hash" ) ;
@@ -1706,6 +1721,7 @@ impl EthereumAdapterTrait for EthereumAdapter {
17061721 transaction_receipts : Vec :: new ( ) ,
17071722 } ) ;
17081723 }
1724+ info ! ( logger, "!!!! load_full_block" ) ;
17091725 let hashes: Vec < _ > = block. transactions . iter ( ) . map ( |txn| txn. hash ) . collect ( ) ;
17101726
17111727 let supports_block_receipts = self
@@ -2673,6 +2689,7 @@ async fn fetch_transaction_receipts_in_batch(
26732689 block_hash : H256 ,
26742690 logger : Logger ,
26752691) -> Result < Vec < Arc < TransactionReceipt > > , IngestorError > {
2692+ info ! ( logger, "!!!! fetch_transaction_receipts_in_batch" ) ;
26762693 let batching_web3 = Web3 :: new ( Batch :: new ( web3. transport ( ) . clone ( ) ) ) ;
26772694 let eth = batching_web3. eth ( ) ;
26782695 let receipt_futures = hashes
@@ -2775,6 +2792,7 @@ async fn fetch_block_receipts_with_retry(
27752792 block_hash : H256 ,
27762793 logger : Logger ,
27772794) -> Result < Vec < Arc < TransactionReceipt > > , IngestorError > {
2795+ info ! ( logger, "!!!! fetch_block_receipts_with_retry" ) ;
27782796 let logger = logger. cheap_clone ( ) ;
27792797 let retry_log_message = format ! ( "eth_getBlockReceipts RPC call for block {:?}" , block_hash) ;
27802798
@@ -2819,6 +2837,7 @@ async fn fetch_transaction_receipt_with_retry(
28192837 block_hash : H256 ,
28202838 logger : Logger ,
28212839) -> Result < Arc < TransactionReceipt > , IngestorError > {
2840+ info ! ( logger, "!!!! fetch_transaction_receipt_with_retry" ) ;
28222841 let logger = logger. cheap_clone ( ) ;
28232842 let retry_log_message = format ! (
28242843 "eth_getTransactionReceipt RPC call for transaction {:?}" ,
@@ -2903,7 +2922,6 @@ async fn get_logs_and_transactions(
29032922 unified_api_version : & UnifiedMappingApiVersion ,
29042923) -> Result < Vec < EthereumTrigger > , anyhow:: Error > {
29052924 // Obtain logs externally
2906- info ! ( logger, "FILTER: {:?}" , log_filter) ;
29072925 let logs = adapter
29082926 . logs_in_block_range (
29092927 logger,
@@ -2914,11 +2932,6 @@ async fn get_logs_and_transactions(
29142932 )
29152933 . await ?;
29162934
2917- info ! ( logger, "LOGS: " ) ;
2918- for log in & logs {
2919- info ! ( logger, "L: {:?}" , log)
2920- }
2921-
29222935 // Not all logs have associated transaction hashes, nor do all triggers require them.
29232936 // We also restrict receipts retrieval for some api versions.
29242937 let transaction_hashes_by_block: HashMap < H256 , HashSet < H256 > > = logs
@@ -2977,11 +2990,6 @@ async fn get_transaction_receipts_for_transaction_hashes(
29772990 subgraph_metrics : Arc < SubgraphEthRpcMetrics > ,
29782991 logger : Logger ,
29792992) -> Result < HashMap < H256 , Arc < TransactionReceipt > > , anyhow:: Error > {
2980- info ! (
2981- logger,
2982- "!!!! get_transaction_receipts_for_transaction_hashes"
2983- ) ;
2984-
29852993 use std:: collections:: hash_map:: Entry :: Vacant ;
29862994
29872995 let mut receipts_by_hash: HashMap < H256 , Arc < TransactionReceipt > > = HashMap :: new ( ) ;
@@ -2990,7 +2998,10 @@ async fn get_transaction_receipts_for_transaction_hashes(
29902998 if transaction_hashes_by_block. is_empty ( ) {
29912999 return Ok ( receipts_by_hash) ;
29923000 }
2993-
3001+ info ! (
3002+ logger,
3003+ "!!!! get_transaction_receipts_for_transaction_hashes"
3004+ ) ;
29943005 // Keep a record of all unique transaction hashes for which we'll request receipts. We will
29953006 // later use this to check if we have collected the receipts from all required transactions.
29963007 let mut unique_transaction_hashes: HashSet < & H256 > = HashSet :: new ( ) ;
@@ -3051,6 +3062,7 @@ async fn get_transaction_receipts_for_transaction_hashes(
30513062 unique_transaction_hashes. is_empty( ) ,
30523063 "Didn't receive all necessary transaction receipts"
30533064 ) ;
3065+ info ! ( logger, "RCP: {:?}" , receipts_by_hash) ;
30543066
30553067 Ok ( receipts_by_hash)
30563068}
@@ -3083,8 +3095,58 @@ fn u128_to_u64(in_data: u128) -> web3::types::U64 {
30833095 web3:: types:: U64 ( [ ( in_data & 0xffffffffffffffff ) as u64 ] )
30843096}
30853097fn address_to_h160 ( fixed_bytes : & alloy:: primitives:: Address ) -> H160 {
3086- let author = H160 ( fixed_bytes. as_slice ( ) . try_into ( ) . unwrap ( ) ) ;
3087- author
3098+ let address = H160 ( fixed_bytes. as_slice ( ) . try_into ( ) . unwrap ( ) ) ;
3099+ address
3100+ }
3101+ fn h160_to_address ( fixed_bytes : & H160 ) -> alloy:: primitives:: Address {
3102+ let address =
3103+ alloy:: primitives:: Address :: new ( fixed_bytes. as_bytes ( ) [ 0 ..20 ] . try_into ( ) . unwrap ( ) ) ;
3104+ address
3105+ }
3106+ fn h256_to_b256 ( fixed_bytes : & H256 ) -> B256 {
3107+ let bytes = fixed_bytes. as_bytes ( ) [ 0 ..32 ] . try_into ( ) . unwrap ( ) ;
3108+ bytes
3109+ }
3110+ fn convert_topic (
3111+ h256s : & Option < Vec < H256 > > ,
3112+ ) -> alloy_rpc_types:: FilterSet < alloy:: primitives:: FixedBytes < 32 > > {
3113+ if let Some ( topic1) = h256s {
3114+ topic1. into_iter ( ) . map ( |b| h256_to_b256 ( & b) ) . collect ( )
3115+ } else {
3116+ alloy_rpc_types:: Topic :: default ( )
3117+ }
3118+ }
3119+
3120+ fn convert_log ( alloy_logs : & Vec < alloy_rpc_types:: Log < alloy:: primitives:: LogData > > ) -> Vec < Log > {
3121+ alloy_logs
3122+ . iter ( )
3123+ . map ( |log| {
3124+ let address = address_to_h160 ( & log. inner . address ) ;
3125+ let topics = log. topics ( ) . iter ( ) . map ( |t| b256_to_h256 ( * t) ) . collect ( ) ;
3126+ let data = log. inner . data . data . clone ( ) . into ( ) ;
3127+ let block_hash = log. block_hash . map ( b256_to_h256) ;
3128+ let block_number = log. block_number . map ( u64_to_u64) ;
3129+ let transaction_hash = log. transaction_hash . map ( b256_to_h256) ;
3130+ let transaction_index = log. transaction_index . map ( u64_to_u64) ;
3131+ let log_index = log. log_index . map ( u64_to_u256) ;
3132+ let transaction_log_index = None ; // TODO: fix it
3133+ let log_type = None ; // TODO: fix it
3134+ let removed = Some ( log. removed ) ;
3135+ Log {
3136+ address,
3137+ topics,
3138+ data,
3139+ block_hash,
3140+ block_number,
3141+ transaction_hash,
3142+ transaction_index,
3143+ log_index,
3144+ transaction_log_index,
3145+ log_type,
3146+ removed,
3147+ }
3148+ } )
3149+ . collect ( )
30883150}
30893151
30903152fn tx_to_tx (
0 commit comments