aboutsummaryrefslogtreecommitdiff
path: root/src/wallet/coinselection.cpp
diff options
context:
space:
mode:
authorAndrew Chow <achow101-github@achow101.com>2020-11-16 14:24:08 -0500
committerAndrew Chow <achow101-github@achow101.com>2021-12-05 13:39:41 -0500
commit9d1d86da04d5d4768975338841285e90b01130b8 (patch)
tree84a0313cb6ea9ca5f5dc6bf173d08f5e57917a6f /src/wallet/coinselection.cpp
parent94d851d28cb909a8f1f8ab795f1d9fc74bebfc7f (diff)
downloadbitcoin-9d1d86da04d5d4768975338841285e90b01130b8.tar.xz
Introduce SelectionResult struct
Introduces a SelectionResult struct which contains the set of selected inputs and the total transaction fee for the transaction. This will be used by the various SelectCoins* functions. Additionally helpers are provided to compute the total input value and result comparisons.
Diffstat (limited to 'src/wallet/coinselection.cpp')
-rw-r--r--src/wallet/coinselection.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/wallet/coinselection.cpp b/src/wallet/coinselection.cpp
index e1ca3fb379..bfe3074944 100644
--- a/src/wallet/coinselection.cpp
+++ b/src/wallet/coinselection.cpp
@@ -395,3 +395,50 @@ CAmount GetSelectionWaste(const std::set<CInputCoin>& inputs, CAmount change_cos
return waste;
}
+
+void SelectionResult::ComputeAndSetWaste(CAmount change_cost)
+{
+ m_waste = GetSelectionWaste(m_selected_inputs, change_cost, m_target, m_use_effective);
+}
+
+CAmount SelectionResult::GetWaste() const
+{
+ Assume(m_waste != std::nullopt);
+ return *m_waste;
+}
+
+CAmount SelectionResult::GetSelectedValue() const
+{
+ return std::accumulate(m_selected_inputs.cbegin(), m_selected_inputs.cend(), CAmount{0}, [](CAmount sum, const auto& coin) { return sum + coin.txout.nValue; });
+}
+
+void SelectionResult::Clear()
+{
+ m_selected_inputs.clear();
+ m_waste.reset();
+}
+
+void SelectionResult::AddInput(const OutputGroup& group)
+{
+ util::insert(m_selected_inputs, group.m_outputs);
+}
+
+const std::set<CInputCoin>& SelectionResult::GetInputSet() const
+{
+ return m_selected_inputs;
+}
+
+std::vector<CInputCoin> SelectionResult::GetShuffledInputVector() const
+{
+ std::vector<CInputCoin> coins(m_selected_inputs.begin(), m_selected_inputs.end());
+ Shuffle(coins.begin(), coins.end(), FastRandomContext());
+ return coins;
+}
+
+bool SelectionResult::operator<(SelectionResult other) const
+{
+ Assume(m_waste != std::nullopt);
+ Assume(other.m_waste != std::nullopt);
+ // As this operator is only used in std::min_element, we want the result that has more inputs when waste are equal.
+ return *m_waste < *other.m_waste || (*m_waste == *other.m_waste && m_selected_inputs.size() > other.m_selected_inputs.size());
+}