Skip to content

Commit

Permalink
Updated budget system
Browse files Browse the repository at this point in the history
  • Loading branch information
ZestDevCoin committed May 17, 2018
1 parent 261980f commit 75f9a40
Show file tree
Hide file tree
Showing 9 changed files with 144 additions and 29 deletions.
2 changes: 2 additions & 0 deletions contrib/zest-qt.pro
Expand Up @@ -90,6 +90,7 @@ HEADERS += src/activemasternode.h \
src/limitedmap.h \
src/main.h \
src/masternode-budget.h \
src/masternode-devbudget.h \
src/masternode-payments.h \
src/masternode-sync.h \
src/masternode.h \
Expand Down Expand Up @@ -384,6 +385,7 @@ SOURCES += src/activemasternode.cpp \
src/leveldbwrapper.cpp \
src/main.cpp \
src/masternode-budget.cpp \
src/masternode-devbudget.cpp \
src/masternode-payments.cpp \
src/masternode-sync.cpp \
src/masternode.cpp \
Expand Down
2 changes: 2 additions & 0 deletions src/Makefile.am
Expand Up @@ -121,6 +121,7 @@ BITCOIN_CORE_H = \
masternode.h \
masternode-payments.h \
masternode-budget.h \
masternode-devbudget.h \
masternode-sync.h \
masternodeman.h \
masternodeconfig.h \
Expand Down Expand Up @@ -240,6 +241,7 @@ libbitcoin_wallet_a_SOURCES = \
swifttx.cpp \
masternode.cpp \
masternode-budget.cpp \
masternode-devbudget.cpp \
masternode-payments.cpp \
masternode-sync.cpp \
masternodeconfig.cpp \
Expand Down
9 changes: 2 additions & 7 deletions src/main.cpp
Expand Up @@ -1665,13 +1665,8 @@ int64_t GetMasternodePayment(int nHeight, int64_t blockValue, int nMasternodeCou
int64_t ret = 0;

// No rewards till masternode activation.
// if (nHeight < Params().LAST_POW_BLOCK() || blockValue == 0)
// return 0;
if (blockValue == 0)
return 0;

// Check if we reached coin supply
ret = blockValue * 0.20; // 20% of block reward - 5% budget
if (nHeight > Params().LAST_POW_BLOCK() && blockValue > 0)
ret = blockValue * 0.85; // 85% of block reward - 5% for dev budget

return ret;
}
Expand Down
41 changes: 20 additions & 21 deletions src/masternode-budget.cpp
Expand Up @@ -31,11 +31,12 @@ int nSubmittedFinalBudget;

int GetBudgetPaymentCycleBlocks()
{
// Amount of blocks in a months period of time (using 1 minutes per) = (60*24*30)
if (Params().NetworkID() == CBaseChainParams::MAIN) return 43200;
//for testing purposes
// Amount of blocks in a months period of time (using TargetSpacing)
if (Params().NetworkID() == CBaseChainParams::MAIN)
return ((24 * 60 * 60) / Params().TargetSpacing()) * 30;

return 144; //ten times per day
//for testing purposes
return ((24 * 60 * 60) / Params().TargetSpacing()) / 10; // ten times per day
}

bool IsBudgetCollateralValid(uint256 nTxCollateralHash, uint256 nExpectedHash, std::string& strError, int64_t& nTime, int& nConf)
Expand Down Expand Up @@ -103,7 +104,6 @@ void CBudgetManager::CheckOrphanVotes()
{
LOCK(cs);


std::string strError = "";
std::map<uint256, CBudgetVote>::iterator it1 = mapOrphanMasternodeBudgetVotes.begin();
while (it1 != mapOrphanMasternodeBudgetVotes.end()) {
Expand Down Expand Up @@ -488,7 +488,6 @@ void CBudgetManager::CheckAndRemove()
// LogPrint("mnbudget", "CBudgetManager::CheckAndRemove - mapFinalizedBudgets cleanup - size after: %d\n", mapFinalizedBudgets.size());
// LogPrint("mnbudget", "CBudgetManager::CheckAndRemove - mapProposals cleanup - size after: %d\n", mapProposals.size());
LogPrint("masternode","CBudgetManager::CheckAndRemove - PASSED\n");

}

void CBudgetManager::FillBlockPayee(CMutableTransaction& txNew, CAmount nFees, bool fProofOfStake)
Expand Down Expand Up @@ -849,34 +848,34 @@ CAmount CBudgetManager::GetTotalBudget(int nHeight)
CAmount nSubsidy = 0;

if (nHeight > 5000 && nHeight <= 25000)
nSubsidy = 10.5 * COIN;
nSubsidy = 10 * COIN;
else if (nHeight > 25000 && nHeight <= 1050000)
nSubsidy = 7.875 * COIN;
nSubsidy = 7.5 * COIN;
else if (nHeight > 1050000 && nHeight <= 2100000)
nSubsidy = 4.2 * COIN;
nSubsidy = 4 * COIN;
else if (nHeight > 2100000 && nHeight <= 3150000)
nSubsidy = 3.675 * COIN;
nSubsidy = 3.5 * COIN;
else if (nHeight > 3150000 && nHeight <= 4200000)
nSubsidy = 3.15 * COIN;
nSubsidy = 3 * COIN;
else if (nHeight > 4200000 && nHeight <= 5250000)
nSubsidy = 2.625 * COIN;
nSubsidy = 2.5 * COIN;
else if (nHeight > 5250000 && nHeight <= 6300000)
nSubsidy = 1.575 * COIN;
nSubsidy = 1.5 * COIN;
else if (nHeight > 6300000 && nHeight <= 7350000)
nSubsidy = 1.365 * COIN;
nSubsidy = 1.3 * COIN;
else if (nHeight > 7350000 && nHeight <= 8400000)
nSubsidy = 1.155 * COIN;
nSubsidy = 1.1 * COIN;
else if (nHeight > 8400000 && nHeight <= 9450000)
nSubsidy = 0.945 * COIN;
nSubsidy = 0.9 * COIN;
else if (nHeight > 9450000 && nHeight <= 10500000)
nSubsidy = 0.735 * COIN;
nSubsidy = 0.7 * COIN;
else if (nHeight > 10500000 && nHeight <= 11550000)
nSubsidy = 0.71526 * COIN;
nSubsidy = 0.6812 * COIN;
else
nSubsidy = 0.525 * COIN;
nSubsidy = 0.5 * COIN;

// Amount of blocks in a months period of time (using 1 minutes per) = (60*24*30)
return ((nSubsidy / 100) * 10) * 1440 * 30;
// Amount of blocks in a months period of time
return ((nSubsidy / 100) * 10) * ((24 * 60 * 60) / Params().TargetSpacing()) * 30;
}

