/// <summary> /// Remove current total shares of Re-Election Reward, /// Add shares to re-elected miners based on their continual appointment count. /// </summary> /// <param name="endPeriod"></param> /// <param name="previousMiners"></param> /// <param name="previousMinerAddresses"></param> /// <param name="victories"></param> private void UpdateReElectionRewardWeights(long endPeriod, ICollection <string> previousMiners, IEnumerable <Address> previousMinerAddresses, ICollection <string> victories) { var reElectionRewardProfitSubBeneficiaries = new RemoveBeneficiariesInput { SchemeId = State.ReElectionRewardHash.Value, Beneficiaries = { previousMinerAddresses } }; State.ProfitContract.RemoveBeneficiaries.Send(reElectionRewardProfitSubBeneficiaries); var minerReElectionInformation = State.MinerReElectionInformation.Value ?? InitialMinerReElectionInformation(previousMiners); AddBeneficiariesForReElectionScheme(endPeriod, victories, minerReElectionInformation); var recordedMiners = minerReElectionInformation.Clone().ContinualAppointmentTimes.Keys; foreach (var miner in recordedMiners) { if (!victories.Contains(miner)) { minerReElectionInformation.ContinualAppointmentTimes.Remove(miner); } } State.MinerReElectionInformation.Value = minerReElectionInformation; }
/// <summary> /// Remove current total shares of Basic Reward, /// Add new shares for miners of next term. /// 1 share for each miner. /// </summary> /// <param name="endPeriod"></param> /// <param name="victories"></param> /// <param name="previousMinerAddresses"></param> private void UpdateBasicMinerRewardWeights(long endPeriod, IEnumerable <string> victories, IEnumerable <Address> previousMinerAddresses) { var basicRewardProfitSubBeneficiaries = new RemoveBeneficiariesInput { SchemeId = State.BasicRewardHash.Value, Beneficiaries = { previousMinerAddresses } }; State.ProfitContract.RemoveBeneficiaries.Send(basicRewardProfitSubBeneficiaries); var basicRewardProfitAddBeneficiaries = new AddBeneficiariesInput { SchemeId = State.BasicRewardHash.Value, EndPeriod = endPeriod, BeneficiaryShares = { victories.Select(k => Address.FromPublicKey(k.ToByteString().ToByteArray())) .Select(a => new BeneficiaryShare { Beneficiary = a, Shares = 1 }) } }; // Manage weights of `MinerBasicReward` State.ProfitContract.AddBeneficiaries.Send(basicRewardProfitAddBeneficiaries); }
/// <summary> /// Remove current total shares of Re-Election Reward, /// Add shares to re-elected miners based on their continual appointment count. /// </summary> /// <param name="previousTermInformation"></param> /// <param name="victories"></param> private void UpdateReElectionRewardWeights(Round previousTermInformation, ICollection <string> victories) { var previousMinerAddresses = previousTermInformation.RealTimeMinersInformation.Keys .Select(k => Address.FromPublicKey(ByteArrayHelper.HexStringToByteArray(k))).ToList(); var reElectionRewardProfitSubBeneficiaries = new RemoveBeneficiariesInput { SchemeId = State.ReElectionRewardHash.Value, Beneficiaries = { previousMinerAddresses } }; State.ProfitContract.RemoveBeneficiaries.Send(reElectionRewardProfitSubBeneficiaries); var minerReElectionInformation = State.MinerReElectionInformation.Value ?? InitialMinerReElectionInformation(previousTermInformation .RealTimeMinersInformation.Keys); AddBeneficiariesForReElectionScheme(previousTermInformation.TermNumber.Add(1), victories, minerReElectionInformation); var recordedMiners = minerReElectionInformation.Clone().ContinualAppointmentTimes.Keys; foreach (var miner in recordedMiners) { if (!victories.Contains(miner)) { minerReElectionInformation.ContinualAppointmentTimes.Remove(miner); } } State.MinerReElectionInformation.Value = minerReElectionInformation; }
public override Empty RemoveBeneficiaries(RemoveBeneficiariesInput input) { foreach (var beneficiary in input.Beneficiaries) { RemoveBeneficiary(new RemoveBeneficiaryInput { SchemeId = input.SchemeId, Beneficiary = beneficiary }); } return(new Empty()); }
/// <summary> /// Remove current total shares of Votes Weight Reward, /// Add shares to current miners based on votes they obtained. /// </summary> /// <param name="previousTermInformation"></param> /// <param name="victories"></param> private void UpdateVotesWeightRewardWeights(Round previousTermInformation, IEnumerable <string> victories) { var previousMinerAddresses = previousTermInformation.RealTimeMinersInformation.Keys .Select(k => Address.FromPublicKey(ByteArrayHelper.HexStringToByteArray(k))).ToList(); var votesWeightRewardProfitSubBeneficiaries = new RemoveBeneficiariesInput { SchemeId = State.VotesWeightRewardHash.Value, Beneficiaries = { previousMinerAddresses } }; State.ProfitContract.RemoveBeneficiaries.Send(votesWeightRewardProfitSubBeneficiaries); var votesWeightRewardProfitAddBeneficiaries = new AddBeneficiariesInput { SchemeId = State.VotesWeightRewardHash.Value, EndPeriod = previousTermInformation.TermNumber.Add(1) }; var dataCenterRankingList = State.ElectionContract.GetDataCenterRankingList.Call(new Empty()); foreach (var victory in victories) { var obtainedVotes = 0L; if (dataCenterRankingList.DataCenters.ContainsKey(victory)) { obtainedVotes = dataCenterRankingList.DataCenters[victory]; } var minerAddress = Address.FromPublicKey(ByteArrayHelper.HexStringToByteArray(victory)); if (obtainedVotes > 0) { votesWeightRewardProfitAddBeneficiaries.BeneficiaryShares.Add(new BeneficiaryShare { Beneficiary = minerAddress, Shares = obtainedVotes }); } } if (votesWeightRewardProfitAddBeneficiaries.BeneficiaryShares.Any()) { State.ProfitContract.AddBeneficiaries.Send(votesWeightRewardProfitAddBeneficiaries); } }