Skip to content

Commit 90b4db2

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 2ca086b commit 90b4db2

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);
@@ -559,12 +551,7 @@ where
559551
}
560552
}
561553

562-
impl<B: Deref, E: Deref, L: Deref> Listen for Wallet<B, E, L>
563-
where
564-
B::Target: BroadcasterInterface,
565-
E::Target: FeeEstimator,
566-
L::Target: LdkLogger,
567-
{
554+
impl Listen for Wallet {
568555
fn filtered_block_connected(
569556
&self, _header: &bitcoin::block::Header,
570557
_txdata: &lightning::chain::transaction::TransactionData, _height: u32,
@@ -624,12 +611,7 @@ where
624611
}
625612
}
626613

627-
impl<B: Deref, E: Deref, L: Deref> WalletSource for Wallet<B, E, L>
628-
where
629-
B::Target: BroadcasterInterface,
630-
E::Target: FeeEstimator,
631-
L::Target: LdkLogger,
632-
{
614+
impl WalletSource for Wallet {
633615
fn list_confirmed_utxos(&self) -> Result<Vec<Utxo>, ()> {
634616
let locked_wallet = self.inner.lock().unwrap();
635617
let mut utxos = Vec::new();
@@ -766,30 +748,20 @@ where
766748

767749
/// Similar to [`KeysManager`], but overrides the destination and shutdown scripts so they are
768750
/// directly spendable by the BDK wallet.
769-
pub(crate) struct WalletKeysManager<B: Deref, E: Deref, L: Deref>
770-
where
771-
B::Target: BroadcasterInterface,
772-
E::Target: FeeEstimator,
773-
L::Target: LdkLogger,
774-
{
751+
pub(crate) struct WalletKeysManager {
775752
inner: KeysManager,
776-
wallet: Arc<Wallet<B, E, L>>,
777-
logger: L,
753+
wallet: Arc<Wallet>,
754+
logger: Arc<Logger>,
778755
}
779756

780-
impl<B: Deref, E: Deref, L: Deref> WalletKeysManager<B, E, L>
781-
where
782-
B::Target: BroadcasterInterface,
783-
E::Target: FeeEstimator,
784-
L::Target: LdkLogger,
785-
{
757+
impl WalletKeysManager {
786758
/// Constructs a `WalletKeysManager` that overrides the destination and shutdown scripts.
787759
///
788760
/// See [`KeysManager::new`] for more information on `seed`, `starting_time_secs`, and
789761
/// `starting_time_nanos`.
790762
pub fn new(
791-
seed: &[u8; 32], starting_time_secs: u64, starting_time_nanos: u32,
792-
wallet: Arc<Wallet<B, E, L>>, logger: L,
763+
seed: &[u8; 32], starting_time_secs: u64, starting_time_nanos: u32, wallet: Arc<Wallet>,
764+
logger: Arc<Logger>,
793765
) -> Self {
794766
let inner = KeysManager::new(seed, starting_time_secs, starting_time_nanos);
795767
Self { inner, wallet, logger }
@@ -808,12 +780,7 @@ where
808780
}
809781
}
810782

811-
impl<B: Deref, E: Deref, L: Deref> NodeSigner for WalletKeysManager<B, E, L>
812-
where
813-
B::Target: BroadcasterInterface,
814-
E::Target: FeeEstimator,
815-
L::Target: LdkLogger,
816-
{
783+
impl NodeSigner for WalletKeysManager {
817784
fn get_node_id(&self, recipient: Recipient) -> Result<PublicKey, ()> {
818785
self.inner.get_node_id(recipient)
819786
}
@@ -845,12 +812,7 @@ where
845812
}
846813
}
847814

848-
impl<B: Deref, E: Deref, L: Deref> OutputSpender for WalletKeysManager<B, E, L>
849-
where
850-
B::Target: BroadcasterInterface,
851-
E::Target: FeeEstimator,
852-
L::Target: LdkLogger,
853-
{
815+
impl OutputSpender for WalletKeysManager {
854816
/// See [`KeysManager::spend_spendable_outputs`] for documentation on this method.
855817
fn spend_spendable_outputs(
856818
&self, descriptors: &[&SpendableOutputDescriptor], outputs: Vec<TxOut>,
@@ -868,23 +830,13 @@ where
868830
}
869831
}
870832

871-
impl<B: Deref, E: Deref, L: Deref> EntropySource for WalletKeysManager<B, E, L>
872-
where
873-
B::Target: BroadcasterInterface,
874-
E::Target: FeeEstimator,
875-
L::Target: LdkLogger,
876-
{
833+
impl EntropySource for WalletKeysManager {
877834
fn get_secure_random_bytes(&self) -> [u8; 32] {
878835
self.inner.get_secure_random_bytes()
879836
}
880837
}
881838

882-
impl<B: Deref, E: Deref, L: Deref> SignerProvider for WalletKeysManager<B, E, L>
883-
where
884-
B::Target: BroadcasterInterface,
885-
E::Target: FeeEstimator,
886-
L::Target: LdkLogger,
887-
{
839+
impl SignerProvider for WalletKeysManager {
888840
type EcdsaSigner = InMemorySigner;
889841

890842
fn generate_channel_keys_id(&self, inbound: bool, user_channel_id: u128) -> [u8; 32] {
@@ -922,16 +874,20 @@ where
922874
}
923875
}
924876

925-
impl<B: Deref, E: Deref, L: Deref> ChangeDestinationSource for WalletKeysManager<B, E, L>
926-
where
927-
B::Target: BroadcasterInterface,
928-
E::Target: FeeEstimator,
929-
L::Target: LdkLogger,
930-
{
931-
fn get_change_destination_script(&self) -> Result<ScriptBuf, ()> {
932-
let address = self.wallet.get_new_internal_address().map_err(|e| {
933-
log_error!(self.logger, "Failed to retrieve new address from wallet: {}", e);
934-
})?;
935-
Ok(address.script_pubkey())
877+
impl ChangeDestinationSource for WalletKeysManager {
878+
fn get_change_destination_script<'a>(
879+
&self,
880+
) -> Pin<Box<dyn Future<Output = Result<ScriptBuf, ()>> + Send + 'a>> {
881+
let wallet = Arc::clone(&self.wallet);
882+
let logger = Arc::clone(&self.logger);
883+
Box::pin(async move {
884+
wallet
885+
.get_new_internal_address()
886+
.map_err(|e| {
887+
log_error!(logger, "Failed to retrieve new address from wallet: {}", e);
888+
})
889+
.map(|addr| addr.script_pubkey())
890+
.map_err(|_| ())
891+
})
936892
}
937893
}

0 commit comments

Comments
 (0)