@@ -4281,6 +4281,60 @@ where
4281
4281
}
4282
4282
}
4283
4283
4284
+ /// See [`splice_channel`]
4285
+ #[cfg(splicing)]
4286
+ fn internal_splice_channel(
4287
+ &self, channel_id: &ChannelId, counterparty_node_id: &PublicKey, our_funding_contribution_satoshis: i64,
4288
+ our_funding_inputs: &Vec<(TxIn, Transaction, Weight)>,
4289
+ funding_feerate_per_kw: u32, locktime: Option<u32>,
4290
+ ) -> (Result<(), APIError>, NotifyOption) {
4291
+ let per_peer_state = self.per_peer_state.read().unwrap();
4292
+
4293
+ let peer_state_mutex = match per_peer_state.get(counterparty_node_id)
4294
+ .ok_or_else(|| APIError::ChannelUnavailable { err: format!("Can't find a peer matching the passed counterparty node_id {}", counterparty_node_id) }) {
4295
+ Ok(p) => p,
4296
+ Err(e) => return (Err(e), NotifyOption::SkipPersistNoEvents),
4297
+ };
4298
+
4299
+ let mut peer_state_lock = peer_state_mutex.lock().unwrap();
4300
+ let peer_state = &mut *peer_state_lock;
4301
+
4302
+ // Look for the channel
4303
+ match peer_state.channel_by_id.entry(*channel_id) {
4304
+ hash_map::Entry::Occupied(mut chan_phase_entry) => {
4305
+ let locktime = locktime.unwrap_or(self.current_best_block().height);
4306
+ if let Some(chan) = chan_phase_entry.get_mut().as_funded_mut() {
4307
+ let msg = match chan.splice_channel(our_funding_contribution_satoshis, our_funding_inputs, funding_feerate_per_kw, locktime) {
4308
+ Ok(m) => m,
4309
+ Err(e) => return (Err(e), NotifyOption::SkipPersistNoEvents),
4310
+ };
4311
+
4312
+ peer_state.pending_msg_events.push(events::MessageSendEvent::SendSpliceInit {
4313
+ node_id: *counterparty_node_id,
4314
+ msg,
4315
+ });
4316
+
4317
+ (Ok(()), NotifyOption::SkipPersistHandleEvents)
4318
+ } else {
4319
+ (Err(APIError::ChannelUnavailable {
4320
+ err: format!(
4321
+ "Channel with id {} is not funded, cannot splice it",
4322
+ channel_id
4323
+ )
4324
+ }), NotifyOption::SkipPersistNoEvents)
4325
+ }
4326
+ },
4327
+ hash_map::Entry::Vacant(_) => {
4328
+ (Err(APIError::ChannelUnavailable {
4329
+ err: format!(
4330
+ "Channel with id {} not found for the passed counterparty node_id {}",
4331
+ channel_id, counterparty_node_id,
4332
+ )
4333
+ }), NotifyOption::SkipPersistNoEvents)
4334
+ },
4335
+ }
4336
+ }
4337
+
4284
4338
/// Initiate a splice, to change the channel capacity of an existing funded channel.
4285
4339
/// After completion of splicing, the funding transaction will be replaced by a new one, spending the old funding transaction,
4286
4340
/// with optional extra inputs (splice-in) and/or extra outputs (splice-out or change).
@@ -4300,60 +4354,11 @@ where
4300
4354
) -> Result<(), APIError> {
4301
4355
let mut res = Ok(());
4302
4356
PersistenceNotifierGuard::optionally_notify(self, || {
4303
- let per_peer_state = self.per_peer_state.read().unwrap();
4304
-
4305
- let peer_state_mutex = match per_peer_state.get(counterparty_node_id)
4306
- .ok_or_else(|| APIError::ChannelUnavailable { err: format!("Can't find a peer matching the passed counterparty node_id {}", counterparty_node_id) }) {
4307
- Ok(p) => p,
4308
- Err(e) => {
4309
- res = Err(e);
4310
- return NotifyOption::SkipPersistNoEvents;
4311
- }
4312
- };
4313
-
4314
- let mut peer_state_lock = peer_state_mutex.lock().unwrap();
4315
- let peer_state = &mut *peer_state_lock;
4316
-
4317
- // Look for the channel
4318
- match peer_state.channel_by_id.entry(*channel_id) {
4319
- hash_map::Entry::Occupied(mut chan_phase_entry) => {
4320
- let locktime = locktime.unwrap_or(self.current_best_block().height);
4321
- if let Some(chan) = chan_phase_entry.get_mut().as_funded_mut() {
4322
- let msg = match chan.splice_channel(our_funding_contribution_satoshis, our_funding_inputs.clone(), funding_feerate_per_kw, locktime) {
4323
- Ok(m) => m,
4324
- Err(e) => {
4325
- res = Err(e);
4326
- return NotifyOption::SkipPersistNoEvents;
4327
- }
4328
- };
4329
-
4330
- peer_state.pending_msg_events.push(events::MessageSendEvent::SendSpliceInit {
4331
- node_id: *counterparty_node_id,
4332
- msg,
4333
- });
4334
-
4335
- res = Ok(());
4336
- NotifyOption::SkipPersistHandleEvents
4337
- } else {
4338
- res = Err(APIError::ChannelUnavailable {
4339
- err: format!(
4340
- "Channel with id {} is not funded, cannot splice it",
4341
- channel_id
4342
- )
4343
- });
4344
- NotifyOption::SkipPersistNoEvents
4345
- }
4346
- },
4347
- hash_map::Entry::Vacant(_) => {
4348
- res = Err(APIError::ChannelUnavailable {
4349
- err: format!(
4350
- "Channel with id {} not found for the passed counterparty node_id {}",
4351
- channel_id, counterparty_node_id,
4352
- )
4353
- });
4354
- NotifyOption::SkipPersistNoEvents
4355
- },
4356
- }
4357
+ let (result, notify_option) = self.internal_splice_channel(
4358
+ channel_id, counterparty_node_id, our_funding_contribution_satoshis, &our_funding_inputs, funding_feerate_per_kw, locktime
4359
+ );
4360
+ res = result;
4361
+ notify_option
4357
4362
});
4358
4363
res
4359
4364
}
0 commit comments