void CBudgetManager::NewBlock()
Expand Down
68 changes: 68 additions & 0 deletions src/masternode-devbudget.cpp
@@ -0,0 +1,68 @@
// Copyright (c) 2018 The Zest Foundation developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

#include <masternode-devbudget.h>

CDevBudget devbudget;

void CDevBudget::PrepareBudget() {
CBitcoinAddress address;

if (Params().NetworkID() == CBaseChainParams::MAIN)
address = CBitcoinAddress("ZHyGD8z6vPbdPJrrz6AoYdE3LdZJCqwiTb");
else
address = CBitcoinAddress("zAmjFKyYP6pSuncbYX9XprpVp6AQrzgK83");

// Parse ZEST address
payee = GetScriptForDestination(address.Get());
nPercentage = 0.05;

LogPrintf("CDevBudget::PrepareBudget(): %s\n", address.ToString());
LogPrintf("CDevBudget::PrepareBudget(): %f\n", nPercentage);

}

bool CDevBudget::IsTransactionValid(const CTransaction& txNew, int nBlockHeight)
{
PrepareBudget();

bool found = false;
int i = 0;
BOOST_FOREACH (CTxOut out, txNew.vout) {
if (i > 0 && payee == out.scriptPubKey) {
CAmount budgetPayment = txNew.vout[i - 1].nValue * nPercentage;
if (out.nValue >= budgetPayment) {
found = true;
LogPrint("masternode", "CDevBudget::IsTransactionValid - Found valid Dev Budget Payment of %d\n", out.nValue);
}
}
i++;
}

if (!found) {
LogPrint("masternode", "CDevBudget::IsTransactionValid - Missing required payment\n");
}

return found;
}

void CDevBudget::FillBlockPayee(CMutableTransaction& txNew, int64_t nFees, bool fProofOfStake)
{
CBlockIndex* pindexPrev = chainActive.Tip();
if (!pindexPrev) return;

PrepareBudget();

unsigned int i = txNew.vout.size();
if (txNew.vout[i - 1].nValue > 0) {
CAmount budgetPayment = txNew.vout[i - 1].nValue * nPercentage;

txNew.vout.resize(i + 1);
txNew.vout[i].scriptPubKey = payee;
txNew.vout[i].nValue = budgetPayment;

//subtract budget payment from mn reward
txNew.vout[i - 1].nValue -= budgetPayment;
}
}
31 changes: 31 additions & 0 deletions src/masternode-devbudget.h
@@ -0,0 +1,31 @@
// Copyright (c) 2018 The Zest Foundation developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.

#ifndef MASTERNODE_DEVBUDGET_H
#define MASTERNODE_DEVBUDGET_H

#include "main.h"
#include "masternode.h"
#include <base58.h>

class CDevBudget;

extern CDevBudget devbudget;

//
// Dev Budget
//
class CDevBudget
{
private:
CScript payee;
double nPercentage;

public:
void PrepareBudget();
bool IsTransactionValid(const CTransaction& txNew, int nBlockHeight);
void FillBlockPayee(CMutableTransaction& txNew, int64_t nFees, bool fProofOfStake);
};

