private BlockRewardType GetBlockRewardType(Address address, Address[] beneficiaries, ushort[] kinds, int index) { bool TryGetKind(int indexIn, ref ushort kindOut) { if (beneficiaries[indexIn] == address) { kindOut = kinds[indexIn]; return(true); } return(false); } bool indexInBounds = index < beneficiaries.Length; ushort kind = BenefactorKind.External; if (!indexInBounds || !TryGetKind(index, ref kind)) { for (int i = 0; i < beneficiaries.Length; i++) { if (TryGetKind(i, ref kind)) { break; } } } return(BenefactorKind.ToBlockRewardType(kind)); }
private BlockReward[] CalculateRewardsWithContract(Block block, IRewardContract contract) { (Address[] beneficieries, ushort[] kinds) GetBeneficiaries() { var length = block.Uncles.Length + 1; Address[] beneficiariesList = new Address[length]; ushort[] kindsList = new ushort[length]; beneficiariesList[0] = block.Beneficiary; kindsList[0] = BenefactorKind.Author; for (int i = 0; i < block.Uncles.Length; i++) { var uncle = block.Uncles[i]; if (BenefactorKind.TryGetUncle(block.Number - uncle.Number, out var kind)) { beneficiariesList[i + 1] = uncle.Beneficiary; kindsList[i + 1] = kind; } } return(beneficiariesList, kindsList); } var(beneficiaries, kinds) = GetBeneficiaries(); var(addresses, rewards) = contract.Reward(block.Header, beneficiaries, kinds); var blockRewards = new BlockReward[addresses.Length]; for (int index = 0; index < addresses.Length; index++) { var address = addresses[index]; blockRewards[index] = new BlockReward(address, rewards[index], BlockRewardType.External); } return(blockRewards); }