From ff273e23150d429b1b0b7ca01b9f529b76e39218 Mon Sep 17 00:00:00 2001 From: Craig Donnachie <88741883+cdonnachie@users.noreply.github.com> Date: Sun, 2 Apr 2023 08:56:25 -0400 Subject: [PATCH 1/2] Adding new multisig --- depends/packages/zlib.mk | 4 ++-- src/chainparams.cpp | 15 +++++++++------ src/founder_payment.cpp | 37 +++++++++++++++++++++++++++++++++---- src/founder_payment.h | 11 +++++------ src/miner.cpp | 5 ++++- src/rpc/mining.cpp | 35 +++++++++++++++++++++-------------- src/validation.cpp | 4 +--- 7 files changed, 75 insertions(+), 36 deletions(-) diff --git a/depends/packages/zlib.mk b/depends/packages/zlib.mk index d444ba5de..bc693f819 100644 --- a/depends/packages/zlib.mk +++ b/depends/packages/zlib.mk @@ -1,8 +1,8 @@ package=zlib -$(package)_version=1.2.12 +$(package)_version=1.2.13 $(package)_download_path=http://www.zlib.net $(package)_file_name=$(package)-$($(package)_version).tar.gz -$(package)_sha256_hash=91844808532e5ce316b3c010929493c0244f3d37593afd6de04f71821d5136d9 +$(package)_sha256_hash=b3a24de97a8fdbc835b9833169501030b8977031bcb54b3b3ac13740f846ab30 define $(package)_set_vars $(package)_build_opts= CC="$($(package)_cc)" diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 55300c1e5..52232bd63 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -210,9 +210,10 @@ class CMainParams : public CChainParams { // Founder reward vector rewardStructures = { - {INT_MAX, 5} // 5% founder/dev fee forever + {"rPC7kPCNPAVnUvQs4fWEvnFwJ4yfKvArXM",1121001,1641000, 5}, // 5% legacy founder/dev fee until block 1641000 + {"rKkJVJKgSPfS7oYmLZWoAHLyRzmFMuxiSU",1641000,INT_MAX, 5} // 5% founder/dev fee forever }; - consensus.nFounderPayment = FounderPayment(rewardStructures, 1121000); // Block 1121000 + consensus.nFounderPayment = FounderPayment(rewardStructures); fDefaultConsistencyChecks = false; fRequireStandard = true; @@ -364,9 +365,11 @@ class CTestNetParams : public CChainParams { // Founder reward vector rewardStructures = { - {INT_MAX, 5} // 5% founder/dev fee forever + {"n1BurnXXXXXXXXXXXXXXXXXXXXXXU1qejP",11,30, 5}, // 5% legacy founder/dev fee until block 50 + {"2MvpouPdDEujBZg5eZnLNv5bCn78EE2bi65",30,100, 5}, // 5% legacy founder/dev fee until block 50 + {"2MzJPqGahWsi42LAw2fxz5gjssMhMinTpWG",100,INT_MAX, 5} // 5% founder/dev fee forever }; - consensus.nFounderPayment = FounderPayment(rewardStructures, 150, "n1BurnXXXXXXXXXXXXXXXXXXXXXXU1qejP"); // Block 150 (burn coins) + consensus.nFounderPayment = FounderPayment(rewardStructures); fDefaultConsistencyChecks = false; fRequireStandard = false; @@ -552,9 +555,9 @@ class CRegTestParams : public CChainParams { // Founder reward vector rewardStructures = { - {INT_MAX, 5} // 5% founder/dev fee forever + {"2MzJPqGahWsi42LAw2fxz5gjssMhMinTpWG",1,INT_MAX, 5} // 5% founder/dev fee forever }; - consensus.nFounderPayment = FounderPayment(rewardStructures, 1, "n1BurnXXXXXXXXXXXXXXXXXXXXXXU1qejP"); // Block 1 (burn coins) + consensus.nFounderPayment = FounderPayment(rewardStructures); vFixedSeeds.clear(); //!< Regtest mode doesn't have any fixed seeds. vSeeds.clear(); //!< Regtest mode doesn't have any DNS seeds. diff --git a/src/founder_payment.cpp b/src/founder_payment.cpp index 769aea8f1..aa29bdeeb 100644 --- a/src/founder_payment.cpp +++ b/src/founder_payment.cpp @@ -7,25 +7,52 @@ CAmount FounderPayment::getFounderPaymentAmount(int blockHeight, CAmount blockReward) { - if (blockHeight <= startBlock) { - return 0; - } for (int i = 0; i < rewardStructures.size(); i++) { FounderRewardStructure rewardStructure = rewardStructures[i]; - if (rewardStructure.blockHeight == INT_MAX || blockHeight <= rewardStructure.blockHeight) { + if(blockHeight < rewardStructure.startBlock) + return 0; + if (rewardStructure.blockHeight == INT_MAX || blockHeight < rewardStructure.blockHeight) { return blockReward * rewardStructure.rewardPercentage / 100; } } return 0; } +string FounderPayment::getFounderPaymentAddress(int blockHeight) +{ + + for (int i = 0; i < rewardStructures.size(); i++) { + FounderRewardStructure rewardStructure = rewardStructures[i]; + if(blockHeight < rewardStructure.startBlock) + return rewardStructure.founderAddress; + if (rewardStructure.blockHeight == INT_MAX || blockHeight < rewardStructure.blockHeight) { + return rewardStructure.founderAddress; + } + } + return DEFAULT_FOUNDER_ADDRESS; +} + +bool FounderPayment::IsFounderPaymentsStarted(int blockHeight) +{ + for (int i = 0; i < rewardStructures.size(); i++) { + FounderRewardStructure rewardStructure = rewardStructures[i]; + if(blockHeight < rewardStructure.startBlock) + return false; + if (rewardStructure.blockHeight == INT_MAX || blockHeight < rewardStructure.blockHeight) { + return true; + } + } + return false; +} + void FounderPayment::FillFounderPayment(CMutableTransaction& txNew, int nBlockHeight, CAmount blockReward, CTxOut& txoutFounderRet) { // Make sure it's not filled yet CAmount founderPayment = getFounderPaymentAmount(nBlockHeight, blockReward); txoutFounderRet = CTxOut(); CScript payee; + string founderAddress = getFounderPaymentAddress(nBlockHeight); // Fill payee with the founder address CAvianAddress cbAddress(founderAddress); @@ -41,6 +68,8 @@ bool FounderPayment::IsBlockPayeeValid(const CTransaction& txNew, const int heig { CScript payee; // Fill payee with the founder address + string founderAddress = getFounderPaymentAddress(height); + payee = GetScriptForDestination(CAvianAddress(founderAddress).Get()); const CAmount founderReward = getFounderPaymentAmount(height, blockReward); BOOST_FOREACH (const CTxOut& out, txNew.vout) { diff --git a/src/founder_payment.h b/src/founder_payment.h index ab8fb3415..2e504e4d7 100644 --- a/src/founder_payment.h +++ b/src/founder_payment.h @@ -12,6 +12,8 @@ using namespace std; static const string DEFAULT_FOUNDER_ADDRESS = "rPC7kPCNPAVnUvQs4fWEvnFwJ4yfKvArXM"; struct FounderRewardStructure { + string founderAddress; + int startBlock; int blockHeight; int rewardPercentage; }; @@ -19,21 +21,18 @@ struct FounderRewardStructure { class FounderPayment { public: - FounderPayment(vector rewardStructures = {}, int startBlock = 0, const string& address = DEFAULT_FOUNDER_ADDRESS) + FounderPayment(vector rewardStructures = {}) { - this->founderAddress = address; - this->startBlock = startBlock; this->rewardStructures = rewardStructures; } ~FounderPayment(){}; CAmount getFounderPaymentAmount(int blockHeight, CAmount blockReward); + string getFounderPaymentAddress(int blockHeight); void FillFounderPayment(CMutableTransaction& txNew, int nBlockHeight, CAmount blockReward, CTxOut& txoutFounderRet); bool IsBlockPayeeValid(const CTransaction& txNew, const int height, const CAmount blockReward); - int getStartBlock() { return this->startBlock; } + bool IsFounderPaymentsStarted(int blockHeight); private: - string founderAddress; - int startBlock; vector rewardStructures; }; diff --git a/src/miner.cpp b/src/miner.cpp index 5d63fd263..512e60614 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -202,7 +202,10 @@ std::unique_ptr BlockAssembler::CreateNewBlock(const CScript& sc // Fill founder payment FounderPayment founderPayment = chainparams.GetConsensus().nFounderPayment; - founderPayment.FillFounderPayment(coinbaseTx, nHeight, blockReward, pblock->txoutFounder); + CAmount nSubsidy = GetBlockSubsidy(nHeight, chainparams.GetConsensus()); + if(founderPayment.IsFounderPaymentsStarted(nHeight)) { + founderPayment.FillFounderPayment(coinbaseTx, nHeight, nSubsidy, pblock->txoutFounder); + } pblock->vtx[0] = MakeTransactionRef(std::move(coinbaseTx)); pblocktemplate->vchCoinbaseCommitment = GenerateCoinbaseCommitment(*pblock, pindexPrev, chainparams.GetConsensus()); diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index e2a29e1de..50d7393d6 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -447,6 +447,13 @@ UniValue getblocktemplate(const JSONRPCRequest& request) " \"curtime\" : ttt, (numeric) current timestamp in seconds since epoch (Jan 1 1970 GMT)\n" " \"bits\" : \"xxxxxxxx\", (string) compressed target of next block\n" " \"height\" : n (numeric) The height of the next block\n" + " \"height\" : n, (numeric) The height of the next block\n" + " \"founder\" : { (array) required founder payee that must be included in the next block\n" + " \"payee\" : \"xxxx\", (string) payee address\n" + " \"script\" : \"xxxx\", (string) payee scriptPubKey\n" + " \"amount\": n (numeric) required amount to pay\n" + " },\n" + " \"founder_payments_started\" : true|false (boolean) true, if founder payments started\n" "}\n" "\nExamples:\n" @@ -697,19 +704,6 @@ UniValue getblocktemplate(const JSONRPCRequest& request) UniValue result(UniValue::VOBJ); result.push_back(Pair("capabilities", aCaps)); - UniValue founderObj(UniValue::VOBJ); - FounderPayment founderPayment = Params().GetConsensus().nFounderPayment; - if(pblock->txoutFounder!= CTxOut()) { - CTxDestination address; - ExtractDestination(pblock->txoutFounder.scriptPubKey, address); - CAvianAddress address2(address); - founderObj.push_back(Pair("payee", address2.ToString().c_str())); - founderObj.push_back(Pair("script", HexStr(pblock->txoutFounder.scriptPubKey.begin(), pblock->txoutFounder.scriptPubKey.end()))); - founderObj.push_back(Pair("amount", pblock->txoutFounder.nValue)); - } - result.push_back(Pair("founder", founderObj)); - result.push_back(Pair("founder_payments_started", pindexPrev->nHeight + 1 > founderPayment.getStartBlock())); - UniValue aRules(UniValue::VARR); UniValue vbavailable(UniValue::VOBJ); for (int j = 0; j < (int)Consensus::MAX_VERSION_BITS_DEPLOYMENTS; ++j) { @@ -768,7 +762,7 @@ UniValue getblocktemplate(const JSONRPCRequest& request) result.push_back(Pair("previousblockhash", pblock->hashPrevBlock.GetHex())); result.push_back(Pair("transactions", transactions)); result.push_back(Pair("coinbaseaux", aux)); - result.push_back(Pair("coinbasevalue", (int64_t)pblock->vtx[0]->vout[0].nValue)); + result.push_back(Pair("coinbasevalue", (int64_t)pblock->vtx[0]->GetValueOut())); result.push_back(Pair("longpollid", chainActive.Tip()->GetBlockHash().GetHex() + i64tostr(nTransactionsUpdatedLast))); result.push_back(Pair("target", hashTarget.GetHex())); result.push_back(Pair("mintime", (int64_t)pindexPrev->GetMedianTimePast()+1)); @@ -790,6 +784,19 @@ UniValue getblocktemplate(const JSONRPCRequest& request) result.push_back(Pair("curtime", pblock->GetBlockTime())); result.push_back(Pair("bits", strprintf("%08x", pblock->nBits))); result.push_back(Pair("height", (int64_t)(pindexPrev->nHeight+1))); + + UniValue founderObj(UniValue::VOBJ); + FounderPayment founderPayment = Params().GetConsensus().nFounderPayment; + if(pblock->txoutFounder!= CTxOut()) { + CTxDestination address; + ExtractDestination(pblock->txoutFounder.scriptPubKey, address); + CAvianAddress address2(address); + founderObj.push_back(Pair("payee", address2.ToString().c_str())); + founderObj.push_back(Pair("script", HexStr(pblock->txoutFounder.scriptPubKey.begin(), pblock->txoutFounder.scriptPubKey.end()))); + founderObj.push_back(Pair("amount", pblock->txoutFounder.nValue)); + } + result.push_back(Pair("founder", founderObj)); + result.push_back(Pair("founder_payments_started", founderPayment.IsFounderPaymentsStarted(pindexPrev->nHeight + 1))); if (!pblocktemplate->vchCoinbaseCommitment.empty() && fSupportsSegwit) { result.push_back(Pair("default_witness_commitment", HexStr(pblocktemplate->vchCoinbaseCommitment.begin(), pblocktemplate->vchCoinbaseCommitment.end()))); diff --git a/src/validation.cpp b/src/validation.cpp index b51c12d30..f74a57aa8 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2811,9 +2811,7 @@ static bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockInd FounderPayment founderPayment = Params().GetConsensus().nFounderPayment; CAmount founderReward = founderPayment.getFounderPaymentAmount(pindex->nHeight, blockReward); - int founderStartHeight = founderPayment.getStartBlock(); - - if (pindex->nHeight > founderStartHeight && founderReward && !founderPayment.IsBlockPayeeValid(*block.vtx[0], pindex->nHeight, blockReward)) + if (founderPayment.IsFounderPaymentsStarted(pindex->nHeight) && founderReward && !founderPayment.IsBlockPayeeValid(*block.vtx[0], pindex->nHeight, blockReward)) return state.DoS(0, error("ConnectBlock(): couldn't find founders fee payments"), REJECT_INVALID, "bad-cb-payee"); From 263d7776c6698ae85f48b883a2d42dfa4f9e0b74 Mon Sep 17 00:00:00 2001 From: Craig Donnachie <88741883+cdonnachie@users.noreply.github.com> Date: Sun, 2 Apr 2023 09:15:59 -0400 Subject: [PATCH 2/2] Correct issue with tx_verify --- src/consensus/tx_verify.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/consensus/tx_verify.cpp b/src/consensus/tx_verify.cpp index 9b4eab752..c932ab88d 100644 --- a/src/consensus/tx_verify.cpp +++ b/src/consensus/tx_verify.cpp @@ -391,9 +391,7 @@ bool CheckTransaction(const CTransaction& tx, CValidationState &state, int nHeig FounderPayment founderPayment = Params().GetConsensus().nFounderPayment; CAmount founderReward = founderPayment.getFounderPaymentAmount(nHeight, blockReward); - int founderStartHeight = founderPayment.getStartBlock(); - - if(nHeight > founderStartHeight && founderReward && !founderPayment.IsBlockPayeeValid(tx, nHeight, blockReward)) { + if(founderPayment.IsFounderPaymentsStarted(nHeight) && founderReward && !founderPayment.IsBlockPayeeValid(tx, nHeight, blockReward)) { return state.DoS(100, false, REJECT_INVALID, "bad-cb-founder-payment-not-found"); } }