@@ -26,6 +26,7 @@ use bitcoin::{Script, Transaction, TxOut};
2626
2727use std:: collections:: HashMap ;
2828use std:: sync:: { Arc , Condvar , Mutex , RwLock } ;
29+ use std:: time:: Duration ;
2930
3031pub struct Wallet < D >
3132where
@@ -79,12 +80,34 @@ where
7980 }
8081
8182 let sync_options = SyncOptions { progress : None } ;
82- let res = match self . inner . lock ( ) . unwrap ( ) . sync ( & self . blockchain , sync_options) . await {
83+ let wallet_lock = self . inner . lock ( ) . unwrap ( ) ;
84+ let res = match wallet_lock. sync ( & self . blockchain , sync_options) . await {
8385 Ok ( ( ) ) => Ok ( ( ) ) ,
84- Err ( e) => {
85- log_error ! ( self . logger, "Wallet sync error: {}" , e) ;
86- Err ( From :: from ( e) )
87- }
86+ Err ( e) => match e {
87+ bdk:: Error :: Esplora ( ref be) => match * * be {
88+ bdk:: blockchain:: esplora:: EsploraError :: Reqwest ( _) => {
89+ tokio:: time:: sleep ( Duration :: from_secs ( 1 ) ) . await ;
90+ log_error ! (
91+ self . logger,
92+ "Sync failed due to HTTP connection error, retrying: {}" ,
93+ e
94+ ) ;
95+ let sync_options = SyncOptions { progress : None } ;
96+ wallet_lock
97+ . sync ( & self . blockchain , sync_options)
98+ . await
99+ . map_err ( |e| From :: from ( e) )
100+ }
101+ _ => {
102+ log_error ! ( self . logger, "Sync failed due to Esplora error: {}" , e) ;
103+ Err ( From :: from ( e) )
104+ }
105+ } ,
106+ _ => {
107+ log_error ! ( self . logger, "Wallet sync error: {}" , e) ;
108+ Err ( From :: from ( e) )
109+ }
110+ } ,
88111 } ;
89112
90113 drop ( guard) ;
0 commit comments