@@ -15,7 +15,7 @@ use crate::io;
1515use crate :: ln:: msgs:: DecodeError ;
1616use crate :: ln:: types:: ChannelId ;
1717use crate :: prelude:: * ;
18- use crate :: sign:: { ChangeDestinationSource , OutputSpender , SpendableOutputDescriptor } ;
18+ use crate :: sign:: { ChangeDestinationSource , ChangeDestinationSourceSync , ChangeDestinationSourceSyncWrapper , OutputSpender , SpendableOutputDescriptor } ;
1919use crate :: sync:: Mutex ;
2020use crate :: util:: logger:: Logger ;
2121use crate :: util:: persist:: {
@@ -356,6 +356,60 @@ where
356356 logger : L ,
357357}
358358
359+ pub struct OutputSweeperSync < B : Deref , D : Deref , E : Deref , F : Deref , K : Deref , L : Deref , O : Deref >
360+ where
361+ B :: Target : BroadcasterInterface ,
362+ D :: Target : ChangeDestinationSource ,
363+ E :: Target : FeeEstimator ,
364+ F :: Target : Filter + Sync + Send ,
365+ K :: Target : KVStore ,
366+ L :: Target : Logger ,
367+ O :: Target : OutputSpender ,
368+ {
369+ sweeper : OutputSweeper < B , D , E , F , K , L , O > ,
370+ }
371+
372+ impl < B : Deref , D : Deref , E : Deref , F : Deref , K : Deref , L : Deref , O : Deref >
373+ OutputSweeperSync < B , D , E , F , K , L , O >
374+ where
375+ B :: Target : BroadcasterInterface ,
376+ D :: Target : ChangeDestinationSource ,
377+ E :: Target : FeeEstimator ,
378+ F :: Target : Filter + Sync + Send ,
379+ K :: Target : KVStore ,
380+ L :: Target : Logger ,
381+ O :: Target : OutputSpender ,
382+ {
383+ fn new < DA : ChangeDestinationSourceSync + Deref > (
384+ best_block : BestBlock , broadcaster : B , fee_estimator : E , chain_data_source : Option < F > ,
385+ output_spender : O , change_destination_source : DA , kv_store : K , logger : L ,
386+ ) -> Self {
387+ let change_destination_source: = ChangeDestinationSourceSyncWrapper :: new ( change_destination_source) ;
388+
389+ let sweeper = OutputSweeper :: new (
390+ best_block, broadcaster, fee_estimator, chain_data_source, output_spender,
391+ & change_destination_source, kv_store, logger,
392+ ) ;
393+ Self { sweeper }
394+ }
395+
396+ /// Regenerates and broadcasts the spending transaction for any outputs that are pending
397+ pub fn regenerate_and_broadcast_spend_if_necessary ( & self ) -> Result < ( ) , ( ) > {
398+ let mut fut = Box :: pin ( self . sweeper . regenerate_and_broadcast_spend_if_necessary_async ( ) ) ;
399+ let mut waker = dummy_waker ( ) ;
400+ let mut ctx = task:: Context :: from_waker ( & mut waker) ;
401+ match fut. as_mut ( ) . poll ( & mut ctx) {
402+ task:: Poll :: Ready ( result) => {
403+ result
404+ } ,
405+ task:: Poll :: Pending => {
406+ // In a sync context, we can't wait for the future to complete.
407+ panic ! ( "task not ready" ) ;
408+ } ,
409+ }
410+ }
411+ }
412+
359413impl < B : Deref , D : Deref , E : Deref , F : Deref , K : Deref , L : Deref , O : Deref >
360414 OutputSweeper < B , D , E , F , K , L , O >
361415where
0 commit comments