Skip to content

Commit 2968699

Browse files
committed
f BDK: Account for persistence changes 4: actually call persist
.. when necessary. Or at least when we *think* it may be necessary, i.e., every time we take `mut locked_wallet`.
1 parent 764ce37 commit 2968699

File tree

2 files changed

+61
-14
lines changed

2 files changed

+61
-14
lines changed

src/builder.rs

+1
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,7 @@ fn build_with_store_internal(
608608
let runtime = Arc::new(RwLock::new(None));
609609
let wallet = Arc::new(Wallet::new(
610610
bdk_wallet,
611+
wallet_persister,
611612
esplora_client,
612613
Arc::clone(&tx_broadcaster),
613614
Arc::clone(&fee_estimator),

src/wallet/mod.rs

+60-14
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ where
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
@@ -442,7 +482,13 @@ where
442482

443483
fn get_change_script(&self) -> Result<ScriptBuf, ()> {
444484
let mut locked_wallet = self.inner.lock().unwrap();
485+
let mut locked_persister = self.persister.lock().unwrap();
486+
445487
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+
})?;
446492
Ok(address_info.address.script_pubkey())
447493
}
448494

0 commit comments

Comments
 (0)