@@ -1478,32 +1478,67 @@ impl<SP: Deref> Channel<SP> where
14781478	where
14791479		L::Target: Logger
14801480	{
1481- 		let phase = core::mem::replace(&mut self.phase, ChannelPhase::Undefined);
1482- 		let result = if let ChannelPhase::UnfundedV2(chan) = phase {
1481+ 		if let ChannelPhase::UnfundedV2(chan) = &mut self.phase {
14831482			let logger = WithChannelContext::from(logger, &chan.context, None);
1484- 			match chan.funding_tx_constructed(signing_session, &&logger) {
1485- 				Ok((chan, commitment_signed, event)) => {
1486- 					self.phase = ChannelPhase::Funded(chan);
1487- 					Ok((commitment_signed, event))
1488- 				},
1489- 				Err((chan, e)) => {
1490- 					self.phase = ChannelPhase::UnfundedV2(chan);
1491- 					Err(e)
1492- 				},
1493- 			}
1483+ 			chan.funding_tx_constructed(signing_session, &&logger)
14941484		} else {
1495- 			self.phase = phase;
14961485			Err(ChannelError::Warn("Got a tx_complete message with no interactive transaction construction expected or in-progress".to_owned()))
1497- 		};
1498- 
1499- 		debug_assert!(!matches!(self.phase, ChannelPhase::Undefined));
1500- 		result
1486+ 		}
15011487	}
15021488
15031489	pub fn force_shutdown(&mut self, should_broadcast: bool, closure_reason: ClosureReason) -> ShutdownResult {
15041490		let (funding, context) = self.funding_and_context_mut();
15051491		context.force_shutdown(funding, should_broadcast, closure_reason)
15061492	}
1493+ 
1494+ 	pub fn commitment_signed<L: Deref>(
1495+ 		&mut self, msg: &msgs::CommitmentSigned, best_block: BestBlock, signer_provider: &SP, logger: &L
1496+ 	) -> Result<(Option<ChannelMonitor<<SP::Target as SignerProvider>::EcdsaSigner>>, Option<ChannelMonitorUpdate>), ChannelError>
1497+ 	where
1498+ 		L::Target: Logger
1499+ 	{
1500+ 		let phase = core::mem::replace(&mut self.phase, ChannelPhase::Undefined);
1501+ 		match phase {
1502+ 			ChannelPhase::UnfundedV2(chan) => {
1503+ 				let holder_commitment_point = match chan.unfunded_context.holder_commitment_point {
1504+ 					Some(point) => point,
1505+ 					None => {
1506+ 						let channel_id = chan.context.channel_id();
1507+ 						// TODO(dual_funding): Add async signing support.
1508+ 						return Err( ChannelError::close(
1509+ 							format!("Expected to have holder commitment points available upon finishing interactive tx construction for channel {}",
1510+ 								channel_id)));
1511+ 					}
1512+ 				};
1513+ 				let mut funded_channel = FundedChannel {
1514+ 					funding: chan.funding,
1515+ 					context: chan.context,
1516+ 					interactive_tx_signing_session: chan.interactive_tx_signing_session,
1517+ 					holder_commitment_point,
1518+ 					is_v2_established: true,
1519+ 				};
1520+ 				let res = funded_channel.commitment_signed_initial_v2(msg, best_block, signer_provider, logger)
1521+ 					.map(|monitor| (Some(monitor), None))
1522+ 					// TODO: Change to `inspect_err` when MSRV is high enough.
1523+ 					.map_err(|err| {
1524+ 						// We always expect a `ChannelError` close.
1525+ 						debug_assert!(matches!(err, ChannelError::Close(_)));
1526+ 						err
1527+ 					});
1528+ 				self.phase = ChannelPhase::Funded(funded_channel);
1529+ 				res
1530+ 			},
1531+ 			ChannelPhase::Funded(mut funded_channel) => {
1532+ 				let res = funded_channel.commitment_signed(msg, logger).map(|monitor_update_opt| (None, monitor_update_opt));
1533+ 				self.phase = ChannelPhase::Funded(funded_channel);
1534+ 				res
1535+ 			},
1536+ 			_ => {
1537+ 				debug_assert!(!matches!(self.phase, ChannelPhase::Undefined));
1538+ 				Err(ChannelError::close("Got a commitment_signed message for an unfunded V1 channel!".into()))
1539+ 			}
1540+ 		}
1541+ 	}
15071542}
15081543
15091544impl<SP: Deref> From<OutboundV1Channel<SP>> for Channel<SP>
@@ -2194,8 +2229,8 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
21942229	}
21952230
21962231	pub fn funding_tx_constructed<L: Deref>(
2197- 		mut self, mut signing_session: InteractiveTxSigningSession, logger: &L
2198- 	) -> Result<(FundedChannel<SP>,  msgs::CommitmentSigned, Option<Event>), (PendingV2Channel<SP>,  ChannelError) >
2232+ 		& mut self, mut signing_session: InteractiveTxSigningSession, logger: &L
2233+ 	) -> Result<(msgs::CommitmentSigned, Option<Event>), ChannelError>
21992234	where
22002235		L::Target: Logger
22012236	{
@@ -2211,7 +2246,7 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
22112246						(
22122247							"Multiple outputs matched the expected script and value".to_owned(),
22132248							ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(false) },
2214- 						))).map_err(|e| (self, e)) ;
2249+ 						)));
22152250				}
22162251				output_index = Some(idx as u16);
22172252			}
@@ -2223,7 +2258,7 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
22232258				(
22242259					"No output matched the funding script_pubkey".to_owned(),
22252260					ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(false) },
2226- 				))).map_err(|e| (self, e)) ;
2261+ 				)));
22272262		};
22282263		self.context.channel_transaction_parameters.funding_outpoint = Some(outpoint);
22292264		self.context.holder_signer.as_mut().provide_channel_parameters(&self.context.channel_transaction_parameters);
@@ -2237,8 +2272,7 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
22372272			},
22382273			Err(err) => {
22392274				self.context.channel_transaction_parameters.funding_outpoint = None;
2240- 				return Err(ChannelError::Close((err.to_string(), ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(false) })))
2241- 					.map_err(|e| (self, e));
2275+ 				return Err(ChannelError::Close((err.to_string(), ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(false) })));
22422276			},
22432277		};
22442278
@@ -2249,10 +2283,10 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
22492283					false,
22502284					"Zero inputs were provided & zero witnesses were provided, but a count mismatch was somehow found",
22512285				);
2252- 				return Err((self,  ChannelError::Close((
2286+ 				return Err(ChannelError::Close((
22532287					"V2 channel rejected due to sender error".into(),
22542288					ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(false) }
2255- 				)))) ;
2289+ 				)));
22562290			}
22572291			None
22582292		} else {
@@ -2274,37 +2308,19 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
22742308				false,
22752309				"We don't support users providing inputs but somehow we had more than zero inputs",
22762310			);
2277- 			return Err((self,  ChannelError::Close((
2311+ 			return Err(ChannelError::Close((
22782312				"V2 channel rejected due to sender error".into(),
22792313				ClosureReason::HolderForceClosed { broadcasted_latest_txn: Some(false) }
2280- 			)))) ;
2314+ 			)));
22812315		};
22822316
22832317		self.context.channel_state = ChannelState::FundingNegotiated;
22842318
22852319		// Clear the interactive transaction constructor
22862320		self.interactive_tx_constructor.take();
2321+ 		self.interactive_tx_signing_session = Some(signing_session);
22872322
2288- 		match self.unfunded_context.holder_commitment_point {
2289- 			Some(holder_commitment_point) => {
2290- 				let funded_chan = FundedChannel {
2291- 					funding: self.funding,
2292- 					context: self.context,
2293- 					interactive_tx_signing_session: Some(signing_session),
2294- 					holder_commitment_point,
2295- 					is_v2_established: true,
2296- 				};
2297- 				Ok((funded_chan, commitment_signed, funding_ready_for_sig_event))
2298- 			},
2299- 			None => {
2300- 				Err(ChannelError::close(
2301- 					format!(
2302- 						"Expected to have holder commitment points available upon finishing interactive tx construction for channel {}",
2303- 						self.context.channel_id(),
2304- 					)))
2305- 					.map_err(|e| (self, e))
2306- 			},
2307- 		}
2323+ 		Ok((commitment_signed, funding_ready_for_sig_event))
23082324	}
23092325}
23102326
@@ -9511,6 +9527,8 @@ pub(super) struct PendingV2Channel<SP: Deref> where SP::Target: SignerProvider {
95119527	pub dual_funding_context: DualFundingChannelContext,
95129528	/// The current interactive transaction construction session under negotiation.
95139529	pub interactive_tx_constructor: Option<InteractiveTxConstructor>,
9530+ 	/// The signing session created after `tx_complete` handling
9531+ 	pub interactive_tx_signing_session: Option<InteractiveTxSigningSession>,
95149532}
95159533
95169534impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
@@ -9576,6 +9594,7 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
95769594				our_funding_inputs: funding_inputs,
95779595			},
95789596			interactive_tx_constructor: None,
9597+ 			interactive_tx_signing_session: None,
95799598		};
95809599		Ok(chan)
95819600	}
@@ -9747,6 +9766,7 @@ impl<SP: Deref> PendingV2Channel<SP> where SP::Target: SignerProvider {
97479766			context,
97489767			dual_funding_context,
97499768			interactive_tx_constructor,
9769+ 			interactive_tx_signing_session: None,
97509770			unfunded_context,
97519771		})
97529772	}
0 commit comments