@@ -1702,20 +1702,20 @@ pub(super) trait InteractivelyFunded<SP: Deref> where SP::Target: SignerProvider
17021702 funding_inputs.push(prev_funding_input);
17031703 }
17041704
1705- let mut funding_inputs_prev_outputs: Vec<TxOut> = Vec::with_capacity(funding_inputs.len());
1705+ let mut funding_inputs_prev_outputs: Vec<& TxOut> = Vec::with_capacity(funding_inputs.len());
17061706 // Check that vouts exist for each TxIn in provided transactions.
1707- for (idx, input ) in funding_inputs.iter().enumerate() {
1708- if let Some(output) = input.1. as_transaction().output.get(input.0 .previous_output.vout as usize) {
1709- funding_inputs_prev_outputs.push(output.clone() );
1707+ for (idx, (txin, tx) ) in funding_inputs.iter().enumerate() {
1708+ if let Some(output) = tx. as_transaction().output.get(txin .previous_output.vout as usize) {
1709+ funding_inputs_prev_outputs.push(output);
17101710 } else {
17111711 return Err(APIError::APIMisuseError {
17121712 err: format!("Transaction with txid {} does not have an output with vout of {} corresponding to TxIn at funding_inputs[{}]",
1713- input.1. as_transaction().compute_txid(), input.0 .previous_output.vout, idx) });
1713+ tx. as_transaction().compute_txid(), txin .previous_output.vout, idx) });
17141714 }
17151715 }
17161716
17171717 let total_input_satoshis: u64 = funding_inputs.iter().map(
1718- |input| input.1. as_transaction().output.get(input.0 .previous_output.vout as usize).map(|out| out.value.to_sat()).unwrap_or(0)
1718+ |(txin, tx)| tx. as_transaction().output.get(txin .previous_output.vout as usize).map(|out| out.value.to_sat()).unwrap_or(0)
17191719 ).sum();
17201720 if total_input_satoshis < self.dual_funding_context().our_funding_satoshis {
17211721 return Err(APIError::APIMisuseError {
@@ -1757,18 +1757,24 @@ pub(super) trait InteractivelyFunded<SP: Deref> where SP::Target: SignerProvider
17571757 |err| APIError::APIMisuseError {
17581758 err: format!("Failed to get change script as new destination script, {:?}", err),
17591759 })?;
1760- add_funding_change_output(change_value, change_script,
1761- &mut funding_outputs, self.dual_funding_context().funding_feerate_sat_per_1000_weight);
1760+ let mut change_output = TxOut {
1761+ value: Amount::from_sat(change_value),
1762+ script_pubkey: change_script,
1763+ };
1764+ let change_output_weight = get_output_weight(&change_output.script_pubkey).to_wu();
1765+ let change_output_fee = fee_for_weight(self.dual_funding_context().funding_feerate_sat_per_1000_weight, change_output_weight);
1766+ change_output.value = Amount::from_sat(change_value.saturating_sub(change_output_fee));
1767+ funding_outputs.push(OutputOwned::Single(change_output));
17621768 }
17631769
17641770 let constructor_args = InteractiveTxConstructorArgs {
17651771 entropy_source,
17661772 holder_node_id,
17671773 counterparty_node_id: self.context().counterparty_node_id,
17681774 channel_id: self.context().channel_id(),
1769- feerate_sat_per_kw: self.dual_funding_context_mut ().funding_feerate_sat_per_1000_weight,
1775+ feerate_sat_per_kw: self.dual_funding_context ().funding_feerate_sat_per_1000_weight,
17701776 is_initiator: self.is_initiator(),
1771- funding_tx_locktime: self.dual_funding_context_mut ().funding_tx_locktime,
1777+ funding_tx_locktime: self.dual_funding_context ().funding_tx_locktime,
17721778 inputs_to_contribute: funding_inputs,
17731779 outputs_to_contribute: funding_outputs,
17741780 expected_remote_shared_funding_output,
@@ -1777,7 +1783,7 @@ pub(super) trait InteractivelyFunded<SP: Deref> where SP::Target: SignerProvider
17771783 .map_err(|_| APIError::APIMisuseError { err: "Incorrect shared output provided".into() })?;
17781784 let msg = tx_constructor.take_initiator_first_message();
17791785
1780- self.interactive_tx_constructor_mut().replace (tx_constructor);
1786+ * self.interactive_tx_constructor_mut() = Some (tx_constructor);
17811787
17821788 Ok(msg)
17831789 }
@@ -4264,21 +4270,6 @@ fn get_v2_channel_reserve_satoshis(channel_value_satoshis: u64, dust_limit_satos
42644270 cmp::min(channel_value_satoshis, cmp::max(q, dust_limit_satoshis))
42654271}
42664272
4267- #[allow(dead_code)] // TODO(dual_funding): Remove once begin_interactive_funding_tx_construction() is used
4268- fn add_funding_change_output(
4269- change_value: u64, change_script: ScriptBuf,
4270- funding_outputs: &mut Vec<OutputOwned>, funding_feerate_sat_per_1000_weight: u32,
4271- ) {
4272- let mut change_output = TxOut {
4273- value: Amount::from_sat(change_value),
4274- script_pubkey: change_script,
4275- };
4276- let change_output_weight = get_output_weight(&change_output.script_pubkey).to_wu();
4277- let change_output_fee = fee_for_weight(funding_feerate_sat_per_1000_weight, change_output_weight);
4278- change_output.value = Amount::from_sat(change_value.saturating_sub(change_output_fee));
4279- funding_outputs.push(OutputOwned::Single(change_output.clone()));
4280- }
4281-
42824273pub(super) fn calculate_our_funding_satoshis(
42834274 is_initiator: bool, funding_inputs: &[(TxIn, TransactionU16LenLimited)],
42844275 total_witness_weight: Weight, funding_feerate_sat_per_1000_weight: u32,
0 commit comments