コード例 #1
0
        public async Task Init(Block block, ProposalOperation proposal)
        {
            proposal.Block ??= block;
            proposal.Sender ??= Cache.Accounts.GetDelegate(proposal.SenderId);
            proposal.Period ??= await Cache.Periods.CurrentAsync();

            proposal.Proposal ??= await Cache.Proposals.GetAsync(proposal.ProposalId);

            ProposalOperations = new List <ProposalOperation> {
                proposal
            };
        }
コード例 #2
0
ファイル: ProposalsCommit.cs プロジェクト: yepeek/tzkt
        public virtual async Task Revert(Block block, ProposalOperation proposalOp)
        {
            #region init
            proposalOp.Block ??= block;
            proposalOp.Sender ??= Cache.Accounts.GetDelegate(proposalOp.SenderId);
            proposalOp.Proposal ??= await Cache.Proposals.GetAsync(proposalOp.ProposalId);

            var snapshot = await Db.VotingSnapshots
                           .FirstAsync(x => x.Period == proposalOp.Period && x.BakerId == proposalOp.Sender.Id);

            var period = await Cache.Periods.GetAsync(proposalOp.Period);

            #endregion

            #region entities
            var sender   = proposalOp.Sender;
            var proposal = proposalOp.Proposal;

            //Db.TryAttach(block);
            Db.TryAttach(period);
            Db.TryAttach(sender);
            Db.TryAttach(proposal);
            //Db.TryAttach(snapshot);
            #endregion

            #region revert operation
            if (!proposalOp.Duplicated)
            {
                proposal.Upvotes--;
                proposal.Rolls -= proposalOp.Rolls;

                if (period.ProposalsCount > 1)
                {
                    var proposals = await Db.Proposals
                                    .AsNoTracking()
                                    .Where(x => x.Epoch == period.Epoch)
                                    .ToListAsync();

                    var curr = proposals.First(x => x.Id == proposal.Id);
                    curr.Rolls -= proposalOp.Rolls;
                    curr.Upvotes--;

                    var prevMax = proposals
                                  .OrderByDescending(x => x.Rolls)
                                  .First();

                    period.TopUpvotes = prevMax.Upvotes;
                    period.TopRolls   = prevMax.Rolls;
                }
                else
                {
                    period.TopUpvotes = proposal.Upvotes;
                    period.TopRolls   = proposal.Rolls;
                }

                if (proposal.Upvotes == 0)
                {
                    period.ProposalsCount--;
                }

                if (!await Db.ProposalOps.AnyAsync(x => x.Period == period.Index && x.SenderId == sender.Id && x.Id < proposalOp.Id))
                {
                    snapshot.Status = VoterStatus.None;
                }
            }

            sender.ProposalsCount--;
            #endregion

            if (proposal.Upvotes == 0)
            {
                Db.Proposals.Remove(proposal);
                Cache.Proposals.Remove(proposal);
            }

            Db.ProposalOps.Remove(proposalOp);
        }
コード例 #3
0
        public static async Task <ProposalsCommit> Revert(ProtocolHandler proto, Block block, ProposalOperation op)
        {
            var commit = new ProposalsCommit(proto);
            await commit.Init(block, op);

            await commit.Revert();

            return(commit);
        }