Merge pull request #520 from TheBlueMatt/2020-02-events-in-monitors
[rust-lightning] / lightning / src / util / events.rs
1 //! Events are returned from various bits in the library which indicate some action must be taken
2 //! by the client.
3 //!
4 //! Because we don't have a built-in runtime, it's up to the client to call events at a time in the
5 //! future, as well as generate and broadcast funding transactions handle payment preimages and a
6 //! few other things.
7
8 use ln::msgs;
9 use ln::channelmanager::{PaymentPreimage, PaymentHash};
10 use chain::transaction::OutPoint;
11 use chain::keysinterface::SpendableOutputDescriptor;
12 use util::ser::{Writeable, Writer, MaybeReadable, Readable};
13
14 use bitcoin::blockdata::script::Script;
15
16 use secp256k1::key::PublicKey;
17
18 use std::time::Duration;
19
20 /// An Event which you should probably take some action in response to.
21 ///
22 /// Note that while Writeable and Readable are implemented for Event, you probably shouldn't use
23 /// them directly as they don't round-trip exactly (for example FundingGenerationReady is never
24 /// written as it makes no sense to respond to it after reconnecting to peers).
25 pub enum Event {
26         /// Used to indicate that the client should generate a funding transaction with the given
27         /// parameters and then call ChannelManager::funding_transaction_generated.
28         /// Generated in ChannelManager message handling.
29         /// Note that *all inputs* in the funding transaction must spend SegWit outputs or your
30         /// counterparty can steal your funds!
31         FundingGenerationReady {
32                 /// The random channel_id we picked which you'll need to pass into
33                 /// ChannelManager::funding_transaction_generated.
34                 temporary_channel_id: [u8; 32],
35                 /// The value, in satoshis, that the output should have.
36                 channel_value_satoshis: u64,
37                 /// The script which should be used in the transaction output.
38                 output_script: Script,
39                 /// The value passed in to ChannelManager::create_channel
40                 user_channel_id: u64,
41         },
42         /// Used to indicate that the client may now broadcast the funding transaction it created for a
43         /// channel. Broadcasting such a transaction prior to this event may lead to our counterparty
44         /// trivially stealing all funds in the funding transaction!
45         FundingBroadcastSafe {
46                 /// The output, which was passed to ChannelManager::funding_transaction_generated, which is
47                 /// now safe to broadcast.
48                 funding_txo: OutPoint,
49                 /// The value passed in to ChannelManager::create_channel
50                 user_channel_id: u64,
51         },
52         /// Indicates we've received money! Just gotta dig out that payment preimage and feed it to
53         /// ChannelManager::claim_funds to get it....
54         /// Note that if the preimage is not known or the amount paid is incorrect, you must call
55         /// ChannelManager::fail_htlc_backwards to free up resources for this HTLC.
56         /// The amount paid should be considered 'incorrect' when it is less than or more than twice
57         /// the amount expected.
58         PaymentReceived {
59                 /// The hash for which the preimage should be handed to the ChannelManager.
60                 payment_hash: PaymentHash,
61                 /// The value, in thousandths of a satoshi, that this payment is for. Note that you must
62                 /// compare this to the expected value before accepting the payment (as otherwise you are
63                 /// providing proof-of-payment for less than the value you expected!).
64                 amt: u64,
65         },
66         /// Indicates an outbound payment we made succeeded (ie it made it all the way to its target
67         /// and we got back the payment preimage for it).
68         /// Note that duplicative PaymentSent Events may be generated - it is your responsibility to
69         /// deduplicate them by payment_preimage (which MUST be unique)!
70         PaymentSent {
71                 /// The preimage to the hash given to ChannelManager::send_payment.
72                 /// Note that this serves as a payment receipt, if you wish to have such a thing, you must
73                 /// store it somehow!
74                 payment_preimage: PaymentPreimage,
75         },
76         /// Indicates an outbound payment we made failed. Probably some intermediary node dropped
77         /// something. You may wish to retry with a different route.
78         /// Note that duplicative PaymentFailed Events may be generated - it is your responsibility to
79         /// deduplicate them by payment_hash (which MUST be unique)!
80         PaymentFailed {
81                 /// The hash which was given to ChannelManager::send_payment.
82                 payment_hash: PaymentHash,
83                 /// Indicates the payment was rejected for some reason by the recipient. This implies that
84                 /// the payment has failed, not just the route in question. If this is not set, you may
85                 /// retry the payment via a different route.
86                 rejected_by_dest: bool,
87 #[cfg(test)]
88                 error_code: Option<u16>,
89         },
90         /// Used to indicate that ChannelManager::process_pending_htlc_forwards should be called at a
91         /// time in the future.
92         PendingHTLCsForwardable {
93                 /// The minimum amount of time that should be waited prior to calling
94                 /// process_pending_htlc_forwards. To increase the effort required to correlate payments,
95                 /// you should wait a random amount of time in roughly the range (now + time_forwardable,
96                 /// now + 5*time_forwardable).
97                 time_forwardable: Duration,
98         },
99         /// Used to indicate that an output was generated on-chain which you should know how to spend.
100         /// Such an output will *not* ever be spent by rust-lightning, and are not at risk of your
101         /// counterparty spending them due to some kind of timeout. Thus, you need to store them
102         /// somewhere and spend them when you create on-chain transactions.
103         SpendableOutputs {
104                 /// The outputs which you should store as spendable by you.
105                 outputs: Vec<SpendableOutputDescriptor>,
106         },
107 }
108
109 impl Writeable for Event {
110         fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
111                 match self {
112                         &Event::FundingGenerationReady { .. } => {
113                                 0u8.write(writer)?;
114                                 // We never write out FundingGenerationReady events as, upon disconnection, peers
115                                 // drop any channels which have not yet exchanged funding_signed.
116                         },
117                         &Event::FundingBroadcastSafe { ref funding_txo, ref user_channel_id } => {
118                                 1u8.write(writer)?;
119                                 funding_txo.write(writer)?;
120                                 user_channel_id.write(writer)?;
121                         },
122                         &Event::PaymentReceived { ref payment_hash, ref amt } => {
123                                 2u8.write(writer)?;
124                                 payment_hash.write(writer)?;
125                                 amt.write(writer)?;
126                         },
127                         &Event::PaymentSent { ref payment_preimage } => {
128                                 3u8.write(writer)?;
129                                 payment_preimage.write(writer)?;
130                         },
131                         &Event::PaymentFailed { ref payment_hash, ref rejected_by_dest,
132                                 #[cfg(test)]
133                                 ref error_code,
134                         } => {
135                                 4u8.write(writer)?;
136                                 payment_hash.write(writer)?;
137                                 rejected_by_dest.write(writer)?;
138                                 #[cfg(test)]
139                                 error_code.write(writer)?;
140                         },
141                         &Event::PendingHTLCsForwardable { time_forwardable: _ } => {
142                                 5u8.write(writer)?;
143                                 // We don't write the time_fordwardable out at all, as we presume when the user
144                                 // deserializes us at least that much time has elapsed.
145                         },
146                         &Event::SpendableOutputs { ref outputs } => {
147                                 6u8.write(writer)?;
148                                 (outputs.len() as u64).write(writer)?;
149                                 for output in outputs.iter() {
150                                         output.write(writer)?;
151                                 }
152                         },
153                 }
154                 Ok(())
155         }
156 }
157 impl<R: ::std::io::Read> MaybeReadable<R> for Event {
158         fn read(reader: &mut R) -> Result<Option<Self>, msgs::DecodeError> {
159                 match Readable::read(reader)? {
160                         0u8 => Ok(None),
161                         1u8 => Ok(Some(Event::FundingBroadcastSafe {
162                                         funding_txo: Readable::read(reader)?,
163                                         user_channel_id: Readable::read(reader)?,
164                                 })),
165                         2u8 => Ok(Some(Event::PaymentReceived {
166                                         payment_hash: Readable::read(reader)?,
167                                         amt: Readable::read(reader)?,
168                                 })),
169                         3u8 => Ok(Some(Event::PaymentSent {
170                                         payment_preimage: Readable::read(reader)?,
171                                 })),
172                         4u8 => Ok(Some(Event::PaymentFailed {
173                                         payment_hash: Readable::read(reader)?,
174                                         rejected_by_dest: Readable::read(reader)?,
175                                         #[cfg(test)]
176                                         error_code: Readable::read(reader)?,
177                                 })),
178                         5u8 => Ok(Some(Event::PendingHTLCsForwardable {
179                                         time_forwardable: Duration::from_secs(0)
180                                 })),
181                         6u8 => {
182                                 let outputs_len: u64 = Readable::read(reader)?;
183                                 let mut outputs = Vec::new();
184                                 for _ in 0..outputs_len {
185                                         outputs.push(Readable::read(reader)?);
186                                 }
187                                 Ok(Some(Event::SpendableOutputs { outputs }))
188                         },
189                         _ => Err(msgs::DecodeError::InvalidValue)
190                 }
191         }
192 }
193
194 /// An event generated by ChannelManager which indicates a message should be sent to a peer (or
195 /// broadcast to most peers).
196 /// These events are handled by PeerManager::process_events if you are using a PeerManager.
197 #[derive(Clone)]
198 pub enum MessageSendEvent {
199         /// Used to indicate that we've accepted a channel open and should send the accept_channel
200         /// message provided to the given peer.
201         SendAcceptChannel {
202                 /// The node_id of the node which should receive this message
203                 node_id: PublicKey,
204                 /// The message which should be sent.
205                 msg: msgs::AcceptChannel,
206         },
207         /// Used to indicate that we've initiated a channel open and should send the open_channel
208         /// message provided to the given peer.
209         SendOpenChannel {
210                 /// The node_id of the node which should receive this message
211                 node_id: PublicKey,
212                 /// The message which should be sent.
213                 msg: msgs::OpenChannel,
214         },
215         /// Used to indicate that a funding_created message should be sent to the peer with the given node_id.
216         SendFundingCreated {
217                 /// The node_id of the node which should receive this message
218                 node_id: PublicKey,
219                 /// The message which should be sent.
220                 msg: msgs::FundingCreated,
221         },
222         /// Used to indicate that a funding_signed message should be sent to the peer with the given node_id.
223         SendFundingSigned {
224                 /// The node_id of the node which should receive this message
225                 node_id: PublicKey,
226                 /// The message which should be sent.
227                 msg: msgs::FundingSigned,
228         },
229         /// Used to indicate that a funding_locked message should be sent to the peer with the given node_id.
230         SendFundingLocked {
231                 /// The node_id of the node which should receive these message(s)
232                 node_id: PublicKey,
233                 /// The funding_locked message which should be sent.
234                 msg: msgs::FundingLocked,
235         },
236         /// Used to indicate that an announcement_signatures message should be sent to the peer with the given node_id.
237         SendAnnouncementSignatures {
238                 /// The node_id of the node which should receive these message(s)
239                 node_id: PublicKey,
240                 /// The announcement_signatures message which should be sent.
241                 msg: msgs::AnnouncementSignatures,
242         },
243         /// Used to indicate that a series of HTLC update messages, as well as a commitment_signed
244         /// message should be sent to the peer with the given node_id.
245         UpdateHTLCs {
246                 /// The node_id of the node which should receive these message(s)
247                 node_id: PublicKey,
248                 /// The update messages which should be sent. ALL messages in the struct should be sent!
249                 updates: msgs::CommitmentUpdate,
250         },
251         /// Used to indicate that a revoke_and_ack message should be sent to the peer with the given node_id.
252         SendRevokeAndACK {
253                 /// The node_id of the node which should receive this message
254                 node_id: PublicKey,
255                 /// The message which should be sent.
256                 msg: msgs::RevokeAndACK,
257         },
258         /// Used to indicate that a closing_signed message should be sent to the peer with the given node_id.
259         SendClosingSigned {
260                 /// The node_id of the node which should receive this message
261                 node_id: PublicKey,
262                 /// The message which should be sent.
263                 msg: msgs::ClosingSigned,
264         },
265         /// Used to indicate that a shutdown message should be sent to the peer with the given node_id.
266         SendShutdown {
267                 /// The node_id of the node which should receive this message
268                 node_id: PublicKey,
269                 /// The message which should be sent.
270                 msg: msgs::Shutdown,
271         },
272         /// Used to indicate that a channel_reestablish message should be sent to the peer with the given node_id.
273         SendChannelReestablish {
274                 /// The node_id of the node which should receive this message
275                 node_id: PublicKey,
276                 /// The message which should be sent.
277                 msg: msgs::ChannelReestablish,
278         },
279         /// Used to indicate that a channel_announcement and channel_update should be broadcast to all
280         /// peers (except the peer with node_id either msg.contents.node_id_1 or msg.contents.node_id_2).
281         BroadcastChannelAnnouncement {
282                 /// The channel_announcement which should be sent.
283                 msg: msgs::ChannelAnnouncement,
284                 /// The followup channel_update which should be sent.
285                 update_msg: msgs::ChannelUpdate,
286         },
287         /// Used to indicate that a channel_update should be broadcast to all peers.
288         BroadcastChannelUpdate {
289                 /// The channel_update which should be sent.
290                 msg: msgs::ChannelUpdate,
291         },
292         /// Broadcast an error downstream to be handled
293         HandleError {
294                 /// The node_id of the node which should receive this message
295                 node_id: PublicKey,
296                 /// The action which should be taken.
297                 action: msgs::ErrorAction
298         },
299         /// When a payment fails we may receive updates back from the hop where it failed. In such
300         /// cases this event is generated so that we can inform the router of this information.
301         PaymentFailureNetworkUpdate {
302                 /// The channel/node update which should be sent to router
303                 update: msgs::HTLCFailChannelUpdate,
304         }
305 }
306
307 /// A trait indicating an object may generate message send events
308 pub trait MessageSendEventsProvider {
309         /// Gets the list of pending events which were generated by previous actions, clearing the list
310         /// in the process.
311         fn get_and_clear_pending_msg_events(&self) -> Vec<MessageSendEvent>;
312 }
313
314 /// A trait indicating an object may generate events
315 pub trait EventsProvider {
316         /// Gets the list of pending events which were generated by previous actions, clearing the list
317         /// in the process.
318         fn get_and_clear_pending_events(&self) -> Vec<Event>;
319 }