@@ -9,7 +9,7 @@ use persist::KVStoreWalletPersister;
99
1010use crate :: logger:: { log_error, log_info, log_trace, Logger } ;
1111
12- use crate :: config:: BDK_WALLET_SYNC_TIMEOUT_SECS ;
12+ use crate :: config:: { BDK_CLIENT_CONCURRENCY , BDK_CLIENT_STOP_GAP , BDK_WALLET_SYNC_TIMEOUT_SECS } ;
1313use crate :: fee_estimator:: { ConfirmationTarget , FeeEstimator } ;
1414use crate :: Error ;
1515
@@ -26,8 +26,8 @@ use lightning::sign::{
2626use lightning:: util:: message_signing;
2727use lightning_invoice:: RawBolt11Invoice ;
2828
29- use bdk:: blockchain:: EsploraBlockchain ;
3029use bdk_chain:: ChainPosition ;
30+ use bdk_esplora:: EsploraAsyncExt ;
3131use bdk_wallet:: { KeychainKind , PersistedWallet , SignOptions } ;
3232
3333use bitcoin:: blockdata:: constants:: WITNESS_SCALE_FACTOR ;
@@ -42,6 +42,8 @@ use bitcoin::{
4242 Amount , ScriptBuf , Transaction , TxOut , Txid , WPubkeyHash , WitnessProgram , WitnessVersion ,
4343} ;
4444
45+ use esplora_client:: AsyncClient as EsploraAsyncClient ;
46+
4547use std:: ops:: { Deref , DerefMut } ;
4648use std:: sync:: { Arc , Mutex } ;
4749use std:: time:: Duration ;
6062 E :: Target : FeeEstimator ,
6163 L :: Target : Logger ,
6264{
63- // A BDK blockchain used for wallet sync.
64- blockchain : EsploraBlockchain ,
6565 // A BDK on-chain wallet.
6666 inner : Mutex < PersistedWallet < KVStoreWalletPersister > > ,
67- // A cache storing the most recently retrieved fee rate estimations.
67+ esplora_client : EsploraAsyncClient ,
6868 broadcaster : B ,
6969 fee_estimator : E ,
7070 // A Mutex holding the current sync status.
@@ -79,12 +79,12 @@ where
7979 L :: Target : Logger ,
8080{
8181 pub ( crate ) fn new (
82- blockchain : EsploraBlockchain , wallet : bdk_wallet:: PersistedWallet < KVStoreWalletPersister > ,
83- broadcaster : B , fee_estimator : E , logger : L ,
82+ wallet : bdk_wallet:: PersistedWallet < KVStoreWalletPersister > ,
83+ esplora_client : EsploraAsyncClient , broadcaster : B , fee_estimator : E , logger : L ,
8484 ) -> Self {
8585 let inner = Mutex :: new ( wallet) ;
8686 let sync_status = Mutex :: new ( WalletSyncStatus :: Completed ) ;
87- Self { blockchain , inner , broadcaster, fee_estimator, sync_status, logger }
87+ Self { inner , esplora_client , broadcaster, fee_estimator, sync_status, logger }
8888 }
8989
9090 pub ( crate ) async fn sync ( & self ) -> Result < ( ) , Error > {
@@ -98,34 +98,42 @@ where
9898 }
9999
100100 let res = {
101- let wallet_lock = self . inner . lock ( ) . unwrap ( ) ;
101+ let full_scan_request = self . inner . lock ( ) . unwrap ( ) . start_full_scan ( ) . build ( ) ;
102102
103103 let wallet_sync_timeout_fut = tokio:: time:: timeout (
104104 Duration :: from_secs ( BDK_WALLET_SYNC_TIMEOUT_SECS ) ,
105- wallet_lock. sync ( & self . blockchain , SyncOptions { progress : None } ) ,
105+ self . esplora_client . full_scan (
106+ full_scan_request,
107+ BDK_CLIENT_STOP_GAP ,
108+ BDK_CLIENT_CONCURRENCY ,
109+ ) ,
106110 ) ;
107111
108112 match wallet_sync_timeout_fut. await {
109113 Ok ( res) => match res {
110- Ok ( ( ) ) => Ok ( ( ) ) ,
111- Err ( e) => match e {
112- bdk:: Error :: Esplora ( ref be) => match * * be {
113- bdk:: blockchain:: esplora:: EsploraError :: Reqwest ( _) => {
114- log_error ! (
115- self . logger,
116- "Sync failed due to HTTP connection error: {}" ,
117- e
118- ) ;
119- Err ( From :: from ( e) )
120- } ,
121- _ => {
122- log_error ! ( self . logger, "Sync failed due to Esplora error: {}" , e) ;
123- Err ( From :: from ( e) )
124- } ,
114+ Ok ( update) => match self . inner . lock ( ) . unwrap ( ) . apply_update ( update) {
115+ Ok ( ( ) ) => Ok ( ( ) ) ,
116+ Err ( e) => {
117+ log_error ! (
118+ self . logger,
119+ "Sync failed due to chain connection error: {}" ,
120+ e
121+ ) ;
122+ Err ( Error :: WalletOperationFailed )
123+ } ,
124+ } ,
125+ Err ( e) => match * e {
126+ esplora_client:: Error :: Reqwest ( he) => {
127+ log_error ! (
128+ self . logger,
129+ "Sync failed due to HTTP connection error: {}" ,
130+ he
131+ ) ;
132+ Err ( Error :: WalletOperationFailed )
125133 } ,
126134 _ => {
127- log_error ! ( self . logger, "Wallet sync error: {}" , e) ;
128- Err ( From :: from ( e ) )
135+ log_error ! ( self . logger, "Sync failed due to Esplora error: {}" , e) ;
136+ Err ( Error :: WalletOperationFailed )
129137 } ,
130138 } ,
131139 } ,
0 commit comments