From 89c1491d35389eac0c1fecc59333cdfae3b1bd2c Mon Sep 17 00:00:00 2001 From: furszy Date: Thu, 8 Dec 2022 15:55:41 -0300 Subject: [PATCH] wallet: if only have one output type, don't perform "mixed" coin selection there is nothing to mix. --- src/wallet/spend.cpp | 5 +++-- src/wallet/spend.h | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/wallet/spend.cpp b/src/wallet/spend.cpp index 3ced3ebeb54..d4148037d27 100644 --- a/src/wallet/spend.cpp +++ b/src/wallet/spend.cpp @@ -524,8 +524,9 @@ std::optional AttemptSelection(const CWallet& wallet, const CAm if (results.size() > 0) return *std::min_element(results.begin(), results.end()); // If we can't fund the transaction from any individual OutputType, run coin selection one last time - // over all available coins, which would allow mixing - if (allow_mixed_output_types) { + // over all available coins, which would allow mixing. + // If TypesCount() <= 1, there is nothing to mix. + if (allow_mixed_output_types && available_coins.TypesCount() > 1) { if (auto result{ChooseSelectionResult(wallet, nTargetValue, eligibility_filter, available_coins.All(), coin_selection_params)}) { return result; } diff --git a/src/wallet/spend.h b/src/wallet/spend.h index 2b861c23616..46144d4c92d 100644 --- a/src/wallet/spend.h +++ b/src/wallet/spend.h @@ -46,6 +46,8 @@ struct CoinsResult { /** The following methods are provided so that CoinsResult can mimic a vector, * i.e., methods can work with individual OutputType vectors or on the entire object */ size_t Size() const; + /** Return how many different output types this struct stores */ + size_t TypesCount() const { return coins.size(); } void Clear(); void Erase(const std::unordered_set& coins_to_remove); void Shuffle(FastRandomContext& rng_fast);