use ln::msgs;
use ln::{PaymentPreimage, PaymentHash, PaymentSecret};
use chain::keysinterface::SpendableOutputDescriptor;
use util::ser::{Writeable, Writer, MaybeReadable, Readable, VecReadWrapper, VecWriteWrapper};
use bitcoin::blockdata::script::Script;
use bitcoin::secp256k1::key::PublicKey;
use io;
use prelude::*;
use core::time::Duration;
use core::ops::Deref;
#[derive(Clone, Debug)]
pub enum PaymentPurpose {
InvoicePayment {
payment_preimage: Option<PaymentPreimage>,
payment_secret: PaymentSecret,
user_payment_id: u64,
},
SpontaneousPayment(PaymentPreimage),
}
#[derive(Clone, Debug)]
pub enum Event {
FundingGenerationReady {
temporary_channel_id: [u8; 32],
channel_value_satoshis: u64,
output_script: Script,
user_channel_id: u64,
},
PaymentReceived {
payment_hash: PaymentHash,
amt: u64,
purpose: PaymentPurpose,
},
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>,
},
PaymentForwarded {
fee_earned_msat: Option<u64>,
claim_from_onchain_tx: bool,
},
}
impl Writeable for Event {
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
match self {
&Event::FundingGenerationReady { .. } => {
0u8.write(writer)?;
},
&Event::PaymentReceived { ref payment_hash, ref amt, ref purpose } => {
1u8.write(writer)?;
let mut payment_secret = None;
let mut user_payment_id = None;
let payment_preimage;
match &purpose {
PaymentPurpose::InvoicePayment { payment_preimage: preimage, payment_secret: secret, user_payment_id: id } => {
payment_secret = Some(secret);
payment_preimage = *preimage;
user_payment_id = Some(id);
},
PaymentPurpose::SpontaneousPayment(preimage) => {
payment_preimage = Some(*preimage);
}
}
write_tlv_fields!(writer, {
(0, payment_hash, required),
(2, payment_secret, option),
(4, amt, required),
(6, user_payment_id, option),
(8, payment_preimage, option),
});
},
&Event::PaymentSent { ref payment_preimage } => {
2u8.write(writer)?;
write_tlv_fields!(writer, {
(0, payment_preimage, required),
});
},
&Event::PaymentFailed { ref payment_hash, ref rejected_by_dest,
#[cfg(test)]
ref error_code,
#[cfg(test)]
ref error_data,
} => {
3u8.write(writer)?;
#[cfg(test)]
error_code.write(writer)?;
#[cfg(test)]
error_data.write(writer)?;
write_tlv_fields!(writer, {
(0, payment_hash, required),
(2, rejected_by_dest, required),
});
},
&Event::PendingHTLCsForwardable { time_forwardable: _ } => {
4u8.write(writer)?;
write_tlv_fields!(writer, {});
},
&Event::SpendableOutputs { ref outputs } => {
5u8.write(writer)?;
write_tlv_fields!(writer, {
(0, VecWriteWrapper(outputs), required),
});
},
&Event::PaymentForwarded { fee_earned_msat, claim_from_onchain_tx } => {
7u8.write(writer)?;
write_tlv_fields!(writer, {
(0, fee_earned_msat, option),
(2, claim_from_onchain_tx, required),
});
},
}
Ok(())
}
}
impl MaybeReadable for Event {
fn read<R: io::Read>(reader: &mut R) -> Result<Option<Self>, msgs::DecodeError> {
match Readable::read(reader)? {
0u8 => Ok(None),
1u8 => {
let f = || {
let mut payment_hash = PaymentHash([0; 32]);
let mut payment_preimage = None;
let mut payment_secret = None;
let mut amt = 0;
let mut user_payment_id = None;
read_tlv_fields!(reader, {
(0, payment_hash, required),
(2, payment_secret, option),
(4, amt, required),
(6, user_payment_id, option),
(8, payment_preimage, option),
});
let purpose = match payment_secret {
Some(secret) => PaymentPurpose::InvoicePayment {
payment_preimage,
payment_secret: secret,
user_payment_id: if let Some(id) = user_payment_id {
id
} else { return Err(msgs::DecodeError::InvalidValue) }
},
None if payment_preimage.is_some() => PaymentPurpose::SpontaneousPayment(payment_preimage.unwrap()),
None => return Err(msgs::DecodeError::InvalidValue),
};
Ok(Some(Event::PaymentReceived {
payment_hash,
amt,
purpose,
}))
};
f()
},
2u8 => {
let f = || {
let mut payment_preimage = PaymentPreimage([0; 32]);
read_tlv_fields!(reader, {
(0, payment_preimage, required),
});
Ok(Some(Event::PaymentSent {
payment_preimage,
}))
};
f()
},
3u8 => {
let f = || {
#[cfg(test)]
let error_code = Readable::read(reader)?;
#[cfg(test)]
let error_data = Readable::read(reader)?;
let mut payment_hash = PaymentHash([0; 32]);
let mut rejected_by_dest = false;
read_tlv_fields!(reader, {
(0, payment_hash, required),
(2, rejected_by_dest, required),
});
Ok(Some(Event::PaymentFailed {
payment_hash,
rejected_by_dest,
#[cfg(test)]
error_code,
#[cfg(test)]
error_data,
}))
};
f()
},
4u8 => {
let f = || {
read_tlv_fields!(reader, {});
Ok(Some(Event::PendingHTLCsForwardable {
time_forwardable: Duration::from_secs(0)
}))
};
f()
},
5u8 => {
let f = || {
let mut outputs = VecReadWrapper(Vec::new());
read_tlv_fields!(reader, {
(0, outputs, required),
});
Ok(Some(Event::SpendableOutputs { outputs: outputs.0 }))
};
f()
},
7u8 => {
let f = || {
let mut fee_earned_msat = None;
let mut claim_from_onchain_tx = false;
read_tlv_fields!(reader, {
(0, fee_earned_msat, option),
(2, claim_from_onchain_tx, required),
});
Ok(Some(Event::PaymentForwarded { fee_earned_msat, claim_from_onchain_tx }))
};
f()
},
x if x % 2 == 1 => Ok(None),
_ => Err(msgs::DecodeError::InvalidValue)
}
}
}
#[derive(Clone, Debug)]
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,
},
SendChannelUpdate {
node_id: PublicKey,
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,
},
SendReplyChannelRange {
node_id: PublicKey,
msg: msgs::ReplyChannelRange,
}
}
pub trait MessageSendEventsProvider {
fn get_and_clear_pending_msg_events(&self) -> Vec<MessageSendEvent>;
}
pub trait EventsProvider {
fn process_pending_events<H: Deref>(&self, handler: H) where H::Target: EventHandler;
}
pub trait EventHandler {
fn handle_event(&self, event: Event);
}
impl<F> EventHandler for F where F: Fn(Event) {
fn handle_event(&self, event: Event) {
self(event)
}
}