@@ -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,93 @@ 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 payment_secret, ref amt } => {
130
+ 2u8 . write ( writer) ?;
131
+ payment_hash. write ( writer) ?;
132
+ payment_secret. write ( writer) ?;
133
+ amt. write ( writer) ?;
134
+ } ,
135
+ & Event :: PaymentSent { ref payment_preimage } => {
136
+ 3u8 . write ( writer) ?;
137
+ payment_preimage. write ( writer) ?;
138
+ } ,
139
+ & Event :: PaymentFailed { ref payment_hash, ref rejected_by_dest,
140
+ #[ cfg( test) ]
141
+ ref error_code,
142
+ } => {
143
+ 4u8 . write ( writer) ?;
144
+ payment_hash. write ( writer) ?;
145
+ rejected_by_dest. write ( writer) ?;
146
+ #[ cfg( test) ]
147
+ error_code. write ( writer) ?;
148
+ } ,
149
+ & Event :: PendingHTLCsForwardable { time_forwardable : _ } => {
150
+ 5u8 . write ( writer) ?;
151
+ // We don't write the time_fordwardable out at all, as we presume when the user
152
+ // deserializes us at least that much time has elapsed.
153
+ } ,
154
+ & Event :: SpendableOutputs { ref outputs } => {
155
+ 6u8 . write ( writer) ?;
156
+ ( outputs. len ( ) as u64 ) . write ( writer) ?;
157
+ for output in outputs. iter ( ) {
158
+ output. write ( writer) ?;
159
+ }
160
+ } ,
161
+ }
162
+ Ok ( ( ) )
163
+ }
164
+ }
165
+ impl < R : :: std:: io:: Read > MaybeReadable < R > for Event {
166
+ fn read ( reader : & mut R ) -> Result < Option < Self > , msgs:: DecodeError > {
167
+ match Readable :: read ( reader) ? {
168
+ 0u8 => Ok ( None ) ,
169
+ 1u8 => Ok ( Some ( Event :: FundingBroadcastSafe {
170
+ funding_txo : Readable :: read ( reader) ?,
171
+ user_channel_id : Readable :: read ( reader) ?,
172
+ } ) ) ,
173
+ 2u8 => Ok ( Some ( Event :: PaymentReceived {
174
+ payment_hash : Readable :: read ( reader) ?,
175
+ payment_secret : Readable :: read ( reader) ?,
176
+ amt : Readable :: read ( reader) ?,
177
+ } ) ) ,
178
+ 3u8 => Ok ( Some ( Event :: PaymentSent {
179
+ payment_preimage : Readable :: read ( reader) ?,
180
+ } ) ) ,
181
+ 4u8 => Ok ( Some ( Event :: PaymentFailed {
182
+ payment_hash : Readable :: read ( reader) ?,
183
+ rejected_by_dest : Readable :: read ( reader) ?,
184
+ #[ cfg( test) ]
185
+ error_code : Readable :: read ( reader) ?,
186
+ } ) ) ,
187
+ 5u8 => Ok ( Some ( Event :: PendingHTLCsForwardable {
188
+ time_forwardable : Duration :: from_secs ( 0 )
189
+ } ) ) ,
190
+ 6u8 => {
191
+ let outputs_len: u64 = Readable :: read ( reader) ?;
192
+ let mut outputs = Vec :: new ( ) ;
193
+ for _ in 0 ..outputs_len {
194
+ outputs. push ( Readable :: read ( reader) ?) ;
195
+ }
196
+ Ok ( Some ( Event :: SpendableOutputs { outputs } ) )
197
+ } ,
198
+ _ => Err ( msgs:: DecodeError :: InvalidValue )
199
+ }
200
+ }
201
+ }
202
+
111
203
/// An event generated by ChannelManager which indicates a message should be sent to a peer (or
112
204
/// broadcast to most peers).
113
205
/// These events are handled by PeerManager::process_events if you are using a PeerManager.
0 commit comments