Exemple #1
0
        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;
        }
Exemple #2
0
        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());
        }
Exemple #3
0
        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());
        }