Bitcoin ABC  0.26.3
P2P Digital Currency
minerfund.cpp
Go to the documentation of this file.
1 // Copyright (c) 2020 The Bitcoin developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include <minerfund.h>
6 
7 #include <blockindex.h>
8 #include <chainparams.h>
9 #include <common/args.h>
10 #include <consensus/activation.h>
11 #include <consensus/amount.h>
12 #include <currencyunit.h>
13 #include <key_io.h> // For DecodeDestination
14 #include <primitives/transaction.h>
15 
19 static constexpr int LEGACY_MINER_FUND_RATIO = 8;
20 static constexpr int MINER_FUND_RATIO = 32;
21 
23  const Amount &coinbaseValue,
24  const CBlockIndex *pprev) {
25  const int minerFundRatio = IsCowperthwaiteEnabled(params, pprev)
28  return minerFundRatio * coinbaseValue / 100;
29 }
30 
31 static CTxDestination BuildDestination(const std::string &dest) {
32  const ArgsManager unused_argsman{};
33  const auto mainNetParams =
35  return DecodeDestination(dest, *mainNetParams);
36 }
37 
39  static const std::string ecashMinerFund =
40  "ecash:prfhcnyqnl5cgrnmlfmms675w93ld7mvvqd0y8lz07";
41  static const std::string bitcoinCashMinerFund =
42  "bitcoincash:prfhcnyqnl5cgrnmlfmms675w93ld7mvvq5zsvycff";
43  static CTxDestination dest = BuildDestination(
44  gArgs.GetBoolArg("-ecash", DEFAULT_ECASH) ? ecashMinerFund
45  : bitcoinCashMinerFund);
46 
47  return dest;
48 }
49 
50 std::unordered_set<CTxDestination, TxDestinationHasher>
52  if (!gArgs.GetBoolArg("-enableminerfund", params.enableMinerFund)) {
53  return {};
54  }
55 
56  return {GetMinerFundDestination()};
57 }
58 
59 bool CheckMinerFund(const Consensus::Params &params,
60  const std::vector<CTxOut> &coinbaseTxOut,
61  const Amount &blockReward, const CBlockIndex *pprev) {
62  const auto whitelist = GetMinerFundWhitelist(params);
63  if (whitelist.empty()) {
64  return true;
65  }
66 
67  const Amount required = GetMinerFundAmount(params, blockReward, pprev);
68  for (auto &o : coinbaseTxOut) {
69  if (o.nValue < required) {
70  // This output doesn't qualify because its amount is too low.
71  continue;
72  }
73 
74  CTxDestination address;
75  if (!ExtractDestination(o.scriptPubKey, address)) {
76  // Cannot decode address.
77  continue;
78  }
79 
80  if (std::find(whitelist.begin(), whitelist.end(), address) !=
81  whitelist.end()) {
82  return true;
83  }
84  }
85 
86  // We did not find an output that match the miner fund requirements.
87  return false;
88 }
bool IsCowperthwaiteEnabled(const Consensus::Params &params, int32_t nHeight)
Check if Nov 15th, 2023 protocol upgrade has activated.
Definition: activation.cpp:104
ArgsManager gArgs
Definition: args.cpp:38
std::unique_ptr< const CChainParams > CreateChainParams(const ArgsManager &args, const std::string &chain)
Creates and returns a std::unique_ptr<CChainParams> of the chosen chain.
Definition: chainparams.cpp:32
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
Definition: args.cpp:556
static const std::string MAIN
BIP70 chain name strings (main, test or regtest)
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition: blockindex.h:25
constexpr bool DEFAULT_ECASH
Definition: currencyunit.h:10
CTxDestination DecodeDestination(const std::string &addr, const CChainParams &params)
Definition: key_io.cpp:174
static CTxDestination BuildDestination(const std::string &dest)
Definition: minerfund.cpp:31
static constexpr int MINER_FUND_RATIO
Definition: minerfund.cpp:20
static const CTxDestination & GetMinerFundDestination()
Definition: minerfund.cpp:38
static constexpr int LEGACY_MINER_FUND_RATIO
Percentage of the block reward to be sent to the fund.
Definition: minerfund.cpp:19
bool CheckMinerFund(const Consensus::Params &params, const std::vector< CTxOut > &coinbaseTxOut, const Amount &blockReward, const CBlockIndex *pprev)
Returns false if there is an invalid miner fund.
Definition: minerfund.cpp:59
Amount GetMinerFundAmount(const Consensus::Params &params, const Amount &coinbaseValue, const CBlockIndex *pprev)
Definition: minerfund.cpp:22
std::unordered_set< CTxDestination, TxDestinationHasher > GetMinerFundWhitelist(const Consensus::Params &params)
Definition: minerfund.cpp:51
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a standard scriptPubKey for the destination address.
Definition: standard.cpp:158
std::variant< CNoDestination, PKHash, ScriptHash > CTxDestination
A txout script template with a specific destination.
Definition: standard.h:85
Definition: amount.h:19
Parameters that influence chain consensus.
Definition: params.h:34
bool enableMinerFund
Enable or disable the miner fund by default.
Definition: params.h:68