diff --git a/src/wallet/test/coinselector_tests.cpp b/src/wallet/test/coinselector_tests.cpp --- a/src/wallet/test/coinselector_tests.cpp +++ b/src/wallet/test/coinselector_tests.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -54,9 +55,8 @@ set.emplace(MakeTransactionRef(tx), nInput); } -static void add_coin(const CWallet &wallet, const Amount nValue, - int nAge = 6 * 24, bool fIsFromMe = false, - int nInput = 0) { +static void add_coin(CWallet &wallet, const Amount nValue, int nAge = 6 * 24, + bool fIsFromMe = false, int nInput = 0) { balance += nValue; static int nextLockTime = 0; CMutableTransaction tx; @@ -79,6 +79,7 @@ COutput output(wtx.get(), nInput, nAge, true /* spendable */, true /* solvable */, true /* safe */); vCoins.push_back(output); + wallet.AddToWallet(*wtx.get()); wtxn.emplace_back(std::move(wtx)); } @@ -247,6 +248,20 @@ BOOST_CHECK(!m_wallet.SelectCoinsMinConf( 1 * CENT, filter_standard, vCoins, setCoinsRet, nValueRet, coin_selection_params_bnb, bnb_used)); + + // Make sure that we aren't using BnB when there are preset inputs + empty_wallet(); + add_coin(m_wallet, 5 * CENT); + add_coin(m_wallet, 3 * CENT); + add_coin(m_wallet, 2 * CENT); + CCoinControl coin_control; + coin_control.fAllowOtherInputs = true; + coin_control.Select(COutPoint(vCoins.at(0).tx->GetId(), vCoins.at(0).i)); + BOOST_CHECK(m_wallet.SelectCoins(vCoins, 10 * CENT, setCoinsRet, nValueRet, + coin_control, coin_selection_params_bnb, + bnb_used)); + BOOST_CHECK(!bnb_used); + BOOST_CHECK(!coin_selection_params_bnb.use_bnb); } BOOST_AUTO_TEST_CASE(knapsack_solver_test) { diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -667,18 +667,6 @@ std::mutex mutexScanning; friend class WalletRescanReserver; - /** - * Select a set of coins such that nValueRet >= nTargetValue and at least - * all coins from coinControl are selected; Never select unconfirmed coins - * if they are not ours. - */ - bool SelectCoins(const std::vector &vAvailableCoins, - const Amount nTargetValue, - std::set &setCoinsRet, Amount &nValueRet, - const CCoinControl &coin_control, - const CoinSelectionParams &coin_selection_params, - bool &bnb_used) const; - CWalletDB *pwalletdbEncryption; //! the current wallet version: clients below this version are not able to @@ -780,6 +768,18 @@ */ CWalletDBWrapper &GetDBHandle() { return *dbw; } + /** + * Select a set of coins such that nValueRet >= nTargetValue and at least + * all coins from coinControl are selected; Never select unconfirmed coins + * if they are not ours. + */ + bool SelectCoins(const std::vector &vAvailableCoins, + const Amount nTargetValue, + std::set &setCoinsRet, Amount &nValueRet, + const CCoinControl &coin_control, + CoinSelectionParams &coin_selection_params, + bool &bnb_used) const; + /** * Get a name for this wallet for logging/debugging purposes. */ diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2668,7 +2668,7 @@ const Amount nTargetValue, std::set &setCoinsRet, Amount &nValueRet, const CCoinControl &coin_control, - const CoinSelectionParams &coin_selection_params, + CoinSelectionParams &coin_selection_params, bool &bnb_used) const { std::vector vCoins(vAvailableCoins); @@ -2701,6 +2701,7 @@ // For now, don't use BnB if preset inputs are selected. TODO: Enable // this later bnb_used = false; + coin_selection_params.use_bnb = false; std::map::const_iterator it = mapWallet.find(outpoint.GetTxId());