X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Futil%2Fevents.rs;h=8502f9be4a32d667b456cc40470389dff098b3e6;hb=9a5c9b3680dccd45986948c5776bd384b4f89dd7;hp=2b6a55bcecc66bb54c87b6d7349efb1aa9c6ef81;hpb=e635db0da31841e8a8ac5c5450c8f595541a6ced;p=rust-lightning diff --git a/lightning/src/util/events.rs b/lightning/src/util/events.rs index 2b6a55bc..8502f9be 100644 --- a/lightning/src/util/events.rs +++ b/lightning/src/util/events.rs @@ -31,6 +31,7 @@ use io; use prelude::*; use core::time::Duration; use core::ops::Deref; +use bitcoin::Transaction; /// Some information provided on receipt of payment depends on whether the payment received is a /// spontaneous payment or a "conventional" lightning payment that's paying an invoice. @@ -145,7 +146,10 @@ pub enum Event { channel_value_satoshis: u64, /// The script which should be used in the transaction output. output_script: Script, - /// The value passed in to ChannelManager::create_channel + /// The `user_id` value passed in to [`ChannelManager::create_channel`], or 0 for an + /// inbound channel. + /// + /// [`ChannelManager::create_channel`]: crate::ln::channelmanager::ChannelManager::create_channel user_channel_id: u64, }, /// Indicates we've received money! Just gotta dig out that payment preimage and feed it to @@ -207,6 +211,11 @@ pub enum Event { all_paths_failed: bool, /// The payment path that failed. path: Vec, + /// The channel responsible for the failed payment path. + /// + /// If this is `Some`, then the corresponding channel should be avoided when the payment is + /// retried. May be `None` for older [`Event`] serializations. + short_channel_id: Option, #[cfg(test)] error_code: Option, #[cfg(test)] @@ -256,8 +265,22 @@ pub enum Event { /// The channel_id of the channel which has been closed. Note that on-chain transactions /// resolving the channel are likely still awaiting confirmation. channel_id: [u8; 32], + /// The `user_id` value passed in to [`ChannelManager::create_channel`], or 0 for an + /// inbound channel. This will always be zero for objects serialized with LDK versions + /// prior to 0.0.102. + /// + /// [`ChannelManager::create_channel`]: crate::ln::channelmanager::ChannelManager::create_channel + user_channel_id: u64, /// The reason the channel was closed. reason: ClosureReason + }, + /// Used to indicate to the user that they can abandon the funding transaction and recycle the + /// inputs for another purpose. + DiscardFunding { + /// The channel_id of the channel which has been closed. + channel_id: [u8; 32], + /// The full transaction received from the user + transaction: Transaction } } @@ -300,7 +323,7 @@ impl Writeable for Event { }); }, &Event::PaymentPathFailed { ref payment_hash, ref rejected_by_dest, ref network_update, - ref all_paths_failed, ref path, + ref all_paths_failed, ref path, ref short_channel_id, #[cfg(test)] ref error_code, #[cfg(test)] @@ -317,6 +340,7 @@ impl Writeable for Event { (2, rejected_by_dest, required), (3, all_paths_failed, required), (5, path, vec_type), + (7, short_channel_id, option), }); }, &Event::PendingHTLCsForwardable { time_forwardable: _ } => { @@ -337,13 +361,21 @@ impl Writeable for Event { (2, claim_from_onchain_tx, required), }); }, - &Event::ChannelClosed { ref channel_id, ref reason } => { + &Event::ChannelClosed { ref channel_id, ref user_channel_id, ref reason } => { 9u8.write(writer)?; write_tlv_fields!(writer, { (0, channel_id, required), + (1, user_channel_id, required), (2, reason, required) }); }, + &Event::DiscardFunding { ref channel_id, ref transaction } => { + 11u8.write(writer)?; + write_tlv_fields!(writer, { + (0, channel_id, required), + (2, transaction, required) + }) + }, // Note that, going forward, all new events must only write data inside of // `write_tlv_fields`. Versions 0.0.101+ will ignore odd-numbered events that write // data via `write_tlv_fields`. @@ -419,12 +451,14 @@ impl MaybeReadable for Event { let mut network_update = None; let mut all_paths_failed = Some(true); let mut path: Option> = Some(vec![]); + let mut short_channel_id = None; read_tlv_fields!(reader, { (0, payment_hash, required), (1, network_update, ignorable), (2, rejected_by_dest, required), (3, all_paths_failed, option), (5, path, vec_type), + (7, short_channel_id, ignorable), }); Ok(Some(Event::PaymentPathFailed { payment_hash, @@ -432,6 +466,7 @@ impl MaybeReadable for Event { network_update, all_paths_failed: all_paths_failed.unwrap(), path: path.unwrap(), + short_channel_id, #[cfg(test)] error_code, #[cfg(test)] @@ -464,14 +499,32 @@ impl MaybeReadable for Event { f() }, 9u8 => { - let mut channel_id = [0; 32]; - let mut reason = None; - read_tlv_fields!(reader, { - (0, channel_id, required), - (2, reason, ignorable), - }); - if reason.is_none() { return Ok(None); } - Ok(Some(Event::ChannelClosed { channel_id, reason: reason.unwrap() })) + let f = || { + let mut channel_id = [0; 32]; + let mut reason = None; + let mut user_channel_id_opt = None; + read_tlv_fields!(reader, { + (0, channel_id, required), + (1, user_channel_id_opt, option), + (2, reason, ignorable), + }); + if reason.is_none() { return Ok(None); } + let user_channel_id = if let Some(id) = user_channel_id_opt { id } else { 0 }; + Ok(Some(Event::ChannelClosed { channel_id, user_channel_id, reason: reason.unwrap() })) + }; + f() + }, + 11u8 => { + let f = || { + let mut channel_id = [0; 32]; + let mut transaction = Transaction{ version: 2, lock_time: 0, input: Vec::new(), output: Vec::new() }; + read_tlv_fields!(reader, { + (0, channel_id, required), + (2, transaction, required), + }); + Ok(Some(Event::DiscardFunding { channel_id, transaction } )) + }; + f() }, // Versions prior to 0.0.100 did not ignore odd types, instead returning InvalidValue. // Version 0.0.100 failed to properly ignore odd types, possibly resulting in corrupt