use ln::msgs;
use ln::channelmanager::{PaymentPreimage, PaymentHash, PaymentSecret};
use chain::transaction::OutPoint;
use chain::keysinterface::SpendableOutputDescriptor;
use util::ser::{Writeable, Writer, MaybeReadable, Readable};
use bitcoin::blockdata::script::Script;
use bitcoin::secp256k1::key::PublicKey;
use std::time::Duration;
#[derive(Clone, Debug)]
pub enum Event {
FundingGenerationReady {
temporary_channel_id: [u8; 32],
channel_value_satoshis: u64,
output_script: Script,
user_channel_id: u64,
},
FundingBroadcastSafe {
funding_txo: OutPoint,
user_channel_id: u64,
},
PaymentReceived {
payment_hash: PaymentHash,
payment_secret: Option<PaymentSecret>,
amt: u64,
},
PaymentSent {
payment_preimage: PaymentPreimage,
},
PaymentFailed {
payment_hash: PaymentHash,
rejected_by_dest: bool,
#[cfg(test)]
error_code: Option<u16>,
#[cfg(test)]
error_data: Option<Vec<u8>>,
},
PendingHTLCsForwardable {
time_forwardable: Duration,
},
SpendableOutputs {
outputs: Vec<SpendableOutputDescriptor>,
},
}
impl Writeable for Event {
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
match self {
&Event::FundingGenerationReady { .. } => {
0u8.write(writer)?;
},
&Event::FundingBroadcastSafe { ref funding_txo, ref user_channel_id } => {
1u8.write(writer)?;
funding_txo.write(writer)?;
user_channel_id.write(writer)?;
},
&Event::PaymentReceived { ref payment_hash, ref payment_secret, ref amt } => {
2u8.write(writer)?;
payment_hash.write(writer)?;
payment_secret.write(writer)?;
amt.write(writer)?;
},
&Event::PaymentSent { ref payment_preimage } => {
3u8.write(writer)?;
payment_preimage.write(writer)?;
},
&Event::PaymentFailed { ref payment_hash, ref rejected_by_dest,
#[cfg(test)]
ref error_code,
#[cfg(test)]
ref error_data,
} => {
4u8.write(writer)?;
payment_hash.write(writer)?;
rejected_by_dest.write(writer)?;
#[cfg(test)]
error_code.write(writer)?;
#[cfg(test)]
error_data.write(writer)?;
},
&Event::PendingHTLCsForwardable { time_forwardable: _ } => {
5u8.write(writer)?;
},
&Event::SpendableOutputs { ref outputs } => {
6u8.write(writer)?;
(outputs.len() as u64).write(writer)?;
for output in outputs.iter() {
output.write(writer)?;
}
},
}
Ok(())
}
}
impl MaybeReadable for Event {
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Option<Self>, msgs::DecodeError> {
match Readable::read(reader)? {
0u8 => Ok(None),
1u8 => Ok(Some(Event::FundingBroadcastSafe {
funding_txo: Readable::read(reader)?,
user_channel_id: Readable::read(reader)?,
})),
2u8 => Ok(Some(Event::PaymentReceived {
payment_hash: Readable::read(reader)?,
payment_secret: Readable::read(reader)?,
amt: Readable::read(reader)?,
})),
3u8 => Ok(Some(Event::PaymentSent {
payment_preimage: Readable::read(reader)?,
})),
4u8 => Ok(Some(Event::PaymentFailed {
payment_hash: Readable::read(reader)?,
rejected_by_dest: Readable::read(reader)?,
#[cfg(test)]
error_code: Readable::read(reader)?,
#[cfg(test)]
error_data: Readable::read(reader)?,
})),
5u8 => Ok(Some(Event::PendingHTLCsForwardable {
time_forwardable: Duration::from_secs(0)
})),
6u8 => {
let outputs_len: u64 = Readable::read(reader)?;
let mut outputs = Vec::new();
for _ in 0..outputs_len {
outputs.push(Readable::read(reader)?);
}
Ok(Some(Event::SpendableOutputs { outputs }))
},
_ => Err(msgs::DecodeError::InvalidValue)
}
}
}
#[derive(Clone)]
pub enum MessageSendEvent {
SendAcceptChannel {
node_id: PublicKey,
msg: msgs::AcceptChannel,
},
SendOpenChannel {
node_id: PublicKey,
msg: msgs::OpenChannel,
},
SendFundingCreated {
node_id: PublicKey,
msg: msgs::FundingCreated,
},
SendFundingSigned {
node_id: PublicKey,
msg: msgs::FundingSigned,
},
SendFundingLocked {
node_id: PublicKey,
msg: msgs::FundingLocked,
},
SendAnnouncementSignatures {
node_id: PublicKey,
msg: msgs::AnnouncementSignatures,
},
UpdateHTLCs {
node_id: PublicKey,
updates: msgs::CommitmentUpdate,
},
SendRevokeAndACK {
node_id: PublicKey,
msg: msgs::RevokeAndACK,
},
SendClosingSigned {
node_id: PublicKey,
msg: msgs::ClosingSigned,
},
SendShutdown {
node_id: PublicKey,
msg: msgs::Shutdown,
},
SendChannelReestablish {
node_id: PublicKey,
msg: msgs::ChannelReestablish,
},
BroadcastChannelAnnouncement {
msg: msgs::ChannelAnnouncement,
update_msg: msgs::ChannelUpdate,
},
BroadcastNodeAnnouncement {
msg: msgs::NodeAnnouncement,
},
BroadcastChannelUpdate {
msg: msgs::ChannelUpdate,
},
HandleError {
node_id: PublicKey,
action: msgs::ErrorAction
},
PaymentFailureNetworkUpdate {
update: msgs::HTLCFailChannelUpdate,
},
SendChannelRangeQuery {
node_id: PublicKey,
msg: msgs::QueryChannelRange,
},
SendShortIdsQuery {
node_id: PublicKey,
msg: msgs::QueryShortChannelIds,
},
}
pub trait MessageSendEventsProvider {
fn get_and_clear_pending_msg_events(&self) -> Vec<MessageSendEvent>;
}
pub trait EventsProvider {
fn get_and_clear_pending_events(&self) -> Vec<Event>;
}