@@ -30,9 +30,7 @@ use bitcoin::hashes::{Hash, HashEngine, HmacEngine};
30
30
31
31
use bitcoin::secp256k1::Secp256k1;
32
32
use bitcoin::secp256k1::{PublicKey, SecretKey};
33
- use bitcoin::{secp256k1, Sequence};
34
- #[cfg(splicing)]
35
- use bitcoin::{TxIn, Weight};
33
+ use bitcoin::{secp256k1, Sequence, TxIn, Weight};
36
34
37
35
use crate::blinded_path::message::MessageForwardNode;
38
36
use crate::blinded_path::message::{AsyncPaymentsContext, OffersContext};
@@ -122,8 +120,8 @@ use crate::util::errors::APIError;
122
120
use crate::util::logger::{Level, Logger, WithContext};
123
121
use crate::util::scid_utils::fake_scid;
124
122
use crate::util::ser::{
125
- BigSize, FixedLengthReader, LengthReadable, MaybeReadable, Readable, ReadableArgs, VecWriter,
126
- Writeable, Writer,
123
+ BigSize, FixedLengthReader, LengthReadable, MaybeReadable, Readable, ReadableArgs,
124
+ TransactionU16LenLimited, VecWriter, Writeable, Writer,
127
125
};
128
126
use crate::util::string::UntrustedString;
129
127
use crate::util::wakers::{Future, Notifier};
@@ -8290,6 +8288,8 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
8290
8288
false,
8291
8289
user_channel_id,
8292
8290
config_overrides,
8291
+ 0,
8292
+ vec![],
8293
8293
)
8294
8294
}
8295
8295
@@ -8321,14 +8321,82 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
8321
8321
true,
8322
8322
user_channel_id,
8323
8323
config_overrides,
8324
+ 0,
8325
+ vec![],
8324
8326
)
8325
8327
}
8326
8328
8329
+ /// Accepts a request to open a dual-funded channel with a contribution provided by us after an
8330
+ /// [`Event::OpenChannelRequest`].
8331
+ ///
8332
+ /// The [`Event::OpenChannelRequest::channel_negotiation_type`] field will indicate the open channel
8333
+ /// request is for a dual-funded channel when the variant is `InboundChannelFunds::DualFunded`.
8334
+ ///
8335
+ /// The `temporary_channel_id` parameter indicates which inbound channel should be accepted,
8336
+ /// and the `counterparty_node_id` parameter is the id of the peer which has requested to open
8337
+ /// the channel.
8338
+ ///
8339
+ /// The `user_channel_id` parameter will be provided back in
8340
+ /// [`Event::ChannelClosed::user_channel_id`] to allow tracking of which events correspond
8341
+ /// with which `accept_inbound_channel_*` call.
8342
+ ///
8343
+ /// The `funding_inputs` parameter provides the `txin`s along with their previous transactions, and
8344
+ /// a corresponding witness weight for each input that will be used to contribute towards our
8345
+ /// portion of the channel value. Our contribution will be calculated as the total value of these
8346
+ /// inputs minus the fees we need to cover for the interactive funding transaction. The witness
8347
+ /// weights must correspond to the witnesses you will provide through [`ChannelManager::funding_transaction_signed`]
8348
+ /// after receiving [`Event::FundingTransactionReadyForSigning`].
8349
+ ///
8350
+ /// Note that this method will return an error and reject the channel if it requires support for
8351
+ /// zero confirmations.
8352
+ // TODO(dual_funding): Discussion on complications with 0conf dual-funded channels where "locking"
8353
+ // of UTXOs used for funding would be required and other issues.
8354
+ // See https://diyhpl.us/~bryan/irc/bitcoin/bitcoin-dev/linuxfoundation-pipermail/lightning-dev/2023-May/003922.txt
8355
+ ///
8356
+ /// [`Event::OpenChannelRequest`]: events::Event::OpenChannelRequest
8357
+ /// [`Event::OpenChannelRequest::channel_negotiation_type`]: events::Event::OpenChannelRequest::channel_negotiation_type
8358
+ /// [`Event::ChannelClosed::user_channel_id`]: events::Event::ChannelClosed::user_channel_id
8359
+ /// [`Event::FundingTransactionReadyForSigning`]: events::Event::FundingTransactionReadyForSigning
8360
+ /// [`ChannelManager::funding_transaction_signed`]: ChannelManager::funding_transaction_signed
8361
+ pub fn accept_inbound_channel_with_contribution(
8362
+ &self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey,
8363
+ user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>,
8364
+ our_funding_satoshis: u64, funding_inputs: Vec<(TxIn, Transaction, Weight)>,
8365
+ ) -> Result<(), APIError> {
8366
+ let funding_inputs = Self::length_limit_holder_input_prev_txs(funding_inputs)?;
8367
+ self.do_accept_inbound_channel(
8368
+ temporary_channel_id,
8369
+ counterparty_node_id,
8370
+ false,
8371
+ user_channel_id,
8372
+ config_overrides,
8373
+ our_funding_satoshis,
8374
+ funding_inputs,
8375
+ )
8376
+ }
8377
+
8378
+ fn length_limit_holder_input_prev_txs(
8379
+ funding_inputs: Vec<(TxIn, Transaction, Weight)>,
8380
+ ) -> Result<Vec<(TxIn, TransactionU16LenLimited, Weight)>, APIError> {
8381
+ funding_inputs
8382
+ .into_iter()
8383
+ .map(|(txin, tx, witness_weight)| match TransactionU16LenLimited::new(tx) {
8384
+ Ok(tx) => Ok((txin, tx, witness_weight)),
8385
+ Err(err) => Err(err),
8386
+ })
8387
+ .collect::<Result<Vec<(TxIn, TransactionU16LenLimited, Weight)>, ()>>()
8388
+ .map_err(|_| APIError::APIMisuseError {
8389
+ err: "One or more transactions had a serialized length exceeding 65535 bytes"
8390
+ .into(),
8391
+ })
8392
+ }
8393
+
8327
8394
/// TODO(dual_funding): Allow contributions, pass intended amount and inputs
8328
8395
#[rustfmt::skip]
8329
8396
fn do_accept_inbound_channel(
8330
8397
&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, accept_0conf: bool,
8331
- user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>
8398
+ user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>, our_funding_satoshis: u64,
8399
+ funding_inputs: Vec<(TxIn, TransactionU16LenLimited, Weight)>
8332
8400
) -> Result<(), APIError> {
8333
8401
8334
8402
let mut config = self.default_configuration.clone();
@@ -8387,7 +8455,7 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
8387
8455
&self.channel_type_features(), &peer_state.latest_features,
8388
8456
&open_channel_msg,
8389
8457
user_channel_id, &config, best_block_height,
8390
- &self.logger,
8458
+ &self.logger, our_funding_satoshis, funding_inputs,
8391
8459
).map_err(|_| MsgHandleErrInternal::from_chan_no_close(
8392
8460
ChannelError::Close(
8393
8461
(
@@ -8674,7 +8742,7 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
8674
8742
&self.fee_estimator, &self.entropy_source, &self.signer_provider,
8675
8743
self.get_our_node_id(), *counterparty_node_id, &self.channel_type_features(),
8676
8744
&peer_state.latest_features, msg, user_channel_id,
8677
- &self.default_configuration, best_block_height, &self.logger,
8745
+ &self.default_configuration, best_block_height, &self.logger, 0, vec![],
8678
8746
).map_err(|e| MsgHandleErrInternal::from_chan_no_close(e, msg.common_fields.temporary_channel_id))?;
8679
8747
let message_send_event = MessageSendEvent::SendAcceptChannelV2 {
8680
8748
node_id: *counterparty_node_id,
0 commit comments