Changeset View
Changeset View
Standalone View
Standalone View
src/wallet/wallet.cpp
Show First 20 Lines • Show All 2,550 Lines • ▼ Show 20 Lines | for (int nRep = 0; nRep < iterations && nBest != nTargetValue; nRep++) { | ||||
vfIncluded[i] = false; | vfIncluded[i] = false; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
bool CWallet::OutputEligibleForSpending(const COutput &output, | bool CWallet::OutputEligibleForSpending( | ||||
const int nConfMine, | const COutput &output, | ||||
const int nConfTheirs, | const CoinEligibilityFilter &eligibilty_filter) const { | ||||
const uint64_t nMaxAncestors) const { | |||||
if (!output.fSpendable) { | if (!output.fSpendable) { | ||||
return false; | return false; | ||||
} | } | ||||
if (output.nDepth < | if (output.nDepth < (output.tx->IsFromMe(ISMINE_ALL) | ||||
(output.tx->IsFromMe(ISMINE_ALL) ? nConfMine : nConfTheirs)) { | ? eligibilty_filter.conf_mine | ||||
: eligibilty_filter.conf_theirs)) { | |||||
return false; | return false; | ||||
} | } | ||||
if (!g_mempool.TransactionWithinChainLimit(output.tx->GetId(), | if (!g_mempool.TransactionWithinChainLimit( | ||||
nMaxAncestors)) { | output.tx->GetId(), eligibilty_filter.max_ancestors)) { | ||||
return false; | return false; | ||||
} | } | ||||
return true; | return true; | ||||
} | } | ||||
bool CWallet::SelectCoinsMinConf(const Amount nTargetValue, const int nConfMine, | bool CWallet::SelectCoinsMinConf(const Amount nTargetValue, | ||||
const int nConfTheirs, | const CoinEligibilityFilter &eligibilty_filter, | ||||
const uint64_t nMaxAncestors, | |||||
std::vector<COutput> vCoins, | std::vector<COutput> vCoins, | ||||
std::set<CInputCoin> &setCoinsRet, | std::set<CInputCoin> &setCoinsRet, | ||||
Amount &nValueRet) const { | Amount &nValueRet) const { | ||||
setCoinsRet.clear(); | setCoinsRet.clear(); | ||||
nValueRet = Amount::zero(); | nValueRet = Amount::zero(); | ||||
// List of values less than target | // List of values less than target | ||||
boost::optional<CInputCoin> coinLowestLarger; | boost::optional<CInputCoin> coinLowestLarger; | ||||
std::vector<CInputCoin> vValue; | std::vector<CInputCoin> vValue; | ||||
Amount nTotalLower = Amount::zero(); | Amount nTotalLower = Amount::zero(); | ||||
random_shuffle(vCoins.begin(), vCoins.end(), GetRandInt); | random_shuffle(vCoins.begin(), vCoins.end(), GetRandInt); | ||||
for (const COutput &output : vCoins) { | for (const COutput &output : vCoins) { | ||||
if (!OutputEligibleForSpending(output, nConfMine, nConfTheirs, | if (!OutputEligibleForSpending(output, eligibilty_filter)) { | ||||
nMaxAncestors)) { | |||||
continue; | continue; | ||||
} | } | ||||
CInputCoin coin = CInputCoin(output.tx, output.i); | CInputCoin coin = CInputCoin(output.tx, output.i); | ||||
if (coin.txout.nValue == nTargetValue) { | if (coin.txout.nValue == nTargetValue) { | ||||
setCoinsRet.insert(coin); | setCoinsRet.insert(coin); | ||||
nValueRet += coin.txout.nValue; | nValueRet += coin.txout.nValue; | ||||
▲ Show 20 Lines • Show All 131 Lines • ▼ Show 20 Lines | bool CWallet::SelectCoins(const std::vector<COutput> &vAvailableCoins, | ||||
size_t nMaxChainLength = std::min( | size_t nMaxChainLength = std::min( | ||||
gArgs.GetArg("-limitancestorcount", DEFAULT_ANCESTOR_LIMIT), | gArgs.GetArg("-limitancestorcount", DEFAULT_ANCESTOR_LIMIT), | ||||
gArgs.GetArg("-limitdescendantcount", DEFAULT_DESCENDANT_LIMIT)); | gArgs.GetArg("-limitdescendantcount", DEFAULT_DESCENDANT_LIMIT)); | ||||
bool fRejectLongChains = gArgs.GetBoolArg( | bool fRejectLongChains = gArgs.GetBoolArg( | ||||
"-walletrejectlongchains", DEFAULT_WALLET_REJECT_LONG_CHAINS); | "-walletrejectlongchains", DEFAULT_WALLET_REJECT_LONG_CHAINS); | ||||
bool res = | bool res = | ||||
nTargetValue <= nValueFromPresetInputs || | nTargetValue <= nValueFromPresetInputs || | ||||
SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 1, 6, 0, | SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, | ||||
vCoins, setCoinsRet, nValueRet) || | CoinEligibilityFilter(1, 6, 0), vCoins, setCoinsRet, | ||||
SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 1, 1, 0, | nValueRet) || | ||||
vCoins, setCoinsRet, nValueRet) || | SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, | ||||
CoinEligibilityFilter(1, 1, 0), vCoins, setCoinsRet, | |||||
nValueRet) || | |||||
(bSpendZeroConfChange && | (bSpendZeroConfChange && | ||||
SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 0, 1, 2, | SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, | ||||
vCoins, setCoinsRet, nValueRet)) || | CoinEligibilityFilter(0, 1, 2), vCoins, setCoinsRet, | ||||
nValueRet)) || | |||||
(bSpendZeroConfChange && | (bSpendZeroConfChange && | ||||
SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 0, 1, | SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, | ||||
std::min((size_t)4, nMaxChainLength / 3), vCoins, | CoinEligibilityFilter( | ||||
setCoinsRet, nValueRet)) || | 0, 1, std::min<size_t>(4, nMaxChainLength / 3)), | ||||
vCoins, setCoinsRet, nValueRet)) || | |||||
(bSpendZeroConfChange && | (bSpendZeroConfChange && | ||||
SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 0, 1, | SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, | ||||
nMaxChainLength / 2, vCoins, setCoinsRet, | CoinEligibilityFilter(0, 1, nMaxChainLength / 2), | ||||
nValueRet)) || | vCoins, setCoinsRet, nValueRet)) || | ||||
(bSpendZeroConfChange && | (bSpendZeroConfChange && | ||||
SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 0, 1, | SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, | ||||
nMaxChainLength, vCoins, setCoinsRet, nValueRet)) || | CoinEligibilityFilter(0, 1, nMaxChainLength), | ||||
vCoins, setCoinsRet, nValueRet)) || | |||||
(bSpendZeroConfChange && !fRejectLongChains && | (bSpendZeroConfChange && !fRejectLongChains && | ||||
SelectCoinsMinConf(nTargetValue - nValueFromPresetInputs, 0, 1, | SelectCoinsMinConf( | ||||
std::numeric_limits<uint64_t>::max(), vCoins, | nTargetValue - nValueFromPresetInputs, | ||||
setCoinsRet, nValueRet)); | CoinEligibilityFilter(0, 1, std::numeric_limits<uint64_t>::max()), | ||||
vCoins, setCoinsRet, nValueRet)); | |||||
// Because SelectCoinsMinConf clears the setCoinsRet, we now add the | // Because SelectCoinsMinConf clears the setCoinsRet, we now add the | ||||
// possible inputs to the coinset. | // possible inputs to the coinset. | ||||
setCoinsRet.insert(setPresetCoins.begin(), setPresetCoins.end()); | setCoinsRet.insert(setPresetCoins.begin(), setPresetCoins.end()); | ||||
// Add preset inputs to the total value selected. | // Add preset inputs to the total value selected. | ||||
nValueRet += nValueFromPresetInputs; | nValueRet += nValueFromPresetInputs; | ||||
▲ Show 20 Lines • Show All 1,795 Lines • Show Last 20 Lines |