Skip to content

Commit 35cd39d

Browse files
committed
Lock outbound channels at 0conf if the peer indicates support for it
If our peer sets a minimum depth of 0, and we're set to trusting ourselves to not double-spend our own funding transactions, send a funding_locked message immediately after funding signed. Note that some special care has to be taken around the `channel_state` values - `ChannelFunded` no longer implies the funding transaction is confirmed on-chain. Thus, for example, the should-we-re-broadcast logic has to now accept `channel_state` values greater than `ChannelFunded` as indicating we may still need to re-broadcast our funding tranasction, unless `minimum_depth` is greater than 0. Further note that this starts writing `Channel` objects with a `MIN_SERIALIZATION_VERSION` of 2. Thus, LDK versions prior to 0.0.99 (July 2021) will now refuse to read serialized Channels/ChannelManagers.
1 parent 168b3a5 commit 35cd39d

File tree

4 files changed

+127
-37
lines changed

4 files changed

+127
-37
lines changed

lightning/src/ln/channel.rs

Lines changed: 43 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,11 @@ pub(super) struct Channel<Signer: Sign> {
710710
// Our counterparty can offer us SCID aliases which they will map to this channel when routing
711711
// outbound payments. These can be used in invoice route hints to avoid explicitly revealing
712712
// the channel's funding UTXO.
713+
//
714+
// We also use this when sending our peer a channel_update that isn't to be broadcasted
715+
// publicly - allowing them to re-use their map of SCID -> channel for channel_update ->
716+
// associated channel mapping.
717+
//
713718
// We only bother storing the most recent SCID alias at any time, though our counterparty has
714719
// to store all of them.
715720
latest_inbound_scid_alias: Option<u64>,
@@ -1987,12 +1992,6 @@ impl<Signer: Sign> Channel<Signer> {
19871992
if msg.minimum_depth > peer_limits.max_minimum_depth {
19881993
return Err(ChannelError::Close(format!("We consider the minimum depth to be unreasonably large. Expected minimum: ({}). Actual: ({})", peer_limits.max_minimum_depth, msg.minimum_depth)));
19891994
}
1990-
if msg.minimum_depth == 0 {
1991-
// Note that if this changes we should update the serialization minimum version to
1992-
// indicate to older clients that they don't understand some features of the current
1993-
// channel.
1994-
return Err(ChannelError::Close("Minimum confirmation depth must be at least 1".to_owned()));
1995-
}
19961995

19971996
if let Some(ty) = &msg.channel_type {
19981997
if *ty != self.channel_type {
@@ -2029,7 +2028,12 @@ impl<Signer: Sign> Channel<Signer> {
20292028
self.counterparty_selected_channel_reserve_satoshis = Some(msg.channel_reserve_satoshis);
20302029
self.counterparty_htlc_minimum_msat = msg.htlc_minimum_msat;
20312030
self.counterparty_max_accepted_htlcs = msg.max_accepted_htlcs;
2032-
self.minimum_depth = Some(msg.minimum_depth);
2031+
2032+
if peer_limits.trust_own_funding_0conf {
2033+
self.minimum_depth = Some(msg.minimum_depth);
2034+
} else {
2035+
self.minimum_depth = Some(cmp::max(1, msg.minimum_depth));
2036+
}
20332037

20342038
let counterparty_pubkeys = ChannelPublicKeys {
20352039
funding_pubkey: msg.funding_pubkey,
@@ -2169,7 +2173,7 @@ impl<Signer: Sign> Channel<Signer> {
21692173

21702174
/// Handles a funding_signed message from the remote end.
21712175
/// If this call is successful, broadcast the funding transaction (and not before!)
2172-
pub fn funding_signed<L: Deref>(&mut self, msg: &msgs::FundingSigned, best_block: BestBlock, logger: &L) -> Result<(ChannelMonitor<Signer>, Transaction), ChannelError> where L::Target: Logger {
2176+
pub fn funding_signed<L: Deref>(&mut self, msg: &msgs::FundingSigned, best_block: BestBlock, logger: &L) -> Result<(ChannelMonitor<Signer>, Transaction, Option<msgs::FundingLocked>), ChannelError> where L::Target: Logger {
21732177
if !self.is_outbound() {
21742178
return Err(ChannelError::Close("Received funding_signed for an inbound channel?".to_owned()));
21752179
}
@@ -2238,7 +2242,7 @@ impl<Signer: Sign> Channel<Signer> {
22382242

22392243
log_info!(logger, "Received funding_signed from peer for channel {}", log_bytes!(self.channel_id()));
22402244

2241-
Ok((channel_monitor, self.funding_transaction.as_ref().cloned().unwrap()))
2245+
Ok((channel_monitor, self.funding_transaction.as_ref().cloned().unwrap(), self.check_get_funding_locked(0)))
22422246
}
22432247

22442248
/// Handles a funding_locked message from our peer. If we've already sent our funding_locked
@@ -3540,12 +3544,13 @@ impl<Signer: Sign> Channel<Signer> {
35403544
/// monitor update failure must *not* have been sent to the remote end, and must instead
35413545
/// have been dropped. They will be regenerated when monitor_updating_restored is called.
35423546
pub fn monitor_update_failed(&mut self, resend_raa: bool, resend_commitment: bool,
3543-
mut pending_forwards: Vec<(PendingHTLCInfo, u64)>,
3547+
resend_funding_locked: bool, mut pending_forwards: Vec<(PendingHTLCInfo, u64)>,
35443548
mut pending_fails: Vec<(HTLCSource, PaymentHash, HTLCFailReason)>,
35453549
mut pending_finalized_claimed_htlcs: Vec<HTLCSource>
35463550
) {
35473551
self.monitor_pending_revoke_and_ack |= resend_raa;
35483552
self.monitor_pending_commitment_signed |= resend_commitment;
3553+
self.monitor_pending_funding_locked |= resend_funding_locked;
35493554
self.monitor_pending_forwards.append(&mut pending_forwards);
35503555
self.monitor_pending_failures.append(&mut pending_fails);
35513556
self.monitor_pending_finalized_fulfills.append(&mut pending_finalized_claimed_htlcs);
@@ -3559,9 +3564,18 @@ impl<Signer: Sign> Channel<Signer> {
35593564
assert_eq!(self.channel_state & ChannelState::MonitorUpdateFailed as u32, ChannelState::MonitorUpdateFailed as u32);
35603565
self.channel_state &= !(ChannelState::MonitorUpdateFailed as u32);
35613566

3562-
let funding_broadcastable = if self.channel_state & (ChannelState::FundingSent as u32) != 0 && self.is_outbound() {
3563-
self.funding_transaction.take()
3564-
} else { None };
3567+
// If we're past (or at) the FundingSent stage on an outbound channel, try to
3568+
// (re-)broadcast the funding transaction as we may have declined to broadcast it when we
3569+
// first received the funding_signed.
3570+
let mut funding_broadcastable =
3571+
if self.is_outbound() && self.channel_state & !MULTI_STATE_FLAGS >= ChannelState::FundingSent as u32 {
3572+
self.funding_transaction.take()
3573+
} else { None };
3574+
// That said, if the funding transaction is already confirmed (ie we're active with a
3575+
// minimum_depth over 0) don't bother re-broadcasting the confirmed funding tx.
3576+
if self.channel_state & !MULTI_STATE_FLAGS >= ChannelState::ChannelFunded as u32 && self.minimum_depth != Some(0) {
3577+
funding_broadcastable = None;
3578+
}
35653579

35663580
// We will never broadcast the funding transaction when we're in MonitorUpdateFailed (and
35673581
// we assume the user never directly broadcasts the funding transaction and waits for us to
@@ -3570,7 +3584,8 @@ impl<Signer: Sign> Channel<Signer> {
35703584
// the funding transaction confirmed before the monitor was persisted, or
35713585
// * a 0-conf channel and intended to send the funding_locked before any broadcast at all.
35723586
let funding_locked = if self.monitor_pending_funding_locked {
3573-
assert!(!self.is_outbound(), "Funding transaction broadcast by the local client before it should have - LDK didn't do it!");
3587+
assert!(!self.is_outbound() || self.minimum_depth == Some(0),
3588+
"Funding transaction broadcast by the local client before it should have - LDK didn't do it!");
35743589
self.monitor_pending_funding_locked = false;
35753590
let next_per_commitment_point = self.holder_signer.get_per_commitment_point(self.cur_holder_commitment_transaction_number, &self.secp_ctx);
35763591
Some(msgs::FundingLocked {
@@ -4552,6 +4567,11 @@ impl<Signer: Sign> Channel<Signer> {
45524567
self.channel_state >= ChannelState::FundingSent as u32
45534568
}
45544569

4570+
/// Returns true if our funding_locked has been sent
4571+
pub fn is_our_funding_locked(&self) -> bool {
4572+
(self.channel_state & ChannelState::OurFundingLocked as u32) != 0 || self.channel_state >= ChannelState::ChannelFunded as u32
4573+
}
4574+
45554575
/// Returns true if our peer has either initiated or agreed to shut down the channel.
45564576
pub fn received_shutdown(&self) -> bool {
45574577
(self.channel_state & ChannelState::RemoteShutdownSent as u32) != 0
@@ -4582,7 +4602,7 @@ impl<Signer: Sign> Channel<Signer> {
45824602
}
45834603

45844604
fn check_get_funding_locked(&mut self, height: u32) -> Option<msgs::FundingLocked> {
4585-
if self.funding_tx_confirmation_height == 0 {
4605+
if self.funding_tx_confirmation_height == 0 && self.minimum_depth != Some(0) {
45864606
return None;
45874607
}
45884608

@@ -4759,9 +4779,9 @@ impl<Signer: Sign> Channel<Signer> {
47594779
// close the channel and hope we can get the latest state on chain (because presumably
47604780
// the funding transaction is at least still in the mempool of most nodes).
47614781
//
4762-
// Note that ideally we wouldn't force-close if we see *any* reorg on a 1-conf channel,
4763-
// but not doing so may lead to the `ChannelManager::short_to_id` map being
4764-
// inconsistent, so we currently have to.
4782+
// Note that ideally we wouldn't force-close if we see *any* reorg on a 1-conf or
4783+
// 0-conf channel, but not doing so may lead to the `ChannelManager::short_to_id` map
4784+
// being inconsistent, so we currently have to.
47654785
if funding_tx_confirmations == 0 && self.funding_tx_confirmed_in.is_some() {
47664786
let err_reason = format!("Funding transaction was un-confirmed. Locked at {} confs, now have {} confs.",
47674787
self.minimum_depth.unwrap(), funding_tx_confirmations);
@@ -5620,7 +5640,7 @@ impl<Signer: Sign> Channel<Signer> {
56205640
}
56215641

56225642
const SERIALIZATION_VERSION: u8 = 2;
5623-
const MIN_SERIALIZATION_VERSION: u8 = 1;
5643+
const MIN_SERIALIZATION_VERSION: u8 = 2;
56245644

56255645
impl_writeable_tlv_based_enum!(InboundHTLCRemovalReason,;
56265646
(0, FailRelay),
@@ -5685,12 +5705,10 @@ impl<Signer: Sign> Writeable for Channel<Signer> {
56855705

56865706
self.user_id.write(writer)?;
56875707

5688-
// Write out the old serialization for the config object. This is read by version-1
5689-
// deserializers, but we will read the version in the TLV at the end instead.
5690-
self.config.forwarding_fee_proportional_millionths.write(writer)?;
5691-
self.config.cltv_expiry_delta.write(writer)?;
5692-
self.config.announced_channel.write(writer)?;
5693-
self.config.commit_upfront_shutdown_pubkey.write(writer)?;
5708+
// Version 1 deserializers expected to read parts of the config object here. Version 2
5709+
// deserializers (0.0.99) now read config through TLVs, and as we now require them for
5710+
// `minimum_depth` we simply write dummy values here.
5711+
writer.write_all(&[0; 8])?;
56945712

56955713
self.channel_id.write(writer)?;
56965714
(self.channel_state | ChannelState::PeerDisconnected as u32).write(writer)?;

lightning/src/ln/channelmanager.rs

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,7 +1286,7 @@ macro_rules! remove_channel {
12861286
}
12871287

12881288
macro_rules! handle_monitor_err {
1289-
($self: ident, $err: expr, $short_to_id: expr, $chan: expr, $action_type: path, $resend_raa: expr, $resend_commitment: expr, $failed_forwards: expr, $failed_fails: expr, $failed_finalized_fulfills: expr, $chan_id: expr) => {
1289+
($self: ident, $err: expr, $short_to_id: expr, $chan: expr, $action_type: path, $resend_raa: expr, $resend_commitment: expr, $resend_funding_locked: expr, $failed_forwards: expr, $failed_fails: expr, $failed_finalized_fulfills: expr, $chan_id: expr) => {
12901290
match $err {
12911291
ChannelMonitorUpdateErr::PermanentFailure => {
12921292
log_error!($self.logger, "Closing channel {} due to monitor update ChannelMonitorUpdateErr::PermanentFailure", log_bytes!($chan_id[..]));
@@ -1324,30 +1324,33 @@ macro_rules! handle_monitor_err {
13241324
if !$resend_raa {
13251325
debug_assert!($action_type == RAACommitmentOrder::CommitmentFirst || !$resend_commitment);
13261326
}
1327-
$chan.monitor_update_failed($resend_raa, $resend_commitment, $failed_forwards, $failed_fails, $failed_finalized_fulfills);
1327+
$chan.monitor_update_failed($resend_raa, $resend_commitment, $resend_funding_locked, $failed_forwards, $failed_fails, $failed_finalized_fulfills);
13281328
(Err(MsgHandleErrInternal::from_chan_no_close(ChannelError::Ignore("Failed to update ChannelMonitor".to_owned()), *$chan_id)), false)
13291329
},
13301330
}
13311331
};
1332-
($self: ident, $err: expr, $channel_state: expr, $entry: expr, $action_type: path, $resend_raa: expr, $resend_commitment: expr, $failed_forwards: expr, $failed_fails: expr, $failed_finalized_fulfills: expr) => { {
1333-
let (res, drop) = handle_monitor_err!($self, $err, $channel_state.short_to_id, $entry.get_mut(), $action_type, $resend_raa, $resend_commitment, $failed_forwards, $failed_fails, $failed_finalized_fulfills, $entry.key());
1332+
($self: ident, $err: expr, $channel_state: expr, $entry: expr, $action_type: path, $resend_raa: expr, $resend_commitment: expr, $resend_funding_locked: expr, $failed_forwards: expr, $failed_fails: expr, $failed_finalized_fulfills: expr) => { {
1333+
let (res, drop) = handle_monitor_err!($self, $err, $channel_state.short_to_id, $entry.get_mut(), $action_type, $resend_raa, $resend_commitment, $resend_funding_locked, $failed_forwards, $failed_fails, $failed_finalized_fulfills, $entry.key());
13341334
if drop {
13351335
$entry.remove_entry();
13361336
}
13371337
res
13381338
} };
13391339
($self: ident, $err: expr, $channel_state: expr, $entry: expr, $action_type: path, $chan_id: expr, COMMITMENT_UPDATE_ONLY) => { {
13401340
debug_assert!($action_type == RAACommitmentOrder::CommitmentFirst);
1341-
handle_monitor_err!($self, $err, $channel_state, $entry, $action_type, false, true, Vec::new(), Vec::new(), Vec::new(), $chan_id)
1341+
handle_monitor_err!($self, $err, $channel_state, $entry, $action_type, false, true, false, Vec::new(), Vec::new(), Vec::new(), $chan_id)
13421342
} };
13431343
($self: ident, $err: expr, $channel_state: expr, $entry: expr, $action_type: path, $chan_id: expr, NO_UPDATE) => {
1344-
handle_monitor_err!($self, $err, $channel_state, $entry, $action_type, false, false, Vec::new(), Vec::new(), Vec::new(), $chan_id)
1344+
handle_monitor_err!($self, $err, $channel_state, $entry, $action_type, false, false, false, Vec::new(), Vec::new(), Vec::new(), $chan_id)
1345+
};
1346+
($self: ident, $err: expr, $channel_state: expr, $entry: expr, $action_type: path, $resend_funding_locked: expr, OPTIONALLY_RESEND_FUNDING_LOCKED) => {
1347+
handle_monitor_err!($self, $err, $channel_state, $entry, $action_type, false, false, $resend_funding_locked, Vec::new(), Vec::new(), Vec::new())
13451348
};
13461349
($self: ident, $err: expr, $channel_state: expr, $entry: expr, $action_type: path, $resend_raa: expr, $resend_commitment: expr) => {
1347-
handle_monitor_err!($self, $err, $channel_state, $entry, $action_type, $resend_raa, $resend_commitment, Vec::new(), Vec::new(), Vec::new())
1350+
handle_monitor_err!($self, $err, $channel_state, $entry, $action_type, $resend_raa, $resend_commitment, false, Vec::new(), Vec::new(), Vec::new())
13481351
};
13491352
($self: ident, $err: expr, $channel_state: expr, $entry: expr, $action_type: path, $resend_raa: expr, $resend_commitment: expr, $failed_forwards: expr, $failed_fails: expr) => {
1350-
handle_monitor_err!($self, $err, $channel_state, $entry, $action_type, $resend_raa, $resend_commitment, $failed_forwards, $failed_fails, Vec::new())
1353+
handle_monitor_err!($self, $err, $channel_state, $entry, $action_type, $resend_raa, $resend_commitment, false, $failed_forwards, $failed_fails, Vec::new())
13511354
};
13521355
}
13531356

@@ -4268,7 +4271,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
42684271
// hasn't persisted to disk yet - we can't lose money on a transaction that we haven't
42694272
// accepted payment from yet. We do, however, need to wait to send our funding_locked
42704273
// until we have persisted our monitor.
4271-
chan.monitor_update_failed(false, false, Vec::new(), Vec::new(), Vec::new());
4274+
chan.monitor_update_failed(false, false, false, Vec::new(), Vec::new(), Vec::new());
42724275
},
42734276
}
42744277
}
@@ -4299,12 +4302,12 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
42994302
if chan.get().get_counterparty_node_id() != *counterparty_node_id {
43004303
return Err(MsgHandleErrInternal::send_err_msg_no_close("Got a message for a channel from the wrong node!".to_owned(), msg.channel_id));
43014304
}
4302-
let (monitor, funding_tx) = match chan.get_mut().funding_signed(&msg, best_block, &self.logger) {
4305+
let (monitor, funding_tx, funding_locked) = match chan.get_mut().funding_signed(&msg, best_block, &self.logger) {
43034306
Ok(update) => update,
43044307
Err(e) => try_chan_entry!(self, Err(e), channel_state, chan),
43054308
};
43064309
if let Err(e) = self.chain_monitor.watch_channel(chan.get().get_funding_txo().unwrap(), monitor) {
4307-
let mut res = handle_monitor_err!(self, e, channel_state, chan, RAACommitmentOrder::RevokeAndACKFirst, false, false);
4310+
let mut res = handle_monitor_err!(self, e, channel_state, chan, RAACommitmentOrder::RevokeAndACKFirst, funding_locked.is_some(), OPTIONALLY_RESEND_FUNDING_LOCKED);
43084311
if let Err(MsgHandleErrInternal { ref mut shutdown_finish, .. }) = res {
43094312
// We weren't able to watch the channel to begin with, so no updates should be made on
43104313
// it. Previously, full_stack_target found an (unreachable) panic when the
@@ -4315,6 +4318,9 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
43154318
}
43164319
return res
43174320
}
4321+
if let Some(msg) = funding_locked {
4322+
send_funding_locked!(channel_state.short_to_id, channel_state.pending_msg_events, chan.get(), msg);
4323+
}
43184324
funding_tx
43194325
},
43204326
hash_map::Entry::Vacant(_) => return Err(MsgHandleErrInternal::send_err_msg_no_close("Failed to find corresponding channel".to_owned(), msg.channel_id))
@@ -4665,7 +4671,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
46654671
} else {
46664672
if let Err(e) = handle_monitor_err!(self, e, channel_state, chan,
46674673
RAACommitmentOrder::CommitmentFirst, false,
4668-
raa_updates.commitment_update.is_some(),
4674+
raa_updates.commitment_update.is_some(), false,
46694675
raa_updates.accepted_htlcs, raa_updates.failed_htlcs,
46704676
raa_updates.finalized_claimed_htlcs) {
46714677
break Err(e);
@@ -5520,6 +5526,19 @@ where
55205526
}
55215527
}
55225528
}
5529+
if channel.is_our_funding_locked() {
5530+
if let Some(real_scid) = channel.get_short_channel_id() {
5531+
// If we sent a 0conf funding_locked, and now have an SCID, we add it
5532+
// to the short_to_id map here. Note that we check whether we can relay
5533+
// using the real SCID at relay-time (i.e. enforce option_scid_alias
5534+
// then), and if the funding tx is ever un-confirmed we force-close the
5535+
// channel, ensuring short_to_id is always consistent.
5536+
let scid_insert = short_to_id.insert(real_scid, channel.channel_id());
5537+
assert!(scid_insert.is_none() || scid_insert.unwrap() == channel.channel_id(),
5538+
"SCIDs should never collide - ensure you weren't behind by a full {} blocks when creating channels",
5539+
fake_scid::MAX_SCID_BLOCKS_FROM_NOW);
5540+
}
5541+
}
55235542
} else if let Err(reason) = res {
55245543
update_maps_on_chan_removal!(self, short_to_id, channel);
55255544
// It looks like our counterparty went on-chain or funding transaction was

lightning/src/ln/priv_short_conf_tests.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,3 +564,37 @@ fn test_scid_alias_returned() {
564564
PaymentFailedConditions::new().blamed_scid(last_hop[0].inbound_scid_alias.unwrap())
565565
.blamed_chan_closed(false).expected_htlc_error_data(0x1000|12, &err_data));
566566
}
567+
568+
#[test]
569+
fn test_simple_0conf_channel() {
570+
// If our peer tells us they will accept our channel with 0 confs, and we funded the channel,
571+
// we should trust the funding won't be double-spent (assuming `trust_own_funding_0conf` is
572+
// set)!
573+
574+
let chanmon_cfgs = create_chanmon_cfgs(2);
575+
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
576+
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
577+
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
578+
579+
nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), 100000, 10001, 42, None).unwrap();
580+
let open_channel = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id());
581+
582+
nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), InitFeatures::known(), &open_channel);
583+
let mut accept_channel = get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id());
584+
accept_channel.minimum_depth = 0;
585+
nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), InitFeatures::known(), &accept_channel);
586+
587+
let (temporary_channel_id, tx, _) = create_funding_transaction(&nodes[0], &nodes[1].node.get_our_node_id(), 100000, 42);
588+
nodes[0].node.funding_transaction_generated(&temporary_channel_id, &nodes[1].node.get_our_node_id(), tx.clone()).unwrap();
589+
let funding_created = get_event_msg!(nodes[0], MessageSendEvent::SendFundingCreated, nodes[1].node.get_our_node_id());
590+
591+
nodes[1].node.handle_funding_created(&nodes[0].node.get_our_node_id(), &funding_created);
592+
check_added_monitors!(nodes[1], 1);
593+
let funding_signed = get_event_msg!(nodes[1], MessageSendEvent::SendFundingSigned, nodes[0].node.get_our_node_id());
594+
595+
nodes[0].node.handle_funding_signed(&nodes[1].node.get_our_node_id(), &funding_signed);
596+
check_added_monitors!(nodes[0], 1);
597+
598+
let as_funding_locked = get_event_msg!(nodes[0], MessageSendEvent::SendFundingLocked, nodes[1].node.get_our_node_id());
599+
nodes[1].node.handle_funding_locked(&nodes[0].node.get_our_node_id(), &as_funding_locked);
600+
}

0 commit comments

Comments
 (0)