64
64
{
65
65
// A BDK on-chain wallet.
66
66
inner : Mutex < PersistedWallet < KVStoreWalletPersister > > ,
67
+ persister : Mutex < KVStoreWalletPersister > ,
67
68
esplora_client : EsploraAsyncClient ,
68
69
broadcaster : B ,
69
70
fee_estimator : E ,
@@ -80,11 +81,13 @@ where
80
81
{
81
82
pub ( crate ) fn new (
82
83
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 ,
84
86
) -> Self {
85
87
let inner = Mutex :: new ( wallet) ;
88
+ let persister = Mutex :: new ( wallet_persister) ;
86
89
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 }
88
91
}
89
92
90
93
pub ( crate ) async fn sync ( & self ) -> Result < ( ) , Error > {
@@ -111,16 +114,27 @@ where
111
114
112
115
match wallet_sync_timeout_fut. await {
113
116
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
+ }
124
138
} ,
125
139
Err ( e) => match * e {
126
140
esplora_client:: Error :: Reqwest ( he) => {
@@ -187,6 +201,12 @@ where
187
201
} ,
188
202
}
189
203
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
+
190
210
let tx = psbt. extract_tx ( ) . map_err ( |e| {
191
211
log_error ! ( self . logger, "Failed to extract transaction: {}" , e) ;
192
212
e
@@ -196,12 +216,26 @@ where
196
216
}
197
217
198
218
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
+ } ) ?;
200
227
Ok ( address_info. address )
201
228
}
202
229
203
230
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
+ } ) ?;
205
239
Ok ( address_info. address )
206
240
}
207
241
@@ -274,6 +308,12 @@ where
274
308
} ,
275
309
}
276
310
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
+
277
317
psbt. extract_tx ( ) . map_err ( |e| {
278
318
log_error ! ( self . logger, "Failed to extract transaction: {}" , e) ;
279
319
e
@@ -442,7 +482,13 @@ where
442
482
443
483
fn get_change_script ( & self ) -> Result < ScriptBuf , ( ) > {
444
484
let mut locked_wallet = self . inner . lock ( ) . unwrap ( ) ;
485
+ let mut locked_persister = self . persister . lock ( ) . unwrap ( ) ;
486
+
445
487
let address_info = locked_wallet. next_unused_address ( KeychainKind :: Internal ) ;
488
+ locked_wallet. persist ( & mut locked_persister) . map_err ( |e| {
489
+ log_error ! ( self . logger, "Failed to persist wallet: {}" , e) ;
490
+ ( )
491
+ } ) ?;
446
492
Ok ( address_info. address . script_pubkey ( ) )
447
493
}
448
494
0 commit comments