Skip to content

Commit 3582921

Browse files
committed
Automatically close channels that go unfunded for 2016 blocks
As recommended by BOLT 2 added in lightning/bolts#839
1 parent b288a27 commit 3582921

File tree

5 files changed

+92
-20
lines changed

5 files changed

+92
-20
lines changed

lightning/src/ln/channel.rs

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,11 @@ pub const FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE: u64 = 2;
379379
#[cfg(not(fuzzing))]
380380
const FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE: u64 = 2;
381381

382+
/// If we fail to see a funding transaction confirmed on-chain within this many blocks after the
383+
/// channel creation on an inbound channel, we simply force-close and move on.
384+
/// This constant is the one suggested in BOLT 2.
385+
pub(crate) const FUNDING_CONF_DEADLINE_BLOCKS: u32 = 2016;
386+
382387
// TODO: We should refactor this to be an Inbound/OutboundChannel until initial setup handshaking
383388
// has been completed, and then turn into a Channel to get compiler-time enforcement of things like
384389
// calling channel_id() before we're set up or things like get_outbound_funding_signed on an
@@ -476,6 +481,10 @@ pub(super) struct Channel<Signer: Sign> {
476481
funding_tx_confirmed_in: Option<BlockHash>,
477482
funding_tx_confirmation_height: u32,
478483
short_channel_id: Option<u64>,
484+
/// Either the height at which this channel was created or the height at which it was last
485+
/// serialized if it was serialized by versions prior to 0.0.103.
486+
/// We use this to close if funding is never broadcasted.
487+
channel_creation_height: u32,
479488

480489
counterparty_dust_limit_satoshis: u64,
481490
#[cfg(test)]
@@ -647,7 +656,10 @@ impl<Signer: Sign> Channel<Signer> {
647656
}
648657

649658
// Constructors:
650-
pub fn new_outbound<K: Deref, F: Deref>(fee_estimator: &F, keys_provider: &K, counterparty_node_id: PublicKey, their_features: &InitFeatures, channel_value_satoshis: u64, push_msat: u64, user_id: u64, config: &UserConfig) -> Result<Channel<Signer>, APIError>
659+
pub fn new_outbound<K: Deref, F: Deref>(
660+
fee_estimator: &F, keys_provider: &K, counterparty_node_id: PublicKey, their_features: &InitFeatures,
661+
channel_value_satoshis: u64, push_msat: u64, user_id: u64, config: &UserConfig, current_chain_height: u32
662+
) -> Result<Channel<Signer>, APIError>
651663
where K::Target: KeysInterface<Signer = Signer>,
652664
F::Target: FeeEstimator,
653665
{
@@ -735,6 +747,7 @@ impl<Signer: Sign> Channel<Signer> {
735747
funding_tx_confirmed_in: None,
736748
funding_tx_confirmation_height: 0,
737749
short_channel_id: None,
750+
channel_creation_height: current_chain_height,
738751

739752
feerate_per_kw: feerate,
740753
counterparty_dust_limit_satoshis: 0,
@@ -808,7 +821,10 @@ impl<Signer: Sign> Channel<Signer> {
808821

809822
/// Creates a new channel from a remote sides' request for one.
810823
/// Assumes chain_hash has already been checked and corresponds with what we expect!
811-
pub fn new_from_req<K: Deref, F: Deref>(fee_estimator: &F, keys_provider: &K, counterparty_node_id: PublicKey, their_features: &InitFeatures, msg: &msgs::OpenChannel, user_id: u64, config: &UserConfig) -> Result<Channel<Signer>, ChannelError>
824+
pub fn new_from_req<K: Deref, F: Deref>(
825+
fee_estimator: &F, keys_provider: &K, counterparty_node_id: PublicKey, their_features: &InitFeatures,
826+
msg: &msgs::OpenChannel, user_id: u64, config: &UserConfig, current_chain_height: u32
827+
) -> Result<Channel<Signer>, ChannelError>
812828
where K::Target: KeysInterface<Signer = Signer>,
813829
F::Target: FeeEstimator
814830
{
@@ -1021,6 +1037,7 @@ impl<Signer: Sign> Channel<Signer> {
10211037
funding_tx_confirmed_in: None,
10221038
funding_tx_confirmation_height: 0,
10231039
short_channel_id: None,
1040+
channel_creation_height: current_chain_height,
10241041

10251042
feerate_per_kw: msg.feerate_per_kw,
10261043
channel_value_satoshis: msg.funding_satoshis,
@@ -4236,6 +4253,13 @@ impl<Signer: Sign> Channel<Signer> {
42364253
self.minimum_depth.unwrap(), funding_tx_confirmations);
42374254
return Err(ClosureReason::ProcessingError { err: err_reason });
42384255
}
4256+
} else if !self.is_outbound() && self.funding_tx_confirmed_in.is_none() &&
4257+
height >= self.channel_creation_height + FUNDING_CONF_DEADLINE_BLOCKS {
4258+
log_info!(logger, "Closing channel {} due to funding timeout", log_bytes!(self.channel_id));
4259+
// If funding_tx_confirmed_in is unset, the channel must not be active
4260+
assert!(non_shutdown_state <= ChannelState::ChannelFunded as u32);
4261+
assert_eq!(non_shutdown_state & ChannelState::OurFundingLocked as u32, 0);
4262+
return Err(ClosureReason::FundingTimedOut);
42394263
}
42404264

42414265
Ok((None, timed_out_htlcs))
@@ -5274,16 +5298,18 @@ impl<Signer: Sign> Writeable for Channel<Signer> {
52745298
(7, self.shutdown_scriptpubkey, option),
52755299
(9, self.target_closing_feerate_sats_per_kw, option),
52765300
(11, self.monitor_pending_finalized_fulfills, vec_type),
5301+
(13, self.channel_creation_height, required),
52775302
});
52785303

52795304
Ok(())
52805305
}
52815306
}
52825307

52835308
const MAX_ALLOC_SIZE: usize = 64*1024;
5284-
impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
5309+
impl<'a, Signer: Sign, K: Deref> ReadableArgs<(&'a K, u32)> for Channel<Signer>
52855310
where K::Target: KeysInterface<Signer = Signer> {
5286-
fn read<R : io::Read>(reader: &mut R, keys_source: &'a K) -> Result<Self, DecodeError> {
5311+
fn read<R : io::Read>(reader: &mut R, args: (&'a K, u32)) -> Result<Self, DecodeError> {
5312+
let (keys_source, serialized_height) = args;
52875313
let ver = read_ver_prefix!(reader, SERIALIZATION_VERSION);
52885314

52895315
let user_id = Readable::read(reader)?;
@@ -5511,6 +5537,7 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
55115537
// Prior to supporting channel type negotiation, all of our channels were static_remotekey
55125538
// only, so we default to that if none was written.
55135539
let mut channel_type = Some(ChannelTypeFeatures::only_static_remote_key());
5540+
let mut channel_creation_height = Some(serialized_height);
55145541
read_tlv_fields!(reader, {
55155542
(0, announcement_sigs, option),
55165543
(1, minimum_depth, option),
@@ -5520,6 +5547,7 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
55205547
(7, shutdown_scriptpubkey, option),
55215548
(9, target_closing_feerate_sats_per_kw, option),
55225549
(11, monitor_pending_finalized_fulfills, vec_type),
5550+
(13, channel_creation_height, option),
55235551
});
55245552

55255553
let chan_features = channel_type.as_ref().unwrap();
@@ -5584,6 +5612,7 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
55845612
funding_tx_confirmed_in,
55855613
funding_tx_confirmation_height,
55865614
short_channel_id,
5615+
channel_creation_height: channel_creation_height.unwrap(),
55875616

55885617
counterparty_dust_limit_satoshis,
55895618
holder_dust_limit_satoshis,
@@ -5732,7 +5761,7 @@ mod tests {
57325761
let secp_ctx = Secp256k1::new();
57335762
let node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
57345763
let config = UserConfig::default();
5735-
match Channel::<EnforcingSigner>::new_outbound(&&fee_estimator, &&keys_provider, node_id, &features, 10000000, 100000, 42, &config) {
5764+
match Channel::<EnforcingSigner>::new_outbound(&&fee_estimator, &&keys_provider, node_id, &features, 10000000, 100000, 42, &config, 0) {
57365765
Err(APIError::IncompatibleShutdownScript { script }) => {
57375766
assert_eq!(script.into_inner(), non_v0_segwit_shutdown_script.into_inner());
57385767
},
@@ -5754,7 +5783,7 @@ mod tests {
57545783

57555784
let node_a_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
57565785
let config = UserConfig::default();
5757-
let node_a_chan = Channel::<EnforcingSigner>::new_outbound(&&fee_est, &&keys_provider, node_a_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config).unwrap();
5786+
let node_a_chan = Channel::<EnforcingSigner>::new_outbound(&&fee_est, &&keys_provider, node_a_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config, 0).unwrap();
57585787

57595788
// Now change the fee so we can check that the fee in the open_channel message is the
57605789
// same as the old fee.
@@ -5779,13 +5808,13 @@ mod tests {
57795808
// Create Node A's channel pointing to Node B's pubkey
57805809
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
57815810
let config = UserConfig::default();
5782-
let mut node_a_chan = Channel::<EnforcingSigner>::new_outbound(&&feeest, &&keys_provider, node_b_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config).unwrap();
5811+
let mut node_a_chan = Channel::<EnforcingSigner>::new_outbound(&&feeest, &&keys_provider, node_b_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config, 0).unwrap();
57835812

57845813
// Create Node B's channel by receiving Node A's open_channel message
57855814
// Make sure A's dust limit is as we expect.
57865815
let open_channel_msg = node_a_chan.get_open_channel(genesis_block(network).header.block_hash());
57875816
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
5788-
let node_b_chan = Channel::<EnforcingSigner>::new_from_req(&&feeest, &&keys_provider, node_b_node_id, &InitFeatures::known(), &open_channel_msg, 7, &config).unwrap();
5817+
let node_b_chan = Channel::<EnforcingSigner>::new_from_req(&&feeest, &&keys_provider, node_b_node_id, &InitFeatures::known(), &open_channel_msg, 7, &config, 0).unwrap();
57895818

57905819
// Node B --> Node A: accept channel, explicitly setting B's dust limit.
57915820
let mut accept_channel_msg = node_b_chan.get_accept_channel();
@@ -5849,7 +5878,7 @@ mod tests {
58495878

58505879
let node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
58515880
let config = UserConfig::default();
5852-
let mut chan = Channel::<EnforcingSigner>::new_outbound(&&fee_est, &&keys_provider, node_id, &InitFeatures::known(), 10000000, 100000, 42, &config).unwrap();
5881+
let mut chan = Channel::<EnforcingSigner>::new_outbound(&&fee_est, &&keys_provider, node_id, &InitFeatures::known(), 10000000, 100000, 42, &config, 0).unwrap();
58535882

58545883
let commitment_tx_fee_0_htlcs = chan.commit_tx_fee_msat(0);
58555884
let commitment_tx_fee_1_htlc = chan.commit_tx_fee_msat(1);
@@ -5898,12 +5927,12 @@ mod tests {
58985927
// Create Node A's channel pointing to Node B's pubkey
58995928
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
59005929
let config = UserConfig::default();
5901-
let mut node_a_chan = Channel::<EnforcingSigner>::new_outbound(&&feeest, &&keys_provider, node_b_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config).unwrap();
5930+
let mut node_a_chan = Channel::<EnforcingSigner>::new_outbound(&&feeest, &&keys_provider, node_b_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config, 0).unwrap();
59025931

59035932
// Create Node B's channel by receiving Node A's open_channel message
59045933
let open_channel_msg = node_a_chan.get_open_channel(chain_hash);
59055934
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[7; 32]).unwrap());
5906-
let mut node_b_chan = Channel::<EnforcingSigner>::new_from_req(&&feeest, &&keys_provider, node_b_node_id, &InitFeatures::known(), &open_channel_msg, 7, &config).unwrap();
5935+
let mut node_b_chan = Channel::<EnforcingSigner>::new_from_req(&&feeest, &&keys_provider, node_b_node_id, &InitFeatures::known(), &open_channel_msg, 7, &config, 0).unwrap();
59075936

59085937
// Node B --> Node A: accept channel
59095938
let accept_channel_msg = node_b_chan.get_accept_channel();
@@ -5960,7 +5989,7 @@ mod tests {
59605989
// Create a channel.
59615990
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
59625991
let config = UserConfig::default();
5963-
let mut node_a_chan = Channel::<EnforcingSigner>::new_outbound(&&feeest, &&keys_provider, node_b_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config).unwrap();
5992+
let mut node_a_chan = Channel::<EnforcingSigner>::new_outbound(&&feeest, &&keys_provider, node_b_node_id, &InitFeatures::known(), 10000000, 100000, 42, &config, 0).unwrap();
59645993
assert!(node_a_chan.counterparty_forwarding_info.is_none());
59655994
assert_eq!(node_a_chan.holder_htlc_minimum_msat, 1); // the default
59665995
assert!(node_a_chan.counterparty_forwarding_info().is_none());
@@ -6024,7 +6053,7 @@ mod tests {
60246053
let counterparty_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
60256054
let mut config = UserConfig::default();
60266055
config.channel_options.announced_channel = false;
6027-
let mut chan = Channel::<InMemorySigner>::new_outbound(&&feeest, &&keys_provider, counterparty_node_id, &InitFeatures::known(), 10_000_000, 100000, 42, &config).unwrap(); // Nothing uses their network key in this test
6056+
let mut chan = Channel::<InMemorySigner>::new_outbound(&&feeest, &&keys_provider, counterparty_node_id, &InitFeatures::known(), 10_000_000, 100000, 42, &config, 0).unwrap(); // Nothing uses their network key in this test
60286057
chan.holder_dust_limit_satoshis = 546;
60296058
chan.counterparty_selected_channel_reserve_satoshis = Some(0); // Filled in in accept_channel
60306059

lightning/src/ln/channelmanager.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1398,7 +1398,8 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
13981398
let peer_state = peer_state.lock().unwrap();
13991399
let their_features = &peer_state.latest_features;
14001400
let config = if override_config.is_some() { override_config.as_ref().unwrap() } else { &self.default_configuration };
1401-
Channel::new_outbound(&self.fee_estimator, &self.keys_manager, their_network_key, their_features, channel_value_satoshis, push_msat, user_channel_id, config)?
1401+
Channel::new_outbound(&self.fee_estimator, &self.keys_manager, their_network_key, their_features,
1402+
channel_value_satoshis, push_msat, user_channel_id, config, self.best_block.read().unwrap().height())?
14021403
},
14031404
None => return Err(APIError::ChannelUnavailable { err: format!("Not connected to node: {}", their_network_key) }),
14041405
}
@@ -3645,7 +3646,8 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
36453646
return Err(MsgHandleErrInternal::send_err_msg_no_close("Unknown genesis block hash".to_owned(), msg.temporary_channel_id.clone()));
36463647
}
36473648

3648-
let channel = Channel::new_from_req(&self.fee_estimator, &self.keys_manager, counterparty_node_id.clone(), &their_features, msg, 0, &self.default_configuration)
3649+
let channel = Channel::new_from_req(&self.fee_estimator, &self.keys_manager, counterparty_node_id.clone(),
3650+
&their_features, msg, 0, &self.default_configuration, self.best_block.read().unwrap().height())
36493651
.map_err(|e| MsgHandleErrInternal::from_chan_no_close(e, msg.temporary_channel_id))?;
36503652
let mut channel_state_lock = self.channel_state.lock().unwrap();
36513653
let channel_state = &mut *channel_state_lock;
@@ -5833,7 +5835,7 @@ impl<'a, Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
58335835
let mut short_to_id = HashMap::with_capacity(cmp::min(channel_count as usize, 128));
58345836
let mut channel_closures = Vec::new();
58355837
for _ in 0..channel_count {
5836-
let mut channel: Channel<Signer> = Channel::read(reader, &args.keys_manager)?;
5838+
let mut channel: Channel<Signer> = Channel::read(reader, (&args.keys_manager, best_block_height))?;
58375839
let funding_txo = channel.get_funding_txo().ok_or(DecodeError::InvalidValue)?;
58385840
funding_txo_set.insert(funding_txo.clone());
58395841
if let Some(ref mut monitor) = args.channel_monitors.get_mut(&funding_txo) {

lightning/src/ln/functional_tests.rs

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6982,7 +6982,7 @@ fn test_user_configurable_csv_delay() {
69826982
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
69836983

69846984
// We test config.our_to_self > BREAKDOWN_TIMEOUT is enforced in Channel::new_outbound()
6985-
if let Err(error) = Channel::new_outbound(&&test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) }, &nodes[0].keys_manager, nodes[1].node.get_our_node_id(), &InitFeatures::known(), 1000000, 1000000, 0, &low_our_to_self_config) {
6985+
if let Err(error) = Channel::new_outbound(&&test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) }, &nodes[0].keys_manager, nodes[1].node.get_our_node_id(), &InitFeatures::known(), 1000000, 1000000, 0, &low_our_to_self_config, 0) {
69866986
match error {
69876987
APIError::APIMisuseError { err } => { assert!(regex::Regex::new(r"Configured with an unreasonable our_to_self_delay \(\d+\) putting user funds at risks").unwrap().is_match(err.as_str())); },
69886988
_ => panic!("Unexpected event"),
@@ -6993,7 +6993,7 @@ fn test_user_configurable_csv_delay() {
69936993
nodes[1].node.create_channel(nodes[0].node.get_our_node_id(), 1000000, 1000000, 42, None).unwrap();
69946994
let mut open_channel = get_event_msg!(nodes[1], MessageSendEvent::SendOpenChannel, nodes[0].node.get_our_node_id());
69956995
open_channel.to_self_delay = 200;
6996-
if let Err(error) = Channel::new_from_req(&&test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) }, &nodes[0].keys_manager, nodes[1].node.get_our_node_id(), &InitFeatures::known(), &open_channel, 0, &low_our_to_self_config) {
6996+
if let Err(error) = Channel::new_from_req(&&test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) }, &nodes[0].keys_manager, nodes[1].node.get_our_node_id(), &InitFeatures::known(), &open_channel, 0, &low_our_to_self_config, 0) {
69976997
match error {
69986998
ChannelError::Close(err) => { assert!(regex::Regex::new(r"Configured with an unreasonable our_to_self_delay \(\d+\) putting user funds at risks").unwrap().is_match(err.as_str())); },
69996999
_ => panic!("Unexpected event"),
@@ -7022,7 +7022,7 @@ fn test_user_configurable_csv_delay() {
70227022
nodes[1].node.create_channel(nodes[0].node.get_our_node_id(), 1000000, 1000000, 42, None).unwrap();
70237023
let mut open_channel = get_event_msg!(nodes[1], MessageSendEvent::SendOpenChannel, nodes[0].node.get_our_node_id());
70247024
open_channel.to_self_delay = 200;
7025-
if let Err(error) = Channel::new_from_req(&&test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) }, &nodes[0].keys_manager, nodes[1].node.get_our_node_id(), &InitFeatures::known(), &open_channel, 0, &high_their_to_self_config) {
7025+
if let Err(error) = Channel::new_from_req(&&test_utils::TestFeeEstimator { sat_per_kw: Mutex::new(253) }, &nodes[0].keys_manager, nodes[1].node.get_our_node_id(), &InitFeatures::known(), &open_channel, 0, &high_their_to_self_config, 0) {
70267026
match error {
70277027
ChannelError::Close(err) => { assert!(regex::Regex::new(r"They wanted our payments to be delayed by a needlessly long period\. Upper limit: \d+\. Actual: \d+").unwrap().is_match(err.as_str())); },
70287028
_ => panic!("Unexpected event"),
@@ -7908,6 +7908,42 @@ fn test_bump_txn_sanitize_tracking_maps() {
79087908
}
79097909
}
79107910

7911+
#[test]
7912+
fn test_channel_conf_timeout() {
7913+
// Tests that, for inbound channels, we give up on them if the funding transaction does not
7914+
// confirm within 2016 blocks, as recommended by BOLT 2.
7915+
let chanmon_cfgs = create_chanmon_cfgs(2);
7916+
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
7917+
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
7918+
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
7919+
7920+
let _funding_tx = create_chan_between_nodes_with_value_init(&nodes[0], &nodes[1], 1_000_000, 100_000, InitFeatures::known(), InitFeatures::known());
7921+
7922+
// The outbound node should wait forever for confirmation:
7923+
// This matches `channel::FUNDING_CONF_DEADLINE_BLOCKS` and BOLT 2's suggested timeout, thus is
7924+
// copied here instead of directly referencing the constant.
7925+
connect_blocks(&nodes[0], 2016);
7926+
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
7927+
7928+
// The inbound node should fail the channel after exactly 2016 blocks
7929+
connect_blocks(&nodes[1], 2015);
7930+
check_added_monitors!(nodes[1], 0);
7931+
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
7932+
7933+
connect_blocks(&nodes[1], 1);
7934+
check_added_monitors!(nodes[1], 1);
7935+
check_closed_event!(nodes[1], 1, ClosureReason::FundingTimedOut);
7936+
let close_ev = nodes[1].node.get_and_clear_pending_msg_events();
7937+
assert_eq!(close_ev.len(), 1);
7938+
match close_ev[0] {
7939+
MessageSendEvent::HandleError { action: ErrorAction::SendErrorMessage { ref msg }, ref node_id } => {
7940+
assert_eq!(*node_id, nodes[0].node.get_our_node_id());
7941+
assert_eq!(msg.data, "Channel closed because funding transaction failed to confirm within 2016 blocks");
7942+
},
7943+
_ => panic!("Unexpected event"),
7944+
}
7945+
}
7946+
79117947
#[test]
79127948
fn test_override_channel_config() {
79137949
let chanmon_cfgs = create_chanmon_cfgs(2);

lightning/src/ln/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ pub(crate) mod peer_channel_encryptor;
3737
#[cfg(feature = "fuzztarget")]
3838
pub mod channel;
3939
#[cfg(not(feature = "fuzztarget"))]
40-
mod channel;
40+
pub(crate) mod channel;
4141

4242
mod onion_utils;
4343
pub mod wire;

0 commit comments

Comments
 (0)