Skip to content

Commit c7b7464

Browse files
committed
f Account for async'ified ChangeDestinationSource
.. we implement the `async` version of `ChangeDestinationSource`, and, to make all involved objects `Send`, we drop the `Deref` generics for concrete `Arc`s everywhere.
1 parent e5871b2 commit c7b7464

File tree

2 files changed

+41
-87
lines changed

2 files changed

+41
-87
lines changed

src/types.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,8 @@ pub(crate) type ChannelManager = lightning::ln::channelmanager::ChannelManager<
7474

7575
pub(crate) type Broadcaster = crate::tx_broadcaster::TransactionBroadcaster<Arc<Logger>>;
7676

77-
pub(crate) type Wallet =
78-
crate::wallet::Wallet<Arc<Broadcaster>, Arc<OnchainFeeEstimator>, Arc<Logger>>;
79-
80-
pub(crate) type KeysManager =
81-
crate::wallet::WalletKeysManager<Arc<Broadcaster>, Arc<OnchainFeeEstimator>, Arc<Logger>>;
77+
pub(crate) type Wallet = crate::wallet::Wallet;
78+
pub(crate) type KeysManager = crate::wallet::WalletKeysManager;
8279

8380
pub(crate) type Router = DefaultRouter<
8481
Arc<Graph>,

src/wallet/mod.rs

Lines changed: 39 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ use persist::KVStoreWalletPersister;
1010
use crate::config::Config;
1111
use crate::logger::{log_debug, log_error, log_info, log_trace, LdkLogger, Logger};
1212

13-
use crate::fee_estimator::{ConfirmationTarget, FeeEstimator};
13+
use crate::fee_estimator::{ConfirmationTarget, FeeEstimator, OnchainFeeEstimator};
1414
use crate::payment::store::{ConfirmationStatus, PaymentStore};
1515
use crate::payment::{PaymentDetails, PaymentDirection, PaymentStatus};
16+
use crate::types::Broadcaster;
1617
use crate::Error;
1718

1819
use lightning::chain::chaininterface::BroadcasterInterface;
@@ -49,7 +50,8 @@ use bitcoin::{
4950
WitnessProgram, WitnessVersion,
5051
};
5152

52-
use std::ops::Deref;
53+
use std::future::Future;
54+
use std::pin::Pin;
5355
use std::str::FromStr;
5456
use std::sync::{Arc, Mutex};
5557

