@@ -30,9 +30,9 @@ use bitcoin::hashes::{Hash, HashEngine, HmacEngine};
30
30
31
31
use bitcoin::secp256k1::Secp256k1;
32
32
use bitcoin::secp256k1::{PublicKey, SecretKey};
33
- #[cfg(splicing)]
34
- use bitcoin::ScriptBuf;
35
33
use bitcoin::{secp256k1, Sequence, SignedAmount, TxIn, Weight};
34
+ #[cfg(splicing)]
35
+ use bitcoin::{Amount, ScriptBuf};
36
36
37
37
use crate::blinded_path::message::MessageForwardNode;
38
38
use crate::blinded_path::message::{AsyncPaymentsContext, OffersContext};
@@ -200,6 +200,47 @@ pub use crate::ln::outbound_payment::{
200
200
};
201
201
use crate::ln::script::ShutdownScript;
202
202
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
+
203
244
/// An input to contribute to a channel's funding transaction either when using the v2 channel
204
245
/// establishment protocol or when splicing.
205
246
#[derive(Clone)]
@@ -4452,14 +4493,13 @@ where
4452
4493
#[cfg(splicing)]
4453
4494
#[rustfmt::skip]
4454
4495
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>,
4458
4498
) -> Result<(), APIError> {
4459
4499
let mut res = Ok(());
4460
4500
PersistenceNotifierGuard::optionally_notify(self, || {
4461
4501
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
4463
4503
);
4464
4504
res = result;
4465
4505
match res {
@@ -4474,8 +4514,7 @@ where
4474
4514
#[cfg(splicing)]
4475
4515
fn internal_splice_channel(
4476
4516
&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>,
4479
4518
) -> Result<(), APIError> {
4480
4519
let per_peer_state = self.per_peer_state.read().unwrap();
4481
4520
@@ -4496,13 +4535,8 @@ where
4496
4535
hash_map::Entry::Occupied(mut chan_phase_entry) => {
4497
4536
let locktime = locktime.unwrap_or_else(|| self.current_best_block().height);
4498
4537
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)?;
4506
4540
peer_state.pending_msg_events.push(MessageSendEvent::SendSpliceInit {
4507
4541
node_id: *counterparty_node_id,
4508
4542
msg,
0 commit comments