@@ -255,6 +255,7 @@ enum HTLCUpdateAwaitingACK {
255
255
/// Note that `PeerDisconnected` can be set on both `ChannelReady` and `FundingSent`.
256
256
/// `ChannelReady` can then get all remaining flags set on it, until we finish shutdown, then we
257
257
/// move on to `ShutdownComplete`, at which point most calls into this channel are disallowed.
258
+ #[derive(Clone, Copy)]
258
259
enum ChannelState {
259
260
/// Implies we have (or are prepared to) send our open_channel/accept_channel message
260
261
OurInitSent = 1 << 0,
@@ -318,6 +319,54 @@ const STATE_FLAGS: u32 =
318
319
ChannelState::OurChannelReady as u32 |
319
320
ChannelState::AwaitingRemoteRevoke as u32 |
320
321
ChannelState::WaitingForBatch as u32;
322
+ const CHANNEL_STATE_ENUMS: [ChannelState; 14] = [
323
+ ChannelState::OurInitSent,
324
+ ChannelState::TheirInitSent,
325
+ ChannelState::FundingCreated,
326
+ ChannelState::FundingSent,
327
+ ChannelState::TheirChannelReady,
328
+ ChannelState::OurChannelReady,
329
+ ChannelState::ChannelReady,
330
+ ChannelState::PeerDisconnected,
331
+ ChannelState::MonitorUpdateInProgress,
332
+ ChannelState::AwaitingRemoteRevoke,
333
+ ChannelState::RemoteShutdownSent,
334
+ ChannelState::LocalShutdownSent,
335
+ ChannelState::ShutdownComplete,
336
+ ChannelState::WaitingForBatch,
337
+ ];
338
+
339
+ struct ChannelStateInt(u32);
340
+
341
+ impl IntoIterator for ChannelStateInt {
342
+ type Item = ChannelState;
343
+ type IntoIter = Box<dyn Iterator<Item = ChannelState>>;
344
+
345
+ fn into_iter(self) -> Self::IntoIter {
346
+ Box::new(
347
+ CHANNEL_STATE_ENUMS.iter()
348
+ .filter(move |&channel_state| self.0 & *channel_state as u32 != 0)
349
+ .map(|channel_state| channel_state.clone())
350
+ )
351
+ }
352
+ }
353
+
354
+ impl_writeable_tlv_based_enum_upgradable!(ChannelState,
355
+ (0, OurInitSent) => {},
356
+ (2, TheirInitSent) => {},
357
+ (4, FundingCreated) => {},
358
+ (6, FundingSent) => {},
359
+ (8, TheirChannelReady) => {},
360
+ (10, OurChannelReady) => {},
361
+ (12, ChannelReady) => {},
362
+ (14, PeerDisconnected) => {},
363
+ (16, MonitorUpdateInProgress) => {},
364
+ (18, AwaitingRemoteRevoke) => {},
365
+ (20, RemoteShutdownSent) => {},
366
+ (22, LocalShutdownSent) => {},
367
+ (24, ShutdownComplete) => {},
368
+ (26, WaitingForBatch) => {},
369
+ );
321
370
322
371
pub const INITIAL_COMMITMENT_NUMBER: u64 = (1 << 48) - 1;
323
372
@@ -7033,6 +7082,11 @@ impl<SP: Deref> Writeable for Channel<SP> where SP::Target: SignerProvider {
7033
7082
(31, channel_pending_event_emitted, option),
7034
7083
(35, pending_outbound_skimmed_fees, optional_vec),
7035
7084
(37, holding_cell_skimmed_fees, optional_vec),
7085
+ (
7086
+ if self.context.channel_state & ChannelState::WaitingForBatch as u32 != 0 { 38 } else { 39 },
7087
+ ChannelStateInt(self.context.channel_state).into_iter().collect::<Vec<ChannelState>>(),
7088
+ optional_vec
7089
+ ),
7036
7090
});
7037
7091
7038
7092
Ok(())
@@ -7317,6 +7371,9 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
7317
7371
let mut pending_outbound_skimmed_fees_opt: Option<Vec<Option<u64>>> = None;
7318
7372
let mut holding_cell_skimmed_fees_opt: Option<Vec<Option<u64>>> = None;
7319
7373
7374
+ let mut _channel_states_even: Option<Vec<ChannelState>>;
7375
+ let mut _channel_states_uneven: Option<Vec<ChannelState>>;
7376
+
7320
7377
read_tlv_fields!(reader, {
7321
7378
(0, announcement_sigs, option),
7322
7379
(1, minimum_depth, option),
@@ -7342,6 +7399,8 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
7342
7399
(31, channel_pending_event_emitted, option),
7343
7400
(35, pending_outbound_skimmed_fees_opt, optional_vec),
7344
7401
(37, holding_cell_skimmed_fees_opt, optional_vec),
7402
+ (38, _channel_states_even, optional_vec),
7403
+ (39, _channel_states_uneven, optional_vec),
7345
7404
});
7346
7405
7347
7406
let (channel_keys_id, holder_signer) = if let Some(channel_keys_id) = channel_keys_id {
0 commit comments