@@ -30,9 +30,7 @@ use bitcoin::hash_types::{BlockHash, Txid};
30
30
31
31
use bitcoin::secp256k1::{SecretKey,PublicKey};
32
32
use bitcoin::secp256k1::Secp256k1;
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::events::FundingInfo;
38
36
use crate::blinded_path::message::{AsyncPaymentsContext, MessageContext, OffersContext};
@@ -84,7 +82,7 @@ use crate::util::config::{ChannelConfig, ChannelConfigUpdate, ChannelConfigOverr
84
82
use crate::util::wakers::{Future, Notifier};
85
83
use crate::util::scid_utils::fake_scid;
86
84
use crate::util::string::UntrustedString;
87
- use crate::util::ser::{BigSize, FixedLengthReader, LengthReadable, Readable, ReadableArgs, MaybeReadable, Writeable, Writer, VecWriter };
85
+ use crate::util::ser::{BigSize, FixedLengthReader, LengthReadable, MaybeReadable, Readable, ReadableArgs, TransactionU16LenLimited, VecWriter, Writeable, Writer };
88
86
use crate::util::logger::{Level, Logger, WithContext};
89
87
use crate::util::errors::APIError;
90
88
#[cfg(async_payments)] use {
@@ -7875,7 +7873,7 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
7875
7873
/// [`Event::OpenChannelRequest`]: events::Event::OpenChannelRequest
7876
7874
/// [`Event::ChannelClosed::user_channel_id`]: events::Event::ChannelClosed::user_channel_id
7877
7875
pub fn accept_inbound_channel(&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>) -> Result<(), APIError> {
7878
- self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, false, user_channel_id, config_overrides)
7876
+ self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, false, user_channel_id, config_overrides, vec![] )
7879
7877
}
7880
7878
7881
7879
/// Accepts a request to open a channel after a [`events::Event::OpenChannelRequest`], treating
@@ -7897,13 +7895,61 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
7897
7895
/// [`Event::OpenChannelRequest`]: events::Event::OpenChannelRequest
7898
7896
/// [`Event::ChannelClosed::user_channel_id`]: events::Event::ChannelClosed::user_channel_id
7899
7897
pub fn accept_inbound_channel_from_trusted_peer_0conf(&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>) -> Result<(), APIError> {
7900
- self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, true, user_channel_id, config_overrides)
7898
+ self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, true, user_channel_id, config_overrides, vec![])
7899
+ }
7900
+
7901
+ /// Accepts a request to open a dual-funded channel with a contribution provided by us after an
7902
+ /// [`Event::OpenChannelRequest`].
7903
+ ///
7904
+ /// The `temporary_channel_id` parameter indicates which inbound channel should be accepted,
7905
+ /// and the `counterparty_node_id` parameter is the id of the peer which has requested to open
7906
+ /// the channel.
7907
+ ///
7908
+ /// The `user_channel_id` parameter will be provided back in
7909
+ /// [`Event::ChannelClosed::user_channel_id`] to allow tracking of which events correspond
7910
+ /// with which `accept_inbound_channel_*` call.
7911
+ ///
7912
+ /// The `funding_inputs` parameter provides the `txin`s along with their previous transactions, and
7913
+ /// a corresponding witness weight for each input that will be used to contribute towards our
7914
+ /// portion of the channel value. Our contribution will be calculated as the total value of these
7915
+ /// inputs minus the fees we need to cover for the interactive funding transaction. The witness
7916
+ /// weights must correspond to the witnesses you will provide through [`ChannelManager::funding_transaction_signed`]
7917
+ /// after receiving [`Event::FundingTransactionReadyForSigning`].
7918
+ ///
7919
+ /// Note that this method will return an error and reject the channel if it requires support for
7920
+ /// zero confirmations.
7921
+ // TODO(dual_funding): Discussion on complications with 0conf dual-funded channels where "locking"
7922
+ // of UTXOs used for funding would be required and other issues.
7923
+ // See https://diyhpl.us/~bryan/irc/bitcoin/bitcoin-dev/linuxfoundation-pipermail/lightning-dev/2023-May/003922.txt
7924
+ ///
7925
+ /// [`Event::OpenChannelRequest`]: events::Event::OpenChannelRequest
7926
+ /// [`Event::ChannelClosed::user_channel_id`]: events::Event::ChannelClosed::user_channel_id
7927
+ /// [`Event::FundingTransactionReadyForSigning`]: events::Event::FundingTransactionReadyForSigning
7928
+ /// [`ChannelManager::funding_transaction_signed`]: ChannelManager::funding_transaction_signed
7929
+ pub fn accept_inbound_channel_with_contribution(
7930
+ &self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, user_channel_id: u128,
7931
+ config_overrides: Option<ChannelConfigOverrides>, funding_inputs: Vec<(TxIn, Transaction, Weight)>
7932
+ ) -> Result<(), APIError> {
7933
+ let funding_inputs = Self::length_limit_holder_input_prev_txs(funding_inputs)?;
7934
+ self.do_accept_inbound_channel(temporary_channel_id, counterparty_node_id, false, user_channel_id,
7935
+ config_overrides, funding_inputs)
7936
+ }
7937
+
7938
+ fn length_limit_holder_input_prev_txs(funding_inputs: Vec<(TxIn, Transaction, Weight)>) -> Result<Vec<(TxIn, TransactionU16LenLimited, Weight)>, APIError> {
7939
+ funding_inputs.into_iter().map(|(txin, tx, witness_weight)| {
7940
+ match TransactionU16LenLimited::new(tx) {
7941
+ Ok(tx) => Ok((txin, tx, witness_weight)),
7942
+ Err(err) => Err(err)
7943
+ }
7944
+ }).collect::<Result<Vec<(TxIn, TransactionU16LenLimited, Weight)>, ()>>()
7945
+ .map_err(|_| APIError::APIMisuseError { err: "One or more transactions had a serialized length exceeding 65535 bytes".into() })
7901
7946
}
7902
7947
7903
7948
/// TODO(dual_funding): Allow contributions, pass intended amount and inputs
7904
7949
fn do_accept_inbound_channel(
7905
7950
&self, temporary_channel_id: &ChannelId, counterparty_node_id: &PublicKey, accept_0conf: bool,
7906
- user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>
7951
+ user_channel_id: u128, config_overrides: Option<ChannelConfigOverrides>,
7952
+ funding_inputs: Vec<(TxIn, TransactionU16LenLimited, Weight)>
7907
7953
) -> Result<(), APIError> {
7908
7954
7909
7955
let mut config = self.default_configuration.clone();
@@ -7962,7 +8008,7 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
7962
8008
&self.channel_type_features(), &peer_state.latest_features,
7963
8009
&open_channel_msg,
7964
8010
user_channel_id, &config, best_block_height,
7965
- &self.logger,
8011
+ &self.logger, funding_inputs,
7966
8012
).map_err(|_| MsgHandleErrInternal::from_chan_no_close(
7967
8013
ChannelError::Close(
7968
8014
(
@@ -8243,7 +8289,7 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
8243
8289
&self.fee_estimator, &self.entropy_source, &self.signer_provider,
8244
8290
self.get_our_node_id(), *counterparty_node_id, &self.channel_type_features(),
8245
8291
&peer_state.latest_features, msg, user_channel_id,
8246
- &self.default_configuration, best_block_height, &self.logger,
8292
+ &self.default_configuration, best_block_height, &self.logger, vec![],
8247
8293
).map_err(|e| MsgHandleErrInternal::from_chan_no_close(e, msg.common_fields.temporary_channel_id))?;
8248
8294
let message_send_event = MessageSendEvent::SendAcceptChannelV2 {
8249
8295
node_id: *counterparty_node_id,
0 commit comments