Skip to content

Commit 32f6205

Browse files
authored
Merge pull request #841 from valentinewallace/207-replacement
Expose counterparty forwarding info in ChannelDetails
2 parents 8799a2a + c318ad8 commit 32f6205

File tree

8 files changed

+170
-2
lines changed

8 files changed

+170
-2
lines changed

fuzz/src/router.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
212212
inbound_capacity_msat: 0,
213213
is_live: true,
214214
outbound_capacity_msat: 0,
215+
counterparty_forwarding_info: None,
215216
});
216217
}
217218
Some(&first_hops_vec[..])

lightning-net-tokio/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,7 @@ mod tests {
561561
fn handle_revoke_and_ack(&self, _their_node_id: &PublicKey, _msg: &RevokeAndACK) {}
562562
fn handle_update_fee(&self, _their_node_id: &PublicKey, _msg: &UpdateFee) {}
563563
fn handle_announcement_signatures(&self, _their_node_id: &PublicKey, _msg: &AnnouncementSignatures) {}
564+
fn handle_channel_update(&self, _their_node_id: &PublicKey, _msg: &ChannelUpdate) {}
564565
fn peer_disconnected(&self, their_node_id: &PublicKey, _no_connection_possible: bool) {
565566
if *their_node_id == self.expected_pubkey {
566567
self.disconnected_flag.store(true, Ordering::SeqCst);

lightning/src/ln/channel.rs

Lines changed: 110 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,19 @@ impl HTLCCandidate {
282282
}
283283
}
284284

285+
/// Information needed for constructing an invoice route hint for this channel.
286+
#[derive(Clone)]
287+
pub struct CounterpartyForwardingInfo {
288+
/// Base routing fee in millisatoshis.
289+
pub fee_base_msat: u32,
290+
/// Amount in millionths of a satoshi the channel will charge per transferred satoshi.
291+
pub fee_proportional_millionths: u32,
292+
/// The minimum difference in cltv_expiry between an ingoing HTLC and its outgoing counterpart,
293+
/// such that the outgoing HTLC is forwardable to this counterparty. See `msgs::ChannelUpdate`'s
294+
/// `cltv_expiry_delta` for more details.
295+
pub cltv_expiry_delta: u16,
296+
}
297+
285298
// TODO: We should refactor this to be an Inbound/OutboundChannel until initial setup handshaking
286299
// has been completed, and then turn into a Channel to get compiler-time enforcement of things like
287300
// calling channel_id() before we're set up or things like get_outbound_funding_signed on an
@@ -392,6 +405,8 @@ pub(super) struct Channel<Signer: Sign> {
392405
//implied by OUR_MAX_HTLCS: max_accepted_htlcs: u16,
393406
minimum_depth: u32,
394407

408+
counterparty_forwarding_info: Option<CounterpartyForwardingInfo>,
409+
395410
pub(crate) channel_transaction_parameters: ChannelTransactionParameters,
396411

397412
counterparty_cur_commitment_point: Option<PublicKey>,
@@ -578,6 +593,8 @@ impl<Signer: Sign> Channel<Signer> {
578593
counterparty_max_accepted_htlcs: 0,
579594
minimum_depth: 0, // Filled in in accept_channel
580595

596+
counterparty_forwarding_info: None,
597+
581598
channel_transaction_parameters: ChannelTransactionParameters {
582599
holder_pubkeys: pubkeys,
583600
holder_selected_contest_delay: config.own_channel_config.our_to_self_delay,
@@ -814,6 +831,8 @@ impl<Signer: Sign> Channel<Signer> {
814831
counterparty_max_accepted_htlcs: msg.max_accepted_htlcs,
815832
minimum_depth: config.own_channel_config.minimum_depth,
816833

834+
counterparty_forwarding_info: None,
835+
817836
channel_transaction_parameters: ChannelTransactionParameters {
818837
holder_pubkeys: pubkeys,
819838
holder_selected_contest_delay: config.own_channel_config.our_to_self_delay,
@@ -4112,6 +4131,25 @@ impl<Signer: Sign> Channel<Signer> {
41124131
}
41134132
}
41144133

4134+
/// Get forwarding information for the counterparty.
4135+
pub fn counterparty_forwarding_info(&self) -> Option<CounterpartyForwardingInfo> {
4136+
self.counterparty_forwarding_info.clone()
4137+
}
4138+
4139+
pub fn channel_update(&mut self, msg: &msgs::ChannelUpdate) -> Result<(), ChannelError> {
4140+
let usable_channel_value_msat = (self.channel_value_satoshis - self.counterparty_selected_channel_reserve_satoshis) * 1000;
4141+
if msg.contents.htlc_minimum_msat >= usable_channel_value_msat {
4142+
return Err(ChannelError::Close("Minimum htlc value is greater than channel value".to_string()));
4143+
}
4144+
self.counterparty_forwarding_info = Some(CounterpartyForwardingInfo {
4145+
fee_base_msat: msg.contents.fee_base_msat,
4146+
fee_proportional_millionths: msg.contents.fee_proportional_millionths,
4147+
cltv_expiry_delta: msg.contents.cltv_expiry_delta
4148+
});
4149+
4150+
Ok(())
4151+
}
4152+
41154153
/// Begins the shutdown process, getting a message for the remote peer and returning all
41164154
/// holding cell HTLCs for payment failure.
41174155
pub fn get_shutdown(&mut self) -> Result<(msgs::Shutdown, Vec<(HTLCSource, PaymentHash)>), APIError> {
@@ -4435,6 +4473,16 @@ impl<Signer: Sign> Writeable for Channel<Signer> {
44354473
self.counterparty_max_accepted_htlcs.write(writer)?;
44364474
self.minimum_depth.write(writer)?;
44374475

4476+
match &self.counterparty_forwarding_info {
4477+
Some(info) => {
4478+
1u8.write(writer)?;
4479+
info.fee_base_msat.write(writer)?;
4480+
info.fee_proportional_millionths.write(writer)?;
4481+
info.cltv_expiry_delta.write(writer)?;
4482+
},
4483+
None => 0u8.write(writer)?
4484+
}
4485+
44384486
self.channel_transaction_parameters.write(writer)?;
44394487
self.counterparty_cur_commitment_point.write(writer)?;
44404488

@@ -4595,6 +4643,16 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
45954643
let counterparty_max_accepted_htlcs = Readable::read(reader)?;
45964644
let minimum_depth = Readable::read(reader)?;
45974645

4646+
let counterparty_forwarding_info = match <u8 as Readable>::read(reader)? {
4647+
0 => None,
4648+
1 => Some(CounterpartyForwardingInfo {
4649+
fee_base_msat: Readable::read(reader)?,
4650+
fee_proportional_millionths: Readable::read(reader)?,
4651+
cltv_expiry_delta: Readable::read(reader)?,
4652+
}),
4653+
_ => return Err(DecodeError::InvalidValue),
4654+
};
4655+
45984656
let channel_parameters = Readable::read(reader)?;
45994657
let counterparty_cur_commitment_point = Readable::read(reader)?;
46004658

@@ -4665,6 +4723,8 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
46654723
counterparty_max_accepted_htlcs,
46664724
minimum_depth,
46674725

4726+
counterparty_forwarding_info,
4727+
46684728
channel_transaction_parameters: channel_parameters,
46694729
counterparty_cur_commitment_point,
46704730

@@ -4700,7 +4760,7 @@ mod tests {
47004760
use ln::channel::{Channel,Sign,InboundHTLCOutput,OutboundHTLCOutput,InboundHTLCState,OutboundHTLCState,HTLCOutputInCommitment,HTLCCandidate,HTLCInitiator,TxCreationKeys};
47014761
use ln::channel::MAX_FUNDING_SATOSHIS;
47024762
use ln::features::InitFeatures;
4703-
use ln::msgs::{OptionalField, DataLossProtect, DecodeError};
4763+
use ln::msgs::{ChannelUpdate, DataLossProtect, DecodeError, OptionalField, UnsignedChannelUpdate};
47044764
use ln::chan_utils;
47054765
use ln::chan_utils::{ChannelPublicKeys, HolderCommitmentTransaction, CounterpartyChannelTransactionParameters, HTLC_SUCCESS_TX_WEIGHT, HTLC_TIMEOUT_TX_WEIGHT};
47064766
use chain::chaininterface::{FeeEstimator,ConfirmationTarget};
@@ -4711,6 +4771,7 @@ mod tests {
47114771
use util::test_utils;
47124772
use util::logger::Logger;
47134773
use bitcoin::secp256k1::{Secp256k1, Message, Signature, All};
4774+
use bitcoin::secp256k1::ffi::Signature as FFISignature;
47144775
use bitcoin::secp256k1::key::{SecretKey,PublicKey};
47154776
use bitcoin::hashes::sha256::Hash as Sha256;
47164777
use bitcoin::hashes::Hash;
@@ -4967,6 +5028,54 @@ mod tests {
49675028
}
49685029
}
49695030

5031+
#[test]
5032+
fn channel_update() {
5033+
let feeest = TestFeeEstimator{fee_est: 15000};
5034+
let secp_ctx = Secp256k1::new();
5035+
let seed = [42; 32];
5036+
let network = Network::Testnet;
5037+
let chain_hash = genesis_block(network).header.block_hash();
5038+
let keys_provider = test_utils::TestKeysInterface::new(&seed, network);
5039+
5040+
// Create a channel.
5041+
let node_b_node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap());
5042+
let config = UserConfig::default();
5043+
let mut node_a_chan = Channel::<EnforcingSigner>::new_outbound(&&feeest, &&keys_provider, node_b_node_id, 10000000, 100000, 42, &config).unwrap();
5044+
assert!(node_a_chan.counterparty_forwarding_info.is_none());
5045+
assert_eq!(node_a_chan.holder_htlc_minimum_msat, 1); // the default
5046+
assert!(node_a_chan.counterparty_forwarding_info().is_none());
5047+
5048+
// Make sure that receiving a channel update will update the Channel as expected.
5049+
let update = ChannelUpdate {
5050+
contents: UnsignedChannelUpdate {
5051+
chain_hash,
5052+
short_channel_id: 0,
5053+
timestamp: 0,
5054+
flags: 0,
5055+
cltv_expiry_delta: 100,
5056+
htlc_minimum_msat: 5,
5057+
htlc_maximum_msat: OptionalField::Absent,
5058+
fee_base_msat: 110,
5059+
fee_proportional_millionths: 11,
5060+
excess_data: Vec::new(),
5061+
},
5062+
signature: Signature::from(unsafe { FFISignature::new() })
5063+
};
5064+
node_a_chan.channel_update(&update).unwrap();
5065+
5066+
// The counterparty can send an update with a higher minimum HTLC, but that shouldn't
5067+
// change our official htlc_minimum_msat.
5068+
assert_eq!(node_a_chan.holder_htlc_minimum_msat, 1);
5069+
match node_a_chan.counterparty_forwarding_info() {
5070+
Some(info) => {
5071+
assert_eq!(info.cltv_expiry_delta, 100);
5072+
assert_eq!(info.fee_base_msat, 110);
5073+
assert_eq!(info.fee_proportional_millionths, 11);
5074+
},
5075+
None => panic!("expected counterparty forwarding info to be Some")
5076+
}
5077+
}
5078+
49705079
#[test]
49715080
fn outbound_commitment_test() {
49725081
// Test vectors from BOLT 3 Appendix C:

lightning/src/ln/channelmanager.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ use chain::Watch;
3939
use chain::chaininterface::{BroadcasterInterface, FeeEstimator};
4040
use chain::channelmonitor::{ChannelMonitor, ChannelMonitorUpdate, ChannelMonitorUpdateStep, ChannelMonitorUpdateErr, HTLC_FAIL_BACK_BUFFER, CLTV_CLAIM_BUFFER, LATENCY_GRACE_PERIOD_BLOCKS, ANTI_REORG_DELAY, MonitorEvent, CLOSED_CHANNEL_UPDATE_ID};
4141
use chain::transaction::{OutPoint, TransactionData};
42+
// Since this struct is returned in `list_channels` methods, expose it here in case users want to
43+
// construct one themselves.
44+
pub use ln::channel::CounterpartyForwardingInfo;
4245
use ln::channel::{Channel, ChannelError};
4346
use ln::features::{InitFeatures, NodeFeatures};
4447
use routing::router::{Route, RouteHop};
@@ -574,6 +577,10 @@ pub struct ChannelDetails {
574577
/// True if the channel is (a) confirmed and funding_locked messages have been exchanged, (b)
575578
/// the peer is connected, and (c) no monitor update failure is pending resolution.
576579
pub is_live: bool,
580+
581+
/// Information on the fees and requirements that the counterparty requires when forwarding
582+
/// payments to us through this channel.
583+
pub counterparty_forwarding_info: Option<CounterpartyForwardingInfo>,
577584
}
578585

579586
/// If a payment fails to send, it can be in one of several states. This enum is returned as the
@@ -892,6 +899,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
892899
outbound_capacity_msat,
893900
user_id: channel.get_user_id(),
894901
is_live: channel.is_live(),
902+
counterparty_forwarding_info: channel.counterparty_forwarding_info(),
895903
});
896904
}
897905
}
@@ -2994,6 +3002,29 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
29943002
Ok(())
29953003
}
29963004

3005+
fn internal_channel_update(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelUpdate) -> Result<(), MsgHandleErrInternal> {
3006+
let mut channel_state_lock = self.channel_state.lock().unwrap();
3007+
let channel_state = &mut *channel_state_lock;
3008+
let chan_id = match channel_state.short_to_id.get(&msg.contents.short_channel_id) {
3009+
Some(chan_id) => chan_id.clone(),
3010+
None => {
3011+
// It's not a local channel
3012+
return Ok(())
3013+
}
3014+
};
3015+
match channel_state.by_id.entry(chan_id) {
3016+
hash_map::Entry::Occupied(mut chan) => {
3017+
if chan.get().get_counterparty_node_id() != *counterparty_node_id {
3018+
// TODO: see issue #153, need a consistent behavior on obnoxious behavior from random node
3019+
return Err(MsgHandleErrInternal::send_err_msg_no_close("Got a message for a channel from the wrong node!".to_owned(), chan_id));
3020+
}
3021+
try_chan_entry!(self, chan.get_mut().channel_update(&msg), channel_state, chan);
3022+
},
3023+
hash_map::Entry::Vacant(_) => unreachable!()
3024+
}
3025+
Ok(())
3026+
}
3027+
29973028
fn internal_channel_reestablish(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelReestablish) -> Result<(), MsgHandleErrInternal> {
29983029
let mut channel_state_lock = self.channel_state.lock().unwrap();
29993030
let channel_state = &mut *channel_state_lock;
@@ -3517,6 +3548,11 @@ impl<Signer: Sign, M: Deref + Sync + Send, T: Deref + Sync + Send, K: Deref + Sy
35173548
let _ = handle_error!(self, self.internal_announcement_signatures(counterparty_node_id, msg), *counterparty_node_id);
35183549
}
35193550

3551+
fn handle_channel_update(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelUpdate) {
3552+
let _persistence_guard = PersistenceNotifierGuard::new(&self.total_consistency_lock, &self.persistence_notifier);
3553+
let _ = handle_error!(self, self.internal_channel_update(counterparty_node_id, msg), *counterparty_node_id);
3554+
}
3555+
35203556
fn handle_channel_reestablish(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelReestablish) {
35213557
let _persistence_guard = PersistenceNotifierGuard::new(&self.total_consistency_lock, &self.persistence_notifier);
35223558
let _ = handle_error!(self, self.internal_channel_reestablish(counterparty_node_id, msg), *counterparty_node_id);

lightning/src/ln/msgs.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,14 @@ pub struct UnsignedChannelUpdate {
543543
pub timestamp: u32,
544544
/// Channel flags
545545
pub flags: u8,
546-
/// The number of blocks to subtract from incoming HTLC cltv_expiry values
546+
/// The number of blocks such that if:
547+
/// `incoming_htlc.cltv_expiry < outgoing_htlc.cltv_expiry + cltv_expiry_delta`
548+
/// then we need to fail the HTLC backwards. When forwarding an HTLC, cltv_expiry_delta determines
549+
/// the outgoing HTLC's minimum cltv_expiry value -- so, if an incoming HTLC comes in with a
550+
/// cltv_expiry of 100000, and the node we're forwarding to has a cltv_expiry_delta value of 10,
551+
/// then we'll check that the outgoing HTLC's cltv_expiry value is at least 100010 before
552+
/// forwarding. Note that the HTLC sender is the one who originally sets this value when
553+
/// constructing the route.
547554
pub cltv_expiry_delta: u16,
548555
/// The minimum HTLC size incoming to sender, in milli-satoshi
549556
pub htlc_minimum_msat: u64,
@@ -789,6 +796,9 @@ pub trait ChannelMessageHandler : MessageSendEventsProvider + Send + Sync {
789796
/// Handle an incoming channel_reestablish message from the given peer.
790797
fn handle_channel_reestablish(&self, their_node_id: &PublicKey, msg: &ChannelReestablish);
791798

799+
/// Handle an incoming channel update from the given peer.
800+
fn handle_channel_update(&self, their_node_id: &PublicKey, msg: &ChannelUpdate);
801+
792802
// Error:
793803
/// Handle an incoming error message from the given peer.
794804
fn handle_error(&self, their_node_id: &PublicKey, msg: &ErrorMessage);

lightning/src/ln/peer_handler.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ impl ChannelMessageHandler for ErroringMessageHandler {
142142
fn handle_channel_reestablish(&self, their_node_id: &PublicKey, msg: &msgs::ChannelReestablish) {
143143
ErroringMessageHandler::push_error(self, their_node_id, msg.channel_id);
144144
}
145+
// msgs::ChannelUpdate does not contain the channel_id field, so we just drop them.
146+
fn handle_channel_update(&self, _their_node_id: &PublicKey, _msg: &msgs::ChannelUpdate) {}
145147
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
146148
fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) {}
147149
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {}
@@ -970,6 +972,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
970972
}
971973
},
972974
wire::Message::ChannelUpdate(msg) => {
975+
self.message_handler.chan_handler.handle_channel_update(&peer.their_node_id.unwrap(), &msg);
973976
let should_forward = match self.message_handler.route_handler.handle_channel_update(&msg) {
974977
Ok(v) => v,
975978
Err(e) => { return Err(e.into()); },

lightning/src/routing/router.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1473,6 +1473,7 @@ mod tests {
14731473
outbound_capacity_msat: 100000,
14741474
inbound_capacity_msat: 100000,
14751475
is_live: true,
1476+
counterparty_forwarding_info: None,
14761477
}];
14771478

14781479
if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(&our_id, &net_graph_msg_handler.network_graph.read().unwrap(), &nodes[2], None, Some(&our_chans.iter().collect::<Vec<_>>()), &Vec::new(), 100, 42, Arc::clone(&logger)) {
@@ -1790,6 +1791,7 @@ mod tests {
17901791
outbound_capacity_msat: 250_000_000,
17911792
inbound_capacity_msat: 0,
17921793
is_live: true,
1794+
counterparty_forwarding_info: None,
17931795
}];
17941796
let route = get_route(&our_id, &net_graph_msg_handler.network_graph.read().unwrap(), &nodes[2], None, Some(&our_chans.iter().collect::<Vec<_>>()), &Vec::new(), 100, 42, Arc::clone(&logger)).unwrap();
17951797
assert_eq!(route.paths[0].len(), 2);
@@ -1837,6 +1839,7 @@ mod tests {
18371839
outbound_capacity_msat: 250_000_000,
18381840
inbound_capacity_msat: 0,
18391841
is_live: true,
1842+
counterparty_forwarding_info: None,
18401843
}];
18411844
let route = get_route(&our_id, &net_graph_msg_handler.network_graph.read().unwrap(), &nodes[2], None, Some(&our_chans.iter().collect::<Vec<_>>()), &Vec::new(), 100, 42, Arc::clone(&logger)).unwrap();
18421845
assert_eq!(route.paths[0].len(), 2);
@@ -1901,6 +1904,7 @@ mod tests {
19011904
outbound_capacity_msat: 250_000_000,
19021905
inbound_capacity_msat: 0,
19031906
is_live: true,
1907+
counterparty_forwarding_info: None,
19041908
}];
19051909
let route = get_route(&our_id, &net_graph_msg_handler.network_graph.read().unwrap(), &nodes[2], None, Some(&our_chans.iter().collect::<Vec<_>>()), &Vec::new(), 100, 42, Arc::clone(&logger)).unwrap();
19061910
assert_eq!(route.paths[0].len(), 2);
@@ -2037,6 +2041,7 @@ mod tests {
20372041
outbound_capacity_msat: 250_000_000,
20382042
inbound_capacity_msat: 0,
20392043
is_live: true,
2044+
counterparty_forwarding_info: None,
20402045
}];
20412046
let mut last_hops = last_hops(&nodes);
20422047
let route = get_route(&our_id, &net_graph_msg_handler.network_graph.read().unwrap(), &nodes[6], None, Some(&our_chans.iter().collect::<Vec<_>>()), &last_hops.iter().collect::<Vec<_>>(), 100, 42, Arc::clone(&logger)).unwrap();
@@ -2165,6 +2170,7 @@ mod tests {
21652170
outbound_capacity_msat: 100000,
21662171
inbound_capacity_msat: 100000,
21672172
is_live: true,
2173+
counterparty_forwarding_info: None,
21682174
}];
21692175
let route = get_route(&source_node_id, &NetworkGraph::new(genesis_block(Network::Testnet).header.block_hash()), &target_node_id, None, Some(&our_chans.iter().collect::<Vec<_>>()), &last_hops.iter().collect::<Vec<_>>(), 100, 42, Arc::new(test_utils::TestLogger::new())).unwrap();
21702176

@@ -2296,6 +2302,7 @@ mod tests {
22962302
outbound_capacity_msat: 200_000_000,
22972303
inbound_capacity_msat: 0,
22982304
is_live: true,
2305+
counterparty_forwarding_info: None,
22992306
}];
23002307

23012308
{

lightning/src/util/test_utils.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ impl msgs::ChannelMessageHandler for TestChannelMessageHandler {
231231
fn handle_commitment_signed(&self, _their_node_id: &PublicKey, _msg: &msgs::CommitmentSigned) {}
232232
fn handle_revoke_and_ack(&self, _their_node_id: &PublicKey, _msg: &msgs::RevokeAndACK) {}
233233
fn handle_update_fee(&self, _their_node_id: &PublicKey, _msg: &msgs::UpdateFee) {}
234+
fn handle_channel_update(&self, _their_node_id: &PublicKey, _msg: &msgs::ChannelUpdate) {}
234235
fn handle_announcement_signatures(&self, _their_node_id: &PublicKey, _msg: &msgs::AnnouncementSignatures) {}
235236
fn handle_channel_reestablish(&self, _their_node_id: &PublicKey, _msg: &msgs::ChannelReestablish) {}
236237
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}

0 commit comments

Comments
 (0)