@@ -1139,6 +1139,7 @@ impl<'a, SP: Deref> ChannelPhase<SP> where
1139
1139
SP::Target: SignerProvider,
1140
1140
<SP::Target as SignerProvider>::EcdsaSigner: ChannelSigner,
1141
1141
{
1142
+ #[inline]
1142
1143
pub fn context(&'a self) -> &'a ChannelContext<SP> {
1143
1144
match self {
1144
1145
ChannelPhase::Funded(chan) => &chan.context,
@@ -1149,6 +1150,7 @@ impl<'a, SP: Deref> ChannelPhase<SP> where
1149
1150
}
1150
1151
}
1151
1152
1153
+ #[inline]
1152
1154
pub fn context_mut(&'a mut self) -> &'a mut ChannelContext<SP> {
1153
1155
match self {
1154
1156
ChannelPhase::Funded(ref mut chan) => &mut chan.context,
@@ -1162,40 +1164,72 @@ impl<'a, SP: Deref> ChannelPhase<SP> where
1162
1164
1163
1165
/// A top-level channel struct, containing a channel phase
1164
1166
pub(super) struct ChannelWrapper<SP: Deref> where SP::Target: SignerProvider {
1165
- phase: ChannelPhase<SP>,
1167
+ /// The inner channel phase
1168
+ /// Option is used to facilitate in-place replacement (see e.g. move_v2_to_funded),
1169
+ /// but it is never None, ensured in new() and set_phase()
1170
+ phase: Option<ChannelPhase<SP>>,
1166
1171
}
1167
1172
1168
1173
impl<'a, SP: Deref> ChannelWrapper<SP> where SP::Target: SignerProvider {
1169
1174
pub fn new(phase: ChannelPhase<SP>) -> Self {
1170
- Self { phase }
1175
+ Self {
1176
+ phase: Some(phase),
1177
+ }
1171
1178
}
1172
1179
1180
+ #[inline]
1173
1181
pub fn phase(&self) -> &ChannelPhase<SP> {
1174
- & self.phase
1182
+ self.phase.as_ref().unwrap()
1175
1183
}
1176
1184
1185
+ #[inline]
1177
1186
pub fn phase_mut(&mut self) -> &mut ChannelPhase<SP> {
1178
- &mut self.phase
1187
+ self.phase.as_mut().unwrap()
1179
1188
}
1180
1189
1181
1190
pub fn phase_take(self) -> ChannelPhase<SP> {
1182
- self.phase
1191
+ match self.phase {
1192
+ Some(phase) => phase,
1193
+ None => panic!("None phase"),
1194
+ }
1183
1195
}
1184
1196
1185
1197
pub fn get_funded_channel(&self) -> Option<&Channel<SP>> {
1186
- if let ChannelPhase::Funded(chan) = &self.phase {
1198
+ if let ChannelPhase::Funded(chan) = &self.phase.as_ref().unwrap() {
1187
1199
Some(chan)
1188
1200
} else {
1189
1201
None
1190
1202
}
1191
1203
}
1192
1204
1205
+ /// Change the internal phase
1206
+ #[inline]
1207
+ pub fn set_phase(&mut self, new_phase: ChannelPhase<SP>) {
1208
+ self.phase = Some(new_phase);
1209
+ }
1210
+
1211
+ pub fn move_v2_to_funded(&mut self, signing_session: InteractiveTxSigningSession) -> Result<(), ChannelError> {
1212
+ // We need a borrow to the phase field, but self is only a mut ref
1213
+ let phase_inline = self.phase.take().unwrap();
1214
+ let new_phase = match phase_inline {
1215
+ ChannelPhase::UnfundedOutboundV2(chan) =>
1216
+ ChannelPhase::Funded(chan.into_funded_channel(signing_session)?),
1217
+ ChannelPhase::UnfundedInboundV2(chan) =>
1218
+ ChannelPhase::Funded(chan.into_funded_channel(signing_session)?),
1219
+ _ => phase_inline,
1220
+ };
1221
+ self.set_phase(new_phase);
1222
+ Ok(())
1223
+ }
1224
+
1225
+ #[inline]
1193
1226
pub fn context(&'a self) -> &'a ChannelContext<SP> {
1194
- self.phase.context()
1227
+ self.phase() .context()
1195
1228
}
1196
1229
1230
+ #[inline]
1197
1231
pub fn context_mut(&'a mut self) -> &'a mut ChannelContext<SP> {
1198
- self.phase .context_mut()
1232
+ self.phase_mut() .context_mut()
1199
1233
}
1200
1234
}
1201
1235
@@ -8888,7 +8922,7 @@ impl<SP: Deref> OutboundV2Channel<SP> where SP::Target: SignerProvider {
8888
8922
}
8889
8923
}
8890
8924
8891
- pub fn into_channel (self, signing_session: InteractiveTxSigningSession) -> Result<Channel<SP>, ChannelError>{
8925
+ pub fn into_funded_channel (self, signing_session: InteractiveTxSigningSession) -> Result<Channel<SP>, ChannelError>{
8892
8926
let channel = Channel {
8893
8927
context: self.context,
8894
8928
interactive_tx_signing_session: Some(signing_session),
@@ -9082,7 +9116,7 @@ impl<SP: Deref> InboundV2Channel<SP> where SP::Target: SignerProvider {
9082
9116
self.generate_accept_channel_v2_message()
9083
9117
}
9084
9118
9085
- pub fn into_channel (self, signing_session: InteractiveTxSigningSession) -> Result<Channel<SP>, ChannelError>{
9119
+ pub fn into_funded_channel (self, signing_session: InteractiveTxSigningSession) -> Result<Channel<SP>, ChannelError>{
9086
9120
let channel = Channel {
9087
9121
context: self.context,
9088
9122
interactive_tx_signing_session: Some(signing_session),
0 commit comments