// Copyright (c) 2014-2016 The Dash Core developers /* * FIELDS AND CLASSIFICATION * -------------------- * * -- fields can be updated by the network dynamically (adding a company type, etc) * -- fields can be voted on, leveling them up/down * -- levels determine pay in DO/DAO company types * * FIELDS * ========================= * * network-type mainnet, testnet, regtest * actor-type group, user, dao, company, committee, foundation * group-type core, noncore * dao-type none * company-type us.llc, us.501c3, us.501c6, us.inc, etc * committee-type science, technology, economics * foundation-type us.501c6, us.501c3 * contract-type blockchain/internal, external/contractor * proposal-type explicit, governance, wikiamend, generic, black * * lvl 1,2,3,4.. roman * status ok, error, active-removal * proposal-rights explicit, explicit_generic, all * contract-rights internal, external * status-error missing-documentation, doa, report-outstanding * milestone-status research, hiring, ongoing, complete, failure, overdue, error //programmatic workflow? * milestone-status-error mia, option2, option3 * network-status ok, error * network-error none, fork-detected, debug, full-blocks, network-outage, spam * foundation-type maintainance, r&d, awareness, bridge(legacy), philanthropic, legal * committee-type business, sciencific_advisory, research * global-type-variable switch, int, string, enum // enum should be defined by another category * category-type primary, secondary, tertiary, quaternary, quinary, senary, septenary, octonary * contract-status ok, error * cantract-status-error none, error1, error2 * committee-type research, business_advisory, economic_advisory * * // note: How enums work * enum-type one, two, three //defined in code, or the defintion could be packed ino this field * * CLASSES * ========================= * * // network * CDashNetwork lvl, network-type, network-status, network-error, milestone-status* * CCategory lvl, category-type, status, status-error * CNetworkGlobalVariable lvl, global-type, status, status-error * // base: actor * CGroup lvl, actor-type, status, status-error, group-type * CUser lvl, actor-type, status, status-error, user-type, contract-status, contract-status-error * CDAO lvl, actor-type, status, status-error, dao-type * CCompany lvl, actor-type, secondary-type, ternary-type, status, status-error * CCommittee lvl, actor-type, status, status-error, committee-type ov * CFoundation lvl, actor-type, status, status-error, foundation-type ov * // base: project manangement * CProposal lvl, proposal-type, status, status-error * CContract lvl, contract-type, status, status-error, proposal-rights, contract-rights * CProject lvl, project-type, status, status-error * CProjectReport lvl, report-type, status, status-error * CProjectMilestone lvl, milestone-type, status, status-error, milestone-status, milestone-status-error, ov * CValueOverride lvl, vo-type, status, status-error */ /* * CLASS INHERITANCE * ============================================================ * * -- Each of the implementable classes use their own serializers * -- Each class is responsible for it's own unique values * -- Most of the values in these classes can be overriden * * CGovernanceNode (base) * * TREE STRUCTURE * =========================================== * * DASH NETWORK (ROOT) * -> NETWORK GLOBOLS * -> SWITCHES, SETTINGS * -> CATEGORIES * -> CATEGORY (DAO) * -> CATEGORIES () * -> CATEGORY (CONTRACT) * -> CATEGORIES (INTERNAL, EXTERNAL, ...) * -> GROUPS * -> GROUP 1 * -> USER : ENDUSER * -> COMPANIES * -> DAO * -> COMPANY, COMMITTEE, FOUNDATION, .. * -> GROUP1 (CORE) * - USER : EVAN DUFFIELD * -> CONTRACT1 (INTERNAL CONTRACT) * -> PROJECT1 * -> PROJECT1 * -> CONTRACT2 (EXTERNAL CONTRACT) * -> PROPOSAL (GENERIC FUNDING) * -> VO (OUTPUT VALUE == 3.23) // NETWORK OVERRIDE * -> REPORT1 * -> REPORT2 * -> REPORT3 * -> MILESTONE1 * -> MILESTONE2 * -> OV (STATUS=OVERDUE) **/ class CGovernanceObject : public CGovernanceNode { private: // some minimal caching is supported here int nLevel; std::string strCategory; // Current OBJECT STATUS (see http://govman.dash.org/index.php/Documentation_:_Status_Field) int nStatusID; std::string strStatusMessage; // minimal caching uint64_t nTimeValueOverrideCached; public: virtual uint256 GetHash() = 0; }; // // root node class CDashNetwork : public CGovernanceObject { private: std::string strName; std::string strURL; public: CDashNetwork(UniValue objIn) { strName = objIn["name"].get_str(); strURL = objIn["name"].get_str(); // we should pop these off one by one and check if the objIn.size() == 0 } uint256 GetHash(){ CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); ss << strName; ss << strURL; ss << nTime; ss << vecSig; ss << nGovernanceType; uint256 h1 = ss.GetHash(); return h1; } ADD_SERIALIZE_METHODS; template inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { // TODO : For testnet version bump READWRITE(nGovernanceType); READWRITE(LIMITED_STRING(strName, 20)); READWRITE(LIMITED_STRING(strURL, 64)); READWRITE(nTime); READWRITE(vecSig); READWRITE(nFeeTXHash); } }; // // can be under: DashNetwork // // -- signature requirements : Key1(User) // class CDashNetworkVariable : public CGovernanceObject // { // private: // public: // virtual uint256 GetHash(){ // CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); // ss << strName; // ss << strURL; // ss << nBlockStart; // ss << nBlockEnd; // ss << nAmount; // ss << *(CScriptBase*)(&address); // ss << nGovernanceType; // uint256 h1 = ss.GetHash(); // return h1; // } // ADD_SERIALIZE_METHODS; // template // virtual inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { // // TODO : For testnet version bump // READWRITE(nGovernanceType); // READWRITE(LIMITED_STRING(strName, 20)); // READWRITE(LIMITED_STRING(strURL, 64)); // READWRITE(nTime); // READWRITE(vecSig); // READWRITE(nFeeTXHash); // } // }; // /* // ValueOverride // */ // // can be under: ANY // // -- signature requirements : Key1(User) // template // class CValueOverride : public CGovernanceObject // { // // bool GetValues(VO& a) // // { // // return nValue1; // // } // // bool GetValues2(VO& a, VO& b) // // { // // return nValue1; // // } // uint256 GetHash(){ // CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); // ss << strName; // ss << strURL; // ss << nBlockStart; // ss << nBlockEnd; // ss << nAmount; // ss << *(CScriptBase*)(&address); // ss << nGovernanceType; // uint256 h1 = ss.GetHash(); // return h1; // } // ADD_SERIALIZE_METHODS; // template // virtual inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { // // TODO : For testnet version bump // READWRITE(nGovernanceType); // READWRITE(LIMITED_STRING(strName, 20)); // READWRITE(LIMITED_STRING(strURL, 64)); // READWRITE(nTime); // READWRITE(vecSig); // READWRITE(nFeeTXHash); // } // }; // class CCategory : public CGovernanceObject // { // // **** Statistics / Information **** // CAmount GetRequiredFeeAmount() {return 1.00;} // CCategory GetLevel() {return (CCategory)GetCategory(0);} // CCategory GetCategoryType() {return (CCategory)GetCategory(1);} // CCategory GetStatus() {return (CCategory)GetCategory(2);} // CCategory GetStatusError() {return (CCategory)GetCategory(3);} // // isRootCategory() // // { // // // root categories won't have categories as parents // // return (IsType() == DashNetwork); // // } // // isSubcategoryOf(std::string strParentName) // // { // // CCategory parent(strParentName); // // if(!parent) return false; // // return isSubcategoryOf(parent); // // } // // isSubcategoryOf(CCategory parentIn) // // { // // // are we related to this category? // // if parent.GetHash() == pParent->GetHash(): // // return true // // return false; // // } // // **** Governance Permissions **** // // only allow categories under categories // virtual bool CanAdd(CCategory obj) {return true;} // virtual bool RequiresSignatureToAddChild(CCategory obj) {return false;} // uint256 GetHash(){ // CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); // ss << strName; // ss << strURL; // ss << nBlockStart; // ss << nBlockEnd; // ss << nAmount; // ss << *(CScriptBase*)(&address); // ss << nGovernanceType; // uint256 h1 = ss.GetHash(); // return h1; // } // ADD_SERIALIZE_METHODS; // template // virtual inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { // // TODO : For testnet version bump // READWRITE(nGovernanceType); // READWRITE(LIMITED_STRING(strName, 20)); // READWRITE(LIMITED_STRING(strURL, 64)); // READWRITE(nTime); // READWRITE(vecSig); // READWRITE(nFeeTXHash); // } // }; // // base: actor class // class CGovernanceActor : public CGovernanceObject // { // /* // ??? // GetAverageMonthlySpending(); // GetYearlySpent(); // GetContractCount(CCategory category) // */ // }; // class CGroup : public CGovernanceActor // uint256 GetHash(){ // CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); // ss << strName; // ss << strURL; // ss << nBlockStart; // ss << nBlockEnd; // ss << nAmount; // ss << *(CScriptBase*)(&address); // ss << nGovernanceType; // uint256 h1 = ss.GetHash(); // return h1; // } // }; // class CUser : public CGovernanceActor // { // public: // uint256 GetHash(){ // CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); // ss << strName; // ss << strURL; // ss << nBlockStart; // ss << nBlockEnd; // ss << nAmount; // ss << *(CScriptBase*)(&address); // ss << nGovernanceType; // uint256 h1 = ss.GetHash(); // return h1; // } // ADD_SERIALIZE_METHODS; // template // virtual inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { // // TODO : For testnet version bump // READWRITE(nGovernanceType); // READWRITE(LIMITED_STRING(strName, 20)); // READWRITE(LIMITED_STRING(strURL, 64)); // READWRITE(nTime); // READWRITE(vecSig); // READWRITE(nFeeTXHash); // } // }; // // base: actor classes // class CCompany : public CGovernanceActor // { // uint256 GetHash(){ // CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); // ss << strName; // ss << strURL; // ss << nBlockStart; // ss << nBlockEnd; // ss << nAmount; // ss << *(CScriptBase*)(&address); // ss << nGovernanceType; // uint256 h1 = ss.GetHash(); // return h1; // } // ADD_SERIALIZE_METHODS; // template // virtual inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { // // TODO : For testnet version bump // READWRITE(nGovernanceType); // READWRITE(LIMITED_STRING(strName, 20)); // READWRITE(LIMITED_STRING(strURL, 64)); // READWRITE(nTime); // READWRITE(vecSig); // } // }; // class CProject : public CGovernanceObject // { // public: // std::string strName; // std::string GetURL(); // uint256 GetHash(){ // CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); // ss << strName; // ss << strURL; // ss << nBlockStart; // ss << nBlockEnd; // ss << nAmount; // ss << *(CScriptBase*)(&address); // ss << nGovernanceType; // uint256 h1 = ss.GetHash(); // return h1; // } // ADD_SERIALIZE_METHODS; // template // virtual inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { // // TODO : For testnet version bump // READWRITE(nGovernanceType); // READWRITE(LIMITED_STRING(strName, 20)); // READWRITE(LIMITED_STRING(strURL, 64)); // READWRITE(nTime); // READWRITE(vecSig); // } // }; // class CProjectReport : public CGovernanceObject // { // private: // std::string strName; // std::string GetURL; // public: // uint256 GetHash(){ // CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); // ss << strName; // ss << strURL; // ss << nBlockStart; // ss << nBlockEnd; // ss << nAmount; // ss << *(CScriptBase*)(&address); // ss << nGovernanceType; // uint256 h1 = ss.GetHash(); // return h1; // } // ADD_SERIALIZE_METHODS; // template // virtual inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { // // TODO : For testnet version bump // READWRITE(nGovernanceType); // READWRITE(LIMITED_STRING(strName, 20)); // READWRITE(LIMITED_STRING(strURL, 64)); // READWRITE(nTime); // READWRITE(vecSig); // } // }; // class CProjectMilestone : public CGovernanceObject // { // private: // // specialized class variables // public: // uint256 GetHash(){ // CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); // ss << strName; // ss << strURL; // ss << nBlockStart; // ss << nBlockEnd; // ss << nAmount; // ss << *(CScriptBase*)(&address); // ss << nGovernanceType; // uint256 h1 = ss.GetHash(); // return h1; // } // ADD_SERIALIZE_METHODS; // template // virtual inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { // // TODO : For testnet version bump // READWRITE(nGovernanceType); // READWRITE(LIMITED_STRING(strName, 20)); // READWRITE(LIMITED_STRING(strURL, 64)); // READWRITE(nTime); // READWRITE(vecSig); // } // }; // class CProposal : public CGovernanceObject // { // private: // // specialized class variables // std::string strName; // std::string strURL; // /* // proposal will be paid on this block // -- if it's not paid, it will expire unpaid // */ // int nBlockStart; // CAmount nAmount; // CScript address; // public: // // **** Statistics / Information **** // std::string GetName() {return strName; } // CScript GetPayee() {return address;} // std::string GetURL() {return strURL; } // // nothing can be under a proposal // // signatures required for everything // virtual bool RequiresSignatureToAddChild(CGovernanceNode obj) {return true;} // uint256 GetHash(){ // CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); // ss << strName; // ss << strURL; // ss << nBlockStart; // ss << nBlockEnd; // ss << nAmount; // ss << *(CScriptBase*)(&address); // ss << nGovernanceType; // uint256 h1 = ss.GetHash(); // return h1; // } // ADD_SERIALIZE_METHODS; // template // virtual inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { // // TODO : For testnet version bump // READWRITE(nGovernanceType); // READWRITE(LIMITED_STRING(strName, 20)); // READWRITE(LIMITED_STRING(strURL, 64)); // READWRITE(nTime); // READWRITE(vecSig); // } // }; // class CContract : public CGovernanceObject // { // private: // std::string strName; // std::string strURL; // int nBlockStart; //starting block // int months_active; //nBlockEnd = nBlockStart + (blocks-per-month * months_active) // CAmount nAmount; // CScript address; // public: // uint256 GetHash(){ // CHashWriter ss(SER_GETHASH, PROTOCOL_VERSION); // ss << strName; // ss << strURL; // ss << nBlockStart; // ss << nBlockEnd; // ss << nAmount; // ss << *(CScriptBase*)(&address); // ss << nGovernanceType; // uint256 h1 = ss.GetHash(); // return h1; // } // ADD_SERIALIZE_METHODS; // template // virtual inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { // // TODO : For testnet version bump // READWRITE(nGovernanceType); // READWRITE(LIMITED_STRING(strName, 20)); // READWRITE(LIMITED_STRING(strURL, 64)); // READWRITE(nTime); // READWRITE(vecSig); // } // }; bool CreateNewGovernanceObject(UniValue& govObjJson, CGovernanceNode& govObj, GovernanceObjectType govType, std::string& strError); #endif