@@ -31,6 +31,7 @@ use crate::chain::ClaimId;
3131use  crate :: chain:: chaininterface:: { ConfirmationTarget ,  FeeEstimator ,  BroadcasterInterface ,  LowerBoundedFeeEstimator } ; 
3232use  crate :: chain:: channelmonitor:: { ANTI_REORG_DELAY ,  CLTV_SHARED_CLAIM_BUFFER } ; 
3333use  crate :: chain:: package:: { PackageSolvingData ,  PackageTemplate } ; 
34+ use  crate :: chain:: transaction:: MaybeSignedTransaction ; 
3435use  crate :: util:: logger:: Logger ; 
3536use  crate :: util:: ser:: { Readable ,  ReadableArgs ,  MaybeReadable ,  UpgradableRequired ,  Writer ,  Writeable ,  VecWriter } ; 
3637
@@ -204,14 +205,16 @@ pub(crate) enum ClaimEvent {
204205/// control) onchain. 
205206pub ( crate )  enum  OnchainClaim  { 
206207	/// A finalized transaction pending confirmation spending the output to claim. 
207-  	Tx ( Transaction ) , 
208+  	Tx ( MaybeSignedTransaction ) , 
208209	/// An event yielded externally to signal additional inputs must be added to a transaction 
209210 	/// pending confirmation spending the output to claim. 
210211 	Event ( ClaimEvent ) , 
211212} 
212213
213- /// Represents the different feerates  a pending request can use when generating a claim. 
214+ /// Represents the different feerate strategies  a pending request can use when generating a claim. 
214215pub ( crate )  enum  FeerateStrategy  { 
216+ 	/// We must reuse the most recently used feerate, if any. 
217+  	RetryPrevious , 
215218	/// We must pick the highest between the most recently used and the current feerate estimate. 
216219 	HighestOfPreviousOrNew , 
217220	/// We must force a bump of the most recently used feerate, either by using the current feerate 
@@ -506,9 +509,13 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
506509					} 
507510					match  claim { 
508511						OnchainClaim :: Tx ( tx)  => { 
509- 							let  log_start = if  bumped_feerate {  "Broadcasting RBF-bumped"  }  else  {  "Rebroadcasting"  } ; 
510- 							log_info ! ( logger,  "{} onchain {}" ,  log_start,  log_tx!( tx) ) ; 
511- 							broadcaster. broadcast_transactions ( & [ & tx] ) ; 
512+ 							if  tx. is_fully_signed ( )  { 
513+ 								let  log_start = if  bumped_feerate {  "Broadcasting RBF-bumped"  }  else  {  "Rebroadcasting"  } ; 
514+ 								log_info ! ( logger,  "{} onchain {}" ,  log_start,  log_tx!( tx. 0 ) ) ; 
515+ 								broadcaster. broadcast_transactions ( & [ & tx. 0 ] ) ; 
516+ 							}  else  { 
517+ 								log_info ! ( logger,  "Waiting for signature of unsigned onchain transaction {}" ,  tx. 0 . txid( ) ) ; 
518+ 							} 
512519						} , 
513520						OnchainClaim :: Event ( event)  => { 
514521							let  log_start = if  bumped_feerate {  "Yielding fee-bumped"  }  else  {  "Replaying"  } ; 
@@ -610,11 +617,10 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
610617			)  { 
611618				assert ! ( new_feerate != 0 ) ; 
612619
613- 				let  transaction = cached_request. finalize_malleable_package ( 
620+ 				let  transaction = cached_request. maybe_finalize_malleable_package ( 
614621					cur_height,  self ,  output_value,  self . destination_script . clone ( ) ,  logger
615622				) . unwrap ( ) ; 
616- 				log_trace ! ( logger,  "...with timer {} and feerate {}" ,  new_timer,  new_feerate) ; 
617- 				assert ! ( predicted_weight >= transaction. weight( ) . to_wu( ) ) ; 
623+ 				assert ! ( predicted_weight >= transaction. 0 . weight( ) . to_wu( ) ) ; 
618624				return  Some ( ( new_timer,  new_feerate,  OnchainClaim :: Tx ( transaction) ) ) ; 
619625			} 
620626		}  else  { 
@@ -623,7 +629,7 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
623629			// which require external funding. 
624630			let  mut  inputs = cached_request. inputs ( ) ; 
625631			debug_assert_eq ! ( inputs. len( ) ,  1 ) ; 
626- 			let  tx = match  cached_request. finalize_untractable_package ( self ,  logger)  { 
632+ 			let  tx = match  cached_request. maybe_finalize_untractable_package ( self ,  logger)  { 
627633				Some ( tx)  => tx, 
628634				None  => return  None , 
629635			} ; 
@@ -634,27 +640,27 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
634640				// Commitment inputs with anchors support are the only untractable inputs supported 
635641				// thus far that require external funding. 
636642				PackageSolvingData :: HolderFundingOutput ( output)  => { 
637- 					debug_assert_eq ! ( tx. txid( ) ,  self . holder_commitment. trust( ) . txid( ) , 
643+ 					debug_assert_eq ! ( tx. 0 . txid( ) ,  self . holder_commitment. trust( ) . txid( ) , 
638644						"Holder commitment transaction mismatch" ) ; 
639645
640646					let  conf_target = ConfirmationTarget :: OnChainSweep ; 
641647					let  package_target_feerate_sat_per_1000_weight = cached_request
642648						. compute_package_feerate ( fee_estimator,  conf_target,  feerate_strategy) ; 
643649					if  let  Some ( input_amount_sat)  = output. funding_amount  { 
644- 						let  fee_sat = input_amount_sat - tx. output . iter ( ) . map ( |output| output. value ) . sum :: < u64 > ( ) ; 
650+ 						let  fee_sat = input_amount_sat - tx. 0 . output . iter ( ) . map ( |output| output. value ) . sum :: < u64 > ( ) ; 
645651						let  commitment_tx_feerate_sat_per_1000_weight =
646- 							compute_feerate_sat_per_1000_weight ( fee_sat,  tx. weight ( ) . to_wu ( ) ) ; 
652+ 							compute_feerate_sat_per_1000_weight ( fee_sat,  tx. 0 . weight ( ) . to_wu ( ) ) ; 
647653						if  commitment_tx_feerate_sat_per_1000_weight >= package_target_feerate_sat_per_1000_weight { 
648- 							log_debug ! ( logger,  "Pre-signed {} already has feerate {} sat/kW above required {} sat/kW" , 
649- 								log_tx! ( tx ) ,  commitment_tx_feerate_sat_per_1000_weight, 
654+ 							log_debug ! ( logger,  "Pre-signed commitment  {} already has feerate {} sat/kW above required {} sat/kW" , 
655+ 								tx . 0 . txid ( ) ,  commitment_tx_feerate_sat_per_1000_weight, 
650656								package_target_feerate_sat_per_1000_weight) ; 
651657							return  Some ( ( new_timer,  0 ,  OnchainClaim :: Tx ( tx. clone ( ) ) ) ) ; 
652658						} 
653659					} 
654660
655661					// We'll locate an anchor output we can spend within the commitment transaction. 
656662					let  funding_pubkey = & self . channel_transaction_parameters . holder_pubkeys . funding_pubkey ; 
657- 					match  chan_utils:: get_anchor_output ( & tx,  funding_pubkey)  { 
663+ 					match  chan_utils:: get_anchor_output ( & tx. 0 ,  funding_pubkey)  { 
658664						// An anchor output was found, so we should yield a funding event externally. 
659665						Some ( ( idx,  _) )  => { 
660666							// TODO: Use a lower confirmation target when both our and the 
@@ -664,7 +670,7 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
664670								package_target_feerate_sat_per_1000_weight as  u64 , 
665671								OnchainClaim :: Event ( ClaimEvent :: BumpCommitment  { 
666672									package_target_feerate_sat_per_1000_weight, 
667- 									commitment_tx :  tx. clone ( ) , 
673+ 									commitment_tx :  tx. 0 . clone ( ) , 
668674									anchor_output_idx :  idx, 
669675								} ) , 
670676							) ) 
@@ -785,9 +791,13 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
785791				// `OnchainClaim`. 
786792				let  claim_id = match  claim { 
787793					OnchainClaim :: Tx ( tx)  => { 
788- 						log_info ! ( logger,  "Broadcasting onchain {}" ,  log_tx!( tx) ) ; 
789- 						broadcaster. broadcast_transactions ( & [ & tx] ) ; 
790- 						ClaimId ( tx. txid ( ) . to_byte_array ( ) ) 
794+ 						if  tx. is_fully_signed ( )  { 
795+ 							log_info ! ( logger,  "Broadcasting onchain {}" ,  log_tx!( tx. 0 ) ) ; 
796+ 							broadcaster. broadcast_transactions ( & [ & tx. 0 ] ) ; 
797+ 						}  else  { 
798+ 							log_info ! ( logger,  "Waiting for signature of unsigned onchain transaction {}" ,  tx. 0 . txid( ) ) ; 
799+ 						} 
800+ 						ClaimId ( tx. 0 . txid ( ) . to_byte_array ( ) ) 
791801					} , 
792802					OnchainClaim :: Event ( claim_event)  => { 
793803						log_info ! ( logger,  "Yielding onchain event to spend inputs {:?}" ,  req. outpoints( ) ) ; 
@@ -980,8 +990,13 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
980990			)  { 
981991				match  bump_claim { 
982992					OnchainClaim :: Tx ( bump_tx)  => { 
983- 						log_info ! ( logger,  "Broadcasting RBF-bumped onchain {}" ,  log_tx!( bump_tx) ) ; 
984- 						broadcaster. broadcast_transactions ( & [ & bump_tx] ) ; 
993+ 						if  bump_tx. is_fully_signed ( )  { 
994+ 							log_info ! ( logger,  "Broadcasting RBF-bumped onchain {}" ,  log_tx!( bump_tx. 0 ) ) ; 
995+ 							broadcaster. broadcast_transactions ( & [ & bump_tx. 0 ] ) ; 
996+ 						}  else  { 
997+ 							log_info ! ( logger,  "Waiting for signature of RBF-bumped unsigned onchain transaction {}" , 
998+ 								bump_tx. 0 . txid( ) ) ; 
999+ 						} 
9851000					} , 
9861001					OnchainClaim :: Event ( claim_event)  => { 
9871002						log_info ! ( logger,  "Yielding RBF-bumped onchain event to spend inputs {:?}" ,  request. outpoints( ) ) ; 
@@ -1063,8 +1078,12 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
10631078				request. set_feerate ( new_feerate) ; 
10641079				match  bump_claim { 
10651080					OnchainClaim :: Tx ( bump_tx)  => { 
1066- 						log_info ! ( logger,  "Broadcasting onchain {}" ,  log_tx!( bump_tx) ) ; 
1067- 						broadcaster. broadcast_transactions ( & [ & bump_tx] ) ; 
1081+ 						if  bump_tx. is_fully_signed ( )  { 
1082+ 							log_info ! ( logger,  "Broadcasting onchain {}" ,  log_tx!( bump_tx. 0 ) ) ; 
1083+ 							broadcaster. broadcast_transactions ( & [ & bump_tx. 0 ] ) ; 
1084+ 						}  else  { 
1085+ 							log_info ! ( logger,  "Waiting for signature of unsigned onchain transaction {}" ,  bump_tx. 0 . txid( ) ) ; 
1086+ 						} 
10681087					} , 
10691088					OnchainClaim :: Event ( claim_event)  => { 
10701089						log_info ! ( logger,  "Yielding onchain event after reorg to spend inputs {:?}" ,  request. outpoints( ) ) ; 
@@ -1117,13 +1136,11 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
11171136		& self . holder_commitment . trust ( ) . built_transaction ( ) . transaction 
11181137	} 
11191138
1120- 	//TODO: getting lastest holder transactions should be infallible and result in us "force-closing the channel", but we may 
1121- 	// have empty holder commitment transaction if a ChannelMonitor is asked to force-close just after OutboundV1Channel::get_funding_created, 
1122- 	// before providing a initial commitment transaction. For outbound channel, init ChannelMonitor at Channel::funding_signed, there is nothing 
1123- 	// to monitor before. 
1124- 	pub ( crate )  fn  get_fully_signed_holder_tx ( & mut  self ,  funding_redeemscript :  & Script )  -> Transaction  { 
1125- 		let  sig = self . signer . sign_holder_commitment ( & self . holder_commitment ,  & self . secp_ctx ) . expect ( "signing holder commitment" ) ; 
1126- 		self . holder_commitment . add_holder_sig ( funding_redeemscript,  sig) 
1139+ 	pub ( crate )  fn  get_maybe_signed_holder_tx ( & mut  self ,  funding_redeemscript :  & Script )  -> MaybeSignedTransaction  { 
1140+ 		let  tx = self . signer . sign_holder_commitment ( & self . holder_commitment ,  & self . secp_ctx ) 
1141+ 			. map ( |sig| self . holder_commitment . add_holder_sig ( funding_redeemscript,  sig) ) 
1142+ 			. unwrap_or_else ( |_| self . get_unsigned_holder_commitment_tx ( ) . clone ( ) ) ; 
1143+ 		MaybeSignedTransaction ( tx) 
11271144	} 
11281145
11291146	#[ cfg( any( test,  feature="unsafe_revoked_tx_signing" ) ) ]  
@@ -1132,7 +1149,7 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
11321149		self . holder_commitment . add_holder_sig ( funding_redeemscript,  sig) 
11331150	} 
11341151
1135- 	pub ( crate )  fn  get_fully_signed_htlc_tx ( & mut  self ,  outp :  & :: bitcoin:: OutPoint ,  preimage :  & Option < PaymentPreimage > )  -> Option < Transaction >  { 
1152+ 	pub ( crate )  fn  get_maybe_signed_htlc_tx ( & mut  self ,  outp :  & :: bitcoin:: OutPoint ,  preimage :  & Option < PaymentPreimage > )  -> Option < MaybeSignedTransaction >  { 
11361153		let  get_signed_htlc_tx = |holder_commitment :  & HolderCommitmentTransaction | { 
11371154			let  trusted_tx = holder_commitment. trust ( ) ; 
11381155			if  trusted_tx. txid ( )  != outp. txid  { 
@@ -1160,11 +1177,12 @@ impl<ChannelSigner: WriteableEcdsaChannelSigner> OnchainTxHandler<ChannelSigner>
11601177				preimage :  preimage. clone ( ) , 
11611178				counterparty_sig :  counterparty_htlc_sig. clone ( ) , 
11621179			} ; 
1163- 			let  htlc_sig = self . signer . sign_holder_htlc_transaction ( & htlc_tx,  0 ,  & htlc_descriptor,  & self . secp_ctx ) . unwrap ( ) ; 
1164- 			htlc_tx. input [ 0 ] . witness  = trusted_tx. build_htlc_input_witness ( 
1165- 				htlc_idx,  & counterparty_htlc_sig,  & htlc_sig,  preimage, 
1166- 			) ; 
1167- 			Some ( htlc_tx) 
1180+ 			if  let  Ok ( htlc_sig)  = self . signer . sign_holder_htlc_transaction ( & htlc_tx,  0 ,  & htlc_descriptor,  & self . secp_ctx )  { 
1181+ 				htlc_tx. input [ 0 ] . witness  = trusted_tx. build_htlc_input_witness ( 
1182+ 					htlc_idx,  & counterparty_htlc_sig,  & htlc_sig,  preimage, 
1183+ 				) ; 
1184+ 			} 
1185+ 			Some ( MaybeSignedTransaction ( htlc_tx) ) 
11681186		} ; 
11691187
11701188		// Check if the HTLC spends from the current holder commitment first, or the previous. 
0 commit comments