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 }; }
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); }
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); }