@@ -71,32 +71,97 @@ impl AppState {
7171}
7272
7373// Transaction verification functions
74+
7475async fn is_transaction_in_block (
7576 provider : & Provider < Http > ,
7677 tx_hash : & str ,
7778 block_number : & str ,
7879) -> Result < bool > {
7980 let tx_hash = tx_hash. parse :: < H256 > ( ) ?;
8081
81- let tx = provider
82- . get_transaction ( tx_hash)
83- . await ?;
84- info ! ( "tx {:?}" , tx) ;
85- info ! ( "block_number {:?}" , block_number) ;
86- info ! ( "tx_hash {:?}" , tx_hash) ;
87-
88-
82+ // Define retry parameters
83+ let max_retries = 5 ;
84+ let initial_delay_ms = 1000 ; // 1 second
85+ let mut retry_count = 0 ;
86+ let mut tx = None ;
87+
88+ // Retry loop
89+ while retry_count < max_retries {
90+ info ! ( "Attempt {} to retrieve transaction {:?}" , retry_count + 1 , tx_hash) ;
91+
92+ // Try to get the transaction
93+ match provider. get_transaction ( tx_hash) . await {
94+ Ok ( Some ( transaction) ) => {
95+ // Success - transaction found
96+ tx = Some ( transaction) ;
97+ break ;
98+ } ,
99+ Ok ( None ) => {
100+ // Transaction not found, let's retry after delay
101+ info ! ( "Transaction not found, retrying..." ) ;
102+ retry_count += 1 ;
103+
104+ // Exponential backoff
105+ let delay_ms = initial_delay_ms * 2_u64 . pow ( retry_count as u32 ) ;
106+ tokio:: time:: sleep ( tokio:: time:: Duration :: from_millis ( delay_ms) ) . await ;
107+ } ,
108+ Err ( e) => {
109+ // RPC error, log and retry
110+ info ! ( "RPC error: {:?}, retrying..." , e) ;
111+ retry_count += 1 ;
112+
113+ // Exponential backoff
114+ let delay_ms = initial_delay_ms * 2_u64 . pow ( retry_count as u32 ) ;
115+ tokio:: time:: sleep ( tokio:: time:: Duration :: from_millis ( delay_ms) ) . await ;
116+ }
117+ }
118+ }
119+
120+ info ! ( "tx {:?}" , tx) ;
121+ info ! ( "block_number {:?}" , block_number) ;
122+ info ! ( "tx_hash {:?}" , tx_hash) ;
123+
89124 match tx {
90125 Some ( tx) => {
91126 let tx_block_number = tx. block_number . unwrap_or_default ( ) ;
92127 let expected_block = U256 :: from_dec_str ( block_number) ?;
93- info ! ( "expected_block {:?}" , expected_block) ;
94- info ! ( "tx_block_number {:?}" , tx_block_number) ;
128+ info ! ( "expected_block {:?}" , expected_block) ;
129+ info ! ( "tx_block_number {:?}" , tx_block_number) ;
95130 Ok ( tx_block_number. as_u64 ( ) == expected_block. as_u64 ( ) )
96131 }
97- None => Ok ( false ) ,
132+ None => {
133+ info ! ( "Transaction not found after {} retries" , max_retries) ;
134+ Ok ( false )
135+ }
98136 }
99137}
138+ // async fn is_transaction_in_block(
139+ // provider: &Provider<Http>,
140+ // tx_hash: &str,
141+ // block_number: &str,
142+ // ) -> Result<bool> {
143+ // let tx_hash = tx_hash.parse::<H256>()?;
144+
145+ // let tx = provider
146+ // .get_transaction(tx_hash)
147+ // .await?;
148+
149+ // info!("tx {:?}",tx);
150+ // info!("block_number {:?}",block_number);
151+ // info!("tx_hash {:?}",tx_hash);
152+
153+
154+ // match tx {
155+ // Some(tx) => {
156+ // let tx_block_number = tx.block_number.unwrap_or_default();
157+ // let expected_block = U256::from_dec_str(block_number)?;
158+ // info!("expected_block {:?}",expected_block);
159+ // info!("tx_block_number {:?}",tx_block_number);
160+ // Ok(tx_block_number.as_u64() == expected_block.as_u64())
161+ // }
162+ // None => Ok(false),
163+ // }
164+ // }
100165
101166async fn get_block_proposer (
102167 client : & reqwest:: Client ,
@@ -146,15 +211,25 @@ async fn verify_transaction(
146211 State ( state) : State < AppState > ,
147212 Json ( request) : Json < VerificationRequest > ,
148213) -> Result < Json < VerificationResponse > , String > {
149- let is_included = is_transaction_in_block (
150- & state. provider ,
151- & request. transaction_hash ,
152- & request. block_number ,
153- )
154- . await
155- . map_err ( |e| e. to_string ( ) ) ?;
156-
157214
215+ info ! ( "provider_verify_transaction {:?}" , state. provider) ;
216+ let verification_task = tokio:: time:: timeout (
217+ std:: time:: Duration :: from_secs ( 15 ) , // 15 second timeout
218+ is_transaction_in_block (
219+ & state. provider ,
220+ & request. transaction_hash ,
221+ & request. block_number ,
222+ )
223+ ) ;
224+
225+ // Handle timeout and results
226+ let is_included = match verification_task. await {
227+ Ok ( result) => result. map_err ( |e| e. to_string ( ) ) ?,
228+ Err ( _) => {
229+ info ! ( "Transaction verification timed out after 15 seconds" ) ;
230+ false // Consider transaction not included if verification times out
231+ }
232+ } ;
158233 info ! ( "is_included {:?}" , is_included) ;
159234
160235 let proposer_index = if is_included {
@@ -187,8 +262,8 @@ async fn health_check() -> &'static str {
187262
188263// Router setup
189264pub fn operator_router ( wallet : PrivateKeySigner ) -> Router {
190- let state = AppState :: new ( "https://eth.llamarpc .com" )
191- . expect ( "Failed to create app state" ) ;
265+ let state = AppState :: new ( "https://ethereum-holesky.publicnode .com" )
266+ . expect ( "Failed to create app state" ) ;
192267
193268 Router :: new ( )
194269 . route ( "/verify" , post ( verify_transaction) )
0 commit comments