dash/src/wallet/coincontrol.h
Wladimir J. van der Laan 6f694a65ea
Merge #13142: Separate IsMine from solvability
c004ffc9b42a738043e19e4c812fc7e0566119c5 Make handling of invalid in IsMine more uniform (Pieter Wuille)
a53f0feff8d42b7a40d417f77dc8de682dd88fd9 Add some checks for invalid recursion in IsMine (Pieter Wuille)
b5802a9f5f69815d3290361fd8c96d76a037832f Simplify IsMine logic (Pieter Wuille)
4e91820531889e309dc4335fe0de8229c6426040 Make IsMine stop distinguishing solvable/unsolvable (Pieter Wuille)
6d714c3419b368671bd071a8992950c3dc00e613 Make coincontrol use IsSolvable to determine solvability (Pieter Wuille)

Pull request description:

  Our current `IsMine` logic does several things with outputs:
  * Determine "spendability" (roughly corresponding to "could we sign for this")
  * Determine "watching" (is this an output directly or indirectly a watched script)
  * Determine invalidity (is this output definitely not legally spendable, detecting accidental uncompressed pubkeys in witnesses)
  * Determine "solvability" (would we be able to sign for this ignoring the fact that we may be missing some private keys).

  The last item (solvability) is mostly unrelated and only rarely needed (there is just one instance, inside the wallet's coin control logic). This PR changes that instance to use the separate `IsSolvable` function, and stop `IsMine` from distinguishing between solvable and unsolvable.

  As an extra, this also simplifies the `IsMine` logic and adds some extra checks (which wouldn't be hit unless someone adds already invalid scripts to their wallet).

Tree-SHA512: 95a6ef75fbf2eedc5ed938c48a8e5d77dcf09c933372acdd0333129fb7301994a78498f9aacce2c8db74275e19260549dd67a83738e187d40b5090cc04f33adf
2021-06-28 02:00:49 +03:00

109 lines
3.0 KiB
C++

// Copyright (c) 2011-2015 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_COINCONTROL_H
#define BITCOIN_WALLET_COINCONTROL_H
#include <key.h>
#include <policy/feerate.h>
#include <policy/fees.h>
#include <primitives/transaction.h>
#include <script/standard.h>
#include <boost/optional.hpp>
enum class CoinType
{
ALL_COINS,
ONLY_FULLY_MIXED,
ONLY_READY_TO_MIX,
ONLY_NONDENOMINATED,
ONLY_MASTERNODE_COLLATERAL, // find masternode outputs including locked ones (use with caution)
ONLY_COINJOIN_COLLATERAL,
// Attributes
MIN_COIN_TYPE = ALL_COINS,
MAX_COIN_TYPE = ONLY_COINJOIN_COLLATERAL,
};
/** Coin Control Features. */
class CCoinControl
{
public:
CTxDestination destChange;
//! If false, allows unselected inputs, but requires all selected inputs be used if fAllowOtherInputs is true (default)
bool fAllowOtherInputs;
//! If false, only include as many inputs as necessary to fulfill a coin selection request. Only usable together with fAllowOtherInputs
bool fRequireAllInputs;
//! Includes watch only addresses which are solvable
bool fAllowWatchOnly;
//! Override automatic min/max checks on fee, m_feerate must be set if true
bool fOverrideFeeRate;
//! Override the wallet's m_pay_tx_fee if set
boost::optional<CFeeRate> m_feerate;
//! Override the discard feerate estimation with m_discard_feerate in CreateTransaction if set
boost::optional<CFeeRate> m_discard_feerate;
//! Override the default confirmation target if set
boost::optional<unsigned int> m_confirm_target;
//! Avoid partial use of funds sent to a given address
bool m_avoid_partial_spends;
//! Fee estimation mode to control arguments to estimateSmartFee
FeeEstimateMode m_fee_mode;
//! Controls which types of coins are allowed to be used (default: ALL_COINS)
CoinType nCoinType;
CCoinControl()
{
SetNull();
}
void SetNull(bool fResetCoinType = true);
bool HasSelected() const
{
return (setSelected.size() > 0);
}
bool IsSelected(const COutPoint& output) const
{
return (setSelected.count(output) > 0);
}
void Select(const COutPoint& output)
{
setSelected.insert(output);
}
void UnSelect(const COutPoint& output)
{
setSelected.erase(output);
}
void UnSelectAll()
{
setSelected.clear();
}
void ListSelected(std::vector<COutPoint>& vOutpoints) const
{
vOutpoints.assign(setSelected.begin(), setSelected.end());
}
// Dash-specific helpers
void UseCoinJoin(bool fUseCoinJoin)
{
nCoinType = fUseCoinJoin ? CoinType::ONLY_FULLY_MIXED : CoinType::ALL_COINS;
}
bool IsUsingCoinJoin() const
{
return nCoinType == CoinType::ONLY_FULLY_MIXED;
}
private:
std::set<COutPoint> setSelected;
};
#endif // BITCOIN_WALLET_COINCONTROL_H