@@ -30,9 +30,9 @@ use bitcoin::hashes::{Hash, HashEngine, HmacEngine};
3030
3131use bitcoin::secp256k1::Secp256k1;
3232use bitcoin::secp256k1::{PublicKey, SecretKey};
33- #[cfg(splicing)]
34- use bitcoin::ScriptBuf;
3533use bitcoin::{secp256k1, Sequence, SignedAmount, TxIn, Weight};
34+ #[cfg(splicing)]
35+ use bitcoin::{Amount, ScriptBuf};
3636
3737use crate::blinded_path::message::MessageForwardNode;
3838use crate::blinded_path::message::{AsyncPaymentsContext, OffersContext};
@@ -200,6 +200,47 @@ pub use crate::ln::outbound_payment::{
200200};
201201use crate::ln::script::ShutdownScript;
202202
203+ /// The components of a splice's funding transaction that are contributed by one party.
204+ #[cfg(splicing)]
205+ pub enum SpliceContribution {
206+ /// When only inputs -- except for a possible change output -- are contributed to the splice.
207+ SpliceIn {
208+ /// The amount to contribute to the splice.
209+ value: Amount,
210+
211+ /// The inputs used to meet the contributed amount. Any excess amount will be sent to a
212+ /// change output.
213+ inputs: Vec<FundingTxInput>,
214+
215+ /// An optional change output script. This will be used if needed or, if not set, generated
216+ /// using `SignerProvider::get_destination_script`.
217+ change_script: Option<ScriptBuf>,
218+ },
219+ }
220+
221+ #[cfg(splicing)]
222+ impl SpliceContribution {
223+ pub(super) fn value(&self) -> SignedAmount {
224+ match self {
225+ SpliceContribution::SpliceIn { value, .. } => {
226+ value.to_signed().unwrap_or(SignedAmount::MAX)
227+ },
228+ }
229+ }
230+
231+ pub(super) fn inputs(&self) -> &[FundingTxInput] {
232+ match self {
233+ SpliceContribution::SpliceIn { inputs, .. } => &inputs[..],
234+ }
235+ }
236+
237+ pub(super) fn into_tx_parts(self) -> (Vec<FundingTxInput>, Option<ScriptBuf>) {
238+ match self {
239+ SpliceContribution::SpliceIn { inputs, change_script, .. } => (inputs, change_script),
240+ }
241+ }
242+ }
243+
203244/// An input to contribute to a channel's funding transaction either when using the v2 channel
204245/// establishment protocol or when splicing.
205246#[derive(Clone)]
@@ -4452,14 +4493,13 @@ where
44524493 #[cfg(splicing)]
44534494 #[rustfmt::skip]
44544495 pub fn splice_channel(
4455- &self, channel_id: &ChannelId, counterparty_node_id: &PublicKey, our_funding_contribution_satoshis: i64,
4456- our_funding_inputs: Vec<FundingTxInput>, change_script: Option<ScriptBuf>,
4457- funding_feerate_per_kw: u32, locktime: Option<u32>,
4496+ &self, channel_id: &ChannelId, counterparty_node_id: &PublicKey,
4497+ contribution: SpliceContribution, funding_feerate_per_kw: u32, locktime: Option<u32>,
44584498 ) -> Result<(), APIError> {
44594499 let mut res = Ok(());
44604500 PersistenceNotifierGuard::optionally_notify(self, || {
44614501 let result = self.internal_splice_channel(
4462- channel_id, counterparty_node_id, our_funding_contribution_satoshis, our_funding_inputs, change_script , funding_feerate_per_kw, locktime
4502+ channel_id, counterparty_node_id, contribution , funding_feerate_per_kw, locktime
44634503 );
44644504 res = result;
44654505 match res {
@@ -4474,8 +4514,7 @@ where
44744514 #[cfg(splicing)]
44754515 fn internal_splice_channel(
44764516 &self, channel_id: &ChannelId, counterparty_node_id: &PublicKey,
4477- our_funding_contribution_satoshis: i64, our_funding_inputs: Vec<FundingTxInput>,
4478- change_script: Option<ScriptBuf>, funding_feerate_per_kw: u32, locktime: Option<u32>,
4517+ contribution: SpliceContribution, funding_feerate_per_kw: u32, locktime: Option<u32>,
44794518 ) -> Result<(), APIError> {
44804519 let per_peer_state = self.per_peer_state.read().unwrap();
44814520
@@ -4496,13 +4535,8 @@ where
44964535 hash_map::Entry::Occupied(mut chan_phase_entry) => {
44974536 let locktime = locktime.unwrap_or_else(|| self.current_best_block().height);
44984537 if let Some(chan) = chan_phase_entry.get_mut().as_funded_mut() {
4499- let msg = chan.splice_channel(
4500- our_funding_contribution_satoshis,
4501- our_funding_inputs,
4502- change_script,
4503- funding_feerate_per_kw,
4504- locktime,
4505- )?;
4538+ let msg =
4539+ chan.splice_channel(contribution, funding_feerate_per_kw, locktime)?;
45064540 peer_state.pending_msg_events.push(MessageSendEvent::SendSpliceInit {
45074541 node_id: *counterparty_node_id,
45084542 msg,
0 commit comments