@@ -2387,7 +2387,7 @@ bool CWallet::SelectCoinsMinConf(const CAmount& nTargetValue, const CoinEligibil
23872387 effective_feerate = coin_selection_params.effective_fee ;
23882388 }
23892389
2390- std::vector<OutputGroup> groups = GroupOutputs (coins, !coin_selection_params.m_avoid_partial_spends , eligibility_filter. max_ancestors , effective_feerate, long_term_feerate, eligibility_filter, true /* positive_only */ );
2390+ std::vector<OutputGroup> groups = GroupOutputs (coins, !coin_selection_params.m_avoid_partial_spends , effective_feerate, long_term_feerate, eligibility_filter, true /* positive_only */ );
23912391
23922392 // Calculate cost of change
23932393 CAmount cost_of_change = GetDiscardRate (*this ).GetFee (coin_selection_params.change_spend_size ) + coin_selection_params.effective_fee .GetFee (coin_selection_params.change_output_size );
@@ -2397,7 +2397,7 @@ bool CWallet::SelectCoinsMinConf(const CAmount& nTargetValue, const CoinEligibil
23972397 bnb_used = true ;
23982398 return SelectCoinsBnB (groups, nTargetValue, cost_of_change, setCoinsRet, nValueRet, not_input_fees);
23992399 } else {
2400- std::vector<OutputGroup> groups = GroupOutputs (coins, !coin_selection_params.m_avoid_partial_spends , eligibility_filter. max_ancestors , CFeeRate (0 ), CFeeRate (0 ), eligibility_filter, false /* positive_only */ );
2400+ std::vector<OutputGroup> groups = GroupOutputs (coins, !coin_selection_params.m_avoid_partial_spends , CFeeRate (0 ), CFeeRate (0 ), eligibility_filter, false /* positive_only */ );
24012401
24022402 bnb_used = false ;
24032403 return KnapsackSolver (nTargetValue, groups, setCoinsRet, nValueRet);
@@ -2489,8 +2489,8 @@ bool CWallet::SelectCoins(const std::vector<COutput>& vAvailableCoins, const CAm
24892489 (m_spend_zero_conf_change && SelectCoinsMinConf (value_to_select, CoinEligibilityFilter (0 , 1 , 2 ), vCoins, setCoinsRet, nValueRet, coin_selection_params, bnb_used)) ||
24902490 (m_spend_zero_conf_change && SelectCoinsMinConf (value_to_select, CoinEligibilityFilter (0 , 1 , std::min ((size_t )4 , max_ancestors/3 ), std::min ((size_t )4 , max_descendants/3 )), vCoins, setCoinsRet, nValueRet, coin_selection_params, bnb_used)) ||
24912491 (m_spend_zero_conf_change && SelectCoinsMinConf (value_to_select, CoinEligibilityFilter (0 , 1 , max_ancestors/2 , max_descendants/2 ), vCoins, setCoinsRet, nValueRet, coin_selection_params, bnb_used)) ||
2492- (m_spend_zero_conf_change && SelectCoinsMinConf (value_to_select, CoinEligibilityFilter (0 , 1 , max_ancestors-1 , max_descendants-1 ), vCoins, setCoinsRet, nValueRet, coin_selection_params, bnb_used)) ||
2493- (m_spend_zero_conf_change && !fRejectLongChains && SelectCoinsMinConf (value_to_select, CoinEligibilityFilter (0 , 1 , std::numeric_limits<uint64_t >::max ()), vCoins, setCoinsRet, nValueRet, coin_selection_params, bnb_used));
2492+ (m_spend_zero_conf_change && SelectCoinsMinConf (value_to_select, CoinEligibilityFilter (0 , 1 , max_ancestors-1 , max_descendants-1 , true /* include_partial_groups */ ), vCoins, setCoinsRet, nValueRet, coin_selection_params, bnb_used)) ||
2493+ (m_spend_zero_conf_change && !fRejectLongChains && SelectCoinsMinConf (value_to_select, CoinEligibilityFilter (0 , 1 , std::numeric_limits<uint64_t >::max (), std::numeric_limits< uint64_t >:: max (), true /* include_partial_groups */ ), vCoins, setCoinsRet, nValueRet, coin_selection_params, bnb_used));
24942494
24952495 // because SelectCoinsMinConf clears the setCoinsRet, we now add the possible inputs to the coinset
24962496 util::insert (setCoinsRet, setPresetCoins);
@@ -4193,7 +4193,7 @@ bool CWalletTx::IsImmatureCoinBase() const
41934193 return GetBlocksToMaturity () > 0 ;
41944194}
41954195
4196- std::vector<OutputGroup> CWallet::GroupOutputs (const std::vector<COutput>& outputs, bool single_coin, const size_t max_ancestors, const CFeeRate& effective_feerate, const CFeeRate& long_term_feerate, const CoinEligibilityFilter& filter, bool positive_only) const {
4196+ std::vector<OutputGroup> CWallet::GroupOutputs (const std::vector<COutput>& outputs, bool single_coin, const CFeeRate& effective_feerate, const CFeeRate& long_term_feerate, const CoinEligibilityFilter& filter, bool positive_only) const {
41974197 std::vector<OutputGroup> groups;
41984198 std::map<CTxDestination, OutputGroup> gmap;
41994199 std::set<CTxDestination> full_groups;
@@ -4235,9 +4235,9 @@ std::vector<OutputGroup> CWallet::GroupOutputs(const std::vector<COutput>& outpu
42354235 if (!single_coin) {
42364236 for (auto & it : gmap) {
42374237 auto & group = it.second ;
4238- if (full_groups.count (it.first ) > 0 ) {
4239- // Make this unattractive as we want coin selection to avoid it if possible
4240- group. m_ancestors = max_ancestors - 1 ;
4238+ if (full_groups.count (it.first ) > 0 && !filter. m_include_partial_groups ) {
4239+ // Don't include partial groups if we don't want them
4240+ continue ;
42414241 }
42424242 // If the OutputGroup is not eligible, don't add it
42434243 if (positive_only && group.effective_value <= 0 ) continue ;
0 commit comments