Skip to content

Commit eaab55f

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 6686bdb commit eaab55f

File tree

2 files changed

+42
-89
lines changed

2 files changed

+42
-89
lines changed

src/types.rs

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

7777
pub(crate) type Broadcaster = crate::tx_broadcaster::TransactionBroadcaster<Arc<Logger>>;
7878

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

8582
pub(crate) type Router = DefaultRouter<
8683
Arc<Graph>,

src/wallet/mod.rs

Lines changed: 40 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
use persist::KVStoreWalletPersister;
99

1010
use crate::config::Config;
11-
use crate::logger::{log_debug, log_error, log_info, log_trace, LdkLogger};
11+
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;
1515
use crate::payment::{PaymentDetails, PaymentDirection, PaymentStatus};
16-
use crate::types::PaymentStore;
16+
use crate::types::{Broadcaster, PaymentStore};
1717
use crate::Error;
1818

1919
use lightning::chain::chaininterface::BroadcasterInterface;
@@ -50,7 +50,8 @@ use bitcoin::{
5050
WitnessProgram, WitnessVersion,
5151
};
5252

53-
use std::ops::Deref;
53+
use std::future::Future;
54+
use std::pin::Pin;
5455
use std::str::FromStr;
5556
use std::sync::{Arc, Mutex};
5657

