6464{
6565 // A BDK on-chain wallet.
6666 inner : Mutex < PersistedWallet < KVStoreWalletPersister > > ,
67+ persister : Mutex < KVStoreWalletPersister > ,
6768 esplora_client : EsploraAsyncClient ,
6869 broadcaster : B ,
6970 fee_estimator : E ,
@@ -80,11 +81,13 @@ where
8081{
8182 pub ( crate ) fn new (
8283 wallet : bdk_wallet:: PersistedWallet < KVStoreWalletPersister > ,
83- esplora_client : EsploraAsyncClient , broadcaster : B , fee_estimator : E , logger : L ,
84+ wallet_persister : KVStoreWalletPersister , esplora_client : EsploraAsyncClient ,
85+ broadcaster : B , fee_estimator : E , logger : L ,
8486 ) -> Self {
8587 let inner = Mutex :: new ( wallet) ;
88+ let persister = Mutex :: new ( wallet_persister) ;
8689 let sync_status = Mutex :: new ( WalletSyncStatus :: Completed ) ;
87- Self { inner, esplora_client, broadcaster, fee_estimator, sync_status, logger }
90+ Self { inner, persister , esplora_client, broadcaster, fee_estimator, sync_status, logger }
8891 }
8992
9093 pub ( crate ) async fn sync ( & self ) -> Result < ( ) , Error > {
@@ -111,16 +114,27 @@ where
111114
112115 match wallet_sync_timeout_fut. await {
113116 Ok ( res) => match res {
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- } ,
117+ Ok ( update) => {
118+ let mut locked_wallet = self . inner . lock ( ) . unwrap ( ) ;
119+ match locked_wallet. apply_update ( update) {
120+ Ok ( ( ) ) => {
121+ let mut locked_persister = self . persister . lock ( ) . unwrap ( ) ;
122+ locked_wallet. persist ( & mut locked_persister) . map_err ( |e| {
123+ log_error ! ( self . logger, "Failed to persist wallet: {}" , e) ;
124+ Error :: PersistenceFailed
125+ } ) ?;
126+
127+ Ok ( ( ) )
128+ } ,
129+ Err ( e) => {
130+ log_error ! (
131+ self . logger,
132+ "Sync failed due to chain connection error: {}" ,
133+ e
134+ ) ;
135+ Err ( Error :: WalletOperationFailed )
136+ } ,
137+ }
124138 } ,
125139 Err ( e) => match * e {
126140 esplora_client:: Error :: Reqwest ( he) => {
@@ -187,6 +201,12 @@ where
187201 } ,
188202 }
189203
204+ let mut locked_persister = self . persister . lock ( ) . unwrap ( ) ;
205+ locked_wallet. persist ( & mut locked_persister) . map_err ( |e| {
206+ log_error ! ( self . logger, "Failed to persist wallet: {}" , e) ;
207+ Error :: PersistenceFailed
208+ } ) ?;
209+
190210 let tx = psbt. extract_tx ( ) . map_err ( |e| {
191211 log_error ! ( self . logger, "Failed to extract transaction: {}" , e) ;
192212 e
@@ -196,12 +216,26 @@ where
196216 }
197217
198218 pub ( crate ) fn get_new_address ( & self ) -> Result < bitcoin:: Address , Error > {
199- let address_info = self . inner . lock ( ) . unwrap ( ) . reveal_next_address ( KeychainKind :: External ) ;
219+ let mut locked_wallet = self . inner . lock ( ) . unwrap ( ) ;
220+ let mut locked_persister = self . persister . lock ( ) . unwrap ( ) ;
221+
222+ let address_info = locked_wallet. reveal_next_address ( KeychainKind :: External ) ;
223+ locked_wallet. persist ( & mut locked_persister) . map_err ( |e| {
224+ log_error ! ( self . logger, "Failed to persist wallet: {}" , e) ;
225+ Error :: PersistenceFailed
226+ } ) ?;
200227 Ok ( address_info. address )
201228 }
202229
203230 fn get_new_internal_address ( & self ) -> Result < bitcoin:: Address , Error > {
204- let address_info = self . inner . lock ( ) . unwrap ( ) . next_unused_address ( KeychainKind :: Internal ) ;
231+ let mut locked_wallet = self . inner . lock ( ) . unwrap ( ) ;
232+ let mut locked_persister = self . persister . lock ( ) . unwrap ( ) ;
233+
234+ let address_info = locked_wallet. next_unused_address ( KeychainKind :: Internal ) ;
235+ locked_wallet. persist ( & mut locked_persister) . map_err ( |e| {
236+ log_error ! ( self . logger, "Failed to persist wallet: {}" , e) ;
237+ Error :: PersistenceFailed
238+ } ) ?;
205239 Ok ( address_info. address )
206240 }
207241
@@ -274,6 +308,12 @@ where
274308 } ,
275309 }
276310
311+ let mut locked_persister = self . persister . lock ( ) . unwrap ( ) ;
312+ locked_wallet. persist ( & mut locked_persister) . map_err ( |e| {
313+ log_error ! ( self . logger, "Failed to persist wallet: {}" , e) ;
314+ Error :: PersistenceFailed
315+ } ) ?;
316+
277317 psbt. extract_tx ( ) . map_err ( |e| {
278318 log_error ! ( self . logger, "Failed to extract transaction: {}" , e) ;
279319 e
@@ -432,7 +472,13 @@ where
432472
433473 fn get_change_script ( & self ) -> Result < ScriptBuf , ( ) > {
434474 let mut locked_wallet = self . inner . lock ( ) . unwrap ( ) ;
475+ let mut locked_persister = self . persister . lock ( ) . unwrap ( ) ;
476+
435477 let address_info = locked_wallet. next_unused_address ( KeychainKind :: Internal ) ;
478+ locked_wallet. persist ( & mut locked_persister) . map_err ( |e| {
479+ log_error ! ( self . logger, "Failed to persist wallet: {}" , e) ;
480+ ( )
481+ } ) ?;
436482 Ok ( address_info. address . script_pubkey ( ) )
437483 }
438484
0 commit comments