@@ -1255,6 +1255,9 @@ pub(crate) struct ShutdownResult {
1255
1255
pub(crate) unbroadcasted_funding_tx: Option<Transaction>,
1256
1256
pub(crate) channel_funding_txo: Option<OutPoint>,
1257
1257
pub(crate) last_local_balance_msat: u64,
1258
+ /// If a splice was in progress when the channel was shut down, this contains
1259
+ /// the splice funding information for emitting a SpliceFailed event.
1260
+ pub(crate) splice_funding_failed: Option<SpliceFundingFailed>,
1258
1261
}
1259
1262
1260
1263
/// Tracks the transaction number, along with current and next commitment points.
@@ -6090,6 +6093,7 @@ where
6090
6093
is_manual_broadcast: self.is_manual_broadcast,
6091
6094
channel_funding_txo: funding.get_funding_txo(),
6092
6095
last_local_balance_msat: funding.value_to_self_msat,
6096
+ splice_funding_failed: None,
6093
6097
}
6094
6098
}
6095
6099
@@ -6846,7 +6850,37 @@ where
6846
6850
}
6847
6851
6848
6852
pub fn force_shutdown(&mut self, closure_reason: ClosureReason) -> ShutdownResult {
6849
- self.context.force_shutdown(&self.funding, closure_reason)
6853
+ // Capture splice funding failed information if we have an active splice negotiation
6854
+ let splice_funding_failed = self.pending_splice.as_mut()
6855
+ .and_then(|pending_splice| pending_splice.funding_negotiation.take())
6856
+ .map(|funding_negotiation| {
6857
+ // Create SpliceFundingFailed for any active splice negotiation during shutdown
6858
+ let (funding_txo, channel_type) = match &funding_negotiation {
6859
+ FundingNegotiation::AwaitingAck { .. } => {
6860
+ (None, None)
6861
+ },
6862
+ FundingNegotiation::ConstructingTransaction { funding, .. } => {
6863
+ (funding.get_funding_txo().map(|txo| txo.into_bitcoin_outpoint()), Some(funding.get_channel_type().clone()))
6864
+ },
6865
+ FundingNegotiation::AwaitingSignatures { funding } => {
6866
+ (funding.get_funding_txo().map(|txo| txo.into_bitcoin_outpoint()), Some(funding.get_channel_type().clone()))
6867
+ },
6868
+ };
6869
+
6870
+ SpliceFundingFailed {
6871
+ channel_id: self.context.channel_id,
6872
+ counterparty_node_id: self.context.counterparty_node_id,
6873
+ user_channel_id: self.context.user_id,
6874
+ funding_txo,
6875
+ channel_type,
6876
+ contributed_inputs: Vec::new(),
6877
+ contributed_outputs: Vec::new(),
6878
+ }
6879
+ });
6880
+
6881
+ let mut shutdown_result = self.context.force_shutdown(&self.funding, closure_reason);
6882
+ shutdown_result.splice_funding_failed = splice_funding_failed;
6883
+ shutdown_result
6850
6884
}
6851
6885
6852
6886
fn interactive_tx_constructor_mut(&mut self) -> Option<&mut InteractiveTxConstructor> {
@@ -10242,6 +10276,7 @@ where
10242
10276
is_manual_broadcast: self.context.is_manual_broadcast,
10243
10277
channel_funding_txo: self.funding.get_funding_txo(),
10244
10278
last_local_balance_msat: self.funding.value_to_self_msat,
10279
+ splice_funding_failed: None,
10245
10280
}
10246
10281
}
10247
10282
0 commit comments