7
7
8
8
use persist:: KVStoreWalletPersister ;
9
9
10
+ use crate :: config:: Config ;
10
11
use crate :: logger:: { log_debug, log_error, log_info, log_trace, LdkLogger , Logger } ;
11
12
12
13
use crate :: fee_estimator:: { ConfirmationTarget , FeeEstimator } ;
@@ -34,6 +35,7 @@ use lightning_invoice::RawBolt11Invoice;
34
35
use bdk_chain:: spk_client:: { FullScanRequest , SyncRequest } ;
35
36
use bdk_wallet:: { Balance , KeychainKind , PersistedWallet , SignOptions , Update } ;
36
37
38
+ use bitcoin:: address:: NetworkUnchecked ;
37
39
use bitcoin:: blockdata:: constants:: WITNESS_SCALE_FACTOR ;
38
40
use bitcoin:: blockdata:: locktime:: absolute:: LockTime ;
39
41
use bitcoin:: hashes:: Hash ;
@@ -43,11 +45,12 @@ use bitcoin::secp256k1::ecdh::SharedSecret;
43
45
use bitcoin:: secp256k1:: ecdsa:: { RecoverableSignature , Signature } ;
44
46
use bitcoin:: secp256k1:: { PublicKey , Scalar , Secp256k1 , SecretKey , Signing } ;
45
47
use bitcoin:: {
46
- Amount , FeeRate , ScriptBuf , Transaction , TxOut , Txid , WPubkeyHash , WitnessProgram ,
47
- WitnessVersion ,
48
+ Address , Amount , FeeRate , Network , ScriptBuf , Transaction , TxOut , Txid , WPubkeyHash ,
49
+ WitnessProgram , WitnessVersion ,
48
50
} ;
49
51
50
52
use std:: ops:: Deref ;
53
+ use std:: str:: FromStr ;
51
54
use std:: sync:: { Arc , Mutex } ;
52
55
53
56
pub ( crate ) enum OnchainSendAmount {
71
74
broadcaster : B ,
72
75
fee_estimator : E ,
73
76
payment_store : Arc < PaymentStore < Arc < Logger > > > ,
77
+ config : Arc < Config > ,
74
78
logger : L ,
75
79
}
76
80
@@ -83,11 +87,11 @@ where
83
87
pub ( crate ) fn new (
84
88
wallet : bdk_wallet:: PersistedWallet < KVStoreWalletPersister > ,
85
89
wallet_persister : KVStoreWalletPersister , broadcaster : B , fee_estimator : E ,
86
- payment_store : Arc < PaymentStore < Arc < Logger > > > , logger : L ,
90
+ payment_store : Arc < PaymentStore < Arc < Logger > > > , config : Arc < Config > , logger : L ,
87
91
) -> Self {
88
92
let inner = Mutex :: new ( wallet) ;
89
93
let persister = Mutex :: new ( wallet_persister) ;
90
- Self { inner, persister, broadcaster, fee_estimator, payment_store, logger }
94
+ Self { inner, persister, broadcaster, fee_estimator, payment_store, config , logger }
91
95
}
92
96
93
97
pub ( crate ) fn get_full_scan_request ( & self ) -> FullScanRequest < KeychainKind > {
@@ -327,10 +331,21 @@ where
327
331
self . get_balances ( total_anchor_channels_reserve_sats) . map ( |( _, s) | s)
328
332
}
329
333
334
+ fn parse_and_validate_address (
335
+ & self , network : Network , address : & Address ,
336
+ ) -> Result < Address , Error > {
337
+ Address :: < NetworkUnchecked > :: from_str ( address. to_string ( ) . as_str ( ) )
338
+ . map_err ( |_| Error :: InvalidAddress ) ?
339
+ . require_network ( network)
340
+ . map_err ( |_| Error :: InvalidAddress )
341
+ }
342
+
330
343
pub ( crate ) fn send_to_address (
331
344
& self , address : & bitcoin:: Address , send_amount : OnchainSendAmount ,
332
345
fee_rate : Option < FeeRate > ,
333
346
) -> Result < Txid , Error > {
347
+ self . parse_and_validate_address ( self . config . network , & address) ?;
348
+
334
349
// Use the set fee_rate or default to fee estimation.
335
350
let confirmation_target = ConfirmationTarget :: OnchainPayment ;
336
351
let fee_rate =
0 commit comments