refactor: use enums instead of random const ints (#5322)

## Issue being fixed or feature implemented
Bad coding in governance code

## What was done?
Use Enums where possible

## How Has This Been Tested?
Make check

## Breaking Changes
none

## Checklist:
_Go over all the following points, and put an `x` in all the boxes that
apply._
- [x] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have added or updated relevant unit/integration/functional/e2e
tests
- [ ] I have made corresponding changes to the documentation
- [x] I have assigned this pull request to a milestone _(for repository
code-owners and collaborators only)_
This commit is contained in:
PastaPastaPasta 2023-04-16 12:09:37 -05:00 committed by GitHub
parent 770eefcd08
commit a4d894943a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 95 additions and 86 deletions

View File

@ -13,6 +13,7 @@
#include <timedata.h>
#include <util/strencodings.h>
#include <validation.h>
#include <util/underlying.h>
#include <univalue.h>
@ -119,7 +120,7 @@ bool CGovernanceTriggerManager::AddNewTrigger(uint256 nHash)
return false;
}
pSuperblock->SetStatus(SEEN_OBJECT_IS_VALID);
pSuperblock->SetStatus(SeenObjectStatus::Valid);
mapTrigger.insert(std::make_pair(nHash, pSuperblock));
@ -149,20 +150,20 @@ void CGovernanceTriggerManager::CleanAndRemove()
remove = true;
} else {
pObj = governance->FindGovernanceObject(it->first);
if (!pObj || pObj->GetObjectType() != GOVERNANCE_OBJECT_TRIGGER) {
if (!pObj || pObj->GetObjectType() != GovernanceObject::TRIGGER) {
LogPrint(BCLog::GOBJECT, "CGovernanceTriggerManager::CleanAndRemove -- Unknown or non-trigger superblock\n");
pSuperblock->SetStatus(SEEN_OBJECT_ERROR_INVALID);
pSuperblock->SetStatus(SeenObjectStatus::ErrorInvalid);
}
LogPrint(BCLog::GOBJECT, "CGovernanceTriggerManager::CleanAndRemove -- superblock status = %d\n", pSuperblock->GetStatus());
LogPrint(BCLog::GOBJECT, "CGovernanceTriggerManager::CleanAndRemove -- superblock status = %d\n", ToUnderlying(pSuperblock->GetStatus()));
switch (pSuperblock->GetStatus()) {
case SEEN_OBJECT_ERROR_INVALID:
case SEEN_OBJECT_UNKNOWN:
case SeenObjectStatus::ErrorInvalid:
case SeenObjectStatus::Unknown:
LogPrint(BCLog::GOBJECT, "CGovernanceTriggerManager::CleanAndRemove -- Unknown or invalid trigger found\n");
remove = true;
break;
case SEEN_OBJECT_IS_VALID:
case SEEN_OBJECT_EXECUTED: {
case SeenObjectStatus::Valid:
case SeenObjectStatus::Executed: {
LogPrint(BCLog::GOBJECT, "CGovernanceTriggerManager::CleanAndRemove -- Valid trigger found\n");
if (pSuperblock->IsExpired(*governance)) {
// update corresponding object
@ -391,7 +392,7 @@ CSuperblock::
CSuperblock() :
nGovObjHash(),
nBlockHeight(0),
nStatus(SEEN_OBJECT_UNKNOWN),
nStatus(SeenObjectStatus::Unknown),
vecPayments()
{
}
@ -400,7 +401,7 @@ CSuperblock::
CSuperblock(uint256& nHash) :
nGovObjHash(nHash),
nBlockHeight(0),
nStatus(SEEN_OBJECT_UNKNOWN),
nStatus(SeenObjectStatus::Unknown),
vecPayments()
{
CGovernanceObject* pGovObj = GetGovernanceObject(*governance);
@ -410,15 +411,15 @@ CSuperblock::
}
LogPrint(BCLog::GOBJECT, "CSuperblock -- Constructor pGovObj: %s, nObjectType = %d\n",
pGovObj->GetDataAsPlainString(), pGovObj->GetObjectType());
pGovObj->GetDataAsPlainString(), ToUnderlying(pGovObj->GetObjectType()));
if (pGovObj->GetObjectType() != GOVERNANCE_OBJECT_TRIGGER) {
if (pGovObj->GetObjectType() != GovernanceObject::TRIGGER) {
throw std::runtime_error("CSuperblock: Governance Object not a trigger");
}
UniValue obj = pGovObj->GetJSONObject();
if (obj["type"].get_int() != GOVERNANCE_OBJECT_TRIGGER) {
if (obj["type"].get_int() != ToUnderlying(GovernanceObject::TRIGGER)) {
throw std::runtime_error("CSuperblock: invalid data type");
}
@ -681,10 +682,10 @@ bool CSuperblock::IsExpired(const CGovernanceManager& governanceManager) const
// Other valid triggers are kept for ~1 day only (for mainnet, but no longer than a superblock cycle for other networks).
// Everything else is pruned after ~1h (for mainnet, but no longer than a superblock cycle for other networks).
switch (nStatus) {
case SEEN_OBJECT_EXECUTED:
case SeenObjectStatus::Executed:
nExpirationBlocks = Params().GetConsensus().nSuperblockCycle;
break;
case SEEN_OBJECT_IS_VALID:
case SeenObjectStatus::Valid:
nExpirationBlocks = std::min(576, Params().GetConsensus().nSuperblockCycle);
break;
default:

View File

@ -117,7 +117,7 @@ private:
uint256 nGovObjHash;
int nBlockHeight;
int nStatus;
SeenObjectStatus nStatus;
std::vector<CGovernancePayment> vecPayments;
void ParsePaymentSchedule(const std::string& strPaymentAddresses, const std::string& strPaymentAmounts);
@ -130,11 +130,11 @@ public:
static void GetNearestSuperblocksHeights(int nBlockHeight, int& nLastSuperblockRet, int& nNextSuperblockRet);
static CAmount GetPaymentsLimit(int nBlockHeight);
int GetStatus() const { return nStatus; }
void SetStatus(int nStatusIn) { nStatus = nStatusIn; }
SeenObjectStatus GetStatus() const { return nStatus; }
void SetStatus(SeenObjectStatus nStatusIn) { nStatus = nStatusIn; }
// TELL THE ENGINE WE EXECUTED THIS EVENT
void SetExecuted() { nStatus = SEEN_OBJECT_EXECUTED; }
void SetExecuted() { nStatus = SeenObjectStatus::Executed; }
CGovernanceObject* GetGovernanceObject(CGovernanceManager& governanceManager);

View File

@ -270,7 +270,8 @@ void CGovernanceManager::AddGovernanceObject(CGovernanceObject& govobj, CConnman
return;
}
LogPrint(BCLog::GOBJECT, "CGovernanceManager::AddGovernanceObject -- Adding object: hash = %s, type = %d\n", nHash.ToString(), govobj.GetObjectType());
LogPrint(BCLog::GOBJECT, "CGovernanceManager::AddGovernanceObject -- Adding object: hash = %s, type = %d\n", nHash.ToString(),
ToUnderlying(govobj.GetObjectType()));
// INSERT INTO OUR GOVERNANCE OBJECT MEMORY
// IF WE HAVE THIS OBJECT ALREADY, WE DON'T WANT ANOTHER COPY
@ -284,9 +285,9 @@ void CGovernanceManager::AddGovernanceObject(CGovernanceObject& govobj, CConnman
// SHOULD WE ADD THIS OBJECT TO ANY OTHER MANAGERS?
LogPrint(BCLog::GOBJECT, "CGovernanceManager::AddGovernanceObject -- Before trigger block, GetDataAsPlainString = %s, nObjectType = %d\n",
govobj.GetDataAsPlainString(), govobj.GetObjectType());
govobj.GetDataAsPlainString(), ToUnderlying(govobj.GetObjectType()));
if (govobj.GetObjectType() == GOVERNANCE_OBJECT_TRIGGER && !triggerman.AddNewTrigger(nHash)) {
if (govobj.GetObjectType() == GovernanceObject::TRIGGER && !triggerman.AddNewTrigger(nHash)) {
LogPrint(BCLog::GOBJECT, "CGovernanceManager::AddGovernanceObject -- undo adding invalid trigger object: hash = %s\n", nHash.ToString());
objpair.first->second.PrepareDeletion(GetAdjustedTime());
return;
@ -382,7 +383,7 @@ void CGovernanceManager::UpdateCachesAndClean()
int64_t nTimeExpired{0};
if (pObj->GetObjectType() == GOVERNANCE_OBJECT_PROPOSAL) {
if (pObj->GetObjectType() == GovernanceObject::PROPOSAL) {
// keep hashes of deleted proposals forever
nTimeExpired = std::numeric_limits<int64_t>::max();
} else {
@ -394,7 +395,7 @@ void CGovernanceManager::UpdateCachesAndClean()
mapObjects.erase(it++);
} else {
// NOTE: triggers are handled via triggerman
if (pObj->GetObjectType() == GOVERNANCE_OBJECT_PROPOSAL) {
if (pObj->GetObjectType() == GovernanceObject::PROPOSAL) {
bool fAllowScript = (VersionBitsState(::ChainActive().Tip(), Params().GetConsensus(), Consensus::DEPLOYMENT_DIP0024, versionbitscache) == ThresholdState::ACTIVE);
CProposalValidator validator(pObj->GetDataAsHexString(), fAllowScript);
if (!validator.Validate()) {
@ -602,7 +603,7 @@ void CGovernanceManager::SyncSingleObjVotes(CNode& peer, const uint256& nProp, c
for (const auto& vote : fileVotes.GetVotes()) {
uint256 nVoteHash = vote.GetHash();
bool onlyVotingKeyAllowed = govobj.GetObjectType() == GOVERNANCE_OBJECT_PROPOSAL && vote.GetSignal() == VOTE_SIGNAL_FUNDING;
bool onlyVotingKeyAllowed = govobj.GetObjectType() == GovernanceObject::PROPOSAL && vote.GetSignal() == VOTE_SIGNAL_FUNDING;
if (filter.contains(nVoteHash) || !vote.IsValid(onlyVotingKeyAllowed)) {
continue;
@ -653,7 +654,7 @@ void CGovernanceManager::SyncObjects(CNode& peer, CConnman& connman) const
continue;
}
if (fAllowScript && peer.nVersion < GOVSCRIPT_PROTO_VERSION && govobj.GetObjectType() == GOVERNANCE_OBJECT_PROPOSAL) {
if (fAllowScript && peer.nVersion < GOVSCRIPT_PROTO_VERSION && govobj.GetObjectType() == GovernanceObject::PROPOSAL) {
// We know this proposal is valid locally, otherwise we would not store it.
// But we don't want to relay it to pre-GOVSCRIPT_PROTO_VERSION peers if payment_address is p2sh
// because they won't accept it anyway and will simply ban us eventually.
@ -679,7 +680,7 @@ void CGovernanceManager::SyncObjects(CNode& peer, CConnman& connman) const
void CGovernanceManager::MasternodeRateUpdate(const CGovernanceObject& govobj)
{
if (govobj.GetObjectType() != GOVERNANCE_OBJECT_TRIGGER) return;
if (govobj.GetObjectType() != GovernanceObject::TRIGGER) return;
const COutPoint& masternodeOutpoint = govobj.GetMasternodeOutpoint();
auto it = mapLastMasternodeObject.find(masternodeOutpoint);
@ -715,7 +716,7 @@ bool CGovernanceManager::MasternodeRateCheck(const CGovernanceObject& govobj, bo
return true;
}
if (govobj.GetObjectType() != GOVERNANCE_OBJECT_TRIGGER) {
if (govobj.GetObjectType() != GovernanceObject::TRIGGER) {
return true;
}
@ -837,7 +838,7 @@ void CGovernanceManager::CheckPostponedObjects(CConnman& connman)
const uint256& nHash = it->first;
CGovernanceObject& govobj = it->second;
assert(govobj.GetObjectType() != GOVERNANCE_OBJECT_TRIGGER);
assert(govobj.GetObjectType() != GovernanceObject::TRIGGER);
std::string strError;
bool fMissingConfirmations;
@ -972,7 +973,7 @@ int CGovernanceManager::RequestGovernanceObjectVotes(const std::vector<CNode*>&
if (mapAskedRecently[nHash].size() >= nPeersPerHashMax) continue;
}
if (objPair.second.GetObjectType() == GOVERNANCE_OBJECT_TRIGGER) {
if (objPair.second.GetObjectType() == GovernanceObject::TRIGGER) {
vTriggerObjHashes.push_back(nHash);
} else {
vOtherObjHashes.push_back(nHash);
@ -1076,7 +1077,7 @@ void CGovernanceManager::AddCachedTriggers()
for (auto& objpair : mapObjects) {
CGovernanceObject& govobj = objpair.second;
if (govobj.GetObjectType() != GOVERNANCE_OBJECT_TRIGGER) {
if (govobj.GetObjectType() != GovernanceObject::TRIGGER) {
continue;
}
@ -1109,10 +1110,10 @@ std::string CGovernanceManager::ToString() const
for (const auto& objPair : mapObjects) {
switch (objPair.second.GetObjectType()) {
case GOVERNANCE_OBJECT_PROPOSAL:
case GovernanceObject::PROPOSAL:
nProposalCount++;
break;
case GOVERNANCE_OBJECT_TRIGGER:
case GovernanceObject::TRIGGER:
nTriggerCount++;
break;
default:
@ -1137,10 +1138,10 @@ UniValue CGovernanceManager::ToJson() const
for (const auto& objpair : mapObjects) {
switch (objpair.second.GetObjectType()) {
case GOVERNANCE_OBJECT_PROPOSAL:
case GovernanceObject::PROPOSAL:
nProposalCount++;
break;
case GOVERNANCE_OBJECT_TRIGGER:
case GovernanceObject::TRIGGER:
nTriggerCount++;
break;
default:

View File

@ -22,7 +22,7 @@
CGovernanceObject::CGovernanceObject() :
cs(),
nObjectType(GOVERNANCE_OBJECT_UNKNOWN),
nObjectType(GovernanceObject::UNKNOWN),
nHashParent(),
nRevision(0),
nTime(0),
@ -49,7 +49,7 @@ CGovernanceObject::CGovernanceObject() :
CGovernanceObject::CGovernanceObject(const uint256& nHashParentIn, int nRevisionIn, int64_t nTimeIn, const uint256& nCollateralHashIn, const std::string& strDataHexIn) :
cs(),
nObjectType(GOVERNANCE_OBJECT_UNKNOWN),
nObjectType(GovernanceObject::UNKNOWN),
nHashParent(nHashParentIn),
nRevision(nRevisionIn),
nTime(nTimeIn),
@ -184,7 +184,7 @@ bool CGovernanceObject::ProcessVote(const CGovernanceVote& vote, CGovernanceExce
nVoteTimeUpdate = nNow;
}
bool onlyVotingKeyAllowed = nObjectType == GOVERNANCE_OBJECT_PROPOSAL && vote.GetSignal() == VOTE_SIGNAL_FUNDING;
bool onlyVotingKeyAllowed = nObjectType == GovernanceObject::PROPOSAL && vote.GetSignal() == VOTE_SIGNAL_FUNDING;
// Finally check that the vote is actually valid (done last because of cost of signature verification)
if (!vote.IsValid(onlyVotingKeyAllowed)) {
@ -245,7 +245,7 @@ std::set<uint256> CGovernanceObject::RemoveInvalidVotes(const COutPoint& mnOutpo
return {};
}
auto removedVotes = fileVotes.RemoveInvalidVotes(mnOutpoint, nObjectType == GOVERNANCE_OBJECT_PROPOSAL);
auto removedVotes = fileVotes.RemoveInvalidVotes(mnOutpoint, nObjectType == GovernanceObject::PROPOSAL);
if (removedVotes.empty()) {
return {};
}
@ -371,7 +371,7 @@ void CGovernanceObject::LoadData()
GetData(objResult);
LogPrint(BCLog::GOBJECT, "CGovernanceObject::LoadData -- GetDataAsPlainString = %s\n", GetDataAsPlainString());
UniValue obj = GetJSONObject();
nObjectType = obj["type"].get_int();
nObjectType = GovernanceObject(obj["type"].get_int());
} catch (std::exception& e) {
fUnparsable = true;
std::ostringstream ostr;
@ -468,7 +468,7 @@ bool CGovernanceObject::IsValidLocally(std::string& strError, bool& fMissingConf
}
switch (nObjectType) {
case GOVERNANCE_OBJECT_PROPOSAL: {
case GovernanceObject::PROPOSAL: {
bool fAllowScript = (VersionBitsState(::ChainActive().Tip(), Params().GetConsensus(), Consensus::DEPLOYMENT_DIP0024, versionbitscache) == ThresholdState::ACTIVE);
CProposalValidator validator(GetDataAsHexString(), fAllowScript);
// Note: It's ok to have expired proposals
@ -484,7 +484,7 @@ bool CGovernanceObject::IsValidLocally(std::string& strError, bool& fMissingConf
}
return true;
}
case GOVERNANCE_OBJECT_TRIGGER: {
case GovernanceObject::TRIGGER: {
if (!fCheckCollateral) {
// nothing else we can check here (yet?)
return true;
@ -508,7 +508,7 @@ bool CGovernanceObject::IsValidLocally(std::string& strError, bool& fMissingConf
return true;
}
default: {
strError = strprintf("Invalid object type %d", nObjectType);
strError = strprintf("Invalid object type %d", ToUnderlying(nObjectType));
return false;
}
}
@ -518,13 +518,16 @@ CAmount CGovernanceObject::GetMinCollateralFee(bool fork_active) const
{
// Only 1 type has a fee for the moment but switch statement allows for future object types
switch (nObjectType) {
case GOVERNANCE_OBJECT_PROPOSAL:
if (fork_active) return GOVERNANCE_PROPOSAL_FEE_TX;
else return GOVERNANCE_PROPOSAL_FEE_TX_OLD;
case GOVERNANCE_OBJECT_TRIGGER:
return 0;
default:
return MAX_MONEY;
case GovernanceObject::PROPOSAL: {
if (fork_active) return GOVERNANCE_PROPOSAL_FEE_TX;
else return GOVERNANCE_PROPOSAL_FEE_TX_OLD;
}
case GovernanceObject::TRIGGER: {
return 0;
}
default: {
return MAX_MONEY;
}
}
}
@ -687,7 +690,7 @@ void CGovernanceObject::Relay(CConnman& connman) const
}
int minProtoVersion = MIN_PEER_PROTO_VERSION;
if (nObjectType == GOVERNANCE_OBJECT_PROPOSAL) {
if (nObjectType == GovernanceObject::PROPOSAL) {
// We know this proposal is valid locally, otherwise we would not get to the point we should relay it.
// But we don't want to relay it to pre-GOVSCRIPT_PROTO_VERSION peers if payment_address is p2sh
// because they won't accept it anyway and will simply ban us eventually.

View File

@ -10,6 +10,7 @@
#include <governance/votedb.h>
#include <logging.h>
#include <sync.h>
#include <util/underlying.h>
#include <univalue.h>
@ -26,9 +27,12 @@ extern CCriticalSection cs_main;
static constexpr double GOVERNANCE_FILTER_FP_RATE = 0.001;
static constexpr int GOVERNANCE_OBJECT_UNKNOWN = 0;
static constexpr int GOVERNANCE_OBJECT_PROPOSAL = 1;
static constexpr int GOVERNANCE_OBJECT_TRIGGER = 2;
enum class GovernanceObject {
UNKNOWN = 0,
PROPOSAL,
TRIGGER
};
static constexpr CAmount GOVERNANCE_PROPOSAL_FEE_TX = (1 * COIN);
static constexpr CAmount GOVERNANCE_PROPOSAL_FEE_TX_OLD = (5 * COIN);
@ -40,10 +44,12 @@ static constexpr int64_t GOVERNANCE_DELETION_DELAY = 10 * 60;
static constexpr int64_t GOVERNANCE_ORPHAN_EXPIRATION_TIME = 10 * 60;
// FOR SEEN MAP ARRAYS - GOVERNANCE OBJECTS AND VOTES
static constexpr int SEEN_OBJECT_IS_VALID = 0;
static constexpr int SEEN_OBJECT_ERROR_INVALID = 1;
static constexpr int SEEN_OBJECT_EXECUTED = 3; //used for triggers
static constexpr int SEEN_OBJECT_UNKNOWN = 4; // the default
enum class SeenObjectStatus {
Valid = 0,
ErrorInvalid,
Executed,
Unknown
};
using vote_time_pair_t = std::pair<CGovernanceVote, int64_t>;
@ -99,7 +105,7 @@ private:
mutable CCriticalSection cs;
/// Object typecode
int nObjectType;
GovernanceObject nObjectType;
/// parent object, 0 is root
uint256 nHashParent;
@ -175,7 +181,7 @@ public:
return nDeletionTime;
}
int GetObjectType() const
GovernanceObject GetObjectType() const
{
return nObjectType;
}
@ -295,7 +301,7 @@ public:
obj.nTime,
obj.nCollateralHash,
obj.vchData,
obj.nObjectType,
ToUnderlying(obj.nObjectType),
obj.masternodeOutpoint
);
if (!(s.GetType() & SER_GETHASH)) {

View File

@ -9,6 +9,7 @@
#include <timedata.h>
#include <tinyformat.h>
#include <util/strencodings.h>
#include <util/underlying.h>
#include <algorithm>
@ -77,8 +78,8 @@ bool CProposalValidator::ValidateType()
return false;
}
if (nType != GOVERNANCE_OBJECT_PROPOSAL) {
strErrorMessages += strprintf("type is not %d;", GOVERNANCE_OBJECT_PROPOSAL);
if (nType != ToUnderlying(GovernanceObject::PROPOSAL)) {
strErrorMessages += strprintf("type is not %d;", ToUnderlying(GovernanceObject::PROPOSAL));
return false;
}

View File

@ -355,7 +355,7 @@ void GovernanceList::updateProposalList()
clientModel->getAllGovernanceObjects(govObjList);
std::vector<const Proposal*> newProposals;
for (const auto& govObj : govObjList) {
if (govObj.GetObjectType() != GOVERNANCE_OBJECT_PROPOSAL) {
if (govObj.GetObjectType() != GovernanceObject::PROPOSAL) {
continue; // Skip triggers.
}

View File

@ -108,7 +108,7 @@ static UniValue gobject_check(const JSONRPCRequest& request)
CGovernanceObject govobj(hashParent, nRevision, nTime, uint256(), strDataHex);
if (govobj.GetObjectType() == GOVERNANCE_OBJECT_PROPOSAL) {
if (govobj.GetObjectType() == GovernanceObject::PROPOSAL) {
LOCK(cs_main);
bool fAllowScript = (VersionBitsState(::ChainActive().Tip(), Params().GetConsensus(), Consensus::DEPLOYMENT_DIP0024, versionbitscache) == ThresholdState::ACTIVE);
CProposalValidator validator(strDataHex, fAllowScript);
@ -183,7 +183,7 @@ static UniValue gobject_prepare(const JSONRPCRequest& request)
request.params[2].getValStr(), request.params[3].getValStr(),
govobj.GetDataAsPlainString(), govobj.GetHash().ToString());
if (govobj.GetObjectType() == GOVERNANCE_OBJECT_PROPOSAL) {
if (govobj.GetObjectType() == GovernanceObject::PROPOSAL) {
LOCK(cs_main);
bool fAllowScript = (VersionBitsState(::ChainActive().Tip(), Params().GetConsensus(), Consensus::DEPLOYMENT_DIP0024, versionbitscache) == ThresholdState::ACTIVE);
CProposalValidator validator(strDataHex, fAllowScript);
@ -192,7 +192,7 @@ static UniValue gobject_prepare(const JSONRPCRequest& request)
}
}
if (govobj.GetObjectType() == GOVERNANCE_OBJECT_TRIGGER) {
if (govobj.GetObjectType() == GovernanceObject::TRIGGER) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Trigger objects need not be prepared (however only masternodes can create them)");
}
@ -348,7 +348,7 @@ static UniValue gobject_submit(const JSONRPCRequest& request)
LogPrint(BCLog::GOBJECT, "gobject_submit -- GetDataAsPlainString = %s, hash = %s, txid = %s\n",
govobj.GetDataAsPlainString(), govobj.GetHash().ToString(), txidFee.ToString());
if (govobj.GetObjectType() == GOVERNANCE_OBJECT_PROPOSAL) {
if (govobj.GetObjectType() == GovernanceObject::PROPOSAL) {
LOCK(cs_main);
bool fAllowScript = (VersionBitsState(::ChainActive().Tip(), Params().GetConsensus(), Consensus::DEPLOYMENT_DIP0024, versionbitscache) == ThresholdState::ACTIVE);
CProposalValidator validator(strDataHex, fAllowScript);
@ -358,7 +358,7 @@ static UniValue gobject_submit(const JSONRPCRequest& request)
}
// Attempt to sign triggers if we are a MN
if (govobj.GetObjectType() == GOVERNANCE_OBJECT_TRIGGER) {
if (govobj.GetObjectType() == GovernanceObject::TRIGGER) {
if (fMnFound) {
LOCK(activeMasternodeInfoCs);
govobj.SetMasternodeOutpoint(activeMasternodeInfo.outpoint);
@ -443,15 +443,13 @@ static UniValue gobject_vote_conf(const JSONRPCRequest& request)
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid vote outcome. Please use one of the following: 'yes', 'no' or 'abstain'");
}
int govObjType;
{
LOCK(governance->cs);
GovernanceObject govObjType = WITH_LOCK(governance->cs, return [&](){
CGovernanceObject *pGovObj = governance->FindGovernanceObject(hash);
if (!pGovObj) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Governance object not found");
}
govObjType = pGovObj->GetObjectType();
}
return pGovObj->GetObjectType();
}());
int nSuccessful = 0;
int nFailed = 0;
@ -476,7 +474,7 @@ static UniValue gobject_vote_conf(const JSONRPCRequest& request)
CGovernanceVote vote(dmn->collateralOutpoint, hash, eVoteSignal, eVoteOutcome);
bool signSuccess = false;
if (govObjType == GOVERNANCE_OBJECT_PROPOSAL && eVoteSignal == VOTE_SIGNAL_FUNDING) {
if (govObjType == GovernanceObject::PROPOSAL && eVoteSignal == VOTE_SIGNAL_FUNDING) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Can't use vote-conf for proposals");
}
@ -727,15 +725,15 @@ static UniValue ListObjects(const std::string& strCachedSignal, const std::strin
if (strCachedSignal == "delete" && !govObj.IsSetCachedDelete()) continue;
if (strCachedSignal == "endorsed" && !govObj.IsSetCachedEndorsed()) continue;
if (strType == "proposals" && govObj.GetObjectType() != GOVERNANCE_OBJECT_PROPOSAL) continue;
if (strType == "triggers" && govObj.GetObjectType() != GOVERNANCE_OBJECT_TRIGGER) continue;
if (strType == "proposals" && govObj.GetObjectType() != GovernanceObject::PROPOSAL) continue;
if (strType == "triggers" && govObj.GetObjectType() != GovernanceObject::TRIGGER) continue;
UniValue bObj(UniValue::VOBJ);
bObj.pushKV("DataHex", govObj.GetDataAsHexString());
bObj.pushKV("DataString", govObj.GetDataAsPlainString());
bObj.pushKV("Hash", govObj.GetHash().ToString());
bObj.pushKV("CollateralHash", govObj.GetCollateralHash().ToString());
bObj.pushKV("ObjectType", govObj.GetObjectType());
bObj.pushKV("ObjectType", ToUnderlying(govObj.GetObjectType()));
bObj.pushKV("CreationTime", govObj.GetCreationTime());
const COutPoint& masternodeOutpoint = govObj.GetMasternodeOutpoint();
if (masternodeOutpoint != COutPoint()) {
@ -869,7 +867,7 @@ static UniValue gobject_get(const JSONRPCRequest& request)
objResult.pushKV("DataString", pGovObj->GetDataAsPlainString());
objResult.pushKV("Hash", pGovObj->GetHash().ToString());
objResult.pushKV("CollateralHash", pGovObj->GetCollateralHash().ToString());
objResult.pushKV("ObjectType", pGovObj->GetObjectType());
objResult.pushKV("ObjectType", ToUnderlying(pGovObj->GetObjectType()));
objResult.pushKV("CreationTime", pGovObj->GetCreationTime());
const COutPoint& masternodeOutpoint = pGovObj->GetMasternodeOutpoint();
if (masternodeOutpoint != COutPoint()) {
@ -1094,15 +1092,14 @@ static UniValue voteraw(const JSONRPCRequest& request)
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid vote outcome. Please use one of the following: 'yes', 'no' or 'abstain'");
}
int govObjType;
{
LOCK(governance->cs);
GovernanceObject govObjType = WITH_LOCK(governance->cs, return [&](){
CGovernanceObject *pGovObj = governance->FindGovernanceObject(hashGovObj);
if (!pGovObj) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Governance object not found");
}
govObjType = pGovObj->GetObjectType();
}
return pGovObj->GetObjectType();
}());
int64_t nTime = request.params[5].get_int64();
std::string strSig = request.params[6].get_str();
@ -1123,7 +1120,7 @@ static UniValue voteraw(const JSONRPCRequest& request)
vote.SetTime(nTime);
vote.SetSignature(vchSig);
bool onlyVotingKeyAllowed = govObjType == GOVERNANCE_OBJECT_PROPOSAL && vote.GetSignal() == VOTE_SIGNAL_FUNDING;
bool onlyVotingKeyAllowed = govObjType == GovernanceObject::PROPOSAL && vote.GetSignal() == VOTE_SIGNAL_FUNDING;
if (!vote.IsValid(onlyVotingKeyAllowed)) {
throw JSONRPCError(RPC_INTERNAL_ERROR, "Failure to verify vote.");

View File

@ -380,7 +380,7 @@ bool CZMQPublishRawGovernanceVoteNotifier::NotifyGovernanceVote(const std::share
bool CZMQPublishRawGovernanceObjectNotifier::NotifyGovernanceObject(const std::shared_ptr<const CGovernanceObject>& govobj)
{
uint256 nHash = govobj->GetHash();
LogPrint(BCLog::ZMQ, "zmq: Publish rawgovernanceobject: hash = %s, type = %d\n", nHash.ToString(), govobj->GetObjectType());
LogPrint(BCLog::ZMQ, "zmq: Publish rawgovernanceobject: hash = %s, type = %d\n", nHash.ToString(), ToUnderlying(govobj->GetObjectType()));
CDataStream ss(SER_NETWORK, PROTOCOL_VERSION);
ss << *govobj;
return SendZmqMessage(MSG_RAWGOBJ, &(*ss.begin()), ss.size());