text: // Copyright (c) 2011-2019 The Bitcoin Core developers
  // Copyright (c) 2017-2020 The LitecoinZ 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 <outputtype.h>
  #include <optional.h>
  #include <policy/feerate.h>
  #include <policy/fees.h>
  #include <primitives/transaction.h>
  #include <script/standard.h>
  
  const int DEFAULT_MIN_DEPTH = 0;
  const int DEFAULT_MAX_DEPTH = 9999999;
  
  //! Default for -avoidpartialspends
  static constexpr bool DEFAULT_AVOIDPARTIALSPENDS = false;
  
  /** Coin Control Features. */
  class CCoinControl
  {
  public:
      //! Custom change destination, if not set an address is generated
      CTxDestination destChange;
      //! Override the default change type if set, ignored if destChange is set
      Optional<OutputType> m_change_type;
      //! If false, allows unselected inputs, but requires all selected inputs be used
      bool fAllowOtherInputs;
      //! 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
      Optional<CFeeRate> m_feerate;
      //! Override the default confirmation target if set
      Optional<unsigned int> m_confirm_target;
      //! Override the wallet's m_signal_rbf if set
      Optional<bool> m_signal_bip125_rbf;
      //! Avoid partial use of funds sent to a given address
      bool m_avoid_partial_spends;
      //! Forbids inclusion of dirty (previously used) addresses
      bool m_avoid_address_reuse;
      //! Fee estimation mode to control arguments to estimateSmartFee
      FeeEstimateMode m_fee_mode;
      //! Minimum chain depth value for coin availability
      int m_min_depth = DEFAULT_MIN_DEPTH;
      //! Maximum chain depth value for coin availability
      int m_max_depth = DEFAULT_MAX_DEPTH;
  
      CCoinControl()
      {
          SetNull();
      }
  
      void SetNull();
  
      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());
      }
  
  private:
      std::set<COutPoint> setSelected;
  };
  
  #endif // BITCOIN_WALLET_COINCONTROL_H
  