}
// 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();
-
- Ok((
- utxos
- .filter(|u| !unspendable_set.contains(&u.outpoint))
- .map(add_weight)
- .collect(),
- send_all,
- ))
+ let utxos = self.list_unspent()?.into_iter().filter(|u| {
+ change_policy.is_satisfied_by(u) && !unspendable_set.contains(&u.outpoint)
+ });
+
+ Ok((utxos.map(add_weight).collect(), send_all))
}
}
}
}
impl ChangeSpendPolicy {
- pub(crate) fn filter_utxos<I: Iterator<Item = UTXO>>(&self, iter: I) -> Vec<UTXO> {
+ 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,
}
}
}
#[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::<Vec<_>>();
assert_eq!(filtered.len(), 2);
}
#[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::<Vec<_>>();
assert_eq!(filtered.len(), 1);
assert_eq!(filtered[0].is_internal, false);
#[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::<Vec<_>>();
assert_eq!(filtered.len(), 1);
assert_eq!(filtered[0].is_internal, true);