@@ -63,32 +64,23 @@ pub(crate) enum OnchainSendAmount {
6364
pub(crate) mod persist;
6465
pub(crate) mod ser;
6566

66-
pub(crate) struct Wallet<B: Deref, E: Deref, L: Deref>
67-
where
68-
B::Target: BroadcasterInterface,
69-
E::Target: FeeEstimator,
70-
L::Target: LdkLogger,
71-
{
67+
pub(crate) struct Wallet {
7268
// A BDK on-chain wallet.
7369
inner: Mutex<PersistedWallet<KVStoreWalletPersister>>,
7470
persister: Mutex<KVStoreWalletPersister>,
75-
broadcaster: B,
76-
fee_estimator: E,
71+
broadcaster: Arc<Broadcaster>,
72+
fee_estimator: Arc<OnchainFeeEstimator>,
7773
payment_store: Arc<PaymentStore>,
7874
config: Arc<Config>,
79-
logger: L,
75+
logger: Arc<Logger>,
8076
}
8177

82-
impl<B: Deref, E: Deref, L: Deref> Wallet<B, E, L>
83-
where
84-
B::Target: BroadcasterInterface,
85-
E::Target: FeeEstimator,
86-
L::Target: LdkLogger,
87-
{
78+
impl Wallet {
8879
pub(crate) fn new(
8980
wallet: bdk_wallet::PersistedWallet<KVStoreWalletPersister>,
90-
wallet_persister: KVStoreWalletPersister, broadcaster: B, fee_estimator: E,
91-
payment_store: Arc<PaymentStore>, config: Arc<Config>, logger: L,
81+
wallet_persister: KVStoreWalletPersister, broadcaster: Arc<Broadcaster>,
82+
fee_estimator: Arc<OnchainFeeEstimator>, payment_store: Arc<PaymentStore>,
83+
config: Arc<Config>, logger: Arc<Logger>,
9284
) -> Self {
9385
let inner = Mutex::new(wallet);
9486
let persister = Mutex::new(wallet_persister);
@@ -570,12 +562,7 @@ where
570562
}
571563
}
572564

573-
impl<B: Deref, E: Deref, L: Deref> Listen for Wallet<B, E, L>
574-
where
575-
B::Target: BroadcasterInterface,
576-
E::Target: FeeEstimator,
577-
L::Target: LdkLogger,
578-
{
565+
impl Listen for Wallet {
579566
fn filtered_block_connected(
580567
&self, _header: &bitcoin::block::Header,
581568
_txdata: &lightning::chain::transaction::TransactionData, _height: u32,
@@ -635,12 +622,7 @@ where
635622
}
636623
}
637624

638-
impl<B: Deref, E: Deref, L: Deref> WalletSource for Wallet<B, E, L>
639-
where
640-
B::Target: BroadcasterInterface,
641-
E::Target: FeeEstimator,
642-
L::Target: LdkLogger,
643-
{
625+
impl WalletSource for Wallet {
644626
fn list_confirmed_utxos(&self) -> Result<Vec<Utxo>, ()> {
645627
let locked_wallet = self.inner.lock().unwrap();
646628
let mut utxos = Vec::new();
@@ -777,30 +759,20 @@ where
777759

778760
/// Similar to [`KeysManager`], but overrides the destination and shutdown scripts so they are
779761
/// directly spendable by the BDK wallet.
780-
pub(crate) struct WalletKeysManager<B: Deref, E: Deref, L: Deref>
781-
where
782-
B::Target: BroadcasterInterface,
783-
E::Target: FeeEstimator,
784-
L::Target: LdkLogger,
785-
{
762+
pub(crate) struct WalletKeysManager {
786763
inner: KeysManager,
787-
wallet: Arc<Wallet<B, E, L>>,
788-
logger: L,
764+
wallet: Arc<Wallet>,
765+
logger: Arc<Logger>,
789766
}
790767

791-
impl<B: Deref, E: Deref, L: Deref> WalletKeysManager<B, E, L>
792-
where
793-
B::Target: BroadcasterInterface,
794-
E::Target: FeeEstimator,
795-
L::Target: LdkLogger,
796-
{
768+
impl WalletKeysManager {
797769
/// Constructs a `WalletKeysManager` that overrides the destination and shutdown scripts.
798770
///
799771
/// See [`KeysManager::new`] for more information on `seed`, `starting_time_secs`, and
800772
/// `starting_time_nanos`.
801773
pub fn new(
802-
seed: &[u8; 32], starting_time_secs: u64, starting_time_nanos: u32,
803-
wallet: Arc<Wallet<B, E, L>>, logger: L,
774+
seed: &[u8; 32], starting_time_secs: u64, starting_time_nanos: u32, wallet: Arc<Wallet>,
775+
logger: Arc<Logger>,
804776
) -> Self {
805777
let inner = KeysManager::new(seed, starting_time_secs, starting_time_nanos);
806778
Self { inner, wallet, logger }
@@ -819,12 +791,7 @@ where
819791
}
820792
}
821793

822-
impl<B: Deref, E: Deref, L: Deref> NodeSigner for WalletKeysManager<B, E, L>
823-
where
824-
B::Target: BroadcasterInterface,
825-
E::Target: FeeEstimator,
826-
L::Target: LdkLogger,
827-
{
794+
impl NodeSigner for WalletKeysManager {
828795
fn get_node_id(&self, recipient: Recipient) -> Result<PublicKey, ()> {
829796
self.inner.get_node_id(recipient)
830797
}
@@ -856,12 +823,7 @@ where
856823
}
857824
}
858825

859-
impl<B: Deref, E: Deref, L: Deref> OutputSpender for WalletKeysManager<B, E, L>
860-
where
861-
B::Target: BroadcasterInterface,
862-
E::Target: FeeEstimator,
863-
L::Target: LdkLogger,
864-
{
826+
impl OutputSpender for WalletKeysManager {
865827
/// See [`KeysManager::spend_spendable_outputs`] for documentation on this method.
866828
fn spend_spendable_outputs(
867829
&self, descriptors: &[&SpendableOutputDescriptor], outputs: Vec<TxOut>,
@@ -879,23 +841,13 @@ where
879841
}
880842
}
881843

882-
impl<B: Deref, E: Deref, L: Deref> EntropySource for WalletKeysManager<B, E, L>
883-
where
884-
B::Target: BroadcasterInterface,
885-
E::Target: FeeEstimator,
886-
L::Target: LdkLogger,
887-
{
844+
impl EntropySource for WalletKeysManager {
888845
fn get_secure_random_bytes(&self) -> [u8; 32] {
889846
self.inner.get_secure_random_bytes()
890847
}
891848
}
892849

893-
impl<B: Deref, E: Deref, L: Deref> SignerProvider for WalletKeysManager<B, E, L>
894-
where
895-
B::Target: BroadcasterInterface,
896-
E::Target: FeeEstimator,
897-
L::Target: LdkLogger,
898-
{
850+
impl SignerProvider for WalletKeysManager {
899851
type EcdsaSigner = InMemorySigner;
900852

901853
fn generate_channel_keys_id(&self, inbound: bool, user_channel_id: u128) -> [u8; 32] {
@@ -933,16 +885,20 @@ where
933885
}
934886
}
935887

936-
impl<B: Deref, E: Deref, L: Deref> ChangeDestinationSource for WalletKeysManager<B, E, L>
937-
where
938-
B::Target: BroadcasterInterface,
939-
E::Target: FeeEstimator,
940-
L::Target: LdkLogger,
941-
{
942-
fn get_change_destination_script(&self) -> Result<ScriptBuf, ()> {
943-
let address = self.wallet.get_new_internal_address().map_err(|e| {
944-
log_error!(self.logger, "Failed to retrieve new address from wallet: {}", e);
945-
})?;
946-
Ok(address.script_pubkey())
888+
impl ChangeDestinationSource for WalletKeysManager {
889+
fn get_change_destination_script<'a>(
890+
&self,
891+
) -> Pin<Box<dyn Future<Output = Result<ScriptBuf, ()>> + Send + 'a>> {
892+
let wallet = Arc::clone(&self.wallet);
893+
let logger = Arc::clone(&self.logger);
894+
Box::pin(async move {
895+
wallet
896+
.get_new_internal_address()
897+
.map_err(|e| {
898+
log_error!(logger, "Failed to retrieve new address from wallet: {}", e);
899+
})
900+
.map(|addr| addr.script_pubkey())
901+
.map_err(|_| ())
902+
})
947903
}
948904
}

0 commit comments

Comments
 (0)