diff --git a/sdk/src/client/api/block_builder/transaction_builder/mod.rs b/sdk/src/client/api/block_builder/transaction_builder/mod.rs index d3f8c7ea73..1d5f68bb38 100644 --- a/sdk/src/client/api/block_builder/transaction_builder/mod.rs +++ b/sdk/src/client/api/block_builder/transaction_builder/mod.rs @@ -210,7 +210,7 @@ pub(crate) struct MinManaAllotment { required_allotment: Option, } -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Default, PartialEq, Eq)] pub(crate) struct Remainders { address: Option
, data: Vec, @@ -545,11 +545,6 @@ impl TransactionBuilder { .expect("expiration unlockable outputs already filtered out"); self.selected_inputs.insert(required_address, input); - // Remove the cached allotment value because it's no longer valid - if let Some(MinManaAllotment { required_allotment, .. }) = self.min_mana_allotment.as_mut() { - *required_allotment = None; - } - Ok(added_output) } diff --git a/sdk/src/client/api/block_builder/transaction_builder/remainder.rs b/sdk/src/client/api/block_builder/transaction_builder/remainder.rs index 04fadac54f..66dcb1cf5e 100644 --- a/sdk/src/client/api/block_builder/transaction_builder/remainder.rs +++ b/sdk/src/client/api/block_builder/transaction_builder/remainder.rs @@ -20,12 +20,14 @@ use crate::{ }; impl TransactionBuilder { - /// Updates the remainders, overwriting old values. - pub(crate) fn update_remainders(&mut self) -> Result<(), TransactionBuilderError> { - self.remainders = Remainders { - address: self.remainders.address.take(), + /// Updates the remainders, overwriting old values. Returns whether any changes were made. + pub(crate) fn update_remainders(&mut self) -> Result { + // Swap the remainders so we can keep the old ones to compare to later. + let mut old_remainders = Remainders { + address: self.remainders.address.clone(), ..Default::default() }; + core::mem::swap(&mut self.remainders, &mut old_remainders); let (input_amount, output_amount, inputs_sdr, outputs_sdr) = self.amount_sums(); for (address, amount) in inputs_sdr { @@ -120,12 +122,11 @@ impl TransactionBuilder { if amount_diff == 0 && mana_diff == 0 && native_tokens_diff.is_empty() { log::debug!("No remainder required"); - return Ok(()); + } else { + self.create_remainder_outputs(amount_diff, mana_diff, native_tokens_diff, remainder_address, chain)?; } - self.create_remainder_outputs(amount_diff, mana_diff, native_tokens_diff, remainder_address, chain)?; - - Ok(()) + Ok(self.remainders != old_remainders) } /// Gets the remainder address from configuration or finds one from the inputs. diff --git a/sdk/src/client/api/block_builder/transaction_builder/requirement/mana.rs b/sdk/src/client/api/block_builder/transaction_builder/requirement/mana.rs index 5a91f9cdf2..beb67f235e 100644 --- a/sdk/src/client/api/block_builder/transaction_builder/requirement/mana.rs +++ b/sdk/src/client/api/block_builder/transaction_builder/requirement/mana.rs @@ -61,14 +61,12 @@ impl TransactionBuilder { } should_recalculate |= self.reduce_account_output()?; - } else { - should_recalculate = true; } // Remainders can only be calculated when the input mana is >= the output mana let (input_mana, output_mana) = self.mana_sums(false)?; if input_mana >= output_mana { - self.update_remainders()?; + should_recalculate |= self.update_remainders()?; } should_recalculate |= self.get_inputs_for_mana_balance()?; @@ -91,7 +89,7 @@ impl TransactionBuilder { return Ok(None); }; - if required_allotment.is_none() && !self.selected_inputs.is_empty() && self.all_outputs().next().is_some() { + if !self.selected_inputs.is_empty() && self.all_outputs().next().is_some() { let inputs = self .selected_inputs .sorted_iter() @@ -303,7 +301,10 @@ impl TransactionBuilder { pub(crate) fn mana_sums(&mut self, include_remainders: bool) -> Result<(u64, u64), TransactionBuilderError> { let allotments_sum = if let Some(MinManaAllotment { issuer_id, .. }) = self.min_mana_allotment { - let required_allotment = self.required_allotment()?.unwrap_or_default(); + let mut required_allotment = self.min_mana_allotment.and_then(|a| a.required_allotment); + if required_allotment.is_none() { + required_allotment = self.required_allotment()?; + } self.mana_allotments .iter() .filter_map(|(id, value)| (id != &issuer_id).then_some(value)) @@ -313,7 +314,7 @@ impl TransactionBuilder { .get(&issuer_id) .copied() .unwrap_or_default() - .max(required_allotment) + .max(required_allotment.unwrap_or_default()) } else { self.mana_allotments.values().sum::() };