nimbus-eth1/nimbus/p2p/executor/calculate_reward.nim

76 lines
2.0 KiB
Nim

# Nimbus
# Copyright (c) 2018 Status Research & Development GmbH
# Licensed under either of
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
# http://www.apache.org/licenses/LICENSE-2.0)
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or
# http://opensource.org/licenses/MIT)
# at your option. This file may not be copied, modified, or distributed except
# according to those terms.
import
../../db/accounts_cache,
../../forks,
../../vm_state,
../../vm_types,
./executor_helpers,
eth/common
func eth(n: int): Uint256 {.compileTime.} =
n.u256 * pow(10.u256, 18)
const
eth5 = 5.eth
eth3 = 3.eth
eth2 = 2.eth
eth0 = 0.u256
# Note than the `blockRewards` were previously exported but nowhere
# used otherwise.
blockRewards: array[Fork, Uint256] = [
eth5, # FkFrontier
eth5, # FkHomestead
eth5, # FkTangerine
eth5, # FkSpurious
eth3, # FkByzantium
eth2, # FkConstantinople
eth2, # FkPetersburg
eth2, # FkIstanbul
eth2, # FkBerlin
eth2 # FkLondon
]
{.push raises: [Defect].}
proc calculateReward*(vmState: BaseVMState; account: EthAddress;
number: BlockNumber; uncles: openArray[BlockHeader])
{.gcsafe, raises: [Defect,CatchableError].} =
var blockReward: Uint256
safeExecutor("getFork"):
blockReward = blockRewards[vmState.getForkUnsafe]
var mainReward = blockReward
for uncle in uncles:
var uncleReward = uncle.blockNumber.u256 + 8.u256
uncleReward -= number
uncleReward = uncleReward * blockReward
uncleReward = uncleReward div 8.u256
vmState.mutateStateDB:
db.addBalance(uncle.coinbase, uncleReward)
mainReward += blockReward div 32.u256
vmState.mutateStateDB:
db.addBalance(account, mainReward)
proc calculateReward*(vmState: BaseVMState;
header: BlockHeader; body: BlockBody)
{.gcsafe, raises: [Defect,CatchableError].} =
vmState.calculateReward(header.coinbase, header.blockNumber, body.uncles)
# End