mirror of
https://github.com/dashpay/dash.git
synced 2024-12-29 13:59:06 +01:00
e24fff7967
fa84723e73 amount: Move CAmount CENT to unit test header (MarcoFalke) Pull request description: `CAmount` is currently not type-safe. Exporting a constant (`CENT`) that is commonly not referred to by that name might be confusing. `CENT` is only used in two places prior to this commit (`ParseMoney` and `MIN_CHANGE`). So replace these with constants relative to `COIN` and move `CENT` to the unit test header. Tree-SHA512: 5273e96d8664ced6ae211abde2e20bc763e6e99f89404eec02c621f29e1d235e5f9b1ade933743843fae16fc24b643f883deda9221e3d9fd31229d2ab63a914f
102 lines
3.7 KiB
C++
102 lines
3.7 KiB
C++
// Copyright (c) 2017 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#ifndef BITCOIN_WALLET_COINSELECTION_H
|
|
#define BITCOIN_WALLET_COINSELECTION_H
|
|
|
|
#include <amount.h>
|
|
#include <primitives/transaction.h>
|
|
#include <random.h>
|
|
|
|
//! target minimum change amount
|
|
static constexpr CAmount MIN_CHANGE{COIN / 100};
|
|
//! final minimum change amount after paying for fees
|
|
static const CAmount MIN_FINAL_CHANGE = MIN_CHANGE/2;
|
|
|
|
class CInputCoin {
|
|
public:
|
|
CInputCoin(const CTransactionRef& tx, unsigned int i)
|
|
{
|
|
if (!tx)
|
|
throw std::invalid_argument("tx should not be null");
|
|
if (i >= tx->vout.size())
|
|
throw std::out_of_range("The output index is out of range");
|
|
|
|
outpoint = COutPoint(tx->GetHash(), i);
|
|
txout = tx->vout[i];
|
|
effective_value = txout.nValue;
|
|
}
|
|
|
|
CInputCoin(const CTransactionRef& tx, unsigned int i, int input_bytes) : CInputCoin(tx, i)
|
|
{
|
|
m_input_bytes = input_bytes;
|
|
}
|
|
|
|
COutPoint outpoint;
|
|
CTxOut txout;
|
|
CAmount effective_value;
|
|
|
|
/** Pre-computed estimated size of this output as a fully-signed input in a transaction. Can be -1 if it could not be calculated */
|
|
int m_input_bytes{-1};
|
|
|
|
bool operator<(const CInputCoin& rhs) const {
|
|
return outpoint < rhs.outpoint;
|
|
}
|
|
|
|
bool operator!=(const CInputCoin& rhs) const {
|
|
return outpoint != rhs.outpoint;
|
|
}
|
|
|
|
bool operator==(const CInputCoin& rhs) const {
|
|
return outpoint == rhs.outpoint;
|
|
}
|
|
};
|
|
|
|
struct CoinEligibilityFilter
|
|
{
|
|
const int conf_mine;
|
|
const int conf_theirs;
|
|
const uint64_t max_ancestors;
|
|
const uint64_t max_descendants;
|
|
|
|
CoinEligibilityFilter(int conf_mine, int conf_theirs, uint64_t max_ancestors) : conf_mine(conf_mine), conf_theirs(conf_theirs), max_ancestors(max_ancestors), max_descendants(max_ancestors) {}
|
|
CoinEligibilityFilter(int conf_mine, int conf_theirs, uint64_t max_ancestors, uint64_t max_descendants) : conf_mine(conf_mine), conf_theirs(conf_theirs), max_ancestors(max_ancestors), max_descendants(max_descendants) {}
|
|
};
|
|
|
|
struct OutputGroup
|
|
{
|
|
std::vector<CInputCoin> m_outputs;
|
|
bool m_from_me{true};
|
|
CAmount m_value{0};
|
|
int m_depth{999};
|
|
size_t m_ancestors{0};
|
|
size_t m_descendants{0};
|
|
CAmount effective_value{0};
|
|
CAmount fee{0};
|
|
CAmount long_term_fee{0};
|
|
|
|
OutputGroup() {}
|
|
OutputGroup(std::vector<CInputCoin>&& outputs, bool from_me, CAmount value, int depth, size_t ancestors, size_t descendants)
|
|
: m_outputs(std::move(outputs))
|
|
, m_from_me(from_me)
|
|
, m_value(value)
|
|
, m_depth(depth)
|
|
, m_ancestors(ancestors)
|
|
, m_descendants(descendants)
|
|
{}
|
|
OutputGroup(const CInputCoin& output, int depth, bool from_me, size_t ancestors, size_t descendants) : OutputGroup() {
|
|
Insert(output, depth, from_me, ancestors, descendants);
|
|
}
|
|
void Insert(const CInputCoin& output, int depth, bool from_me, size_t ancestors, size_t descendants);
|
|
std::vector<CInputCoin>::iterator Discard(const CInputCoin& output);
|
|
bool IsLockedByInstantSend() const;
|
|
bool EligibleForSpending(const CoinEligibilityFilter& eligibility_filter) const;
|
|
};
|
|
|
|
bool SelectCoinsBnB(std::vector<OutputGroup>& utxo_pool, const CAmount& target_value, const CAmount& cost_of_change, std::set<CInputCoin>& out_set, CAmount& value_ret, CAmount not_input_fees);
|
|
|
|
// Original coin selection algorithm as a fallback
|
|
bool KnapsackSolver(const CAmount& nTargetValue, std::vector<OutputGroup>& groups, std::set<CInputCoin>& setCoinsRet, CAmount& nValueRet, bool fFulyMixedOnly, CAmount maxTxFee);
|
|
#endif // BITCOIN_WALLET_COINSELECTION_H
|