@@ -16,6 +16,7 @@ use ln::msgs;
16
16
use ln:: channelmanager:: { PaymentPreimage , PaymentHash } ;
17
17
use chain:: transaction:: OutPoint ;
18
18
use chain:: keysinterface:: SpendableOutputDescriptor ;
19
+ use util:: ser:: { Writeable , Writer , MaybeReadable , Readable } ;
19
20
20
21
use bitcoin:: blockdata:: script:: Script ;
21
22
@@ -24,6 +25,10 @@ use secp256k1::key::PublicKey;
24
25
use std:: time:: Duration ;
25
26
26
27
/// An Event which you should probably take some action in response to.
28
+ ///
29
+ /// Note that while Writeable and Readable are implemented for Event, you probably shouldn't use
30
+ /// them directly as they don't round-trip exactly (for example FundingGenerationReady is never
31
+ /// written as it makes no sense to respond to it after reconnecting to peers).
27
32
pub enum Event {
28
33
/// Used to indicate that the client should generate a funding transaction with the given
29
34
/// parameters and then call ChannelManager::funding_transaction_generated.
@@ -108,6 +113,91 @@ pub enum Event {
108
113
} ,
109
114
}
110
115
116
+ impl Writeable for Event {
117
+ fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , :: std:: io:: Error > {
118
+ match self {
119
+ & Event :: FundingGenerationReady { .. } => {
120
+ 0u8 . write ( writer) ?;
121
+ // We never write out FundingGenerationReady events as, upon disconnection, peers
122
+ // drop any channels which have not yet exchanged funding_signed.
123
+ } ,
124
+ & Event :: FundingBroadcastSafe { ref funding_txo, ref user_channel_id } => {
125
+ 1u8 . write ( writer) ?;
126
+ funding_txo. write ( writer) ?;
127
+ user_channel_id. write ( writer) ?;
128
+ } ,
129
+ & Event :: PaymentReceived { ref payment_hash, ref amt } => {
130
+ 2u8 . write ( writer) ?;
131
+ payment_hash. write ( writer) ?;
132
+ amt. write ( writer) ?;
133
+ } ,
134
+ & Event :: PaymentSent { ref payment_preimage } => {
135
+ 3u8 . write ( writer) ?;
136
+ payment_preimage. write ( writer) ?;
137
+ } ,
138
+ & Event :: PaymentFailed { ref payment_hash, ref rejected_by_dest,
139
+ #[ cfg( test) ]
140
+ ref error_code,
141
+ } => {
142
+ 4u8 . write ( writer) ?;
143
+ payment_hash. write ( writer) ?;
144
+ rejected_by_dest. write ( writer) ?;
145
+ #[ cfg( test) ]
146
+ error_code. write ( writer) ?;
147
+ } ,
148
+ & Event :: PendingHTLCsForwardable { time_forwardable : _ } => {
149
+ 5u8 . write ( writer) ?;
150
+ // We don't write the time_fordwardable out at all, as we presume when the user
151
+ // deserializes us at least that much time has elapsed.
152
+ } ,
153
+ & Event :: SpendableOutputs { ref outputs } => {
154
+ 6u8 . write ( writer) ?;
155
+ ( outputs. len ( ) as u64 ) . write ( writer) ?;
156
+ for output in outputs. iter ( ) {
157
+ output. write ( writer) ?;
158
+ }
159
+ } ,
160
+ }
161
+ Ok ( ( ) )
162
+ }
163
+ }
164
+ impl < R : :: std:: io:: Read > MaybeReadable < R > for Event {
165
+ fn read ( reader : & mut R ) -> Result < Option < Self > , msgs:: DecodeError > {
166
+ match Readable :: read ( reader) ? {
167
+ 0u8 => Ok ( None ) ,
168
+ 1u8 => Ok ( Some ( Event :: FundingBroadcastSafe {
169
+ funding_txo : Readable :: read ( reader) ?,
170
+ user_channel_id : Readable :: read ( reader) ?,
171
+ } ) ) ,
172
+ 2u8 => Ok ( Some ( Event :: PaymentReceived {
173
+ payment_hash : Readable :: read ( reader) ?,
174
+ amt : Readable :: read ( reader) ?,
175
+ } ) ) ,
176
+ 3u8 => Ok ( Some ( Event :: PaymentSent {
177
+ payment_preimage : Readable :: read ( reader) ?,
178
+ } ) ) ,
179
+ 4u8 => Ok ( Some ( Event :: PaymentFailed {
180
+ payment_hash : Readable :: read ( reader) ?,
181
+ rejected_by_dest : Readable :: read ( reader) ?,
182
+ #[ cfg( test) ]
183
+ error_code : Readable :: read ( reader) ?,
184
+ } ) ) ,
185
+ 5u8 => Ok ( Some ( Event :: PendingHTLCsForwardable {
186
+ time_forwardable : Duration :: from_secs ( 0 )
187
+ } ) ) ,
188
+ 6u8 => {
189
+ let outputs_len: u64 = Readable :: read ( reader) ?;
190
+ let mut outputs = Vec :: new ( ) ;
191
+ for _ in 0 ..outputs_len {
192
+ outputs. push ( Readable :: read ( reader) ?) ;
193
+ }
194
+ Ok ( Some ( Event :: SpendableOutputs { outputs } ) )
195
+ } ,
196
+ _ => Err ( msgs:: DecodeError :: InvalidValue )
197
+ }
198
+ }
199
+ }
200
+
111
201
/// An event generated by ChannelManager which indicates a message should be sent to a peer (or
112
202
/// broadcast to most peers).
113
203
/// These events are handled by PeerManager::process_events if you are using a PeerManager.
0 commit comments