@@ -34,7 +34,7 @@ use namada_sdk::masp::ShieldedContext;
3434use namada_sdk:: masp_primitives:: sapling:: ViewingKey ;
3535use namada_sdk:: masp_primitives:: transaction:: components:: amount:: I128Sum ;
3636use namada_sdk:: masp_primitives:: zip32:: { ExtendedFullViewingKey , ExtendedKey } ;
37- use namada_sdk:: rpc:: { self , query_denom, query_epoch, InnerTxResult , TxResponse } ;
37+ use namada_sdk:: rpc:: { self , query_denom, query_epoch, InnerTxResult , TxAppliedEvents , TxResponse } ;
3838use namada_sdk:: signing:: SigningTxData ;
3939use namada_sdk:: string_encoding:: Format ;
4040use namada_sdk:: tendermint_rpc:: Url ;
@@ -337,6 +337,48 @@ impl Sdk {
337337 to_js_result ( borsh:: to_vec ( & namada_tx) ?)
338338 }
339339
340+ // We query tx evcents in loop here as control flow in namada_sdk does not seem to work well in
341+ // browsers
342+ async fn query_tx_result (
343+ & self ,
344+ deadline : u64 ,
345+ tx_hash : & str ,
346+ ) -> Result < TxAppliedEvents , JsValue > {
347+ let mut backoff = 0 ;
348+ let deadline = time:: Instant :: now ( ) + time:: Duration :: from_secs ( deadline) ;
349+ let tx_query = rpc:: TxEventQuery :: Applied ( tx_hash) ;
350+
351+ let event = loop {
352+ // We do linear backoff here to avoid hammering the RPC server
353+ backoff += 1000 ;
354+
355+ if time:: Instant :: now ( ) >= deadline {
356+ break Err ( JsValue :: from ( "Timed out waiting for tx to be applied" ) ) ;
357+ }
358+ let res = rpc:: query_tx_events ( self . namada . client ( ) , tx_query) . await ;
359+
360+ let maybe_response = match res {
361+ Ok ( response) => response,
362+ Err ( _) => {
363+ crate :: utils:: sleep ( backoff) . await ;
364+ continue ;
365+ }
366+ } ;
367+
368+ match maybe_response {
369+ Some ( res) => {
370+ break Ok ( res) ;
371+ }
372+ None => {
373+ crate :: utils:: sleep ( backoff) . await ;
374+ continue ;
375+ }
376+ }
377+ } ?;
378+
379+ Ok ( event)
380+ }
381+
340382 pub async fn broadcast_tx ( & self , tx_bytes : & [ u8 ] , deadline : u64 ) -> Result < JsValue , JsValue > {
341383 #[ derive( serde:: Serialize ) ]
342384 struct TxErrResponse {
@@ -363,11 +405,7 @@ impl Sdk {
363405 ) ) ;
364406 }
365407
366- let deadline = time:: Instant :: now ( ) + time:: Duration :: from_secs ( deadline) ;
367- let tx_query = rpc:: TxEventQuery :: Applied ( tx_hash. as_str ( ) ) ;
368- let event = rpc:: query_tx_status ( & self . namada , tx_query, deadline)
369- . await
370- . map_err ( |e| JsValue :: from_str ( & e. to_string ( ) ) ) ?;
408+ let event = self . query_tx_result ( deadline, & tx_hash) . await ?;
371409 let tx_response = TxResponse :: from_events ( event) ;
372410
373411 let mut batch_tx_results: Vec < tx:: BatchTxResult > = vec ! [ ] ;
0 commit comments