diff --git a/src/payment/onchain.rs b/src/payment/onchain.rs index 92de090ab..b38865d99 100644 --- a/src/payment/onchain.rs +++ b/src/payment/onchain.rs @@ -64,6 +64,13 @@ impl OnchainPayment { Ok(funding_address) } + /// Retrieve the next unused on-chain/funding address. + pub fn next_address(&self) -> Result { + let funding_address = self.wallet.get_next_address()?; + log_info!(self.logger, "Generated next funding address: {}", funding_address); + Ok(funding_address) + } + /// Send an on-chain payment to the given address. /// /// This will respect any on-chain reserve we need to keep, i.e., won't allow to cut into diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs index dd88dad90..a1c3c32c2 100644 --- a/src/wallet/mod.rs +++ b/src/wallet/mod.rs @@ -473,6 +473,18 @@ impl Wallet { Ok(address_info.address) } + pub(crate) fn get_next_address(&self) -> Result { + let mut locked_wallet = self.inner.lock().unwrap(); + let mut locked_persister = self.persister.lock().unwrap(); + + let address_info = locked_wallet.next_unused_address(KeychainKind::External); + locked_wallet.persist(&mut locked_persister).map_err(|e| { + log_error!(self.logger, "Failed to persist wallet: {}", e); + Error::PersistenceFailed + })?; + Ok(address_info.address) + } + pub(crate) fn get_new_internal_address(&self) -> Result { let mut locked_wallet = self.inner.lock().unwrap(); let mut locked_persister = self.persister.lock().unwrap();