diff --git a/src/wallet/mod.rs b/src/wallet/mod.rs index ef36a555..ba4100e3 100644 --- a/src/wallet/mod.rs +++ b/src/wallet/mod.rs @@ -1015,16 +1015,11 @@ where } // otherwise limit ourselves to the spendable utxos for the selected policy, and the `send_all` setting None => { - let utxos = self.list_unspent()?.into_iter(); - let utxos = change_policy.filter_utxos(utxos).into_iter(); + let utxos = self.list_unspent()?.into_iter().filter(|u| { + change_policy.is_satisfied_by(u) && !unspendable_set.contains(&u.outpoint) + }); - Ok(( - utxos - .filter(|u| !unspendable_set.contains(&u.outpoint)) - .map(add_weight) - .collect(), - send_all, - )) + Ok((utxos.map(add_weight).collect(), send_all)) } } } diff --git a/src/wallet/tx_builder.rs b/src/wallet/tx_builder.rs index aca6fc6f..65171c3e 100644 --- a/src/wallet/tx_builder.rs +++ b/src/wallet/tx_builder.rs @@ -397,11 +397,11 @@ impl Default for ChangeSpendPolicy { } impl ChangeSpendPolicy { - pub(crate) fn filter_utxos>(&self, iter: I) -> Vec { + pub(crate) fn is_satisfied_by(&self, utxo: &UTXO) -> bool { match self { - ChangeSpendPolicy::ChangeAllowed => iter.collect(), - ChangeSpendPolicy::OnlyChange => iter.filter(|utxo| utxo.is_internal).collect(), - ChangeSpendPolicy::ChangeForbidden => iter.filter(|utxo| !utxo.is_internal).collect(), + ChangeSpendPolicy::ChangeAllowed => true, + ChangeSpendPolicy::OnlyChange => utxo.is_internal, + ChangeSpendPolicy::ChangeForbidden => !utxo.is_internal, } } } @@ -512,7 +512,10 @@ mod test { #[test] fn test_change_spend_policy_default() { let change_spend_policy = ChangeSpendPolicy::default(); - let filtered = change_spend_policy.filter_utxos(get_test_utxos().into_iter()); + let filtered = get_test_utxos() + .into_iter() + .filter(|u| change_spend_policy.is_satisfied_by(u)) + .collect::>(); assert_eq!(filtered.len(), 2); } @@ -520,7 +523,10 @@ mod test { #[test] fn test_change_spend_policy_no_internal() { let change_spend_policy = ChangeSpendPolicy::ChangeForbidden; - let filtered = change_spend_policy.filter_utxos(get_test_utxos().into_iter()); + let filtered = get_test_utxos() + .into_iter() + .filter(|u| change_spend_policy.is_satisfied_by(u)) + .collect::>(); assert_eq!(filtered.len(), 1); assert_eq!(filtered[0].is_internal, false); @@ -529,7 +535,10 @@ mod test { #[test] fn test_change_spend_policy_only_internal() { let change_spend_policy = ChangeSpendPolicy::OnlyChange; - let filtered = change_spend_policy.filter_utxos(get_test_utxos().into_iter()); + let filtered = get_test_utxos() + .into_iter() + .filter(|u| change_spend_policy.is_satisfied_by(u)) + .collect::>(); assert_eq!(filtered.len(), 1); assert_eq!(filtered[0].is_internal, true);