diff --git a/src/bench/coin_selection.cpp b/src/bench/coin_selection.cpp --- a/src/bench/coin_selection.cpp +++ b/src/bench/coin_selection.cpp @@ -47,8 +47,9 @@ std::set setCoinsRet; Amount nValueRet; - bool success = wallet.SelectCoinsMinConf(1003 * COIN, 1, 6, 0, vCoins, - setCoinsRet, nValueRet); + CoinEligibilityFilter filter_standard(1, 6, 0); + bool success = wallet.SelectCoinsMinConf( + 1003 * COIN, filter_standard, vCoins, setCoinsRet, nValueRet); assert(success); assert(nValueRet == 1003 * COIN); assert(setCoinsRet.size() == 2); diff --git a/src/wallet/test/wallet_tests.cpp b/src/wallet/test/wallet_tests.cpp --- a/src/wallet/test/wallet_tests.cpp +++ b/src/wallet/test/wallet_tests.cpp @@ -82,6 +82,10 @@ return ret.first == a.end() && ret.second == b.end(); } +CoinEligibilityFilter filter_standard(1, 6, 0); +CoinEligibilityFilter filter_confirmed(1, 1, 0); +CoinEligibilityFilter filter_standard_extra(6, 6, 0); + BOOST_AUTO_TEST_CASE(coin_selection_tests) { CoinSet setCoinsRet, setCoinsRet2; Amount nValueRet; @@ -94,29 +98,29 @@ empty_wallet(); // with an empty wallet we can't even pay one cent - BOOST_CHECK(!wallet.SelectCoinsMinConf(1 * CENT, 1, 6, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(!wallet.SelectCoinsMinConf(1 * CENT, filter_standard, + vCoins, setCoinsRet, nValueRet)); // add a new 1 cent coin add_coin(wallet, 1 * CENT, 4); // with a new 1 cent coin, we still can't find a mature 1 cent - BOOST_CHECK(!wallet.SelectCoinsMinConf(1 * CENT, 1, 6, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(!wallet.SelectCoinsMinConf(1 * CENT, filter_standard, + vCoins, setCoinsRet, nValueRet)); // but we can find a new 1 cent - BOOST_CHECK(wallet.SelectCoinsMinConf(1 * CENT, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(1 * CENT, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); BOOST_CHECK_EQUAL(nValueRet, 1 * CENT); // add a mature 2 cent coin add_coin(wallet, 2 * CENT); // we can't make 3 cents of mature coins - BOOST_CHECK(!wallet.SelectCoinsMinConf(3 * CENT, 1, 6, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(!wallet.SelectCoinsMinConf(3 * CENT, filter_standard, + vCoins, setCoinsRet, nValueRet)); // we can make 3 cents of new coins - BOOST_CHECK(wallet.SelectCoinsMinConf(3 * CENT, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(3 * CENT, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); BOOST_CHECK_EQUAL(nValueRet, 3 * CENT); // add a mature 5 cent coin, @@ -130,24 +134,24 @@ // 2+5+20=27. total = 38 // we can't make 38 cents only if we disallow new coins: - BOOST_CHECK(!wallet.SelectCoinsMinConf(38 * CENT, 1, 6, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(!wallet.SelectCoinsMinConf(38 * CENT, filter_standard, + vCoins, setCoinsRet, nValueRet)); // we can't even make 37 cents if we don't allow new coins even if // they're from us - BOOST_CHECK(!wallet.SelectCoinsMinConf(38 * CENT, 6, 6, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(!wallet.SelectCoinsMinConf(38 * CENT, filter_standard_extra, + vCoins, setCoinsRet, nValueRet)); // but we can make 37 cents if we accept new coins from ourself - BOOST_CHECK(wallet.SelectCoinsMinConf(37 * CENT, 1, 6, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(37 * CENT, filter_standard, + vCoins, setCoinsRet, nValueRet)); BOOST_CHECK_EQUAL(nValueRet, 37 * CENT); // and we can make 38 cents if we accept all new coins - BOOST_CHECK(wallet.SelectCoinsMinConf(38 * CENT, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(38 * CENT, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); BOOST_CHECK_EQUAL(nValueRet, 38 * CENT); // try making 34 cents from 1,2,5,10,20 - we can't do it exactly - BOOST_CHECK(wallet.SelectCoinsMinConf(34 * CENT, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(34 * CENT, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); // but 35 cents is closest BOOST_CHECK_EQUAL(nValueRet, 35 * CENT); // the best should be 20+10+5. it's incredibly unlikely the 1 or 2 got @@ -156,22 +160,22 @@ // when we try making 7 cents, the smaller coins (1,2,5) are enough. We // should see just 2+5 - BOOST_CHECK(wallet.SelectCoinsMinConf(7 * CENT, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(7 * CENT, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); BOOST_CHECK_EQUAL(nValueRet, 7 * CENT); BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U); // when we try making 8 cents, the smaller coins (1,2,5) are exactly // enough. - BOOST_CHECK(wallet.SelectCoinsMinConf(8 * CENT, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(8 * CENT, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); BOOST_CHECK(nValueRet == 8 * CENT); BOOST_CHECK_EQUAL(setCoinsRet.size(), 3U); // when we try making 9 cents, no subset of smaller coins is enough, and // we get the next bigger coin (10) - BOOST_CHECK(wallet.SelectCoinsMinConf(9 * CENT, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(9 * CENT, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); BOOST_CHECK_EQUAL(nValueRet, 10 * CENT); BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U); @@ -187,15 +191,15 @@ add_coin(wallet, 30 * CENT); // check that we have 71 and not 72 - BOOST_CHECK(wallet.SelectCoinsMinConf(71 * CENT, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); - BOOST_CHECK(!wallet.SelectCoinsMinConf(72 * CENT, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(71 * CENT, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); + BOOST_CHECK(!wallet.SelectCoinsMinConf(72 * CENT, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); // now try making 16 cents. the best smaller coins can do is 6+7+8 = // 21; not as good at the next biggest coin, 20 - BOOST_CHECK(wallet.SelectCoinsMinConf(16 * CENT, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(16 * CENT, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); // we should get 20 in one coin BOOST_CHECK_EQUAL(nValueRet, 20 * CENT); BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U); @@ -205,8 +209,8 @@ // now if we try making 16 cents again, the smaller coins can make 5+6+7 // = 18 cents, better than the next biggest coin, 20 - BOOST_CHECK(wallet.SelectCoinsMinConf(16 * CENT, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(16 * CENT, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); // we should get 18 in 3 coins BOOST_CHECK_EQUAL(nValueRet, 18 * CENT); BOOST_CHECK_EQUAL(setCoinsRet.size(), 3U); @@ -216,16 +220,16 @@ // and now if we try making 16 cents again, the smaller coins can make // 5+6+7 = 18 cents, the same as the next biggest coin, 18 - BOOST_CHECK(wallet.SelectCoinsMinConf(16 * CENT, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(16 * CENT, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); // we should get 18 in 1 coin BOOST_CHECK_EQUAL(nValueRet, 18 * CENT); // because in the event of a tie, the biggest coin wins BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U); // now try making 11 cents. we should get 5+6 - BOOST_CHECK(wallet.SelectCoinsMinConf(11 * CENT, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(11 * CENT, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); BOOST_CHECK_EQUAL(nValueRet, 11 * CENT); BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U); @@ -235,14 +239,14 @@ add_coin(wallet, 3 * COIN); // now we have 5+6+7+8+18+20+30+100+200+300+400 = 1094 cents add_coin(wallet, 4 * COIN); - BOOST_CHECK(wallet.SelectCoinsMinConf(95 * CENT, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(95 * CENT, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); // we should get 1 BCH in 1 coin BOOST_CHECK_EQUAL(nValueRet, 1 * COIN); BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U); - BOOST_CHECK(wallet.SelectCoinsMinConf(195 * CENT, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(195 * CENT, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); // we should get 2 BCH in 1 coin BOOST_CHECK_EQUAL(nValueRet, 2 * COIN); BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U); @@ -260,16 +264,16 @@ // try making 1 * MIN_CHANGE from the 1.5 * MIN_CHANGE we'll get change // smaller than MIN_CHANGE whatever happens, so can expect MIN_CHANGE // exactly - BOOST_CHECK(wallet.SelectCoinsMinConf(MIN_CHANGE, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(MIN_CHANGE, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); BOOST_CHECK_EQUAL(nValueRet, MIN_CHANGE); // but if we add a bigger coin, small change is avoided add_coin(wallet, 1111 * MIN_CHANGE); // try making 1 from 0.1 + 0.2 + 0.3 + 0.4 + 0.5 + 1111 = 1112.5 - BOOST_CHECK(wallet.SelectCoinsMinConf(1 * MIN_CHANGE, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(1 * MIN_CHANGE, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); // we should get the exact amount BOOST_CHECK_EQUAL(nValueRet, 1 * MIN_CHANGE); @@ -278,8 +282,8 @@ add_coin(wallet, 7 * MIN_CHANGE / 10); // and try again to make 1.0 * MIN_CHANGE - BOOST_CHECK(wallet.SelectCoinsMinConf(1 * MIN_CHANGE, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(1 * MIN_CHANGE, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); // we should get the exact amount BOOST_CHECK_EQUAL(nValueRet, 1 * MIN_CHANGE); @@ -292,8 +296,8 @@ add_coin(wallet, 50000 * COIN); } - BOOST_CHECK(wallet.SelectCoinsMinConf(500000 * COIN, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(500000 * COIN, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); // we should get the exact amount BOOST_CHECK_EQUAL(nValueRet, 500000 * COIN); // in ten coins @@ -309,8 +313,8 @@ add_coin(wallet, 6 * MIN_CHANGE / 10); add_coin(wallet, 7 * MIN_CHANGE / 10); add_coin(wallet, 1111 * MIN_CHANGE); - BOOST_CHECK(wallet.SelectCoinsMinConf(1 * MIN_CHANGE, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(1 * MIN_CHANGE, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); // we get the bigger coin BOOST_CHECK_EQUAL(nValueRet, 1111 * MIN_CHANGE); BOOST_CHECK_EQUAL(setCoinsRet.size(), 1U); @@ -322,8 +326,8 @@ add_coin(wallet, 6 * MIN_CHANGE / 10); add_coin(wallet, 8 * MIN_CHANGE / 10); add_coin(wallet, 1111 * MIN_CHANGE); - BOOST_CHECK(wallet.SelectCoinsMinConf(MIN_CHANGE, 1, 1, 0, vCoins, - setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(MIN_CHANGE, filter_confirmed, + vCoins, setCoinsRet, nValueRet)); // we should get the exact amount BOOST_CHECK_EQUAL(nValueRet, MIN_CHANGE); // in two coins 0.4+0.6 @@ -336,16 +340,18 @@ add_coin(wallet, 100 * MIN_CHANGE); // trying to make 100.01 from these three coins - BOOST_CHECK(wallet.SelectCoinsMinConf(10001 * MIN_CHANGE / 100, 1, 1, 0, - vCoins, setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(10001 * MIN_CHANGE / 100, + filter_confirmed, vCoins, + setCoinsRet, nValueRet)); // we should get all coins BOOST_CHECK_EQUAL(nValueRet, 10105 * MIN_CHANGE / 100); BOOST_CHECK_EQUAL(setCoinsRet.size(), 3U); // but if we try to make 99.9, we should take the bigger of the two // small coins to avoid small change - BOOST_CHECK(wallet.SelectCoinsMinConf(9990 * MIN_CHANGE / 100, 1, 1, 0, - vCoins, setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(9990 * MIN_CHANGE / 100, + filter_confirmed, vCoins, + setCoinsRet, nValueRet)); BOOST_CHECK_EQUAL(nValueRet, 101 * MIN_CHANGE); BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U); @@ -357,8 +363,9 @@ for (uint16_t j = 0; j < 676; j++) { add_coin(wallet, amt); } - BOOST_CHECK(wallet.SelectCoinsMinConf( - 2000 * SATOSHI, 1, 1, 0, vCoins, setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(2000 * SATOSHI, + filter_confirmed, vCoins, + setCoinsRet, nValueRet)); if (amt - 2000 * SATOSHI < MIN_CHANGE) { // needs more than one input: uint16_t returnSize = std::ceil( @@ -382,10 +389,10 @@ // picking 50 from 100 coins doesn't depend on the shuffle, but does // depend on randomness in the stochastic approximation code - BOOST_CHECK(wallet.SelectCoinsMinConf(50 * COIN, 1, 6, 0, vCoins, - setCoinsRet, nValueRet)); - BOOST_CHECK(wallet.SelectCoinsMinConf(50 * COIN, 1, 6, 0, vCoins, - setCoinsRet2, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf( + 50 * COIN, filter_standard, vCoins, setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf( + 50 * COIN, filter_standard, vCoins, setCoinsRet2, nValueRet)); BOOST_CHECK(!equal_sets(setCoinsRet, setCoinsRet2)); int fails = 0; @@ -393,10 +400,10 @@ // selecting 1 from 100 identical coins depends on the shuffle; // this test will fail 1% of the time run the test // RANDOM_REPEATS times and only complain if all of them fail - BOOST_CHECK(wallet.SelectCoinsMinConf(COIN, 1, 6, 0, vCoins, - setCoinsRet, nValueRet)); - BOOST_CHECK(wallet.SelectCoinsMinConf(COIN, 1, 6, 0, vCoins, - setCoinsRet2, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf( + COIN, filter_standard, vCoins, setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf( + COIN, filter_standard, vCoins, setCoinsRet2, nValueRet)); if (equal_sets(setCoinsRet, setCoinsRet2)) { fails++; } @@ -417,10 +424,12 @@ // selecting 1 from 100 identical coins depends on the shuffle; // this test will fail 1% of the time run the test // RANDOM_REPEATS times and only complain if all of them fail - BOOST_CHECK(wallet.SelectCoinsMinConf( - 90 * CENT, 1, 6, 0, vCoins, setCoinsRet, nValueRet)); - BOOST_CHECK(wallet.SelectCoinsMinConf( - 90 * CENT, 1, 6, 0, vCoins, setCoinsRet2, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(90 * CENT, + filter_standard, vCoins, + setCoinsRet, nValueRet)); + BOOST_CHECK(wallet.SelectCoinsMinConf(90 * CENT, + filter_standard, vCoins, + setCoinsRet2, nValueRet)); if (equal_sets(setCoinsRet, setCoinsRet2)) { fails++; } @@ -446,7 +455,7 @@ } add_coin(wallet, 3 * COIN); - BOOST_CHECK(wallet.SelectCoinsMinConf(1003 * COIN, 1, 6, 0, vCoins, + BOOST_CHECK(wallet.SelectCoinsMinConf(1003 * COIN, filter_standard, vCoins, setCoinsRet, nValueRet)); BOOST_CHECK_EQUAL(nValueRet, 1003 * COIN); BOOST_CHECK_EQUAL(setCoinsRet.size(), 2U); diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -650,8 +650,20 @@ std::vector _ssExtra; }; +struct CoinEligibilityFilter { + const int conf_mine; + const int conf_theirs; + const uint64_t max_ancestors; + + CoinEligibilityFilter(int conf_mine_, int conf_theirs_, + uint64_t max_ancestors_) + : conf_mine(conf_mine_), conf_theirs(conf_theirs_), + max_ancestors(max_ancestors_) {} +}; + // forward declarations for ScanForWalletTransactions/RescanFromTime class WalletRescanReserver; + /** * A CWallet is an extension of a keystore, which also maintains a set of * transactions and balances, and provides the ability to create new @@ -878,8 +890,8 @@ * completion the coin set and corresponding actual target value is * assembled. */ - bool SelectCoinsMinConf(const Amount nTargetValue, int nConfMine, - int nConfTheirs, uint64_t nMaxAncestors, + bool SelectCoinsMinConf(const Amount nTargetValue, + const CoinEligibilityFilter &eligibilty_filter, std::vector vCoins, std::set &setCoinsRet, Amount &nValueRet) const; @@ -1262,9 +1274,9 @@ OutputType); /** Whether a given output is spendable by this wallet */ - bool OutputEligibleForSpending(const COutput &output, const int nConfMine, - const int nConfTheirs, - const uint64_t nMaxAncestors) const; + bool OutputEligibleForSpending( + const COutput &output, + const CoinEligibilityFilter &eligibilty_filter) const; }; /** A key allocated from the key pool. */ diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2556,30 +2556,29 @@ } } -bool CWallet::OutputEligibleForSpending(const COutput &output, - const int nConfMine, - const int nConfTheirs, - const uint64_t nMaxAncestors) const { +bool CWallet::OutputEligibleForSpending( + const COutput &output, + const CoinEligibilityFilter &eligibilty_filter) const { if (!output.fSpendable) { return false; } - if (output.nDepth < - (output.tx->IsFromMe(ISMINE_ALL) ? nConfMine : nConfTheirs)) { + if (output.nDepth < (output.tx->IsFromMe(ISMINE_ALL) + ? eligibilty_filter.conf_mine + : eligibilty_filter.conf_theirs)) { return false; } - if (!g_mempool.TransactionWithinChainLimit(output.tx->GetId(), - nMaxAncestors)) { + if (!g_mempool.TransactionWithinChainLimit( + output.tx->GetId(), eligibilty_filter.max_ancestors)) { return false; } return true; } -bool CWallet::SelectCoinsMinConf(const Amount nTargetValue, const int nConfMine, - const int nConfTheirs, - const uint64_t nMaxAncestors, +bool CWallet::SelectCoinsMinConf(const Amount nTargetValue, + const CoinEligibilityFilter &eligibilty_filter, std::vector vCoins, std::set &setCoinsRet, Amount &nValueRet) const { @@ -2594,8 +2593,7 @@ random_shuffle(vCoins.begin(), vCoins.end(), GetRandInt); for (const COutput &output : vCoins) { - if (!OutputEligibleForSpending(output, nConfMine, nConfTheirs, - nMaxAncestors)) { + if (!OutputEligibleForSpending(output, eligibilty_filter)) { continue; } @@ -2743,28 +2741,34 @@ bool res = nTargetValue <= nValueFromPresetInputs || - SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 1, 6, 0, - vCoins, setCoinsRet, nValueRet) || - SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 1, 1, 0, - vCoins, setCoinsRet, nValueRet) || + SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, + CoinEligibilityFilter(1, 6, 0), vCoins, setCoinsRet, + nValueRet) || + SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, + CoinEligibilityFilter(1, 1, 0), vCoins, setCoinsRet, + nValueRet) || (bSpendZeroConfChange && - SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 0, 1, 2, - vCoins, setCoinsRet, nValueRet)) || + SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, + CoinEligibilityFilter(0, 1, 2), vCoins, setCoinsRet, + nValueRet)) || (bSpendZeroConfChange && - SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 0, 1, - std::min((size_t)4, nMaxChainLength / 3), vCoins, - setCoinsRet, nValueRet)) || + SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, + CoinEligibilityFilter( + 0, 1, std::min(4, nMaxChainLength / 3)), + vCoins, setCoinsRet, nValueRet)) || (bSpendZeroConfChange && - SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 0, 1, - nMaxChainLength / 2, vCoins, setCoinsRet, - nValueRet)) || + SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, + CoinEligibilityFilter(0, 1, nMaxChainLength / 2), + vCoins, setCoinsRet, nValueRet)) || (bSpendZeroConfChange && - SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 0, 1, - nMaxChainLength, vCoins, setCoinsRet, nValueRet)) || + SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, + CoinEligibilityFilter(0, 1, nMaxChainLength), + vCoins, setCoinsRet, nValueRet)) || (bSpendZeroConfChange && !fRejectLongChains && - SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 0, 1, - std::numeric_limits::max(), vCoins, - setCoinsRet, nValueRet)); + SelectCoinsMinConf( + nTargetValue - nValueFromPresetInputs, + CoinEligibilityFilter(0, 1, std::numeric_limits::max()), + vCoins, setCoinsRet, nValueRet)); // Because SelectCoinsMinConf clears the setCoinsRet, we now add the // possible inputs to the coinset.