Skip to content

Commit 673083b

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 3dac6c4 commit 673083b

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,
@@ -9621,37 +9623,44 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
96219623
let chan = chan_entry.get_mut();
96229624
let logger = WithChannelContext::from(&self.logger, &chan.context(), None);
96239625
let funding_txo = chan.funding().get_funding_txo();
9624-
let (monitor_opt, monitor_update_opt, funding_tx_opt) = try_channel_entry!(
9626+
let res = try_channel_entry!(
96259627
self, peer_state, chan.commitment_signed(msg, best_block, &self.signer_provider, &&logger),
96269628
chan_entry);
96279629

96289630
if let Some(chan) = chan.as_funded_mut() {
9629-
if let Some(unsigned_transaction) = funding_tx_opt {
9630-
let mut pending_events = self.pending_events.lock().unwrap();
9631-
pending_events.push_back((
9632-
Event::FundingTransactionReadyForSigning {
9633-
unsigned_transaction,
9634-
counterparty_node_id: *counterparty_node_id,
9635-
channel_id: msg.channel_id,
9636-
user_channel_id: chan.context.get_user_id(),
9637-
}, None));
9638-
}
9639-
if let Some(monitor) = monitor_opt {
9640-
let monitor_res = self.chain_monitor.watch_channel(monitor.channel_id(), monitor);
9641-
if let Ok(persist_state) = monitor_res {
9642-
handle_new_monitor_update!(self, persist_state, peer_state_lock, peer_state,
9643-
per_peer_state, chan, INITIAL_MONITOR);
9644-
} else {
9645-
let logger = WithChannelContext::from(&self.logger, &chan.context, None);
9646-
log_error!(logger, "Persisting initial ChannelMonitor failed, implying the channel ID was duplicated");
9647-
let msg = "Channel ID was a duplicate";
9648-
let reason = ClosureReason::ProcessingError { err: msg.to_owned() };
9649-
let err = ChannelError::Close((msg.to_owned(), reason));
9650-
try_channel_entry!(self, peer_state, Err(err), chan_entry)
9651-
}
9652-
} else if let Some(monitor_update) = monitor_update_opt {
9653-
handle_new_monitor_update!(self, funding_txo.unwrap(), monitor_update, peer_state_lock,
9654-
peer_state, per_peer_state, chan);
9631+
let monitor = match res {
9632+
CommitmentSignedResult::ChannelMonitor(monitor) => monitor,
9633+
CommitmentSignedResult::ChannelMonitorWithUnsignedFundingTransaction(monitor, unsigned_transaction) => {
9634+
let mut pending_events = self.pending_events.lock().unwrap();
9635+
pending_events.push_back((
9636+
Event::FundingTransactionReadyForSigning {
9637+
unsigned_transaction,
9638+
counterparty_node_id: *counterparty_node_id,
9639+
channel_id: msg.channel_id,
9640+
user_channel_id: chan.context.get_user_id(),
9641+
}, None));
9642+
9643+
monitor
9644+
},
9645+
CommitmentSignedResult::ChannelMonitorUpdate(monitor_update) => {
9646+
handle_new_monitor_update!(self, funding_txo.unwrap(), monitor_update, peer_state_lock,
9647+
peer_state, per_peer_state, chan);
9648+
return Ok(());
9649+
},
9650+
CommitmentSignedResult::None => return Ok(()),
9651+
};
9652+
9653+
let monitor_res = self.chain_monitor.watch_channel(monitor.channel_id(), monitor);
9654+
if let Ok(persist_state) = monitor_res {
9655+
handle_new_monitor_update!(self, persist_state, peer_state_lock, peer_state,
9656+
per_peer_state, chan, INITIAL_MONITOR);
9657+
} else {
9658+
let logger = WithChannelContext::from(&self.logger, &chan.context, None);
9659+
log_error!(logger, "Persisting initial ChannelMonitor failed, implying the channel ID was duplicated");
9660+
let msg = "Channel ID was a duplicate";
9661+
let reason = ClosureReason::ProcessingError { err: msg.to_owned() };
9662+
let err = ChannelError::Close((msg.to_owned(), reason));
9663+
try_channel_entry!(self, peer_state, Err(err), chan_entry)
96559664
}
96569665
}
96579666
Ok(())

0 commit comments

Comments
 (0)