@@ -1124,9 +1124,15 @@ impl_writeable_tlv_based!(PendingChannelMonitorUpdate, {
1124
1124
(0, update, required),
1125
1125
});
1126
1126
1127
- /// The `Channel` enum describes the current phase in life of a lightning channel with each of
1127
+ /// A payment channel with a counterparty throughout its life-cycle, encapsulating negotiation and
1128
+ /// funding phases.
1129
+ pub(super) struct Channel<SP: Deref> where SP::Target: SignerProvider {
1130
+ phase: ChannelPhase<SP>,
1131
+ }
1132
+
1133
+ /// The `ChannelPhase` enum describes the current phase in life of a lightning channel with each of
1128
1134
/// its variants containing an appropriate channel struct.
1129
- pub(super) enum Channel <SP: Deref> where SP::Target: SignerProvider {
1135
+ enum ChannelPhase <SP: Deref> where SP::Target: SignerProvider {
1130
1136
UnfundedOutboundV1(OutboundV1Channel<SP>),
1131
1137
UnfundedInboundV1(InboundV1Channel<SP>),
1132
1138
#[allow(dead_code)] // TODO(dual_funding): Remove once creating V2 channels is enabled.
@@ -1139,54 +1145,54 @@ impl<SP: Deref> Channel<SP> where
1139
1145
<SP::Target as SignerProvider>::EcdsaSigner: ChannelSigner,
1140
1146
{
1141
1147
pub fn context(&self) -> &ChannelContext<SP> {
1142
- match self {
1143
- Channel ::Funded(chan) => &chan.context,
1144
- Channel ::UnfundedOutboundV1(chan) => &chan.context,
1145
- Channel ::UnfundedInboundV1(chan) => &chan.context,
1146
- Channel ::UnfundedV2(chan) => &chan.context,
1148
+ match & self.phase {
1149
+ ChannelPhase ::Funded(chan) => &chan.context,
1150
+ ChannelPhase ::UnfundedOutboundV1(chan) => &chan.context,
1151
+ ChannelPhase ::UnfundedInboundV1(chan) => &chan.context,
1152
+ ChannelPhase ::UnfundedV2(chan) => &chan.context,
1147
1153
}
1148
1154
}
1149
1155
1150
1156
pub fn context_mut(&mut self) -> &mut ChannelContext<SP> {
1151
- match self {
1152
- Channel ::Funded(ref mut chan) => &mut chan.context,
1153
- Channel ::UnfundedOutboundV1(ref mut chan) => &mut chan.context,
1154
- Channel ::UnfundedInboundV1(ref mut chan) => &mut chan.context,
1155
- Channel ::UnfundedV2(ref mut chan) => &mut chan.context,
1157
+ match &mut self.phase {
1158
+ ChannelPhase ::Funded(chan) => &mut chan.context,
1159
+ ChannelPhase ::UnfundedOutboundV1(chan) => &mut chan.context,
1160
+ ChannelPhase ::UnfundedInboundV1(chan) => &mut chan.context,
1161
+ ChannelPhase ::UnfundedV2(chan) => &mut chan.context,
1156
1162
}
1157
1163
}
1158
1164
1159
1165
pub fn unfunded_context_mut(&mut self) -> Option<&mut UnfundedChannelContext> {
1160
- match self {
1161
- Channel ::Funded(_) => { debug_assert!(false); None },
1162
- Channel ::UnfundedOutboundV1(chan) => Some(&mut chan.unfunded_context),
1163
- Channel ::UnfundedInboundV1(chan) => Some(&mut chan.unfunded_context),
1164
- Channel ::UnfundedV2(chan) => Some(&mut chan.unfunded_context),
1166
+ match &mut self.phase {
1167
+ ChannelPhase ::Funded(_) => { debug_assert!(false); None },
1168
+ ChannelPhase ::UnfundedOutboundV1(chan) => Some(&mut chan.unfunded_context),
1169
+ ChannelPhase ::UnfundedInboundV1(chan) => Some(&mut chan.unfunded_context),
1170
+ ChannelPhase ::UnfundedV2(chan) => Some(&mut chan.unfunded_context),
1165
1171
}
1166
1172
}
1167
1173
1168
1174
pub fn is_funded(&self) -> bool {
1169
- matches!(self, Channel ::Funded(_))
1175
+ matches!(self.phase, ChannelPhase ::Funded(_))
1170
1176
}
1171
1177
1172
1178
pub fn as_funded(&self) -> Option<&FundedChannel<SP>> {
1173
- if let Channel ::Funded(channel) = self {
1179
+ if let ChannelPhase ::Funded(channel) = & self.phase {
1174
1180
Some(channel)
1175
1181
} else {
1176
1182
None
1177
1183
}
1178
1184
}
1179
1185
1180
1186
pub fn as_funded_mut(&mut self) -> Option<&mut FundedChannel<SP>> {
1181
- if let Channel ::Funded(channel) = self {
1187
+ if let ChannelPhase ::Funded(channel) = &mut self.phase {
1182
1188
Some(channel)
1183
1189
} else {
1184
1190
None
1185
1191
}
1186
1192
}
1187
1193
1188
1194
pub fn as_unfunded_outbound_v1_mut(&mut self) -> Option<&mut OutboundV1Channel<SP>> {
1189
- if let Channel ::UnfundedOutboundV1(channel) = self {
1195
+ if let ChannelPhase ::UnfundedOutboundV1(channel) = &mut self.phase {
1190
1196
Some(channel)
1191
1197
} else {
1192
1198
None
@@ -1195,47 +1201,47 @@ impl<SP: Deref> Channel<SP> where
1195
1201
1196
1202
#[cfg(test)]
1197
1203
pub fn is_unfunded_v1(&self) -> bool {
1198
- matches!(self, Channel ::UnfundedOutboundV1(_) | Channel ::UnfundedInboundV1(_))
1204
+ matches!(self.phase, ChannelPhase ::UnfundedOutboundV1(_) | ChannelPhase ::UnfundedInboundV1(_))
1199
1205
}
1200
1206
1201
1207
pub fn is_unfunded_outbound_v1(&self) -> bool {
1202
- matches!(self, Channel ::UnfundedOutboundV1(_))
1208
+ matches!(self.phase, ChannelPhase ::UnfundedOutboundV1(_))
1203
1209
}
1204
1210
1205
1211
pub fn into_unfunded_outbound_v1(self) -> Result<OutboundV1Channel<SP>, Self> {
1206
- if let Channel ::UnfundedOutboundV1(channel) = self {
1212
+ if let ChannelPhase ::UnfundedOutboundV1(channel) = self.phase {
1207
1213
Ok(channel)
1208
1214
} else {
1209
1215
Err(self)
1210
1216
}
1211
1217
}
1212
1218
1213
1219
pub fn into_unfunded_inbound_v1(self) -> Result<InboundV1Channel<SP>, Self> {
1214
- if let Channel ::UnfundedInboundV1(channel) = self {
1220
+ if let ChannelPhase ::UnfundedInboundV1(channel) = self.phase {
1215
1221
Ok(channel)
1216
1222
} else {
1217
1223
Err(self)
1218
1224
}
1219
1225
}
1220
1226
1221
1227
pub fn as_unfunded_v2(&self) -> Option<&PendingV2Channel<SP>> {
1222
- if let Channel ::UnfundedV2(channel) = self {
1228
+ if let ChannelPhase ::UnfundedV2(channel) = & self.phase {
1223
1229
Some(channel)
1224
1230
} else {
1225
1231
None
1226
1232
}
1227
1233
}
1228
1234
1229
1235
pub fn as_unfunded_v2_mut(&mut self) -> Option<&mut PendingV2Channel<SP>> {
1230
- if let Channel ::UnfundedV2(channel) = self {
1236
+ if let ChannelPhase ::UnfundedV2(channel) = &mut self.phase {
1231
1237
Some(channel)
1232
1238
} else {
1233
1239
None
1234
1240
}
1235
1241
}
1236
1242
1237
1243
pub fn into_unfunded_v2(self) -> Option<PendingV2Channel<SP>> {
1238
- if let Channel ::UnfundedV2(channel) = self {
1244
+ if let ChannelPhase ::UnfundedV2(channel) = self.phase {
1239
1245
Some(channel)
1240
1246
} else {
1241
1247
None
@@ -1245,9 +1251,9 @@ impl<SP: Deref> Channel<SP> where
1245
1251
pub fn signer_maybe_unblocked<L: Deref>(
1246
1252
&mut self, chain_hash: ChainHash, logger: &L,
1247
1253
) -> Option<SignerResumeUpdates> where L::Target: Logger {
1248
- match self {
1249
- Channel ::Funded(chan) => Some(chan.signer_maybe_unblocked(logger)),
1250
- Channel ::UnfundedOutboundV1(chan) => {
1254
+ match &mut self.phase {
1255
+ ChannelPhase ::Funded(chan) => Some(chan.signer_maybe_unblocked(logger)),
1256
+ ChannelPhase ::UnfundedOutboundV1(chan) => {
1251
1257
let (open_channel, funding_created) = chan.signer_maybe_unblocked(chain_hash, logger);
1252
1258
Some(SignerResumeUpdates {
1253
1259
commitment_update: None,
@@ -1263,7 +1269,7 @@ impl<SP: Deref> Channel<SP> where
1263
1269
shutdown_result: None,
1264
1270
})
1265
1271
},
1266
- Channel ::UnfundedInboundV1(chan) => {
1272
+ ChannelPhase ::UnfundedInboundV1(chan) => {
1267
1273
let logger = WithChannelContext::from(logger, &chan.context, None);
1268
1274
let accept_channel = chan.signer_maybe_unblocked(&&logger);
1269
1275
Some(SignerResumeUpdates {
@@ -1280,38 +1286,38 @@ impl<SP: Deref> Channel<SP> where
1280
1286
shutdown_result: None,
1281
1287
})
1282
1288
},
1283
- Channel ::UnfundedV2(_) => None,
1289
+ ChannelPhase ::UnfundedV2(_) => None,
1284
1290
}
1285
1291
}
1286
1292
1287
1293
pub fn is_resumable(&self) -> bool {
1288
- match self {
1289
- Channel ::Funded(_) => false,
1290
- Channel ::UnfundedOutboundV1(chan) => chan.is_resumable(),
1291
- Channel ::UnfundedInboundV1(_) => false,
1292
- Channel ::UnfundedV2(_) => false,
1294
+ match & self.phase {
1295
+ ChannelPhase ::Funded(_) => false,
1296
+ ChannelPhase ::UnfundedOutboundV1(chan) => chan.is_resumable(),
1297
+ ChannelPhase ::UnfundedInboundV1(_) => false,
1298
+ ChannelPhase ::UnfundedV2(_) => false,
1293
1299
}
1294
1300
}
1295
1301
1296
1302
pub fn maybe_get_open_channel<L: Deref>(
1297
1303
&mut self, chain_hash: ChainHash, logger: &L,
1298
1304
) -> Option<OpenChannelMessage> where L::Target: Logger {
1299
- match self {
1300
- Channel ::Funded(_) => None,
1301
- Channel ::UnfundedOutboundV1(chan) => {
1305
+ match &mut self.phase {
1306
+ ChannelPhase ::Funded(_) => None,
1307
+ ChannelPhase ::UnfundedOutboundV1(chan) => {
1302
1308
let logger = WithChannelContext::from(logger, &chan.context, None);
1303
1309
chan.get_open_channel(chain_hash, &&logger)
1304
1310
.map(|msg| OpenChannelMessage::V1(msg))
1305
1311
},
1306
- Channel ::UnfundedInboundV1(_) => {
1312
+ ChannelPhase ::UnfundedInboundV1(_) => {
1307
1313
// Since unfunded inbound channel maps are cleared upon disconnecting a peer,
1308
1314
// they are not persisted and won't be recovered after a crash.
1309
1315
// Therefore, they shouldn't exist at this point.
1310
1316
debug_assert!(false);
1311
1317
None
1312
1318
},
1313
1319
#[cfg(dual_funding)]
1314
- Channel ::UnfundedV2(chan) => {
1320
+ ChannelPhase ::UnfundedV2(chan) => {
1315
1321
if chan.context.is_outbound() {
1316
1322
Some(OpenChannelMessage::V2(chan.get_open_channel_v2(chain_hash)))
1317
1323
} else {
@@ -1323,7 +1329,7 @@ impl<SP: Deref> Channel<SP> where
1323
1329
}
1324
1330
},
1325
1331
#[cfg(not(dual_funding))]
1326
- Channel ::UnfundedV2(_) => {
1332
+ ChannelPhase ::UnfundedV2(_) => {
1327
1333
debug_assert!(false);
1328
1334
None
1329
1335
},
@@ -1337,16 +1343,16 @@ impl<SP: Deref> Channel<SP> where
1337
1343
F::Target: FeeEstimator,
1338
1344
L::Target: Logger,
1339
1345
{
1340
- match self {
1341
- Channel ::Funded(_) => Ok(None),
1342
- Channel ::UnfundedOutboundV1(chan) => {
1346
+ match &mut self.phase {
1347
+ ChannelPhase ::Funded(_) => Ok(None),
1348
+ ChannelPhase ::UnfundedOutboundV1(chan) => {
1343
1349
let logger = WithChannelContext::from(logger, &chan.context, None);
1344
1350
chan.maybe_handle_error_without_close(chain_hash, fee_estimator, &&logger)
1345
1351
.map(|msg| Some(OpenChannelMessage::V1(msg)))
1346
1352
},
1347
- Channel ::UnfundedInboundV1(_) => Ok(None),
1353
+ ChannelPhase ::UnfundedInboundV1(_) => Ok(None),
1348
1354
#[cfg(dual_funding)]
1349
- Channel ::UnfundedV2(chan) => {
1355
+ ChannelPhase ::UnfundedV2(chan) => {
1350
1356
if chan.context.is_outbound() {
1351
1357
chan.maybe_handle_error_without_close(chain_hash, fee_estimator)
1352
1358
.map(|msg| Some(OpenChannelMessage::V2(msg)))
@@ -1355,7 +1361,7 @@ impl<SP: Deref> Channel<SP> where
1355
1361
}
1356
1362
},
1357
1363
#[cfg(not(dual_funding))]
1358
- Channel ::UnfundedV2(_) => {
1364
+ ChannelPhase ::UnfundedV2(_) => {
1359
1365
debug_assert!(false);
1360
1366
Ok(None)
1361
1367
},
@@ -1369,7 +1375,9 @@ where
1369
1375
<SP::Target as SignerProvider>::EcdsaSigner: ChannelSigner,
1370
1376
{
1371
1377
fn from(channel: OutboundV1Channel<SP>) -> Self {
1372
- Channel::UnfundedOutboundV1(channel)
1378
+ Channel {
1379
+ phase: ChannelPhase::UnfundedOutboundV1(channel),
1380
+ }
1373
1381
}
1374
1382
}
1375
1383
@@ -1379,7 +1387,9 @@ where
1379
1387
<SP::Target as SignerProvider>::EcdsaSigner: ChannelSigner,
1380
1388
{
1381
1389
fn from(channel: InboundV1Channel<SP>) -> Self {
1382
- Channel::UnfundedInboundV1(channel)
1390
+ Channel {
1391
+ phase: ChannelPhase::UnfundedInboundV1(channel),
1392
+ }
1383
1393
}
1384
1394
}
1385
1395
@@ -1389,7 +1399,9 @@ where
1389
1399
<SP::Target as SignerProvider>::EcdsaSigner: ChannelSigner,
1390
1400
{
1391
1401
fn from(channel: PendingV2Channel<SP>) -> Self {
1392
- Channel::UnfundedV2(channel)
1402
+ Channel {
1403
+ phase: ChannelPhase::UnfundedV2(channel),
1404
+ }
1393
1405
}
1394
1406
}
1395
1407
@@ -1399,7 +1411,9 @@ where
1399
1411
<SP::Target as SignerProvider>::EcdsaSigner: ChannelSigner,
1400
1412
{
1401
1413
fn from(channel: FundedChannel<SP>) -> Self {
1402
- Channel::Funded(channel)
1414
+ Channel {
1415
+ phase: ChannelPhase::Funded(channel),
1416
+ }
1403
1417
}
1404
1418
}
1405
1419
0 commit comments