mirror of
https://github.com/dashpay/dash.git
synced 2024-12-26 12:32:48 +01:00
refactor: use NodeContext members instead of globals in RPC logic
This commit is contained in:
parent
2efebcac81
commit
e8270ca91b
@ -20,6 +20,7 @@
|
|||||||
#include <masternode/meta.h>
|
#include <masternode/meta.h>
|
||||||
#include <messagesigner.h>
|
#include <messagesigner.h>
|
||||||
#include <netbase.h>
|
#include <netbase.h>
|
||||||
|
#include <node/context.h>
|
||||||
#include <rpc/blockchain.h>
|
#include <rpc/blockchain.h>
|
||||||
#include <rpc/server.h>
|
#include <rpc/server.h>
|
||||||
#include <rpc/util.h>
|
#include <rpc/util.h>
|
||||||
@ -928,6 +929,8 @@ static UniValue protx_update_service_common_wrapper(const JSONRPCRequest& reques
|
|||||||
|
|
||||||
EnsureWalletIsUnlocked(wallet.get());
|
EnsureWalletIsUnlocked(wallet.get());
|
||||||
|
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
|
||||||
const bool isV19active{DeploymentActiveAfter(WITH_LOCK(cs_main, return chainman.ActiveChain().Tip();), Params().GetConsensus(), Consensus::DEPLOYMENT_V19)};
|
const bool isV19active{DeploymentActiveAfter(WITH_LOCK(cs_main, return chainman.ActiveChain().Tip();), Params().GetConsensus(), Consensus::DEPLOYMENT_V19)};
|
||||||
const bool is_bls_legacy = !isV19active;
|
const bool is_bls_legacy = !isV19active;
|
||||||
if (isEvoRequested && !isV19active) {
|
if (isEvoRequested && !isV19active) {
|
||||||
@ -966,7 +969,7 @@ static UniValue protx_update_service_common_wrapper(const JSONRPCRequest& reques
|
|||||||
paramIdx += 3;
|
paramIdx += 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto dmn = deterministicMNManager->GetListAtChainTip().GetMN(ptx.proTxHash);
|
auto dmn = node.dmnman->GetListAtChainTip().GetMN(ptx.proTxHash);
|
||||||
if (!dmn) {
|
if (!dmn) {
|
||||||
throw std::runtime_error(strprintf("masternode with proTxHash %s not found", ptx.proTxHash.ToString()));
|
throw std::runtime_error(strprintf("masternode with proTxHash %s not found", ptx.proTxHash.ToString()));
|
||||||
}
|
}
|
||||||
@ -1059,10 +1062,12 @@ static UniValue protx_update_registrar_wrapper(const JSONRPCRequest& request, co
|
|||||||
|
|
||||||
EnsureWalletIsUnlocked(wallet.get());
|
EnsureWalletIsUnlocked(wallet.get());
|
||||||
|
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
|
||||||
CProUpRegTx ptx;
|
CProUpRegTx ptx;
|
||||||
ptx.proTxHash = ParseHashV(request.params[0], "proTxHash");
|
ptx.proTxHash = ParseHashV(request.params[0], "proTxHash");
|
||||||
|
|
||||||
auto dmn = deterministicMNManager->GetListAtChainTip().GetMN(ptx.proTxHash);
|
auto dmn = node.dmnman->GetListAtChainTip().GetMN(ptx.proTxHash);
|
||||||
if (!dmn) {
|
if (!dmn) {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("masternode %s not found", ptx.proTxHash.ToString()));
|
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("masternode %s not found", ptx.proTxHash.ToString()));
|
||||||
}
|
}
|
||||||
@ -1170,6 +1175,8 @@ static UniValue protx_revoke(const JSONRPCRequest& request, const ChainstateMana
|
|||||||
|
|
||||||
EnsureWalletIsUnlocked(wallet.get());
|
EnsureWalletIsUnlocked(wallet.get());
|
||||||
|
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
|
||||||
const bool isV19active{DeploymentActiveAfter(WITH_LOCK(cs_main, return chainman.ActiveChain().Tip();), Params().GetConsensus(), Consensus::DEPLOYMENT_V19)};
|
const bool isV19active{DeploymentActiveAfter(WITH_LOCK(cs_main, return chainman.ActiveChain().Tip();), Params().GetConsensus(), Consensus::DEPLOYMENT_V19)};
|
||||||
const bool is_bls_legacy = !isV19active;
|
const bool is_bls_legacy = !isV19active;
|
||||||
CProUpRevTx ptx;
|
CProUpRevTx ptx;
|
||||||
@ -1186,7 +1193,7 @@ static UniValue protx_revoke(const JSONRPCRequest& request, const ChainstateMana
|
|||||||
ptx.nReason = (uint16_t)nReason;
|
ptx.nReason = (uint16_t)nReason;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto dmn = deterministicMNManager->GetListAtChainTip().GetMN(ptx.proTxHash);
|
auto dmn = node.dmnman->GetListAtChainTip().GetMN(ptx.proTxHash);
|
||||||
if (!dmn) {
|
if (!dmn) {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("masternode %s not found", ptx.proTxHash.ToString()));
|
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("masternode %s not found", ptx.proTxHash.ToString()));
|
||||||
}
|
}
|
||||||
@ -1281,7 +1288,7 @@ static bool CheckWalletOwnsScript(CWallet* pwallet, const CScript& script) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static UniValue BuildDMNListEntry(CWallet* pwallet, const CDeterministicMN& dmn, bool detailed, const ChainstateManager& chainman, const CBlockIndex* pindex = nullptr)
|
static UniValue BuildDMNListEntry(CWallet* pwallet, const CDeterministicMN& dmn, CMasternodeMetaMan& mn_metaman, bool detailed, const ChainstateManager& chainman, const CBlockIndex* pindex = nullptr)
|
||||||
{
|
{
|
||||||
if (!detailed) {
|
if (!detailed) {
|
||||||
return dmn.proTxHash.ToString();
|
return dmn.proTxHash.ToString();
|
||||||
@ -1329,8 +1336,7 @@ static UniValue BuildDMNListEntry(CWallet* pwallet, const CDeterministicMN& dmn,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CHECK_NONFATAL(mmetaman != nullptr);
|
const auto metaInfo = mn_metaman.GetMetaInfo(dmn.proTxHash);
|
||||||
auto metaInfo = mmetaman->GetMetaInfo(dmn.proTxHash);
|
|
||||||
o.pushKV("metaInfo", metaInfo->ToJson());
|
o.pushKV("metaInfo", metaInfo->ToJson());
|
||||||
|
|
||||||
return o;
|
return o;
|
||||||
@ -1348,6 +1354,8 @@ static UniValue protx_list(const JSONRPCRequest& request, const ChainstateManage
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
|
||||||
std::string type = "registered";
|
std::string type = "registered";
|
||||||
if (!request.params[0].isNull()) {
|
if (!request.params[0].isNull()) {
|
||||||
type = request.params[0].get_str();
|
type = request.params[0].get_str();
|
||||||
@ -1384,14 +1392,14 @@ static UniValue protx_list(const JSONRPCRequest& request, const ChainstateManage
|
|||||||
setOutpts.emplace(outpt);
|
setOutpts.emplace(outpt);
|
||||||
}
|
}
|
||||||
|
|
||||||
CDeterministicMNList mnList = deterministicMNManager->GetListForBlock(chainman.ActiveChain()[height]);
|
CDeterministicMNList mnList = node.dmnman->GetListForBlock(chainman.ActiveChain()[height]);
|
||||||
mnList.ForEachMN(false, [&](const auto& dmn) {
|
mnList.ForEachMN(false, [&](const auto& dmn) {
|
||||||
if (setOutpts.count(dmn.collateralOutpoint) ||
|
if (setOutpts.count(dmn.collateralOutpoint) ||
|
||||||
CheckWalletOwnsKey(wallet.get(), dmn.pdmnState->keyIDOwner) ||
|
CheckWalletOwnsKey(wallet.get(), dmn.pdmnState->keyIDOwner) ||
|
||||||
CheckWalletOwnsKey(wallet.get(), dmn.pdmnState->keyIDVoting) ||
|
CheckWalletOwnsKey(wallet.get(), dmn.pdmnState->keyIDVoting) ||
|
||||||
CheckWalletOwnsScript(wallet.get(), dmn.pdmnState->scriptPayout) ||
|
CheckWalletOwnsScript(wallet.get(), dmn.pdmnState->scriptPayout) ||
|
||||||
CheckWalletOwnsScript(wallet.get(), dmn.pdmnState->scriptOperatorPayout)) {
|
CheckWalletOwnsScript(wallet.get(), dmn.pdmnState->scriptOperatorPayout)) {
|
||||||
ret.push_back(BuildDMNListEntry(wallet.get(), dmn, detailed, chainman));
|
ret.push_back(BuildDMNListEntry(wallet.get(), dmn, *node.mn_metaman, detailed, chainman));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
#endif
|
#endif
|
||||||
@ -1409,12 +1417,12 @@ static UniValue protx_list(const JSONRPCRequest& request, const ChainstateManage
|
|||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "invalid height specified");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "invalid height specified");
|
||||||
}
|
}
|
||||||
|
|
||||||
CDeterministicMNList mnList = deterministicMNManager->GetListForBlock(chainman.ActiveChain()[height]);
|
CDeterministicMNList mnList = node.dmnman->GetListForBlock(chainman.ActiveChain()[height]);
|
||||||
bool onlyValid = type == "valid";
|
bool onlyValid = type == "valid";
|
||||||
bool onlyEvoNodes = type == "evo";
|
bool onlyEvoNodes = type == "evo";
|
||||||
mnList.ForEachMN(onlyValid, [&](const auto& dmn) {
|
mnList.ForEachMN(onlyValid, [&](const auto& dmn) {
|
||||||
if (onlyEvoNodes && dmn.nType != MnType::Evo) return;
|
if (onlyEvoNodes && dmn.nType != MnType::Evo) return;
|
||||||
ret.push_back(BuildDMNListEntry(wallet.get(), dmn, detailed, chainman));
|
ret.push_back(BuildDMNListEntry(wallet.get(), dmn, *node.mn_metaman, detailed, chainman));
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "invalid type specified");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "invalid type specified");
|
||||||
@ -1455,6 +1463,8 @@ static UniValue protx_info(const JSONRPCRequest& request, const ChainstateManage
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
|
||||||
if (g_txindex) {
|
if (g_txindex) {
|
||||||
g_txindex->BlockUntilSyncedToCurrentChain();
|
g_txindex->BlockUntilSyncedToCurrentChain();
|
||||||
}
|
}
|
||||||
@ -1475,12 +1485,12 @@ static UniValue protx_info(const JSONRPCRequest& request, const ChainstateManage
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto mnList = deterministicMNManager->GetListForBlock(pindex);
|
auto mnList = node.dmnman->GetListForBlock(pindex);
|
||||||
auto dmn = mnList.GetMN(proTxHash);
|
auto dmn = mnList.GetMN(proTxHash);
|
||||||
if (!dmn) {
|
if (!dmn) {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("%s not found", proTxHash.ToString()));
|
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("%s not found", proTxHash.ToString()));
|
||||||
}
|
}
|
||||||
return BuildDMNListEntry(wallet.get(), *dmn, true, chainman, pindex);
|
return BuildDMNListEntry(wallet.get(), *dmn, *node.mn_metaman, true, chainman, pindex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void protx_diff_help(const JSONRPCRequest& request)
|
static void protx_diff_help(const JSONRPCRequest& request)
|
||||||
@ -1569,6 +1579,8 @@ static UniValue protx_listdiff(const JSONRPCRequest& request, const ChainstateMa
|
|||||||
{
|
{
|
||||||
protx_listdiff_help(request);
|
protx_listdiff_help(request);
|
||||||
|
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
UniValue ret(UniValue::VOBJ);
|
UniValue ret(UniValue::VOBJ);
|
||||||
|
|
||||||
@ -1586,8 +1598,8 @@ static UniValue protx_listdiff(const JSONRPCRequest& request, const ChainstateMa
|
|||||||
ret.pushKV("baseHeight", pBaseBlockIndex->nHeight);
|
ret.pushKV("baseHeight", pBaseBlockIndex->nHeight);
|
||||||
ret.pushKV("blockHeight", pTargetBlockIndex->nHeight);
|
ret.pushKV("blockHeight", pTargetBlockIndex->nHeight);
|
||||||
|
|
||||||
auto baseBlockMNList = deterministicMNManager->GetListForBlock(pBaseBlockIndex);
|
auto baseBlockMNList = node.dmnman->GetListForBlock(pBaseBlockIndex);
|
||||||
auto blockMNList = deterministicMNManager->GetListForBlock(pTargetBlockIndex);
|
auto blockMNList = node.dmnman->GetListForBlock(pTargetBlockIndex);
|
||||||
|
|
||||||
auto mnDiff = baseBlockMNList.BuildDiff(blockMNList);
|
auto mnDiff = baseBlockMNList.BuildDiff(blockMNList);
|
||||||
|
|
||||||
|
@ -52,7 +52,8 @@ static UniValue gobject_count(const JSONRPCRequest& request)
|
|||||||
if (strMode != "json" && strMode != "all")
|
if (strMode != "json" && strMode != "all")
|
||||||
gobject_count_help(request);
|
gobject_count_help(request);
|
||||||
|
|
||||||
return strMode == "json" ? governance->ToJson() : governance->ToString();
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
return strMode == "json" ? node.govman->ToJson() : node.govman->ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gobject_deserialize_help(const JSONRPCRequest& request)
|
static void gobject_deserialize_help(const JSONRPCRequest& request)
|
||||||
@ -304,11 +305,13 @@ static UniValue gobject_submit(const JSONRPCRequest& request)
|
|||||||
{
|
{
|
||||||
gobject_submit_help(request);
|
gobject_submit_help(request);
|
||||||
|
|
||||||
if(!::masternodeSync->IsBlockchainSynced()) {
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
|
||||||
|
if(!node.mn_sync->IsBlockchainSynced()) {
|
||||||
throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Must wait for client to sync with masternode network. Try again in a minute or so.");
|
throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Must wait for client to sync with masternode network. Try again in a minute or so.");
|
||||||
}
|
}
|
||||||
|
|
||||||
auto mnList = deterministicMNManager->GetListAtChainTip();
|
auto mnList = node.dmnman->GetListAtChainTip();
|
||||||
bool fMnFound = WITH_LOCK(activeMasternodeInfoCs, return mnList.HasValidMNByCollateral(activeMasternodeInfo.outpoint));
|
bool fMnFound = WITH_LOCK(activeMasternodeInfoCs, return mnList.HasValidMNByCollateral(activeMasternodeInfo.outpoint));
|
||||||
|
|
||||||
LogPrint(BCLog::GOBJECT, "gobject_submit -- pubKeyOperator = %s, outpoint = %s, params.size() = %lld, fMnFound = %d\n",
|
LogPrint(BCLog::GOBJECT, "gobject_submit -- pubKeyOperator = %s, outpoint = %s, params.size() = %lld, fMnFound = %d\n",
|
||||||
@ -354,7 +357,6 @@ static UniValue gobject_submit(const JSONRPCRequest& request)
|
|||||||
|
|
||||||
std::string strHash = govobj.GetHash().ToString();
|
std::string strHash = govobj.GetHash().ToString();
|
||||||
|
|
||||||
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
|
||||||
const CTxMemPool& mempool = EnsureMemPool(node);
|
const CTxMemPool& mempool = EnsureMemPool(node);
|
||||||
bool fMissingConfirmations;
|
bool fMissingConfirmations;
|
||||||
{
|
{
|
||||||
@ -372,7 +374,7 @@ static UniValue gobject_submit(const JSONRPCRequest& request)
|
|||||||
|
|
||||||
// RELAY THIS OBJECT
|
// RELAY THIS OBJECT
|
||||||
// Reject if rate check fails but don't update buffer
|
// Reject if rate check fails but don't update buffer
|
||||||
if (!governance->MasternodeRateCheck(govobj)) {
|
if (!node.govman->MasternodeRateCheck(govobj)) {
|
||||||
LogPrintf("gobject(submit) -- Object submission rejected because of rate check failure - hash = %s\n", strHash);
|
LogPrintf("gobject(submit) -- Object submission rejected because of rate check failure - hash = %s\n", strHash);
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Object creation rate limit exceeded");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Object creation rate limit exceeded");
|
||||||
}
|
}
|
||||||
@ -380,10 +382,10 @@ static UniValue gobject_submit(const JSONRPCRequest& request)
|
|||||||
LogPrintf("gobject(submit) -- Adding locally created governance object - %s\n", strHash);
|
LogPrintf("gobject(submit) -- Adding locally created governance object - %s\n", strHash);
|
||||||
|
|
||||||
if (fMissingConfirmations) {
|
if (fMissingConfirmations) {
|
||||||
governance->AddPostponedObject(govobj);
|
node.govman->AddPostponedObject(govobj);
|
||||||
govobj.Relay(*node.connman);
|
govobj.Relay(*node.connman);
|
||||||
} else {
|
} else {
|
||||||
governance->AddGovernanceObject(govobj, *node.connman);
|
node.govman->AddGovernanceObject(govobj, *node.connman);
|
||||||
}
|
}
|
||||||
|
|
||||||
return govobj.GetHash().ToString();
|
return govobj.GetHash().ToString();
|
||||||
@ -395,8 +397,8 @@ static UniValue VoteWithMasternodes(const JSONRPCRequest& request, const std::ma
|
|||||||
{
|
{
|
||||||
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
{
|
{
|
||||||
LOCK(governance->cs);
|
LOCK(node.govman->cs);
|
||||||
const CGovernanceObject *pGovObj = governance->FindConstGovernanceObject(hash);
|
const CGovernanceObject *pGovObj = node.govman->FindConstGovernanceObject(hash);
|
||||||
if (!pGovObj) {
|
if (!pGovObj) {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Governance object not found");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Governance object not found");
|
||||||
}
|
}
|
||||||
@ -405,7 +407,7 @@ static UniValue VoteWithMasternodes(const JSONRPCRequest& request, const std::ma
|
|||||||
int nSuccessful = 0;
|
int nSuccessful = 0;
|
||||||
int nFailed = 0;
|
int nFailed = 0;
|
||||||
|
|
||||||
auto mnList = deterministicMNManager->GetListAtChainTip();
|
auto mnList = node.dmnman->GetListAtChainTip();
|
||||||
|
|
||||||
UniValue resultsObj(UniValue::VOBJ);
|
UniValue resultsObj(UniValue::VOBJ);
|
||||||
|
|
||||||
@ -434,7 +436,7 @@ static UniValue VoteWithMasternodes(const JSONRPCRequest& request, const std::ma
|
|||||||
}
|
}
|
||||||
|
|
||||||
CGovernanceException exception;
|
CGovernanceException exception;
|
||||||
if (governance->ProcessVoteAndRelay(vote, exception, *node.connman)) {
|
if (node.govman->ProcessVoteAndRelay(vote, exception, *node.connman)) {
|
||||||
nSuccessful++;
|
nSuccessful++;
|
||||||
statusObj.pushKV("result", "success");
|
statusObj.pushKV("result", "success");
|
||||||
} else {
|
} else {
|
||||||
@ -476,6 +478,8 @@ static UniValue gobject_vote_many(const JSONRPCRequest& request)
|
|||||||
std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
|
std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
|
||||||
if (!wallet) return NullUniValue;
|
if (!wallet) return NullUniValue;
|
||||||
|
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
|
||||||
uint256 hash(ParseHashV(request.params[0], "Object hash"));
|
uint256 hash(ParseHashV(request.params[0], "Object hash"));
|
||||||
std::string strVoteSignal = request.params[1].get_str();
|
std::string strVoteSignal = request.params[1].get_str();
|
||||||
std::string strVoteOutcome = request.params[2].get_str();
|
std::string strVoteOutcome = request.params[2].get_str();
|
||||||
@ -501,7 +505,7 @@ static UniValue gobject_vote_many(const JSONRPCRequest& request)
|
|||||||
|
|
||||||
std::map<uint256, CKey> votingKeys;
|
std::map<uint256, CKey> votingKeys;
|
||||||
|
|
||||||
auto mnList = deterministicMNManager->GetListAtChainTip();
|
auto mnList = node.dmnman->GetListAtChainTip();
|
||||||
mnList.ForEachMN(true, [&](auto& dmn) {
|
mnList.ForEachMN(true, [&](auto& dmn) {
|
||||||
CKey votingKey;
|
CKey votingKey;
|
||||||
if (spk_man->GetKey(dmn.pdmnState->keyIDVoting, votingKey)) {
|
if (spk_man->GetKey(dmn.pdmnState->keyIDVoting, votingKey)) {
|
||||||
@ -535,6 +539,8 @@ static UniValue gobject_vote_alias(const JSONRPCRequest& request)
|
|||||||
std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
|
std::shared_ptr<CWallet> const wallet = GetWalletForJSONRPCRequest(request);
|
||||||
if (!wallet) return NullUniValue;
|
if (!wallet) return NullUniValue;
|
||||||
|
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
|
||||||
uint256 hash(ParseHashV(request.params[0], "Object hash"));
|
uint256 hash(ParseHashV(request.params[0], "Object hash"));
|
||||||
std::string strVoteSignal = request.params[1].get_str();
|
std::string strVoteSignal = request.params[1].get_str();
|
||||||
std::string strVoteOutcome = request.params[2].get_str();
|
std::string strVoteOutcome = request.params[2].get_str();
|
||||||
@ -554,7 +560,7 @@ static UniValue gobject_vote_alias(const JSONRPCRequest& request)
|
|||||||
EnsureWalletIsUnlocked(wallet.get());
|
EnsureWalletIsUnlocked(wallet.get());
|
||||||
|
|
||||||
uint256 proTxHash(ParseHashV(request.params[3], "protx-hash"));
|
uint256 proTxHash(ParseHashV(request.params[3], "protx-hash"));
|
||||||
auto dmn = deterministicMNManager->GetListAtChainTip().GetValidMN(proTxHash);
|
auto dmn = node.dmnman->GetListAtChainTip().GetValidMN(proTxHash);
|
||||||
if (!dmn) {
|
if (!dmn) {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid or unknown proTxHash");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid or unknown proTxHash");
|
||||||
}
|
}
|
||||||
@ -576,7 +582,8 @@ static UniValue gobject_vote_alias(const JSONRPCRequest& request)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static UniValue ListObjects(const std::string& strCachedSignal, const std::string& strType, int nStartTime)
|
static UniValue ListObjects(CGovernanceManager& govman, const std::string& strCachedSignal,
|
||||||
|
const std::string& strType, int nStartTime)
|
||||||
{
|
{
|
||||||
UniValue objResult(UniValue::VOBJ);
|
UniValue objResult(UniValue::VOBJ);
|
||||||
|
|
||||||
@ -586,12 +593,12 @@ static UniValue ListObjects(const std::string& strCachedSignal, const std::strin
|
|||||||
g_txindex->BlockUntilSyncedToCurrentChain();
|
g_txindex->BlockUntilSyncedToCurrentChain();
|
||||||
}
|
}
|
||||||
|
|
||||||
LOCK2(cs_main, governance->cs);
|
LOCK2(cs_main, govman.cs);
|
||||||
|
|
||||||
std::vector<CGovernanceObject> objs;
|
std::vector<CGovernanceObject> objs;
|
||||||
governance->GetAllNewerThan(objs, nStartTime);
|
govman.GetAllNewerThan(objs, nStartTime);
|
||||||
|
|
||||||
governance->UpdateLastDiffTime(GetTime());
|
govman.UpdateLastDiffTime(GetTime());
|
||||||
// CREATE RESULTS FOR USER
|
// CREATE RESULTS FOR USER
|
||||||
|
|
||||||
for (const auto& govObj : objs) {
|
for (const auto& govObj : objs) {
|
||||||
@ -667,7 +674,8 @@ static UniValue gobject_list(const JSONRPCRequest& request)
|
|||||||
if (strType != "proposals" && strType != "triggers" && strType != "all")
|
if (strType != "proposals" && strType != "triggers" && strType != "all")
|
||||||
return "Invalid type, should be 'proposals', 'triggers' or 'all'";
|
return "Invalid type, should be 'proposals', 'triggers' or 'all'";
|
||||||
|
|
||||||
return ListObjects(strCachedSignal, strType, 0);
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
return ListObjects(*node.govman, strCachedSignal, strType, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gobject_diff_help(const JSONRPCRequest& request)
|
static void gobject_diff_help(const JSONRPCRequest& request)
|
||||||
@ -701,7 +709,8 @@ static UniValue gobject_diff(const JSONRPCRequest& request)
|
|||||||
if (strType != "proposals" && strType != "triggers" && strType != "all")
|
if (strType != "proposals" && strType != "triggers" && strType != "all")
|
||||||
return "Invalid type, should be 'proposals', 'triggers' or 'all'";
|
return "Invalid type, should be 'proposals', 'triggers' or 'all'";
|
||||||
|
|
||||||
return ListObjects(strCachedSignal, strType, governance->GetLastDiffTime());
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
return ListObjects(*node.govman, strCachedSignal, strType, node.govman->GetLastDiffTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gobject_get_help(const JSONRPCRequest& request)
|
static void gobject_get_help(const JSONRPCRequest& request)
|
||||||
@ -728,8 +737,10 @@ static UniValue gobject_get(const JSONRPCRequest& request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FIND THE GOVERNANCE OBJECT THE USER IS LOOKING FOR
|
// FIND THE GOVERNANCE OBJECT THE USER IS LOOKING FOR
|
||||||
LOCK2(cs_main, governance->cs);
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
const CGovernanceObject* pGovObj = governance->FindConstGovernanceObject(hash);
|
|
||||||
|
LOCK2(cs_main, node.govman->cs);
|
||||||
|
const CGovernanceObject* pGovObj = node.govman->FindConstGovernanceObject(hash);
|
||||||
|
|
||||||
if (pGovObj == nullptr) {
|
if (pGovObj == nullptr) {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Unknown governance object");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Unknown governance object");
|
||||||
@ -824,10 +835,10 @@ static UniValue gobject_getcurrentvotes(const JSONRPCRequest& request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FIND OBJECT USER IS LOOKING FOR
|
// FIND OBJECT USER IS LOOKING FOR
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
|
||||||
LOCK(governance->cs);
|
LOCK(node.govman->cs);
|
||||||
|
const CGovernanceObject* pGovObj = node.govman->FindConstGovernanceObject(hash);
|
||||||
const CGovernanceObject* pGovObj = governance->FindConstGovernanceObject(hash);
|
|
||||||
|
|
||||||
if (pGovObj == nullptr) {
|
if (pGovObj == nullptr) {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Unknown governance-hash");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Unknown governance-hash");
|
||||||
@ -839,9 +850,9 @@ static UniValue gobject_getcurrentvotes(const JSONRPCRequest& request)
|
|||||||
|
|
||||||
// GET MATCHING VOTES BY HASH, THEN SHOW USERS VOTE INFORMATION
|
// GET MATCHING VOTES BY HASH, THEN SHOW USERS VOTE INFORMATION
|
||||||
|
|
||||||
std::vector<CGovernanceVote> vecVotes = governance->GetCurrentVotes(hash, mnCollateralOutpoint);
|
std::vector<CGovernanceVote> vecVotes = node.govman->GetCurrentVotes(hash, mnCollateralOutpoint);
|
||||||
for (const auto& vote : vecVotes) {
|
for (const auto& vote : vecVotes) {
|
||||||
bResult.pushKV(vote.GetHash().ToString(), vote.ToString());
|
bResult.pushKV(vote.GetHash().ToString(), vote.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
return bResult;
|
return bResult;
|
||||||
@ -962,9 +973,10 @@ static UniValue voteraw(const JSONRPCRequest& request)
|
|||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid vote outcome. Please use one of the following: 'yes', 'no' or 'abstain'");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid vote outcome. Please use one of the following: 'yes', 'no' or 'abstain'");
|
||||||
}
|
}
|
||||||
|
|
||||||
GovernanceObject govObjType = WITH_LOCK(governance->cs, return [&](){
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
AssertLockHeld(governance->cs);
|
GovernanceObject govObjType = WITH_LOCK(node.govman->cs, return [&](){
|
||||||
const CGovernanceObject *pGovObj = governance->FindConstGovernanceObject(hashGovObj);
|
AssertLockHeld(node.govman->cs);
|
||||||
|
const CGovernanceObject *pGovObj = node.govman->FindConstGovernanceObject(hashGovObj);
|
||||||
if (!pGovObj) {
|
if (!pGovObj) {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Governance object not found");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Governance object not found");
|
||||||
}
|
}
|
||||||
@ -981,7 +993,7 @@ static UniValue voteraw(const JSONRPCRequest& request)
|
|||||||
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Malformed base64 encoding");
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Malformed base64 encoding");
|
||||||
}
|
}
|
||||||
|
|
||||||
auto dmn = deterministicMNManager->GetListAtChainTip().GetValidMNByCollateral(outpoint);
|
auto dmn = node.dmnman->GetListAtChainTip().GetValidMNByCollateral(outpoint);
|
||||||
|
|
||||||
if (!dmn) {
|
if (!dmn) {
|
||||||
throw JSONRPCError(RPC_INTERNAL_ERROR, "Failure to find masternode in list : " + outpoint.ToStringShort());
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "Failure to find masternode in list : " + outpoint.ToStringShort());
|
||||||
@ -998,8 +1010,7 @@ static UniValue voteraw(const JSONRPCRequest& request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
CGovernanceException exception;
|
CGovernanceException exception;
|
||||||
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
if (node.govman->ProcessVoteAndRelay(vote, exception, *node.connman)) {
|
||||||
if (governance->ProcessVoteAndRelay(vote, exception, *node.connman)) {
|
|
||||||
return "Voted successfully";
|
return "Voted successfully";
|
||||||
} else {
|
} else {
|
||||||
throw JSONRPCError(RPC_INTERNAL_ERROR, "Error voting : " + exception.GetMessage());
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "Error voting : " + exception.GetMessage());
|
||||||
@ -1032,7 +1043,9 @@ static UniValue getgovernanceinfo(const JSONRPCRequest& request)
|
|||||||
|
|
||||||
int nLastSuperblock = 0, nNextSuperblock = 0;
|
int nLastSuperblock = 0, nNextSuperblock = 0;
|
||||||
|
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
const ChainstateManager& chainman = EnsureAnyChainman(request.context);
|
const ChainstateManager& chainman = EnsureAnyChainman(request.context);
|
||||||
|
|
||||||
const auto* pindex = WITH_LOCK(cs_main, return chainman.ActiveChain().Tip());
|
const auto* pindex = WITH_LOCK(cs_main, return chainman.ActiveChain().Tip());
|
||||||
int nBlockHeight = pindex->nHeight;
|
int nBlockHeight = pindex->nHeight;
|
||||||
|
|
||||||
@ -1045,7 +1058,7 @@ static UniValue getgovernanceinfo(const JSONRPCRequest& request)
|
|||||||
obj.pushKV("superblockmaturitywindow", Params().GetConsensus().nSuperblockMaturityWindow);
|
obj.pushKV("superblockmaturitywindow", Params().GetConsensus().nSuperblockMaturityWindow);
|
||||||
obj.pushKV("lastsuperblock", nLastSuperblock);
|
obj.pushKV("lastsuperblock", nLastSuperblock);
|
||||||
obj.pushKV("nextsuperblock", nNextSuperblock);
|
obj.pushKV("nextsuperblock", nNextSuperblock);
|
||||||
obj.pushKV("fundingthreshold", int(deterministicMNManager->GetListAtChainTip().GetValidWeightedMNsCount() / 10));
|
obj.pushKV("fundingthreshold", int(node.dmnman->GetListAtChainTip().GetValidWeightedMNsCount() / 10));
|
||||||
obj.pushKV("governancebudget", ValueFromAmount(CSuperblock::GetPaymentsLimit(nNextSuperblock)));
|
obj.pushKV("governancebudget", ValueFromAmount(CSuperblock::GetPaymentsLimit(nNextSuperblock)));
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
|
@ -106,7 +106,9 @@ static UniValue masternode_count(const JSONRPCRequest& request)
|
|||||||
{
|
{
|
||||||
masternode_count_help(request);
|
masternode_count_help(request);
|
||||||
|
|
||||||
auto mnList = deterministicMNManager->GetListAtChainTip();
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
|
||||||
|
auto mnList = node.dmnman->GetListAtChainTip();
|
||||||
int total = mnList.GetAllMNsCount();
|
int total = mnList.GetAllMNsCount();
|
||||||
int enabled = mnList.GetValidMNsCount();
|
int enabled = mnList.GetValidMNsCount();
|
||||||
|
|
||||||
@ -133,10 +135,10 @@ static UniValue masternode_count(const JSONRPCRequest& request)
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniValue GetNextMasternodeForPayment(int heightShift)
|
static UniValue GetNextMasternodeForPayment(CDeterministicMNManager& dmnman, int heightShift)
|
||||||
{
|
{
|
||||||
const CBlockIndex *tip = WITH_LOCK(::cs_main, return ::ChainActive().Tip());
|
const CBlockIndex *tip = WITH_LOCK(::cs_main, return ::ChainActive().Tip());
|
||||||
auto mnList = deterministicMNManager->GetListForBlock(tip);
|
auto mnList = dmnman.GetListForBlock(tip);
|
||||||
auto payees = mnList.GetProjectedMNPayees(tip, heightShift);
|
auto payees = mnList.GetProjectedMNPayees(tip, heightShift);
|
||||||
if (payees.empty())
|
if (payees.empty())
|
||||||
return "unknown";
|
return "unknown";
|
||||||
@ -173,7 +175,9 @@ static void masternode_winner_help(const JSONRPCRequest& request)
|
|||||||
static UniValue masternode_winner(const JSONRPCRequest& request)
|
static UniValue masternode_winner(const JSONRPCRequest& request)
|
||||||
{
|
{
|
||||||
masternode_winner_help(request);
|
masternode_winner_help(request);
|
||||||
return GetNextMasternodeForPayment(10);
|
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
return GetNextMasternodeForPayment(*node.dmnman, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void masternode_current_help(const JSONRPCRequest& request)
|
static void masternode_current_help(const JSONRPCRequest& request)
|
||||||
@ -193,7 +197,9 @@ static void masternode_current_help(const JSONRPCRequest& request)
|
|||||||
static UniValue masternode_current(const JSONRPCRequest& request)
|
static UniValue masternode_current(const JSONRPCRequest& request)
|
||||||
{
|
{
|
||||||
masternode_current_help(request);
|
masternode_current_help(request);
|
||||||
return GetNextMasternodeForPayment(1);
|
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
return GetNextMasternodeForPayment(*node.dmnman, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_WALLET
|
#ifdef ENABLE_WALLET
|
||||||
@ -253,8 +259,9 @@ static UniValue masternode_status(const JSONRPCRequest& request)
|
|||||||
if (!fMasternodeMode)
|
if (!fMasternodeMode)
|
||||||
throw JSONRPCError(RPC_INTERNAL_ERROR, "This is not a masternode");
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "This is not a masternode");
|
||||||
|
|
||||||
UniValue mnObj(UniValue::VOBJ);
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
|
||||||
|
UniValue mnObj(UniValue::VOBJ);
|
||||||
CDeterministicMNCPtr dmn;
|
CDeterministicMNCPtr dmn;
|
||||||
{
|
{
|
||||||
LOCK(activeMasternodeInfoCs);
|
LOCK(activeMasternodeInfoCs);
|
||||||
@ -262,7 +269,7 @@ static UniValue masternode_status(const JSONRPCRequest& request)
|
|||||||
// keep compatibility with legacy status for now (might get deprecated/removed later)
|
// keep compatibility with legacy status for now (might get deprecated/removed later)
|
||||||
mnObj.pushKV("outpoint", activeMasternodeInfo.outpoint.ToStringShort());
|
mnObj.pushKV("outpoint", activeMasternodeInfo.outpoint.ToStringShort());
|
||||||
mnObj.pushKV("service", activeMasternodeInfo.service.ToString());
|
mnObj.pushKV("service", activeMasternodeInfo.service.ToString());
|
||||||
dmn = deterministicMNManager->GetListAtChainTip().GetMN(activeMasternodeInfo.proTxHash);
|
dmn = node.dmnman->GetListAtChainTip().GetMN(activeMasternodeInfo.proTxHash);
|
||||||
}
|
}
|
||||||
if (dmn) {
|
if (dmn) {
|
||||||
mnObj.pushKV("proTxHash", dmn->proTxHash.ToString());
|
mnObj.pushKV("proTxHash", dmn->proTxHash.ToString());
|
||||||
@ -277,7 +284,7 @@ static UniValue masternode_status(const JSONRPCRequest& request)
|
|||||||
return mnObj;
|
return mnObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string GetRequiredPaymentsString(int nBlockHeight, const CDeterministicMNCPtr &payee)
|
static std::string GetRequiredPaymentsString(CGovernanceManager& govman, int nBlockHeight, const CDeterministicMNCPtr &payee)
|
||||||
{
|
{
|
||||||
std::string strPayments = "Unknown";
|
std::string strPayments = "Unknown";
|
||||||
if (payee) {
|
if (payee) {
|
||||||
@ -293,9 +300,9 @@ static std::string GetRequiredPaymentsString(int nBlockHeight, const CDeterminis
|
|||||||
strPayments += ", " + EncodeDestination(dest);
|
strPayments += ", " + EncodeDestination(dest);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (CSuperblockManager::IsSuperblockTriggered(*governance, nBlockHeight)) {
|
if (CSuperblockManager::IsSuperblockTriggered(govman, nBlockHeight)) {
|
||||||
std::vector<CTxOut> voutSuperblock;
|
std::vector<CTxOut> voutSuperblock;
|
||||||
if (!CSuperblockManager::GetSuperblockPayments(*governance, nBlockHeight, voutSuperblock)) {
|
if (!CSuperblockManager::GetSuperblockPayments(govman, nBlockHeight, voutSuperblock)) {
|
||||||
return strPayments + ", error";
|
return strPayments + ", error";
|
||||||
}
|
}
|
||||||
std::string strSBPayees = "Unknown";
|
std::string strSBPayees = "Unknown";
|
||||||
@ -353,24 +360,26 @@ static UniValue masternode_winners(const JSONRPCRequest& request, const Chainsta
|
|||||||
int nChainTipHeight = pindexTip->nHeight;
|
int nChainTipHeight = pindexTip->nHeight;
|
||||||
int nStartHeight = std::max(nChainTipHeight - nCount, 1);
|
int nStartHeight = std::max(nChainTipHeight - nCount, 1);
|
||||||
|
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
for (int h = nStartHeight; h <= nChainTipHeight; h++) {
|
for (int h = nStartHeight; h <= nChainTipHeight; h++) {
|
||||||
const CBlockIndex* pIndex = pindexTip->GetAncestor(h - 1);
|
const CBlockIndex* pIndex = pindexTip->GetAncestor(h - 1);
|
||||||
auto payee = deterministicMNManager->GetListForBlock(pIndex).GetMNPayee(pIndex);
|
auto payee = node.dmnman->GetListForBlock(pIndex).GetMNPayee(pIndex);
|
||||||
std::string strPayments = GetRequiredPaymentsString(h, payee);
|
std::string strPayments = GetRequiredPaymentsString(*node.govman, h, payee);
|
||||||
if (strFilter != "" && strPayments.find(strFilter) == std::string::npos) continue;
|
if (strFilter != "" && strPayments.find(strFilter) == std::string::npos) continue;
|
||||||
obj.pushKV(strprintf("%d", h), strPayments);
|
obj.pushKV(strprintf("%d", h), strPayments);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto projection = deterministicMNManager->GetListForBlock(pindexTip).GetProjectedMNPayees(pindexTip, 20);
|
auto projection = node.dmnman->GetListForBlock(pindexTip).GetProjectedMNPayees(pindexTip, 20);
|
||||||
for (size_t i = 0; i < projection.size(); i++) {
|
for (size_t i = 0; i < projection.size(); i++) {
|
||||||
int h = nChainTipHeight + 1 + i;
|
int h = nChainTipHeight + 1 + i;
|
||||||
std::string strPayments = GetRequiredPaymentsString(h, projection[i]);
|
std::string strPayments = GetRequiredPaymentsString(*node.govman, h, projection[i]);
|
||||||
if (strFilter != "" && strPayments.find(strFilter) == std::string::npos) continue;
|
if (strFilter != "" && strPayments.find(strFilter) == std::string::npos) continue;
|
||||||
obj.pushKV(strprintf("%d", h), strPayments);
|
obj.pushKV(strprintf("%d", h), strPayments);
|
||||||
}
|
}
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void masternode_payments_help(const JSONRPCRequest& request)
|
static void masternode_payments_help(const JSONRPCRequest& request)
|
||||||
{
|
{
|
||||||
RPCHelpMan{"masternode payments",
|
RPCHelpMan{"masternode payments",
|
||||||
@ -432,8 +441,8 @@ static UniValue masternode_payments(const JSONRPCRequest& request, const Chainst
|
|||||||
// A temporary vector which is used to sort results properly (there is no "reverse" in/for UniValue)
|
// A temporary vector which is used to sort results properly (there is no "reverse" in/for UniValue)
|
||||||
std::vector<UniValue> vecPayments;
|
std::vector<UniValue> vecPayments;
|
||||||
|
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
while (vecPayments.size() < uint64_t(std::abs(nCount)) && pindex != nullptr) {
|
while (vecPayments.size() < uint64_t(std::abs(nCount)) && pindex != nullptr) {
|
||||||
|
|
||||||
CBlock block;
|
CBlock block;
|
||||||
if (!ReadBlockFromDisk(block, pindex, Params().GetConsensus())) {
|
if (!ReadBlockFromDisk(block, pindex, Params().GetConsensus())) {
|
||||||
throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk");
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk");
|
||||||
@ -459,7 +468,7 @@ static UniValue masternode_payments(const JSONRPCRequest& request, const Chainst
|
|||||||
std::vector<CTxOut> voutMasternodePayments, voutDummy;
|
std::vector<CTxOut> voutMasternodePayments, voutDummy;
|
||||||
CMutableTransaction dummyTx;
|
CMutableTransaction dummyTx;
|
||||||
CAmount blockSubsidy = GetBlockSubsidy(pindex, Params().GetConsensus());
|
CAmount blockSubsidy = GetBlockSubsidy(pindex, Params().GetConsensus());
|
||||||
MasternodePayments::FillBlockPayments(*sporkManager, *governance, dummyTx, pindex->pprev, blockSubsidy, nBlockFees, voutMasternodePayments, voutDummy);
|
MasternodePayments::FillBlockPayments(*node.sporkman, *node.govman, dummyTx, pindex->pprev, blockSubsidy, nBlockFees, voutMasternodePayments, voutDummy);
|
||||||
|
|
||||||
UniValue blockObj(UniValue::VOBJ);
|
UniValue blockObj(UniValue::VOBJ);
|
||||||
CAmount payedPerBlock{0};
|
CAmount payedPerBlock{0};
|
||||||
@ -481,7 +490,7 @@ static UniValue masternode_payments(const JSONRPCRequest& request, const Chainst
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: we use _previous_ block to find a payee for the current one
|
// NOTE: we use _previous_ block to find a payee for the current one
|
||||||
const auto dmnPayee = deterministicMNManager->GetListForBlock(pindex->pprev).GetMNPayee(pindex->pprev);
|
const auto dmnPayee = node.dmnman->GetListForBlock(pindex->pprev).GetMNPayee(pindex->pprev);
|
||||||
protxObj.pushKV("proTxHash", dmnPayee == nullptr ? "" : dmnPayee->proTxHash.ToString());
|
protxObj.pushKV("proTxHash", dmnPayee == nullptr ? "" : dmnPayee->proTxHash.ToString());
|
||||||
protxObj.pushKV("amount", payedPerMasternode);
|
protxObj.pushKV("amount", payedPerMasternode);
|
||||||
protxObj.pushKV("payees", payeesArr);
|
protxObj.pushKV("payees", payeesArr);
|
||||||
@ -589,9 +598,11 @@ static UniValue masternodelist(const JSONRPCRequest& request, ChainstateManager&
|
|||||||
masternode_list_help(request);
|
masternode_list_help(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
|
||||||
UniValue obj(UniValue::VOBJ);
|
UniValue obj(UniValue::VOBJ);
|
||||||
|
|
||||||
auto mnList = deterministicMNManager->GetListAtChainTip();
|
auto mnList = node.dmnman->GetListAtChainTip();
|
||||||
auto dmnToStatus = [&](auto& dmn) {
|
auto dmnToStatus = [&](auto& dmn) {
|
||||||
if (mnList.IsMNValid(dmn)) {
|
if (mnList.IsMNValid(dmn)) {
|
||||||
return "ENABLED";
|
return "ENABLED";
|
||||||
|
@ -150,8 +150,9 @@ static bool GenerateBlock(ChainstateManager& chainman, CBlock& block, uint64_t&
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniValue generateBlocks(ChainstateManager& chainman, const CTxMemPool& mempool, CEvoDB& evodb,
|
static UniValue generateBlocks(ChainstateManager& chainman, CEvoDB& evodb, CGovernanceManager& govman, CSporkManager& sporkman,
|
||||||
LLMQContext& llmq_ctx, const CScript& coinbase_script, int nGenerate, uint64_t nMaxTries)
|
LLMQContext& llmq_ctx, const CTxMemPool& mempool, const CScript& coinbase_script, int nGenerate,
|
||||||
|
uint64_t nMaxTries)
|
||||||
{
|
{
|
||||||
int nHeightEnd = 0;
|
int nHeightEnd = 0;
|
||||||
int nHeight = 0;
|
int nHeight = 0;
|
||||||
@ -166,7 +167,7 @@ static UniValue generateBlocks(ChainstateManager& chainman, const CTxMemPool& me
|
|||||||
UniValue blockHashes(UniValue::VARR);
|
UniValue blockHashes(UniValue::VARR);
|
||||||
while (nHeight < nHeightEnd && !ShutdownRequested())
|
while (nHeight < nHeightEnd && !ShutdownRequested())
|
||||||
{
|
{
|
||||||
std::unique_ptr<CBlockTemplate> pblocktemplate(BlockAssembler(*sporkManager, *governance, llmq_ctx, evodb, chainman.ActiveChainstate(), mempool, Params()).CreateNewBlock(coinbase_script));
|
std::unique_ptr<CBlockTemplate> pblocktemplate(BlockAssembler(sporkman, govman, llmq_ctx, evodb, chainman.ActiveChainstate(), mempool, Params()).CreateNewBlock(coinbase_script));
|
||||||
if (!pblocktemplate.get())
|
if (!pblocktemplate.get())
|
||||||
throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block");
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block");
|
||||||
CBlock *pblock = &pblocktemplate->block;
|
CBlock *pblock = &pblocktemplate->block;
|
||||||
@ -253,7 +254,7 @@ static UniValue generatetodescriptor(const JSONRPCRequest& request)
|
|||||||
ChainstateManager& chainman = EnsureChainman(node);
|
ChainstateManager& chainman = EnsureChainman(node);
|
||||||
LLMQContext& llmq_ctx = EnsureLLMQContext(node);
|
LLMQContext& llmq_ctx = EnsureLLMQContext(node);
|
||||||
|
|
||||||
return generateBlocks(chainman, mempool, *node.evodb, llmq_ctx, coinbase_script, num_blocks, max_tries);
|
return generateBlocks(chainman, *node.evodb, *node.govman, *node.sporkman, llmq_ctx, mempool, coinbase_script, num_blocks, max_tries);
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniValue generatetoaddress(const JSONRPCRequest& request)
|
static UniValue generatetoaddress(const JSONRPCRequest& request)
|
||||||
@ -292,7 +293,7 @@ static UniValue generatetoaddress(const JSONRPCRequest& request)
|
|||||||
|
|
||||||
CScript coinbase_script = GetScriptForDestination(destination);
|
CScript coinbase_script = GetScriptForDestination(destination);
|
||||||
|
|
||||||
return generateBlocks(chainman, mempool, *node.evodb, llmq_ctx, coinbase_script, num_blocks, max_tries);
|
return generateBlocks(chainman, *node.evodb, *node.govman, *node.sporkman, llmq_ctx, mempool, coinbase_script, num_blocks, max_tries);
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniValue generateblock(const JSONRPCRequest& request)
|
static UniValue generateblock(const JSONRPCRequest& request)
|
||||||
@ -372,7 +373,7 @@ static UniValue generateblock(const JSONRPCRequest& request)
|
|||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
|
|
||||||
CTxMemPool empty_mempool;
|
CTxMemPool empty_mempool;
|
||||||
std::unique_ptr<CBlockTemplate> blocktemplate(BlockAssembler(*sporkManager, *governance, llmq_ctx, *node.evodb, active_chainstate, empty_mempool, chainparams).CreateNewBlock(coinbase_script));
|
std::unique_ptr<CBlockTemplate> blocktemplate(BlockAssembler(*node.sporkman, *node.govman, llmq_ctx, *node.evodb, active_chainstate, empty_mempool, chainparams).CreateNewBlock(coinbase_script));
|
||||||
if (!blocktemplate) {
|
if (!blocktemplate) {
|
||||||
throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block");
|
throw JSONRPCError(RPC_INTERNAL_ERROR, "Couldn't create new block");
|
||||||
}
|
}
|
||||||
@ -715,8 +716,8 @@ static UniValue getblocktemplate(const JSONRPCRequest& request)
|
|||||||
throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, PACKAGE_NAME " is in initial sync and waiting for blocks...");
|
throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, PACKAGE_NAME " is in initial sync and waiting for blocks...");
|
||||||
|
|
||||||
// next bock is a superblock and we need governance info to correctly construct it
|
// next bock is a superblock and we need governance info to correctly construct it
|
||||||
if (AreSuperblocksEnabled(*sporkManager)
|
if (AreSuperblocksEnabled(*node.sporkman)
|
||||||
&& !::masternodeSync->IsSynced()
|
&& !node.mn_sync->IsSynced()
|
||||||
&& CSuperblock::IsValidBlockHeight(active_chain.Height() + 1))
|
&& CSuperblock::IsValidBlockHeight(active_chain.Height() + 1))
|
||||||
throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, PACKAGE_NAME " is syncing with network...");
|
throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, PACKAGE_NAME " is syncing with network...");
|
||||||
|
|
||||||
@ -788,7 +789,7 @@ static UniValue getblocktemplate(const JSONRPCRequest& request)
|
|||||||
// Create new block
|
// Create new block
|
||||||
CScript scriptDummy = CScript() << OP_TRUE;
|
CScript scriptDummy = CScript() << OP_TRUE;
|
||||||
LLMQContext& llmq_ctx = EnsureAnyLLMQContext(request.context);
|
LLMQContext& llmq_ctx = EnsureAnyLLMQContext(request.context);
|
||||||
pblocktemplate = BlockAssembler(*sporkManager, *governance, llmq_ctx, *node.evodb, active_chainstate, mempool, Params()).CreateNewBlock(scriptDummy);
|
pblocktemplate = BlockAssembler(*node.sporkman, *node.govman, llmq_ctx, *node.evodb, active_chainstate, mempool, Params()).CreateNewBlock(scriptDummy);
|
||||||
if (!pblocktemplate)
|
if (!pblocktemplate)
|
||||||
throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory");
|
throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory");
|
||||||
|
|
||||||
@ -952,7 +953,7 @@ static UniValue getblocktemplate(const JSONRPCRequest& request)
|
|||||||
}
|
}
|
||||||
result.pushKV("superblock", superblockObjArray);
|
result.pushKV("superblock", superblockObjArray);
|
||||||
result.pushKV("superblocks_started", pindexPrev->nHeight + 1 > consensusParams.nSuperblockStartBlock);
|
result.pushKV("superblocks_started", pindexPrev->nHeight + 1 > consensusParams.nSuperblockStartBlock);
|
||||||
result.pushKV("superblocks_enabled", AreSuperblocksEnabled(*sporkManager));
|
result.pushKV("superblocks_enabled", AreSuperblocksEnabled(*node.sporkman));
|
||||||
|
|
||||||
result.pushKV("coinbase_payload", HexStr(pblock->vtx[0]->vExtraPayload));
|
result.pushKV("coinbase_payload", HexStr(pblock->vtx[0]->vExtraPayload));
|
||||||
|
|
||||||
|
@ -101,26 +101,29 @@ static UniValue mnsync(const JSONRPCRequest& request)
|
|||||||
|
|
||||||
std::string strMode = request.params[0].get_str();
|
std::string strMode = request.params[0].get_str();
|
||||||
|
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
|
auto& mn_sync = *node.mn_sync;
|
||||||
|
|
||||||
if(strMode == "status") {
|
if(strMode == "status") {
|
||||||
UniValue objStatus(UniValue::VOBJ);
|
UniValue objStatus(UniValue::VOBJ);
|
||||||
objStatus.pushKV("AssetID", ::masternodeSync->GetAssetID());
|
objStatus.pushKV("AssetID", mn_sync.GetAssetID());
|
||||||
objStatus.pushKV("AssetName", ::masternodeSync->GetAssetName());
|
objStatus.pushKV("AssetName", mn_sync.GetAssetName());
|
||||||
objStatus.pushKV("AssetStartTime", ::masternodeSync->GetAssetStartTime());
|
objStatus.pushKV("AssetStartTime", mn_sync.GetAssetStartTime());
|
||||||
objStatus.pushKV("Attempt", ::masternodeSync->GetAttempt());
|
objStatus.pushKV("Attempt", mn_sync.GetAttempt());
|
||||||
objStatus.pushKV("IsBlockchainSynced", ::masternodeSync->IsBlockchainSynced());
|
objStatus.pushKV("IsBlockchainSynced", mn_sync.IsBlockchainSynced());
|
||||||
objStatus.pushKV("IsSynced", ::masternodeSync->IsSynced());
|
objStatus.pushKV("IsSynced", mn_sync.IsSynced());
|
||||||
return objStatus;
|
return objStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(strMode == "next")
|
if(strMode == "next")
|
||||||
{
|
{
|
||||||
::masternodeSync->SwitchToNextAsset();
|
mn_sync.SwitchToNextAsset();
|
||||||
return "sync updated to " + ::masternodeSync->GetAssetName();
|
return "sync updated to " + mn_sync.GetAssetName();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(strMode == "reset")
|
if(strMode == "reset")
|
||||||
{
|
{
|
||||||
::masternodeSync->Reset(true);
|
mn_sync.Reset(true);
|
||||||
return "success";
|
return "success";
|
||||||
}
|
}
|
||||||
return "failure";
|
return "failure";
|
||||||
@ -157,16 +160,17 @@ static UniValue spork(const JSONRPCRequest& request)
|
|||||||
|
|
||||||
// basic mode, show info
|
// basic mode, show info
|
||||||
std:: string strCommand = request.params[0].get_str();
|
std:: string strCommand = request.params[0].get_str();
|
||||||
|
const NodeContext& node = EnsureAnyNodeContext(request.context);
|
||||||
if (strCommand == "show") {
|
if (strCommand == "show") {
|
||||||
UniValue ret(UniValue::VOBJ);
|
UniValue ret(UniValue::VOBJ);
|
||||||
for (const auto& sporkDef : sporkDefs) {
|
for (const auto& sporkDef : sporkDefs) {
|
||||||
ret.pushKV(std::string(sporkDef.name), sporkManager->GetSporkValue(sporkDef.sporkId));
|
ret.pushKV(std::string(sporkDef.name), node.sporkman->GetSporkValue(sporkDef.sporkId));
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
} else if(strCommand == "active"){
|
} else if(strCommand == "active"){
|
||||||
UniValue ret(UniValue::VOBJ);
|
UniValue ret(UniValue::VOBJ);
|
||||||
for (const auto& sporkDef : sporkDefs) {
|
for (const auto& sporkDef : sporkDefs) {
|
||||||
ret.pushKV(std::string(sporkDef.name), sporkManager->IsSporkActive(sporkDef.sporkId));
|
ret.pushKV(std::string(sporkDef.name), node.sporkman->IsSporkActive(sporkDef.sporkId));
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -206,7 +210,7 @@ static UniValue sporkupdate(const JSONRPCRequest& request)
|
|||||||
int64_t nValue = request.params[1].get_int64();
|
int64_t nValue = request.params[1].get_int64();
|
||||||
|
|
||||||
// broadcast new spork
|
// broadcast new spork
|
||||||
if (sporkManager->UpdateSpork(nSporkID, nValue, *node.connman)) {
|
if (node.sporkman->UpdateSpork(nSporkID, nValue, *node.connman)) {
|
||||||
return "success";
|
return "success";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -381,7 +381,7 @@ static void quorum_memberof_help(const JSONRPCRequest& request)
|
|||||||
}.Check(request);
|
}.Check(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
static UniValue quorum_memberof(const JSONRPCRequest& request, const ChainstateManager& chainman, const LLMQContext& llmq_ctx)
|
static UniValue quorum_memberof(const JSONRPCRequest& request, const ChainstateManager& chainman, const NodeContext& node, const LLMQContext& llmq_ctx)
|
||||||
{
|
{
|
||||||
quorum_memberof_help(request);
|
quorum_memberof_help(request);
|
||||||
|
|
||||||
@ -395,8 +395,7 @@ static UniValue quorum_memberof(const JSONRPCRequest& request, const ChainstateM
|
|||||||
}
|
}
|
||||||
|
|
||||||
const CBlockIndex* pindexTip = WITH_LOCK(cs_main, return chainman.ActiveChain().Tip());
|
const CBlockIndex* pindexTip = WITH_LOCK(cs_main, return chainman.ActiveChain().Tip());
|
||||||
|
auto mnList = node.dmnman->GetListForBlock(pindexTip);
|
||||||
auto mnList = deterministicMNManager->GetListForBlock(pindexTip);
|
|
||||||
auto dmn = mnList.GetMN(protxHash);
|
auto dmn = mnList.GetMN(protxHash);
|
||||||
if (!dmn) {
|
if (!dmn) {
|
||||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "masternode not found");
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "masternode not found");
|
||||||
@ -885,7 +884,7 @@ static UniValue _quorum(const JSONRPCRequest& request)
|
|||||||
} else if (command == "quorumdkgstatus") {
|
} else if (command == "quorumdkgstatus") {
|
||||||
return quorum_dkgstatus(new_request, chainman, llmq_ctx);
|
return quorum_dkgstatus(new_request, chainman, llmq_ctx);
|
||||||
} else if (command == "quorummemberof") {
|
} else if (command == "quorummemberof") {
|
||||||
return quorum_memberof(new_request, chainman, llmq_ctx);
|
return quorum_memberof(new_request, chainman, node, llmq_ctx);
|
||||||
} else if (command == "quorumsign" || command == "quorumverify" || command == "quorumhasrecsig" || command == "quorumgetrecsig" || command == "quorumisconflicting") {
|
} else if (command == "quorumsign" || command == "quorumverify" || command == "quorumhasrecsig" || command == "quorumgetrecsig" || command == "quorumisconflicting") {
|
||||||
return quorum_sigs_cmd(new_request, llmq_ctx);
|
return quorum_sigs_cmd(new_request, llmq_ctx);
|
||||||
} else if (command == "quorumselectquorum") {
|
} else if (command == "quorumselectquorum") {
|
||||||
|
Loading…
Reference in New Issue
Block a user