use chain::keysinterface::SpendableOutputDescriptor;
use ln::msgs;
+use ln::msgs::DecodeError;
use ln::{PaymentPreimage, PaymentHash, PaymentSecret};
use routing::network_graph::NetworkUpdate;
use util::ser::{Writeable, Writer, MaybeReadable, Readable, VecReadWrapper, VecWriteWrapper};
use io;
use prelude::*;
-use core::cmp;
use core::time::Duration;
use core::ops::Deref;
SpontaneousPayment(PaymentPreimage),
}
+#[derive(Clone, Debug)]
+/// Some information provided on the closure source of the channel halting.
+pub enum ClosureReason {
+ /// Closure generated from receiving a peer error message by ChannelManager::handle_error
+ CounterpartyForceClosed {
+ /// The error is coming from the peer, there *might* be a human-readable msg
+ peer_msg: Option<String>,
+ },
+ /// Closure generated from ChannelManager::force_close_channel
+ HolderForceClosed,
+ /// Closure generated from receiving a peer's ClosingSigned message. Note the shutdown
+ /// sequence might have been initially initiated by us.
+ CooperativeClosure,
+ /// Closure generated from receiving chain::Watch's CommitmentTxBroadcast event.
+ CommitmentTxBroadcasted,
+ /// Closure generated from processing an event, likely a HTLC forward/relay/reception.
+ ProcessingError {
+ err: String,
+ },
+ /// Closure generated from ChannelManager::peer_disconnected.
+ DisconnectedPeer,
+}
+
+impl_writeable_tlv_based_enum_upgradable!(ClosureReason,
+ (0, CounterpartyForceClosed) => { (1, peer_msg, option) },
+ (2, HolderForceClosed) => {},
+ (6, CommitmentTxBroadcasted) => {},
+ (4, CooperativeClosure) => {},
+ (8, ProcessingError) => { (1, err, required) },
+ (10, DisconnectedPeer) => {},
+);
+
/// An Event which you should probably take some action in response to.
///
/// Note that while Writeable and Readable are implemented for Event, you probably shouldn't use
/// transaction.
claim_from_onchain_tx: bool,
},
- /// Used to indicate that a channel was closed at the given timestamp.
+ /// Used to indicate that a channel with the given `channel_id` is in the process of closure.
ChannelClosed {
/// The channel_id which has been barren from further off-chain updates but
/// funding output might still be not resolved yet.
channel_id: [u8; 32],
- /// A human-readable error message
- err: String
+ /// A machine-readable error message
+ err: ClosureReason
}
}
});
},
&Event::ChannelClosed { ref channel_id, ref err } => {
- 6u8.write(writer)?;
+ 8u8.write(writer)?;
channel_id.write(writer)?;
- (err.len() as u16).write(writer)?;
- writer.write_all(err.as_bytes())?;
+ err.write(writer)?;
write_tlv_fields!(writer, {});
},
}
};
f()
},
+ 8u8 => {
+ let channel_id = Readable::read(reader)?;
+ let err = MaybeReadable::read(reader)?;
+ read_tlv_fields!(reader, {});
+ if err.is_none() { return Ok(None); }
+ Ok(Some(Event::ChannelClosed { channel_id, err: err.unwrap() }))
+ },
// Versions prior to 0.0.100 did not ignore odd types, instead returning InvalidValue.
x if x % 2 == 1 => Ok(None),
- 6u8 => {
- let f = || {
- let channel_id = Readable::read(reader)?;
- let err = {
- let mut size: usize = <u16 as Readable>::read(reader)? as usize;
- let mut data = vec![];
- let data_len = reader.read_to_end(&mut data)?;
- size = cmp::min(data_len, size);
- match String::from_utf8(data[..size as usize].to_vec()) {
- Ok(s) => s,
- Err(_) => return Err(msgs::DecodeError::InvalidValue),
- }
- };
- read_tlv_fields!(reader, {});
- Ok(Some(Event::ChannelClosed { channel_id, err: err }))
- };
- f()
- },
_ => Err(msgs::DecodeError::InvalidValue)
}
}