@@ -9,7 +9,7 @@ use persist::KVStoreWalletPersister;
9
9
10
10
use crate :: logger:: { log_error, log_info, log_trace, Logger } ;
11
11
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 } ;
13
13
use crate :: fee_estimator:: { ConfirmationTarget , FeeEstimator } ;
14
14
use crate :: Error ;
15
15
@@ -26,8 +26,8 @@ use lightning::sign::{
26
26
use lightning:: util:: message_signing;
27
27
use lightning_invoice:: RawBolt11Invoice ;
28
28
29
- use bdk:: blockchain:: EsploraBlockchain ;
30
29
use bdk_chain:: ChainPosition ;
30
+ use bdk_esplora:: EsploraAsyncExt ;
31
31
use bdk_wallet:: { KeychainKind , PersistedWallet , SignOptions } ;
32
32
33
33
use bitcoin:: blockdata:: constants:: WITNESS_SCALE_FACTOR ;
@@ -42,6 +42,8 @@ use bitcoin::{
42
42
Amount , ScriptBuf , Transaction , TxOut , Txid , WPubkeyHash , WitnessProgram , WitnessVersion ,
43
43
} ;
44
44
45
+ use esplora_client:: AsyncClient as EsploraAsyncClient ;
46
+
45
47
use std:: ops:: { Deref , DerefMut } ;
46
48
use std:: sync:: { Arc , Mutex } ;
47
49
use std:: time:: Duration ;
60
62
E :: Target : FeeEstimator ,
61
63
L :: Target : Logger ,
62
64
{
63
- // A BDK blockchain used for wallet sync.
64
- blockchain : EsploraBlockchain ,
65
65
// A BDK on-chain wallet.
66
66
inner : Mutex < PersistedWallet < KVStoreWalletPersister > > ,
67
- // A cache storing the most recently retrieved fee rate estimations.
67
+ esplora_client : EsploraAsyncClient ,
68
68
broadcaster : B ,
69
69
fee_estimator : E ,
70
70
// A Mutex holding the current sync status.
@@ -79,12 +79,12 @@ where
79
79
L :: Target : Logger ,
80
80
{
81
81
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 ,
84
84
) -> Self {
85
85
let inner = Mutex :: new ( wallet) ;
86
86
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 }
88
88
}
89
89
90
90
pub ( crate ) async fn sync ( & self ) -> Result < ( ) , Error > {
@@ -98,34 +98,42 @@ where
98
98
}
99
99
100
100
let res = {
101
- let wallet_lock = self . inner . lock ( ) . unwrap ( ) ;
101
+ let full_scan_request = self . inner . lock ( ) . unwrap ( ) . start_full_scan ( ) . build ( ) ;
102
102
103
103
let wallet_sync_timeout_fut = tokio:: time:: timeout (
104
104
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
+ ) ,
106
110
) ;
107
111
108
112
match wallet_sync_timeout_fut. await {
109
113
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 )
125
133
} ,
126
134
_ => {
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 )
129
137
} ,
130
138
} ,
131
139
} ,
0 commit comments