// 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_COINSELECTION_H #define BITCOIN_COINSELECTION_H #include #include #include //! target minimum change amount static const CAmount MIN_CHANGE = CENT; //! 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; } COutPoint outpoint; CTxOut txout; CAmount effective_value; CAmount fee = 0; CAmount long_term_fee = 0; 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; } }; bool SelectCoinsBnB(std::vector& utxo_pool, const CAmount& target_value, const CAmount& cost_of_change, std::set& out_set, CAmount& value_ret, CAmount not_input_fees); // Original coin selection algorithm as a fallback bool KnapsackSolver(const CAmount& nTargetValue, std::vector& vCoins, std::set& setCoinsRet, CAmount& nValueRet); #endif // BITCOIN_COINSELECTION_H