77
88use crate :: config:: {
99 Config , BDK_CLIENT_CONCURRENCY , BDK_CLIENT_STOP_GAP , BDK_WALLET_SYNC_TIMEOUT_SECS ,
10- FEE_RATE_CACHE_UPDATE_TIMEOUT_SECS , LDK_WALLET_SYNC_TIMEOUT_SECS ,
10+ FEE_RATE_CACHE_UPDATE_TIMEOUT_SECS , LDK_WALLET_SYNC_TIMEOUT_SECS , TX_BROADCAST_TIMEOUT_SECS ,
1111} ;
1212use crate :: fee_estimator:: {
1313 apply_post_estimation_adjustments, get_all_conf_targets, get_num_block_defaults_for_target,
1414 OnchainFeeEstimator ,
1515} ;
16- use crate :: logger:: { log_error, log_info, log_trace, FilesystemLogger , Logger } ;
17- use crate :: types:: Wallet ;
16+ use crate :: logger:: { log_bytes , log_error, log_info, log_trace, FilesystemLogger , Logger } ;
17+ use crate :: types:: { Broadcaster , Wallet } ;
1818use crate :: Error ;
1919
2020use lightning:: chain:: { Confirm , Filter } ;
21+ use lightning:: util:: ser:: Writeable ;
2122
2223use lightning_transaction_sync:: EsploraSyncClient ;
2324
@@ -98,6 +99,7 @@ pub(crate) enum ChainSource {
9899 tx_sync : Arc < EsploraSyncClient < Arc < FilesystemLogger > > > ,
99100 lightning_wallet_sync_status : Mutex < WalletSyncStatus > ,
100101 fee_estimator : Arc < OnchainFeeEstimator > ,
102+ tx_broadcaster : Arc < Broadcaster > ,
101103 config : Arc < Config > ,
102104 logger : Arc < FilesystemLogger > ,
103105 } ,
@@ -106,9 +108,9 @@ pub(crate) enum ChainSource {
106108impl ChainSource {
107109 pub ( crate ) fn new_esplora (
108110 server_url : String , onchain_wallet : Arc < Wallet > , fee_estimator : Arc < OnchainFeeEstimator > ,
109- config : Arc < Config > , logger : Arc < FilesystemLogger > ,
111+ tx_broadcaster : Arc < Broadcaster > , config : Arc < Config > , logger : Arc < FilesystemLogger > ,
110112 ) -> Self {
111- let mut client_builder = esplora_client:: Builder :: new ( & server_url. clone ( ) ) ;
113+ let mut client_builder = esplora_client:: Builder :: new ( & server_url) ;
112114 client_builder = client_builder. timeout ( DEFAULT_ESPLORA_CLIENT_TIMEOUT_SECS ) ;
113115 let esplora_client = client_builder. build_async ( ) . unwrap ( ) ;
114116 let tx_sync =
@@ -122,6 +124,7 @@ impl ChainSource {
122124 tx_sync,
123125 lightning_wallet_sync_status,
124126 fee_estimator,
127+ tx_broadcaster,
125128 config,
126129 logger,
127130 }
@@ -298,6 +301,82 @@ impl ChainSource {
298301 } ,
299302 }
300303 }
304+
305+ pub ( crate ) async fn process_broadcast_queue ( & self ) {
306+ match self {
307+ Self :: Esplora { esplora_client, tx_broadcaster, logger, .. } => {
308+ let mut receiver = tx_broadcaster. get_broadcast_queue ( ) . await ;
309+ while let Some ( next_package) = receiver. recv ( ) . await {
310+ for tx in & next_package {
311+ let txid = tx. compute_txid ( ) ;
312+ let timeout_fut = tokio:: time:: timeout (
313+ Duration :: from_secs ( TX_BROADCAST_TIMEOUT_SECS ) ,
314+ esplora_client. broadcast ( tx) ,
315+ ) ;
316+ match timeout_fut. await {
317+ Ok ( res) => match res {
318+ Ok ( ( ) ) => {
319+ log_trace ! (
320+ logger,
321+ "Successfully broadcast transaction {}" ,
322+ txid
323+ ) ;
324+ } ,
325+ Err ( e) => match e {
326+ esplora_client:: Error :: Reqwest ( err) => {
327+ if err. status ( ) == reqwest:: StatusCode :: from_u16 ( 400 ) . ok ( ) {
328+ // Ignore 400, as this just means bitcoind already knows the
329+ // transaction.
330+ // FIXME: We can further differentiate here based on the error
331+ // message which will be available with rust-esplora-client 0.7 and
332+ // later.
333+ } else {
334+ log_error ! (
335+ logger,
336+ "Failed to broadcast due to HTTP connection error: {}" ,
337+ err
338+ ) ;
339+ }
340+ log_trace ! (
341+ logger,
342+ "Failed broadcast transaction bytes: {}" ,
343+ log_bytes!( tx. encode( ) )
344+ ) ;
345+ } ,
346+ _ => {
347+ log_error ! (
348+ logger,
349+ "Failed to broadcast transaction {}: {}" ,
350+ txid,
351+ e
352+ ) ;
353+ log_trace ! (
354+ logger,
355+ "Failed broadcast transaction bytes: {}" ,
356+ log_bytes!( tx. encode( ) )
357+ ) ;
358+ } ,
359+ } ,
360+ } ,
361+ Err ( e) => {
362+ log_error ! (
363+ logger,
364+ "Failed to broadcast transaction due to timeout {}: {}" ,
365+ txid,
366+ e
367+ ) ;
368+ log_trace ! (
369+ logger,
370+ "Failed broadcast transaction bytes: {}" ,
371+ log_bytes!( tx. encode( ) )
372+ ) ;
373+ } ,
374+ }
375+ }
376+ }
377+ } ,
378+ }
379+ }
301380}
302381
303382impl Filter for ChainSource {
0 commit comments