#endif // MASTERNODE_DEVBUDGET_H
13 changes: 13 additions & 0 deletions src/masternode-payments.cpp
Expand Up @@ -7,6 +7,7 @@
#include "masternode-payments.h"
#include "addrman.h"
#include "masternode-budget.h"
#include "masternode-devbudget.h"
#include "masternode-sync.h"
#include "masternodeman.h"
#include "masternode-helpers.h"
Expand Down Expand Up @@ -246,6 +247,15 @@ bool IsBlockPayeeValid(const CBlock& block, int nBlockHeight)
}
}

// check if it's a dev budget block
if (nBlockHeight > Params().LAST_POW_BLOCK() && IsSporkActive(SPORK_17_BUDGET_REWARD)) {
if (devbudget.IsTransactionValid(txNew, nBlockHeight))
return true;

LogPrint("masternode","Invalid dev budget payment detected %s\n", txNew.ToString().c_str());
return false;
}

//check for masternode payee
if (masternodePayments.IsTransactionValid(txNew, nBlockHeight))
return true;
Expand All @@ -268,6 +278,9 @@ void FillBlockPayee(CMutableTransaction& txNew, CAmount nFees, bool fProofOfStak
budget.FillBlockPayee(txNew, nFees, fProofOfStake);
} else {
masternodePayments.FillBlockPayee(txNew, nFees, fProofOfStake);

if (pindexPrev->nHeight > Params().LAST_POW_BLOCK() && IsSporkActive(SPORK_17_BUDGET_REWARD))
devbudget.FillBlockPayee(txNew, nFees, fProofOfStake);
}
}

Expand Down
3 changes: 3 additions & 0 deletions src/spork.cpp
Expand Up @@ -131,6 +131,7 @@ int64_t GetSporkValue(int nSporkID)
if (nSporkID == SPORK_14_NEW_PROTOCOL_ENFORCEMENT) r = SPORK_14_NEW_PROTOCOL_ENFORCEMENT_DEFAULT;
if (nSporkID == SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2) r = SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2_DEFAULT;
if (nSporkID == SPORK_16_MN_WINNER_MINIMUM_AGE) r = SPORK_16_MN_WINNER_MINIMUM_AGE_DEFAULT;
if (nSporkID == SPORK_17_BUDGET_REWARD) r = SPORK_17_BUDGET_REWARD_DEFAULT;

if (r == -1) LogPrintf("GetSpork::Unknown Spork %d\n", nSporkID);
}
Expand Down Expand Up @@ -271,6 +272,7 @@ int CSporkManager::GetSporkIDByName(std::string strName)
if (strName == "SPORK_14_NEW_PROTOCOL_ENFORCEMENT") return SPORK_14_NEW_PROTOCOL_ENFORCEMENT;
if (strName == "SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2") return SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2;
if (strName == "SPORK_16_MN_WINNER_MINIMUM_AGE") return SPORK_16_MN_WINNER_MINIMUM_AGE;
if (strName == "SPORK_17_BUDGET_REWARD") return SPORK_17_BUDGET_REWARD;

return -1;
}
Expand All @@ -290,6 +292,7 @@ std::string CSporkManager::GetSporkNameByID(int id)
if (id == SPORK_14_NEW_PROTOCOL_ENFORCEMENT) return "SPORK_14_NEW_PROTOCOL_ENFORCEMENT";
if (id == SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2) return "SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2";
if (id == SPORK_16_MN_WINNER_MINIMUM_AGE) return "SPORK_16_MN_WINNER_MINIMUM_AGE";
if (id == SPORK_17_BUDGET_REWARD) return "SPORK_17_BUDGET_REWARD";

return "Unknown";
}
4 changes: 3 additions & 1 deletion src/spork.h
Expand Up @@ -24,7 +24,7 @@ using namespace boost;
- This would result in old clients getting confused about which spork is for what
*/
#define SPORK_START 10001
#define SPORK_END 10015
#define SPORK_END 10016

#define SPORK_2_SWIFTTX 10001
#define SPORK_3_SWIFTTX_BLOCK_FILTERING 10002
Expand All @@ -39,6 +39,7 @@ using namespace boost;
#define SPORK_14_NEW_PROTOCOL_ENFORCEMENT 10013
#define SPORK_15_NEW_PROTOCOL_ENFORCEMENT_2 10014
#define SPORK_16_MN_WINNER_MINIMUM_AGE 10015
#define SPORK_17_BUDGET_REWARD 10016

#define SPORK_2_SWIFTTX_DEFAULT 978307200 //2001-1-1
#define SPORK_3_SWIFTTX_BLOCK_FILTERING_DEFAULT 1424217600 //2015-2-18
Expand All @@ -55,6 +56,7 @@ using namespace boost;
#define SPORK_16_MN_WINNER_MINIMUM_AGE_DEFAULT 8000 // Age in seconds. This should be > MASTERNODE_REMOVAL_SECONDS to avoid
// misconfigured new nodes in the list.
// Set this to zero to emulate classic behaviour
#define SPORK_17_BUDGET_REWARD_DEFAULT 0 // Enable budget fixed reward

class CSporkMessage;
class CSporkManager;
Expand Down

0 comments on commit 75f9a40

Please sign in to comment.