Exemplo n.º 1
0
        public virtual async Task Apply(Block block, JsonElement op, JsonElement content)
        {
            #region init
            var metadata = content.Required("metadata");
            var reward   = metadata
                           .RequiredArray("balance_updates")
                           .EnumerateArray()
                           .FirstOrDefault(x => x.RequiredString("kind")[0] == 'f' && x.RequiredString("category")[0] == 'r');
            var deposit = metadata
                          .RequiredArray("balance_updates")
                          .EnumerateArray()
                          .FirstOrDefault(x => x.RequiredString("kind")[0] == 'f' && x.RequiredString("category")[0] == 'd');

            var endorsement = new EndorsementOperation
            {
                Id        = Cache.AppState.NextOperationId(),
                Block     = block,
                Level     = block.Level,
                Timestamp = block.Timestamp,
                OpHash    = op.RequiredString("hash"),
                Slots     = metadata.RequiredArray("slots").Count(),
                Delegate  = Cache.Accounts.GetDelegate(metadata.RequiredString("delegate")),
                Reward    = reward.ValueKind != JsonValueKind.Undefined ? reward.RequiredInt64("change") : 0,
                Deposit   = deposit.ValueKind != JsonValueKind.Undefined ? deposit.RequiredInt64("change") : 0
            };
            #endregion

            #region entities
            //var block = endorsement.Block;
            var sender = endorsement.Delegate;

            //Db.TryAttach(block);
            Db.TryAttach(sender);
            #endregion

            #region apply operation
            sender.Balance        += endorsement.Reward;
            sender.FrozenRewards  += endorsement.Reward;
            sender.FrozenDeposits += endorsement.Deposit;

            sender.EndorsementsCount++;

            block.Operations  |= Operations.Endorsements;
            block.Validations += endorsement.Slots;

            var newDeactivationLevel = sender.Staked ? GracePeriod.Reset(endorsement.Block) : GracePeriod.Init(endorsement.Block);
            if (sender.DeactivationLevel < newDeactivationLevel)
            {
                if (sender.DeactivationLevel <= endorsement.Level)
                {
                    await UpdateDelegate(sender, true);
                }

                endorsement.ResetDeactivation = sender.DeactivationLevel;
                sender.DeactivationLevel      = newDeactivationLevel;
            }
            #endregion

            Db.EndorsementOps.Add(endorsement);
        }
Exemplo n.º 2
0
        public async Task Init(Block block, EndorsementOperation endorsement)
        {
            Endorsement = endorsement;

            Endorsement.Block ??= block;
            Endorsement.Block.Protocol ??= await Cache.Protocols.GetAsync(block.ProtoCode);

            Endorsement.Delegate ??= Cache.Accounts.GetDelegate(endorsement.DelegateId);
        }
Exemplo n.º 3
0
        public Task Init(Block block, RawOperation op, RawEndorsementContent content)
        {
            Endorsement = new EndorsementOperation
            {
                Id        = Cache.AppState.NextOperationId(),
                Block     = block,
                Level     = block.Level,
                Timestamp = block.Timestamp,
                OpHash    = op.Hash,
                Slots     = content.Metadata.Slots.Count,
                Delegate  = Cache.Accounts.GetDelegate(content.Metadata.Delegate),
                Reward    = content.Metadata.BalanceUpdates.FirstOrDefault(x => x is RewardsUpdate)?.Change ?? 0
            };

            return(Task.CompletedTask);
        }
Exemplo n.º 4
0
        public virtual async Task Revert(Block block, EndorsementOperation endorsement)
        {
            #region init
            endorsement.Block ??= block;
            endorsement.Block.Protocol ??= await Cache.Protocols.GetAsync(block.ProtoCode);

            endorsement.Delegate ??= Cache.Accounts.GetDelegate(endorsement.DelegateId);
            #endregion

            #region entities
            //var block = endorsement.Block;
            var sender = endorsement.Delegate;

            //Db.TryAttach(block);
            Db.TryAttach(sender);
            #endregion

            #region revert operation
            sender.Balance        -= endorsement.Reward;
            sender.FrozenRewards  -= endorsement.Reward;
            sender.FrozenDeposits -= endorsement.Deposit;

            sender.EndorsementsCount--;

            if (endorsement.ResetDeactivation != null)
            {
                if (endorsement.ResetDeactivation <= endorsement.Level)
                {
                    await UpdateDelegate(sender, false);
                }

                sender.DeactivationLevel = (int)endorsement.ResetDeactivation;
            }
            #endregion

            Db.EndorsementOps.Remove(endorsement);
        }
Exemplo n.º 5
0
        public static async Task <EndorsementsCommit> Revert(ProtocolHandler proto, Block block, EndorsementOperation op)
        {
            var commit = new EndorsementsCommit(proto);
            await commit.Init(block, op);

            await commit.Revert();

            return(commit);
        }