13 => {
loss_detector.disconnect_block();
},
+ 14 => {
+ let mut channels = channelmanager.list_channels();
+ let channel_id = get_slice!(1)[0] as usize;
+ if channel_id >= channels.len() { return; }
+ channels.sort_by(|a, b| { a.channel_id.cmp(&b.channel_id) });
+ channelmanager.force_close_channel(&channels[channel_id].channel_id);
+ },
_ => return,
}
loss_detector.handler.process_events();
pub fn get_update_fail_htlc(&mut self, payment_hash_arg: &[u8; 32], err_packet: msgs::OnionErrorPacket) -> Result<Option<msgs::UpdateFailHTLC>, HandleError> {
if (self.channel_state & (ChannelState::ChannelFunded as u32)) != (ChannelState::ChannelFunded as u32) {
- return Err(HandleError{err: "Was asked to fail an HTLC when channel was not in an operational state", action: None});
+ panic!("Was asked to fail an HTLC when channel was not in an operational state");
}
assert_eq!(self.channel_state & ChannelState::ShutdownComplete as u32, 0);
/// Creates a signed commitment transaction to send to the remote peer.
/// Always returns a Channel-failing HandleError::action if an immediately-preceding (read: the
/// last call to this Channel) send_htlc returned Ok(Some(_)) and there is an Err.
+ /// May panic if called except immediately after a successful, Ok(Some(_))-returning send_htlc.
pub fn send_commitment(&mut self) -> Result<(msgs::CommitmentSigned, ChannelMonitor), HandleError> {
if (self.channel_state & (ChannelState::ChannelFunded as u32)) != (ChannelState::ChannelFunded as u32) {
- return Err(HandleError{err: "Cannot create commitment tx until channel is fully established", action: None});
+ panic!("Cannot create commitment tx until channel is fully established");
}
if (self.channel_state & (ChannelState::AwaitingRemoteRevoke as u32)) == (ChannelState::AwaitingRemoteRevoke as u32) {
- return Err(HandleError{err: "Cannot create commitment tx until remote revokes their previous commitment", action: None});
+ panic!("Cannot create commitment tx until remote revokes their previous commitment");
}
let mut have_updates = false; // TODO initialize with "have we sent a fee update?"
for htlc in self.pending_htlcs.iter() {
if have_updates { break; }
}
if !have_updates {
- return Err(HandleError{err: "Cannot create commitment tx until we have some updates to send", action: None});
+ panic!("Cannot create commitment tx until we have some updates to send");
}
self.send_commitment_no_status_check()
}
if chan.get_their_node_id() != route.hops.first().unwrap().pubkey {
return Err(HandleError{err: "Node ID mismatch on first hop!", action: None});
}
+ if !chan.is_live() {
+ return Err(HandleError{err: "Peer for first hop currently disconnected!", action: None});
+ }
chan.send_htlc_and_commit(htlc_msat, payment_hash, htlc_cltv, onion_packet)?
};