private void SavePreviousTermInformation(TakeElectionSnapshotInput input) { var snapshot = new TermSnapshot { MinedBlocks = input.MinedBlocks, EndRoundNumber = input.RoundNumber }; if (State.Candidates.Value == null) { return; } foreach (var pubkey in State.Candidates.Value.Value) { var votes = State.CandidateVotes[pubkey.ToHex()]; var validObtainedVotesAmount = 0L; if (votes != null) { validObtainedVotesAmount = votes.ObtainedActiveVotedVotesAmount; } snapshot.ElectionResult.Add(pubkey.ToHex(), validObtainedVotesAmount); } State.Snapshots[input.TermNumber] = snapshot; }
public override Empty TakeSnapshot(TakeElectionSnapshotInput input) { if (State.AEDPoSContract.Value == null) { State.AEDPoSContract.Value = Context.GetContractAddressByName(SmartContractConstants.ConsensusContractSystemName); } Assert(State.AEDPoSContract.Value == Context.Sender, "No permission."); SavePreviousTermInformation(input); if (State.ProfitContract.Value == null) { var profitContractAddress = Context.GetContractAddressByName(SmartContractConstants.ProfitContractSystemName); // Return if profit contract didn't deployed. (Often in test cases.) if (profitContractAddress == null) { return(new Empty()); } State.ProfitContract.Value = profitContractAddress; } // Update snapshot of corresponding voting record by the way. State.VoteContract.TakeSnapshot.Send(new TakeSnapshotInput { SnapshotNumber = input.TermNumber, VotingItemId = State.MinerElectionVotingItemId.Value }); State.CurrentTermNumber.Value = input.TermNumber.Add(1); var previousMiners = State.AEDPoSContract.GetPreviousRoundInformation.Call(new Empty()) .RealTimeMinersInformation.Keys.ToList(); foreach (var pubkey in previousMiners) { UpdateCandidateInformation(pubkey, input.TermNumber, previousMiners); } State.ProfitContract.DistributeProfits.Send(new DistributeProfitsInput { SchemeId = State.SubsidyHash.Value, Period = input.TermNumber, Symbol = Context.Variables.NativeSymbol }); State.ProfitContract.DistributeProfits.Send(new DistributeProfitsInput { SchemeId = State.WelfareHash.Value, Period = input.TermNumber, Symbol = Context.Variables.NativeSymbol }); return(new Empty()); }
public override Empty TakeSnapshot(TakeElectionSnapshotInput input) { if (State.AEDPoSContract.Value == null) { State.AEDPoSContract.Value = Context.GetContractAddressByName(SmartContractConstants.ConsensusContractSystemName); } Assert(State.AEDPoSContract.Value == Context.Sender, "No permission."); SavePreviousTermInformation(input); if (State.ProfitContract.Value == null) { var profitContractAddress = Context.GetContractAddressByName(SmartContractConstants.ProfitContractSystemName); // Return if profit contract didn't deployed. (Often in test cases.) if (profitContractAddress == null) { return(new Empty()); } State.ProfitContract.Value = profitContractAddress; } // Update snapshot of corresponding voting record by the way. State.VoteContract.TakeSnapshot.Send(new TakeSnapshotInput { SnapshotNumber = input.TermNumber, VotingItemId = State.MinerElectionVotingItemId.Value }); State.CurrentTermNumber.Value = input.TermNumber.Add(1); var previousTermMinerList = State.AEDPoSContract.GetPreviousTermMinerPubkeyList.Call(new Empty()).Pubkeys.ToList(); foreach (var pubkey in previousTermMinerList) { UpdateCandidateInformation(pubkey, input.TermNumber, previousTermMinerList); } if (State.DividendPoolContract.Value == null) { State.DividendPoolContract.Value = Context.GetContractAddressByName(SmartContractConstants.TreasuryContractSystemName); } var symbolList = State.DividendPoolContract.GetSymbolList.Call(new Empty()); var amountsMap = symbolList.Value.ToDictionary(s => s, s => 0L); State.ProfitContract.DistributeProfits.Send(new DistributeProfitsInput { SchemeId = State.SubsidyHash.Value, Period = input.TermNumber, AmountsMap = { amountsMap } }); State.ProfitContract.DistributeProfits.Send(new DistributeProfitsInput { SchemeId = State.WelfareHash.Value, Period = input.TermNumber, AmountsMap = { amountsMap } }); return(new Empty()); }