text: // Copyright (c) 2015 The CHID developers
  // Copyright (c) 2009-2012 The Darkcoin developers
  // Distributed under the MIT/X11 software license, see the accompanying
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
  #ifndef SPORK_H
  #define SPORK_H
  
  #include "bignum.h"
  #include "sync.h"
  #include "net.h"
  #include "key.h"
  
  #include "util.h"
  #include "script.h"
  #include "base58.h"
  #include "main.h"
  
  using namespace std;
  using namespace boost;
  
  // Don't ever reuse these IDs for other sporks
  #define SPORK_1_MASTERNODE_PAYMENTS_ENFORCEMENT               10000
  #define SPORK_2_MAX_VALUE                                     10002
  #define SPORK_3_REPLAY_BLOCKS                                 10003
  #define SPORK_4_NOTUSED                                       10004
   
  
  #define SPORK_1_MASTERNODE_PAYMENTS_ENFORCEMENT_DEFAULT       4070908800  //OFF
  #define SPORK_2_MAX_VALUE_DEFAULT                             100000        //1000000  
  #define SPORK_3_REPLAY_BLOCKS_DEFAULT                         0
  #define SPORK_4_RECONVERGE_DEFAULT                            1420070400  //2047-1-1
  
  class CSporkMessage;
  class CSporkManager;
  
  #include "bignum.h"
  #include "net.h"
  #include "key.h"
  #include "util.h"
  #include "protocol.h"
  #include "darksend.h"
  #include <boost/lexical_cast.hpp>
  
  using namespace std;
  using namespace boost;
  
  extern std::map<uint256, CSporkMessage> mapSporks;
  extern std::map<int, CSporkMessage> mapSporksActive;
  extern CSporkManager sporkManager;
  
  void ProcessSpork(CNode* pfrom, std::string& strCommand, CDataStream& vRecv);
  int GetSporkValue(int nSporkID);
  bool IsSporkActive(int nSporkID);
  void ExecuteSpork(int nSporkID, int nValue);
  
  //
  // Spork Class
  // Keeps track of all of the network spork settings
  //
  
  class CSporkMessage
  {
  public:
      std::vector<unsigned char> vchSig;
      int nSporkID;
      int64_t nValue;
      int64_t nTimeSigned;
  
      uint256 GetHash(){
          uint256 n = Hash(BEGIN(nSporkID), END(nTimeSigned));
          return n;
      }
  
      ADD_SERIALIZE_METHODS;
  
      template <typename Stream, typename Operation>
      inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) {
  	unsigned int nSerSize = 0;
          READWRITE(nSporkID);
          READWRITE(nValue);
          READWRITE(nTimeSigned);
          READWRITE(vchSig);
  	}
  };
  
  
  class CSporkManager
  {
  private:
      std::vector<unsigned char> vchSig;
  
      std::string strMasterPrivKey;
      std::string strTestPubKey;
      std::string strMainPubKey;
  
  public:
  
      CSporkManager() {
          strMainPubKey = "04205623a097f275c6538a9a9878f8d772356732a98a628a1f102ad64789d578ea74c3738a7074493512";
          strTestPubKey = "041fd14ff8d722738aa9778728a72647864c3235c653238a9a9862a07557302a0746789d98a0ea7593512";
      }
  
      std::string GetSporkNameByID(int id);
      int GetSporkIDByName(std::string strName);
      bool UpdateSpork(int nSporkID, int64_t nValue);
      bool SetPrivKey(std::string strPrivKey);
      bool CheckSignature(CSporkMessage& spork);
      bool Sign(CSporkMessage& spork);
      void Relay(CSporkMessage& msg);
  
  };
  
  #endif
  