Skip to content

Commit c638579

Browse files
committed
Create CommitmentSignedResult enum for Channel::commitment_signed();
The return type of commitment_signed() started groing into a really long and unwieldy tuple. We introduce a dedicated enum return type for it here.
1 parent d64112c commit c638579

File tree

2 files changed

+80
-32
lines changed

2 files changed

+80
-32
lines changed

lightning/src/ln/channel.rs

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1461,6 +1461,19 @@ where
14611461
Funded(FundedChannel<SP>),
14621462
}
14631463

1464+
pub(super) enum CommitmentSignedResult<SP: Deref>
1465+
where
1466+
SP::Target: SignerProvider,
1467+
{
1468+
ChannelMonitor(ChannelMonitor<<SP::Target as SignerProvider>::EcdsaSigner>),
1469+
ChannelMonitorWithUnsignedFundingTransaction(
1470+
ChannelMonitor<<SP::Target as SignerProvider>::EcdsaSigner>,
1471+
Transaction,
1472+
),
1473+
ChannelMonitorUpdate(ChannelMonitorUpdate),
1474+
None,
1475+
}
1476+
14641477
impl<SP: Deref> Channel<SP>
14651478
where
14661479
SP::Target: SignerProvider,
@@ -1786,7 +1799,7 @@ where
17861799
#[rustfmt::skip]
17871800
pub fn commitment_signed<L: Deref>(
17881801
&mut self, msg: &msgs::CommitmentSigned, best_block: BestBlock, signer_provider: &SP, logger: &L
1789-
) -> Result<(Option<ChannelMonitor<<SP::Target as SignerProvider>::EcdsaSigner>>, Option<ChannelMonitorUpdate>, Option<Transaction>), ChannelError>
1802+
) -> Result<CommitmentSignedResult<SP>, ChannelError>
17901803
where
17911804
L::Target: Logger
17921805
{
@@ -1813,7 +1826,15 @@ where
18131826
pending_splice: None,
18141827
};
18151828
let res = funded_channel.commitment_signed_initial_v2(msg, best_block, signer_provider, logger)
1816-
.map(|(monitor, funding_tx_opt)| (Some(monitor), None, funding_tx_opt))
1829+
.map(|(monitor, funding_tx_opt)| {
1830+
if let Some(funding_tx) = funding_tx_opt {
1831+
CommitmentSignedResult::ChannelMonitorWithUnsignedFundingTransaction(
1832+
monitor, funding_tx,
1833+
)
1834+
} else {
1835+
CommitmentSignedResult::ChannelMonitor(monitor)
1836+
}
1837+
})
18171838
// TODO: Change to `inspect_err` when MSRV is high enough.
18181839
.map_err(|err| {
18191840
// We always expect a `ChannelError` close.
@@ -1840,15 +1861,33 @@ where
18401861
let res = if has_negotiated_pending_splice && !session_received_commitment_signed {
18411862
funded_channel
18421863
.splice_initial_commitment_signed(msg, logger)
1843-
.map(|monitor_update_opt| (None, monitor_update_opt, None))
1864+
.map(|monitor_update_opt|
1865+
if let Some(monitor_update) = monitor_update_opt {
1866+
CommitmentSignedResult::ChannelMonitorUpdate(monitor_update)
1867+
} else {
1868+
CommitmentSignedResult::None
1869+
}
1870+
)
18441871
} else {
18451872
funded_channel.commitment_signed(msg, logger)
1846-
.map(|monitor_update_opt| (None, monitor_update_opt, None))
1873+
.map(|monitor_update_opt|
1874+
if let Some(monitor_update) = monitor_update_opt {
1875+
CommitmentSignedResult::ChannelMonitorUpdate(monitor_update)
1876+
} else {
1877+
CommitmentSignedResult::None
1878+
}
1879+
)
18471880
};
18481881

18491882
#[cfg(not(splicing))]
18501883
let res = funded_channel.commitment_signed(msg, logger)
1851-
.map(|monitor_update_opt| (None, monitor_update_opt, None));
1884+
.map(|monitor_update_opt|
1885+
if let Some(monitor_update) = monitor_update_opt {
1886+
CommitmentSignedResult::ChannelMonitorUpdate(monitor_update)
1887+
} else {
1888+
CommitmentSignedResult::None
1889+
}
1890+
);
18521891

18531892
self.phase = ChannelPhase::Funded(funded_channel);
18541893
res

lightning/src/ln/channelmanager.rs

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,10 @@ use crate::util::ser::{
130130
};
131131
use crate::util::wakers::{Future, Notifier};
132132

133+
use super::channel::CommitmentSignedResult;
133134
#[cfg(all(test, async_payments))]
134135
use crate::blinded_path::payment::BlindedPaymentPath;
136+
135137
#[cfg(async_payments)]
136138
use {
137139
crate::blinded_path::message::BlindedMessagePath,
@@ -9638,37 +9640,44 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
96389640
let chan = chan_entry.get_mut();
96399641
let logger = WithChannelContext::from(&self.logger, &chan.context(), None);
96409642
let funding_txo = chan.funding().get_funding_txo();
9641-
let (monitor_opt, monitor_update_opt, funding_tx_opt) = try_channel_entry!(
9643+
let res = try_channel_entry!(
96429644
self, peer_state, chan.commitment_signed(msg, best_block, &self.signer_provider, &&logger),
96439645
chan_entry);
96449646

96459647
if let Some(chan) = chan.as_funded_mut() {
9646-
if let Some(unsigned_transaction) = funding_tx_opt {
9647-
let mut pending_events = self.pending_events.lock().unwrap();
9648-
pending_events.push_back((
9649-
Event::FundingTransactionReadyForSigning {
9650-
unsigned_transaction,
9651-
counterparty_node_id: *counterparty_node_id,
9652-
channel_id: msg.channel_id,
9653-
user_channel_id: chan.context.get_user_id(),
9654-
}, None));
9655-
}
9656-
if let Some(monitor) = monitor_opt {
9657-
let monitor_res = self.chain_monitor.watch_channel(monitor.channel_id(), monitor);
9658-
if let Ok(persist_state) = monitor_res {
9659-
handle_new_monitor_update!(self, persist_state, peer_state_lock, peer_state,
9660-
per_peer_state, chan, INITIAL_MONITOR);
9661-
} else {
9662-
let logger = WithChannelContext::from(&self.logger, &chan.context, None);
9663-
log_error!(logger, "Persisting initial ChannelMonitor failed, implying the channel ID was duplicated");
9664-
let msg = "Channel ID was a duplicate";
9665-
let reason = ClosureReason::ProcessingError { err: msg.to_owned() };
9666-
let err = ChannelError::Close((msg.to_owned(), reason));
9667-
try_channel_entry!(self, peer_state, Err(err), chan_entry)
9668-
}
9669-
} else if let Some(monitor_update) = monitor_update_opt {
9670-
handle_new_monitor_update!(self, funding_txo.unwrap(), monitor_update, peer_state_lock,
9671-
peer_state, per_peer_state, chan);
9648+
let monitor = match res {
9649+
CommitmentSignedResult::ChannelMonitor(monitor) => monitor,
9650+
CommitmentSignedResult::ChannelMonitorWithUnsignedFundingTransaction(monitor, unsigned_transaction) => {
9651+
let mut pending_events = self.pending_events.lock().unwrap();
9652+
pending_events.push_back((
9653+
Event::FundingTransactionReadyForSigning {
9654+
unsigned_transaction,
9655+
counterparty_node_id: *counterparty_node_id,
9656+
channel_id: msg.channel_id,
9657+
user_channel_id: chan.context.get_user_id(),
9658+
}, None));
9659+
9660+
monitor
9661+
},
9662+
CommitmentSignedResult::ChannelMonitorUpdate(monitor_update) => {
9663+
handle_new_monitor_update!(self, funding_txo.unwrap(), monitor_update, peer_state_lock,
9664+
peer_state, per_peer_state, chan);
9665+
return Ok(());
9666+
},
9667+
CommitmentSignedResult::None => return Ok(()),
9668+
};
9669+
9670+
let monitor_res = self.chain_monitor.watch_channel(monitor.channel_id(), monitor);
9671+
if let Ok(persist_state) = monitor_res {
9672+
handle_new_monitor_update!(self, persist_state, peer_state_lock, peer_state,
9673+
per_peer_state, chan, INITIAL_MONITOR);
9674+
} else {
9675+
let logger = WithChannelContext::from(&self.logger, &chan.context, None);
9676+
log_error!(logger, "Persisting initial ChannelMonitor failed, implying the channel ID was duplicated");
9677+
let msg = "Channel ID was a duplicate";
9678+
let reason = ClosureReason::ProcessingError { err: msg.to_owned() };
9679+
let err = ChannelError::Close((msg.to_owned(), reason));
9680+
try_channel_entry!(self, peer_state, Err(err), chan_entry)
96729681
}
96739682
}
96749683
Ok(())

0 commit comments

Comments
 (0)