public class RewardsVerifier : IBlockTreeVisitor
public bool PreventsAcceptingNewBlocks => true;
public long StartLevelInclusive => 0;
public long EndLevelExclusive => 10618000;
private UInt256 _genesisAllocations = UInt256.Parse("72009990499480000000000000");
private UInt256 _blockRewards;
public RewardsVerifier(ILogManager logManager)
_logger = logManager.GetClassLogger();
private RewardCalculator _rewardCalculator = new RewardCalculator(MainnetSpecProvider.Instance);
public Task<BlockVisitOutcome> VisitBlock(Block block, CancellationToken cancellationToken)
BlockReward[] rewards = _rewardCalculator.CalculateRewards(block);
for (int i = 0; i < rewards.Length; i++)
if (rewards[i].RewardType == BlockRewardType.Uncle)
_uncles += rewards[i].Value;
_blockRewards += rewards[i].Value;
_logger.Info(quot;Visiting block {block.Number}, total supply is (genesis + miner rewards + uncle rewards) | {_genesisAllocations} + {_blockRewards} + {_uncles}");
return Task.FromResult(BlockVisitOutcome.None);
public Task<LevelVisitOutcome> VisitLevelStart(ChainLevelInfo chainLevelInfo, CancellationToken cancellationToken)
=> Task.FromResult(LevelVisitOutcome.None);
public Task<bool> VisitMissing(Keccak hash, CancellationToken cancellationToken)
=> Task.FromResult(true);
public Task<bool> VisitHeader(BlockHeader header, CancellationToken cancellationToken)
=> Task.FromResult(true);
public Task<LevelVisitOutcome> VisitLevelEnd(CancellationToken cancellationToken)
=> Task.FromResult(LevelVisitOutcome.None);