9 #include <test/util/setup_common.h> 15 #include <boost/test/unit_test.hpp> 25 #define RANDOM_REPEATS 5 43 static void add_coin(
const CAmount& nValue,
int nInput, std::vector<CInputCoin>&
set)
46 tx.
vout.resize(nInput + 1);
47 tx.
vout[nInput].nValue = nValue;
54 tx.
vout.resize(nInput + 1);
55 tx.
vout[nInput].nValue = nValue;
62 static int nextLockTime = 0;
65 tx.
vout.resize(nInput + 1);
66 tx.
vout[nInput].nValue = nValue;
85 COutput output(wtx, nInput, nAge,
true ,
true ,
true );
88 static void add_coin(
const CAmount& nValue,
int nAge = 6*24,
bool fIsFromMe =
false,
int nInput=0,
bool spendable =
false)
101 std::pair<CoinSet::iterator, CoinSet::iterator> ret = mismatch(a.begin(), a.end(), b.begin());
102 return ret.first == a.end() && ret.second == b.end();
109 for (
int i = 0; i < utxos; ++i) {
110 target += (
CAmount)1 << (utxos+i);
117 inline std::vector<OutputGroup>&
GroupCoins(
const std::vector<CInputCoin>& coins)
119 static std::vector<OutputGroup> static_groups;
120 static_groups.clear();
121 for (
auto& coin : coins) {
122 static_groups.emplace_back();
123 static_groups.back().Insert(coin, 0,
true, 0, 0,
false);
125 return static_groups;
128 inline std::vector<OutputGroup>&
GroupCoins(
const std::vector<COutput>& coins)
130 static std::vector<OutputGroup> static_groups;
131 static_groups.clear();
132 for (
auto& coin : coins) {
133 static_groups.emplace_back();
136 return static_groups;
147 std::vector<CInputCoin> utxo_pool;
167 add_coin(1 * CENT, 1, actual_selection);
171 actual_selection.clear();
175 add_coin(2 * CENT, 2, actual_selection);
179 actual_selection.clear();
183 add_coin(4 * CENT, 4, actual_selection);
184 add_coin(1 * CENT, 1, actual_selection);
188 actual_selection.clear();
193 actual_selection.clear();
197 add_coin(1 * CENT, 1, actual_selection);
201 actual_selection.clear();
206 actual_selection.clear();
211 add_coin(5 * CENT, 5, actual_selection);
212 add_coin(4 * CENT, 4, actual_selection);
213 add_coin(1 * CENT, 1, actual_selection);
217 actual_selection.clear();
222 add_coin(5 * CENT, 5, actual_selection);
223 add_coin(3 * CENT, 3, actual_selection);
224 add_coin(2 * CENT, 2, actual_selection);
232 actual_selection.clear();
243 add_coin(7 * CENT, 7, actual_selection);
244 add_coin(7 * CENT, 7, actual_selection);
245 add_coin(7 * CENT, 7, actual_selection);
246 add_coin(7 * CENT, 7, actual_selection);
247 add_coin(2 * CENT, 7, actual_selection);
253 for (
int i = 0; i < 50000; ++i) {
265 for (
int i = 5; i <= 20; ++i) {
269 for (
int i = 0; i < 100; ++i) {
282 vCoins.at(0).nInputBytes = 40;
288 vCoins.at(0).nInputBytes = 40;
298 wallet->SetupLegacyScriptPubKeyMan();
307 BOOST_CHECK(
wallet->SelectCoins(
vCoins, 10 * CENT, setCoinsRet, nValueRet, coin_control, coin_selection_params_bnb));
313 CoinSet setCoinsRet, setCoinsRet2;
464 for (
int j = 0; j < 20; j++)
515 for (uint16_t j = 0; j < 676; j++)
524 uint16_t returnSize = std::ceil((2000.0 +
MIN_CHANGE)/amt);
525 CAmount returnValue = amt * returnSize;
539 for (
int i2 = 0; i2 < 100; i2++)
601 for (
int i = 0; i < 1000; i++)
619 std::default_random_engine generator;
620 std::exponential_distribution<double> distribution (100);
624 for (
int i = 0; i < 100; ++i)
629 for (
int j = 0; j < 1000; ++j)
649 BOOST_CHECK_GE(out_value, target);
static CAmount make_hard_case(int utxos, std::vector< CInputCoin > &utxo_pool)
void SetupLegacyScriptPubKeyMan()
Make a LegacyScriptPubKeyMan and set it for all types, internal, and external.
std::unique_ptr< WalletDatabase > CreateMockWalletDatabase()
Return object for accessing temporary in-memory database.
std::set< CInputCoin > CoinSet
bool m_is_cache_empty
This flag is true if all m_amounts caches are empty.
CFeeRate m_effective_feerate
The targeted feerate of the transaction being built.
static bool equal_sets(CoinSet a, CoinSet b)
static const CAmount COIN
static void empty_wallet(void)
std::unique_ptr< interfaces::Chain > chain
CoinEligibilityFilter filter_standard(1, 6, 0)
static constexpr CAmount MIN_CHANGE
target minimum change amount
static void add_coin(const CAmount &nValue, int nInput, std::vector< CInputCoin > &set)
static NodeContext testNode
BOOST_AUTO_TEST_CASE(bnb_search_test)
std::unique_ptr< Chain > MakeChain(NodeContext &node)
Return implementation of Chain interface.
bool SelectCoinsBnB(std::vector< OutputGroup > &utxo_pool, const CAmount &selection_target, const CAmount &cost_of_change, std::set< CInputCoin > &out_set, CAmount &value_ret)
std::set< CInputCoin > CoinSet
int64_t CAmount
Amount in satoshis (Can be negative)
Parameters for filtering which OutputGroups we may use in coin selection.
NodeContext struct containing references to chain state and connection state.
void Set(isminefilter filter, CAmount value)
void Select(const COutPoint &output)
bool fAllowOtherInputs
If false, allows unselected inputs, but requires all selected inputs be used.
bool m_subtract_fee_outputs
Indicate that we are subtracting the fee from outputs.
bool AttemptSelection(const CAmount &nTargetValue, const CoinEligibilityFilter &eligibility_filter, std::vector< COutput > coins, std::set< CInputCoin > &setCoinsRet, CAmount &nValueRet, const CoinSelectionParams &coin_selection_params) const
Shuffle and select coins until nTargetValue is reached while avoiding small change; This method is st...
std::variant< CNoDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown > CTxDestination
A txout script template with a specific destination.
std::vector< OutputGroup > & GroupCoins(const std::vector< CInputCoin > &coins)
std::unique_ptr< WalletDatabase > CreateDummyWalletDatabase()
Return object for accessing dummy database with no read/write capabilities.
CoinEligibilityFilter filter_confirmed(1, 1, 0)
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
An outpoint - a combination of a transaction hash and an index n into its vout.
std::vector< CTxOut > vout
A transaction with a bunch of additional info that only the owner cares about.
static CTransactionRef MakeTransactionRef(Tx &&txIn)
bool SelectCoins(const std::vector< COutput > &vAvailableCoins, const CAmount &nTargetValue, std::set< CInputCoin > &setCoinsRet, CAmount &nValueRet, const CCoinControl &coin_control, CoinSelectionParams &coin_selection_params) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet)
Select a set of coins such that nValueRet >= nTargetValue and at least all coins from coin_control ar...
CachableAmount m_amounts[AMOUNTTYPE_ENUM_ELEMENTS]
CoinSelectionParams coin_selection_params(0, 0, CFeeRate(0), CFeeRate(0), CFeeRate(0), 0, false)
#define BOOST_FIXTURE_TEST_SUITE(a, b)
Testing setup and teardown for wallet.
#define BOOST_CHECK_EQUAL(v1, v2)
CoinEligibilityFilter filter_standard_extra(6, 6, 0)
#define BOOST_AUTO_TEST_SUITE_END()
A CWallet maintains a set of transactions and balances, and provides the ability to create new transa...
Parameters for one iteration of Coin Selection.
Fee rate in satoshis per kilobyte: CAmount / kB.
bool KnapsackSolver(const CAmount &nTargetValue, std::vector< OutputGroup > &groups, std::set< CInputCoin > &setCoinsRet, CAmount &nValueRet)
RecursiveMutex cs_wallet
Main wallet lock.
A mutable version of CTransaction.
static void ApproximateBestSubset(const std::vector< OutputGroup > &groups, const CAmount &nTotalLower, const CAmount &nTargetValue, std::vector< char > &vfBest, CAmount &nBest, int iterations=1000)
static std::vector< COutput > vCoins
static CWallet testWallet(testChain.get(), "", CreateDummyWalletDatabase())
bool error(const char *fmt, const Args &... args)
uint64_t randrange(uint64_t range) noexcept
Generate a random integer in the range [0..range).
#define BOOST_CHECK(expr)