bool Currency::getBlockReward(size_t medianSize, size_t currentBlockSize, uint64_t alreadyGeneratedCoins, uint64_t fee, uint64_t& reward, int64_t& emissionChange) const { assert(alreadyGeneratedCoins <= m_moneySupply); assert(m_emissionSpeedFactor > 0 && m_emissionSpeedFactor <= 8 * sizeof(uint64_t)); uint64_t baseReward = (m_moneySupply - alreadyGeneratedCoins) >> m_emissionSpeedFactor; medianSize = std::max(medianSize, m_blockGrantedFullRewardZone); if (currentBlockSize > UINT64_C(2) * medianSize) { LOG_PRINT_L4("Block cumulative size is too big: " << currentBlockSize << ", expected less than " << 2 * medianSize); return false; } uint64_t penalizedBaseReward = getPenalizedAmount(baseReward, medianSize, currentBlockSize); uint64_t penalizedFee = getPenalizedAmount(fee, medianSize, currentBlockSize); emissionChange = penalizedBaseReward - (fee - penalizedFee); reward = penalizedBaseReward + penalizedFee; return true; }
bool Currency::getBlockReward(size_t medianSize, size_t currentBlockSize, uint64_t alreadyGeneratedCoins, uint64_t fee, uint32_t height, uint64_t& reward, int64_t& emissionChange) const { assert(alreadyGeneratedCoins <= m_moneySupply); uint64_t baseReward = baseRewardFunction(alreadyGeneratedCoins, height); medianSize = std::max(medianSize, m_blockGrantedFullRewardZone); if (currentBlockSize > UINT64_C(2) * medianSize) { logger(TRACE) << "Block cumulative size is too big: " << currentBlockSize << ", expected less than " << 2 * medianSize; return false; } uint64_t penalizedBaseReward = getPenalizedAmount(baseReward, medianSize, currentBlockSize); emissionChange = penalizedBaseReward; reward = penalizedBaseReward + fee; return true; }