Changeset View
Changeset View
Standalone View
Standalone View
src/minerfund.cpp
// Copyright (c) 2020 The Bitcoin developers | // Copyright (c) 2020 The Bitcoin developers | ||||
// Distributed under the MIT software license, see the accompanying | // Distributed under the MIT software license, see the accompanying | ||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
#include <minerfund.h> | #include <minerfund.h> | ||||
#include <blockindex.h> | |||||
#include <chainparams.h> | #include <chainparams.h> | ||||
#include <consensus/activation.h> | #include <consensus/activation.h> | ||||
#include <consensus/amount.h> | |||||
#include <currencyunit.h> | #include <currencyunit.h> | ||||
#include <key_io.h> // For DecodeDestination | #include <key_io.h> // For DecodeDestination | ||||
#include <primitives/transaction.h> | |||||
#include <util/system.h> | #include <util/system.h> | ||||
/** | /** | ||||
* Percentage of the block reward to be sent to the fund. | * Percentage of the block reward to be sent to the fund. | ||||
*/ | */ | ||||
static constexpr int MINER_FUND_RATIO = 8; | static constexpr int MINER_FUND_RATIO = 8; | ||||
Amount GetMinerFundAmount(const Amount &coinbaseValue) { | Amount GetMinerFundAmount(const Amount &coinbaseValue) { | ||||
Show All 34 Lines | GetMinerFundWhitelist(const Consensus::Params ¶ms, | ||||
} | } | ||||
if (!IsAxionEnabled(params, pindexPrev)) { | if (!IsAxionEnabled(params, pindexPrev)) { | ||||
return {}; | return {}; | ||||
} | } | ||||
return {GetMinerFundDestination(!IsGluonEnabled(params, pindexPrev))}; | return {GetMinerFundDestination(!IsGluonEnabled(params, pindexPrev))}; | ||||
} | } | ||||
bool CheckMinerFund(const Consensus::Params ¶ms, | |||||
const CBlockIndex *pindexPrev, | |||||
const std::vector<CTxOut> &coinbaseTxOut, | |||||
const Amount &blockReward) { | |||||
const auto whitelist = GetMinerFundWhitelist(params, pindexPrev); | |||||
if (whitelist.empty()) { | |||||
return true; | |||||
} | |||||
const Amount required = GetMinerFundAmount(blockReward); | |||||
for (auto &o : coinbaseTxOut) { | |||||
if (o.nValue < required) { | |||||
// This output doesn't qualify because its amount is too low. | |||||
continue; | |||||
} | |||||
CTxDestination address; | |||||
if (!ExtractDestination(o.scriptPubKey, address)) { | |||||
// Cannot decode address. | |||||
continue; | |||||
} | |||||
if (std::find(whitelist.begin(), whitelist.end(), address) != | |||||
whitelist.end()) { | |||||
return true; | |||||
} | |||||
} | |||||
// We did not find an output that match the miner fund requirements. | |||||
return false; | |||||
} |