From 90d87e7d9a02bde5dbc025adcdaee39e6c2c4c7f Mon Sep 17 00:00:00 2001 From: NicolasCantu Date: Tue, 8 Apr 2025 16:03:46 +0200 Subject: [PATCH] Use FeeRate to prevent fees miscalculation --- src/api.rs | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/api.rs b/src/api.rs index 082d45f..f04c98c 100644 --- a/src/api.rs +++ b/src/api.rs @@ -68,7 +68,7 @@ use sdk_common::pcd::{ }; use sdk_common::prd::{AnkPrdHash, Prd, PrdType}; use sdk_common::silentpayments::{create_transaction as internal_create_transaction, sign_transaction as internal_sign_tx, TsUnsignedTransaction}; -use sdk_common::sp_client::{OutputSpendStatus, OwnedOutput, Recipient, RecipientAddress, SilentPaymentUnsignedTransaction, SpClient, SpendKey}; +use sdk_common::sp_client::{FeeRate, OutputSpendStatus, OwnedOutput, Recipient, RecipientAddress, SilentPaymentUnsignedTransaction, SpClient, SpendKey}; use sdk_common::secrets::SecretsStore; use crate::user::{lock_local_device, set_new_device, LOCAL_DEVICE}; @@ -1047,7 +1047,7 @@ fn create_transaction_for_addresses( device: &Device, freezed_utxos: &HashSet, sp_addresses: &[SilentPaymentAddress], - fee_rate: u32 + fee_rate: FeeRate ) -> anyhow::Result { let mut recipients = Vec::with_capacity(sp_addresses.len()); for sp_address in sp_addresses { @@ -1058,18 +1058,30 @@ fn create_transaction_for_addresses( recipients.push(recipient); } + // If we had mandatory inputs, we would add them at the top of the list + // Take spendable outputs and filter out the freezed utxos + let candidates_inputs: Vec<(OutPoint, OwnedOutput)> = device.get_outputs() + .into_iter() + .filter_map(|(outpoint, output)| { + if output.spend_status == OutputSpendStatus::Unspent && !freezed_utxos.contains(outpoint) { + Some((*outpoint, output.clone())) + } else { + None + } + }) + .collect(); let mut tx = internal_create_transaction( - vec![], - device.get_outputs().clone(), - freezed_utxos, + candidates_inputs, device.get_sp_client(), recipients, None, - Amount::from_sat(fee_rate.into()), + fee_rate, )?; let unsigned_transaction = SpClient::finalize_transaction(tx)?; + log::debug!("{:#?}", unsigned_transaction.unsigned_tx); + Ok(unsigned_transaction) } @@ -1094,7 +1106,7 @@ pub fn create_transaction(addresses: Vec, fee_rate: u32) -> ApiResult