text: // Copyright (c) 2009-2010 Satoshi Nakamoto
  // Copyright (c) 2009-2014 The Bitcoin developers
  // Copyright (c) 2020-2021 The Sprouts-Origins Core Developers
  // Distributed under the MIT software license, see the accompanying
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  
  #ifndef BITCOIN_POLICY_H
  #define BITCOIN_POLICY_H
  
  #include "consensus/consensus.h"
  #include "script/interpreter.h"
  #include "script/standard.h"
  
  #include <string>
  
  class CChainParams;
  class CCoinsViewCache;
  
  /** Default for -blockmaxsize and -blockminsize, which control the range of sizes the mining code will create **/
  static const unsigned int DEFAULT_BLOCK_MAX_SIZE = MAX_BLOCK_SIZE_CURRENT;
  static const unsigned int DEFAULT_BLOCK_MIN_SIZE = 0;
  /** Default for -blockprioritysize, maximum space for zero/low-fee transactions **/
  static const unsigned int DEFAULT_BLOCK_PRIORITY_SIZE = 50000;
  /** Maximum number of signature check operations in an IsStandard() P2SH script */
  static const unsigned int MAX_P2SH_SIGOPS = 15;
  /** Default for -maxmempool, maximum megabytes of mempool memory usage */
  static const unsigned int DEFAULT_MAX_MEMPOOL_SIZE = 300;
  /** Default for -permitbaremultisig */
  static const bool DEFAULT_PERMIT_BAREMULTISIG = true;
  extern bool fIsBareMultisigStd;
  
  /**
   * Standard script verification flags that standard transactions will comply
   * with. However scripts violating these flags may still be present in valid
   * blocks and we must accept those blocks.
   */
  static constexpr unsigned int STANDARD_SCRIPT_VERIFY_FLAGS = MANDATORY_SCRIPT_VERIFY_FLAGS |
                                                           SCRIPT_VERIFY_DERSIG |
                                                           SCRIPT_VERIFY_STRICTENC |
                                                           SCRIPT_VERIFY_MINIMALDATA |
                                                           SCRIPT_VERIFY_NULLDUMMY |
                                                           SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS |
                                                           SCRIPT_VERIFY_LOW_S;
  
  /** For convenience, standard but not mandatory verify flags. */
  static constexpr unsigned int STANDARD_NOT_MANDATORY_VERIFY_FLAGS = STANDARD_SCRIPT_VERIFY_FLAGS & ~MANDATORY_SCRIPT_VERIFY_FLAGS;
  
  // Sanity check the magic numbers when we change them
  BOOST_STATIC_ASSERT(DEFAULT_BLOCK_MAX_SIZE <= MAX_BLOCK_SIZE_CURRENT);
  BOOST_STATIC_ASSERT(DEFAULT_BLOCK_PRIORITY_SIZE <= DEFAULT_BLOCK_MAX_SIZE);
  
  bool IsStandard(const CScript& scriptPubKey, txnouttype& whichType);
  
  /** Check for standard transaction types
   * @return True if all outputs (scriptPubKeys) use only standard transaction forms
   */
  bool IsStandardTx(const CTransaction& tx, std::string& reason);
  
  /**
   * Check for standard transaction types
   * @param[in] mapInputs    Map of previous transactions that have outputs we're spending
   * @return True if all inputs (scriptSigs) use only standard transaction forms
   */
  bool AreInputsStandard(const CTransaction& tx, const CCoinsViewCache& mapInputs);
  
  #endif // BITCOIN_POLICY_H
  