From f8e796348b644c011ad9a8312356d4426c16cc4b Mon Sep 17 00:00:00 2001 From: S3RK <1466284+S3RK@users.noreply.github.com> Date: Wed, 6 Jul 2022 09:18:17 +0200 Subject: [PATCH] wallet: add SelectionResult::Merge --- src/wallet/coinselection.cpp | 10 ++++++++++ src/wallet/coinselection.h | 15 ++++++++++----- src/wallet/spend.cpp | 4 ++-- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/wallet/coinselection.cpp b/src/wallet/coinselection.cpp index 0f2e57f9a1..a61921f69f 100644 --- a/src/wallet/coinselection.cpp +++ b/src/wallet/coinselection.cpp @@ -433,6 +433,16 @@ void SelectionResult::AddInput(const OutputGroup& group) m_use_effective = !group.m_subtract_fee_outputs; } +void SelectionResult::Merge(const SelectionResult& other) +{ + m_target += other.m_target; + m_use_effective |= other.m_use_effective; + if (m_algo == SelectionAlgorithm::MANUAL) { + m_algo = other.m_algo; + } + util::insert(m_selected_inputs, other.m_selected_inputs); +} + const std::set& SelectionResult::GetInputSet() const { return m_selected_inputs; diff --git a/src/wallet/coinselection.h b/src/wallet/coinselection.h index 191476779f..fa24fec6e9 100644 --- a/src/wallet/coinselection.h +++ b/src/wallet/coinselection.h @@ -281,17 +281,16 @@ struct SelectionResult private: /** Set of inputs selected by the algorithm to use in the transaction */ std::set m_selected_inputs; + /** The target the algorithm selected for. Equal to the recipient amount plus non-input fees */ + CAmount m_target; + /** The algorithm used to produce this result */ + SelectionAlgorithm m_algo; /** Whether the input values for calculations should be the effective value (true) or normal value (false) */ bool m_use_effective{false}; /** The computed waste */ std::optional m_waste; public: - /** The target the algorithm selected for. Note that this may not be equal to the recipient amount as it can include non-input fees */ - const CAmount m_target; - /** The algorithm used to produce this result */ - const SelectionAlgorithm m_algo; - explicit SelectionResult(const CAmount target, SelectionAlgorithm algo) : m_target(target), m_algo(algo) {} @@ -308,12 +307,18 @@ public: void ComputeAndSetWaste(CAmount change_cost); [[nodiscard]] CAmount GetWaste() const; + void Merge(const SelectionResult& other); + /** Get m_selected_inputs */ const std::set& GetInputSet() const; /** Get the vector of COutputs that will be used to fill in a CTransaction's vin */ std::vector GetShuffledInputVector() const; bool operator<(SelectionResult other) const; + + CAmount GetTarget() const { return m_target; } + + SelectionAlgorithm GetAlgo() const { return m_algo; } }; std::optional SelectCoinsBnB(std::vector& utxo_pool, const CAmount& selection_target, const CAmount& cost_of_change); diff --git a/src/wallet/spend.cpp b/src/wallet/spend.cpp index aed6dc89d2..223377cf0e 100644 --- a/src/wallet/spend.cpp +++ b/src/wallet/spend.cpp @@ -667,7 +667,7 @@ std::optional SelectCoins(const CWallet& wallet, CoinsResult& a // Add preset inputs to result res->AddInput(preset_inputs); - if (res->m_algo == SelectionAlgorithm::MANUAL) { + if (res->GetAlgo() == SelectionAlgorithm::MANUAL) { res->ComputeAndSetWaste(coin_selection_params.m_cost_of_change); } @@ -890,7 +890,7 @@ static util::Result CreateTransactionInternal( if (!result) { return util::Error{_("Insufficient funds")}; } - TRACE5(coin_selection, selected_coins, wallet.GetName().c_str(), GetAlgorithmName(result->m_algo).c_str(), result->m_target, result->GetWaste(), result->GetSelectedValue()); + TRACE5(coin_selection, selected_coins, wallet.GetName().c_str(), GetAlgorithmName(result->GetAlgo()).c_str(), result->GetTarget(), result->GetWaste(), result->GetSelectedValue()); // Always make a change output // We will reduce the fee from this change output later, and remove the output if it is too small.