@@ -62,32 +64,23 @@ pub(crate) enum OnchainSendAmount {
6264
pub(crate) mod persist;
6365
pub(crate) mod ser;
6466

65-
pub(crate) struct Wallet<B: Deref, E: Deref, L: Deref>
66-
where
67-
B::Target: BroadcasterInterface,
68-
E::Target: FeeEstimator,
69-
L::Target: LdkLogger,
70-
{
67+
pub(crate) struct Wallet {
7168
// A BDK on-chain wallet.
7269
inner: Mutex<PersistedWallet<KVStoreWalletPersister>>,
7370
persister: Mutex<KVStoreWalletPersister>,
74-
broadcaster: B,
75-
fee_estimator: E,
71+
broadcaster: Arc<Broadcaster>,
72+
fee_estimator: Arc<OnchainFeeEstimator>,
7673
payment_store: Arc<PaymentStore<Arc<Logger>>>,
7774
config: Arc<Config>,
78-
logger: L,
75+
logger: Arc<Logger>,
7976
}
8077

81-
impl<B: Deref, E: Deref, L: Deref> Wallet<B, E, L>
82-
where
83-
B::Target: BroadcasterInterface,
84-
E::Target: FeeEstimator,
85-
L::Target: LdkLogger,
86-
{
78+
impl Wallet {
8779
pub(crate) fn new(
8880
wallet: bdk_wallet::PersistedWallet<KVStoreWalletPersister>,
89-
wallet_persister: KVStoreWalletPersister, broadcaster: B, fee_estimator: E,
90-
payment_store: Arc<PaymentStore<Arc<Logger>>>, config: Arc<Config>, logger: L,
81+
wallet_persister: KVStoreWalletPersister, broadcaster: Arc<Broadcaster>,
82+
fee_estimator: Arc<OnchainFeeEstimator>, payment_store: Arc<PaymentStore<Arc<Logger>>>,
83+
config: Arc<Config>, logger: Arc<Logger>,
9184
) -> Self {
9285
let inner = Mutex::new(wallet);
9386
let persister = Mutex::new(wallet_persister);
@@ -550,12 +543,7 @@ where
550543
}
551544
}
552545

553-
impl<B: Deref, E: Deref, L: Deref> Listen for Wallet<B, E, L>
554-
where
555-
B::Target: BroadcasterInterface,
556-
E::Target: FeeEstimator,
557-
L::Target: LdkLogger,
558-
{
546+
impl Listen for Wallet {
559547
fn filtered_block_connected(
560548
&self, _header: &bitcoin::block::Header,
561549
_txdata: &lightning::chain::transaction::TransactionData, _height: u32,
@@ -615,12 +603,7 @@ where
615603
}
616604
}
617605

618-
impl<B: Deref, E: Deref, L: Deref> WalletSource for Wallet<B, E, L>
619-
where
620-
B::Target: BroadcasterInterface,
621-
E::Target: FeeEstimator,
622-
L::Target: LdkLogger,
623-
{
606+
impl WalletSource for Wallet {
624607
fn list_confirmed_utxos(&self) -> Result<Vec<Utxo>, ()> {
625608
let locked_wallet = self.inner.lock().unwrap();
626609
let mut utxos = Vec::new();
@@ -757,30 +740,20 @@ where
757740

758741
/// Similar to [`KeysManager`], but overrides the destination and shutdown scripts so they are
759742
/// directly spendable by the BDK wallet.
760-
pub(crate) struct WalletKeysManager<B: Deref, E: Deref, L: Deref>
761-
where
762-
B::Target: BroadcasterInterface,
763-
E::Target: FeeEstimator,
764-
L::Target: LdkLogger,
765-
{
743+
pub(crate) struct WalletKeysManager {
766744
inner: KeysManager,
767-
wallet: Arc<Wallet<B, E, L>>,
768-
logger: L,
745+
wallet: Arc<Wallet>,
746+
logger: Arc<Logger>,
769747
}
770748

771-
impl<B: Deref, E: Deref, L: Deref> WalletKeysManager<B, E, L>
772-
where
773-
B::Target: BroadcasterInterface,
774-
E::Target: FeeEstimator,
775-
L::Target: LdkLogger,
776-
{
749+
impl WalletKeysManager {
777750
/// Constructs a `WalletKeysManager` that overrides the destination and shutdown scripts.
778751
///
779752
/// See [`KeysManager::new`] for more information on `seed`, `starting_time_secs`, and
780753
/// `starting_time_nanos`.
781754
pub fn new(
782-
seed: &[u8; 32], starting_time_secs: u64, starting_time_nanos: u32,
783-
wallet: Arc<Wallet<B, E, L>>, logger: L,
755+
seed: &[u8; 32], starting_time_secs: u64, starting_time_nanos: u32, wallet: Arc<Wallet>,
756+
logger: Arc<Logger>,
784757
) -> Self {
785758
let inner = KeysManager::new(seed, starting_time_secs, starting_time_nanos);
786759
Self { inner, wallet, logger }
@@ -799,12 +772,7 @@ where
799772
}
800773
}
801774

802-
impl<B: Deref, E: Deref, L: Deref> NodeSigner for WalletKeysManager<B, E, L>
803-
where
804-
B::Target: BroadcasterInterface,
805-
E::Target: FeeEstimator,
806-
L::Target: LdkLogger,
807-
{
775+
impl NodeSigner for WalletKeysManager {
808776
fn get_node_id(&self, recipient: Recipient) -> Result<PublicKey, ()> {
809777
self.inner.get_node_id(recipient)
810778
}
@@ -836,12 +804,7 @@ where
836804
}
837805
}
838806

839-
impl<B: Deref, E: Deref, L: Deref> OutputSpender for WalletKeysManager<B, E, L>
840-
where
841-
B::Target: BroadcasterInterface,
842-
E::Target: FeeEstimator,
843-
L::Target: LdkLogger,
844-
{
807+
impl OutputSpender for WalletKeysManager {
845808
/// See [`KeysManager::spend_spendable_outputs`] for documentation on this method.
846809
fn spend_spendable_outputs(
847810
&self, descriptors: &[&SpendableOutputDescriptor], outputs: Vec<TxOut>,
@@ -859,23 +822,13 @@ where
859822
}
860823
}
861824

862-
impl<B: Deref, E: Deref, L: Deref> EntropySource for WalletKeysManager<B, E, L>
863-
where
864-
B::Target: BroadcasterInterface,
865-
E::Target: FeeEstimator,
866-
L::Target: LdkLogger,
867-
{
825+
impl EntropySource for WalletKeysManager {
868826
fn get_secure_random_bytes(&self) -> [u8; 32] {
869827
self.inner.get_secure_random_bytes()
870828
}
871829
}
872830

873-
impl<B: Deref, E: Deref, L: Deref> SignerProvider for WalletKeysManager<B, E, L>
874-
where
875-
B::Target: BroadcasterInterface,
876-
E::Target: FeeEstimator,
877-
L::Target: LdkLogger,
878-
{
831+
impl SignerProvider for WalletKeysManager {
879832
type EcdsaSigner = InMemorySigner;
880833

881834
fn generate_channel_keys_id(&self, inbound: bool, user_channel_id: u128) -> [u8; 32] {
@@ -913,16 +866,20 @@ where
913866
}
914867
}
915868

916-
impl<B: Deref, E: Deref, L: Deref> ChangeDestinationSource for WalletKeysManager<B, E, L>
917-
where
918-
B::Target: BroadcasterInterface,
919-
E::Target: FeeEstimator,
920-
L::Target: LdkLogger,
921-
{
922-
fn get_change_destination_script(&self) -> Result<ScriptBuf, ()> {
923-
let address = self.wallet.get_new_internal_address().map_err(|e| {
924-
log_error!(self.logger, "Failed to retrieve new address from wallet: {}", e);
925-
})?;
926-
Ok(address.script_pubkey())
869+
impl ChangeDestinationSource for WalletKeysManager {
870+
fn get_change_destination_script<'a>(
871+
&self,
872+
) -> Pin<Box<dyn Future<Output = Result<ScriptBuf, ()>> + Send + 'a>> {
873+
let wallet = Arc::clone(&self.wallet);
874+
let logger = Arc::clone(&self.logger);
875+
Box::pin(async move {
876+
wallet
877+
.get_new_internal_address()
878+
.map_err(|e| {
879+
log_error!(logger, "Failed to retrieve new address from wallet: {}", e);
880+
})
881+
.map(|addr| addr.script_pubkey())
882+
.map_err(|_| ())
883+
})
927884
}
928885
}

0 commit comments

Comments
 (0)