From ed78b370fc8161d87411b9cf0a2dcafa5507b50f Mon Sep 17 00:00:00 2001 From: NicolasCantu Date: Tue, 8 Apr 2025 16:00:25 +0200 Subject: [PATCH] create_transaction deep refactoring --- src/silentpayments.rs | 53 ++++++++----------------------------------- 1 file changed, 9 insertions(+), 44 deletions(-) diff --git a/src/silentpayments.rs b/src/silentpayments.rs index a16e4db..eebdde7 100644 --- a/src/silentpayments.rs +++ b/src/silentpayments.rs @@ -27,52 +27,12 @@ impl TsUnsignedTransaction { } pub fn create_transaction( - mandatory_inputs: Vec, - mut available_outpoints: HashMap, - freezed_utxos: &HashSet, + available_outpoints: Vec<(OutPoint, OwnedOutput)>, sp_client: &SpClient, mut recipients: Vec, payload: Option>, - fee_rate: Amount, + fee_rate: FeeRate, ) -> Result { - let sum_outputs = recipients - .iter() - .fold(Amount::from_sat(0), |acc, x| acc + x.amount); - - let zero_value_recipient = recipients - .iter_mut() - .find(|r| r.amount == Amount::from_sat(0)); - - let mut inputs: HashMap = HashMap::new(); - let mut total_available = Amount::from_sat(0); - for outpoint in mandatory_inputs { - let (must_outpoint, must_output) = available_outpoints - .remove_entry(&outpoint) - .ok_or_else(|| Error::msg(format!("Mandatory outpoint unknown: {}", outpoint)))?; - total_available += must_output.amount; - inputs.insert(must_outpoint, must_output); - } - - let fee_provision = Amount::from_sat(1000); - - for (outpoint, output) in &available_outpoints { - if freezed_utxos.contains(outpoint) { continue } - if total_available > sum_outputs.checked_add(fee_provision).unwrap() { - break; - } - total_available += output.amount; - inputs.insert(*outpoint, output.clone()); - } - - if total_available <= sum_outputs.checked_add(fee_provision).unwrap() { - return Err(Error::msg("Not enough available funds")); - } - - if let Some(recipient) = zero_value_recipient { - // update the amount for the recipient - recipient.amount = total_available; - } - let mut commitment = [0u8; 32]; if let Some(ref p) = payload { commitment.copy_from_slice(&p); @@ -80,10 +40,15 @@ pub fn create_transaction( thread_rng().fill(&mut commitment); } + recipients.push(Recipient { + address: sp_client::RecipientAddress::Data(commitment.to_vec()), + amount: Amount::ZERO + }); + let new_transaction = sp_client.create_new_transaction( - available_outpoints.into_iter().collect(), + available_outpoints, recipients, - fee_rate.to_btc() as f32, + fee_rate, sp_client.get_network() )?;