diff --git a/Tzkt.Sync/Protocols/Handlers/Proto1/Activation/ProtoActivator.Protocol.cs b/Tzkt.Sync/Protocols/Handlers/Proto1/Activation/ProtoActivator.Protocol.cs index 8a5f67fc..32a19ffb 100644 --- a/Tzkt.Sync/Protocols/Handlers/Proto1/Activation/ProtoActivator.Protocol.cs +++ b/Tzkt.Sync/Protocols/Handlers/Proto1/Activation/ProtoActivator.Protocol.cs @@ -107,6 +107,18 @@ public async Task UpgradeProtocol(AppState state) LBToggleThreshold = prev.LBToggleThreshold, ConsensusThreshold = prev.ConsensusThreshold, MaxDelegatedOverFrozenRatio = prev.MaxDelegatedOverFrozenRatio, + MaxExternalOverOwnStakeRatio = prev.MaxExternalOverOwnStakeRatio, + DoubleBakingSlashedPercentage = prev.DoubleBakingSlashedPercentage, + DoubleEndorsingSlashedPercentage = prev.DoubleEndorsingSlashedPercentage, + MinimalFrozenStake = prev.MinimalFrozenStake, + StakePowerMultiplier = prev.StakePowerMultiplier, + BaseIssuedPerMinute = prev.BaseIssuedPerMinute, + BlockBonusWeight = prev.BlockBonusWeight, + BlockRewardWeight = prev.BlockRewardWeight, + EndorsingRewardWeight = prev.EndorsingRewardWeight, + LBSubsidyWeight = prev.LBSubsidyWeight, + NonceRevelationRewardWeight = prev.NonceRevelationRewardWeight, + VdfRevelationRewardWeight = prev.VdfRevelationRewardWeight, MaxBakingReward = prev.MaxBakingReward, MaxEndorsingReward = prev.MaxEndorsingReward, MaxSlashingPeriod = prev.MaxSlashingPeriod, diff --git a/Tzkt.Sync/Protocols/Handlers/Proto12/Rpc/Rpc.cs b/Tzkt.Sync/Protocols/Handlers/Proto12/Rpc/Rpc.cs index 7a129127..dfcc6add 100644 --- a/Tzkt.Sync/Protocols/Handlers/Proto12/Rpc/Rpc.cs +++ b/Tzkt.Sync/Protocols/Handlers/Proto12/Rpc/Rpc.cs @@ -12,5 +12,8 @@ public override Task GetStakeDistribution(int block, int cycle) public override Task GetDelegateParticipationAsync(int level, string address) => Node.GetAsync($"chains/main/blocks/{level}/context/delegates/{address}/participation"); + + public override Task GetLevelBakingRightsAsync(int block, int level, int maxRound) + => Node.GetAsync($"chains/main/blocks/{block}/helpers/baking_rights?level={level}&max_round={maxRound}&all=true"); } } diff --git a/Tzkt.Sync/Protocols/Handlers/Proto18/Commits/Operations/DoubleBakingCommit.cs b/Tzkt.Sync/Protocols/Handlers/Proto18/Commits/Operations/DoubleBakingCommit.cs index 6ced5fc0..a05dfdd8 100644 --- a/Tzkt.Sync/Protocols/Handlers/Proto18/Commits/Operations/DoubleBakingCommit.cs +++ b/Tzkt.Sync/Protocols/Handlers/Proto18/Commits/Operations/DoubleBakingCommit.cs @@ -14,10 +14,19 @@ public async Task Apply(Block block, JsonElement op, JsonElement content) #region init var accusedLevel = content.Required("bh1").RequiredInt32("level"); var accusedRound = Hex.Parse(content.Required("bh1").RequiredArray("fitness", 5)[4].RequiredString()).ToInt32(); - var accusedRight = await Db.BakingRights.FirstAsync(x => x.Level == accusedLevel && x.Round == accusedRound); + var accusedBakerId = (await Db.BakingRights.AsNoTracking().FirstOrDefaultAsync(x => x.Level == accusedLevel && x.Round == accusedRound))?.BakerId; + if (accusedBakerId == null) + { + var rpcRights = await Proto.Rpc.GetLevelBakingRightsAsync(block.Level, accusedLevel, accusedRound); + var accusedBaker = rpcRights + .EnumerateArray() + .First(x => x.RequiredInt32("level") == accusedLevel && x.RequiredInt32("round") == accusedRound) + .RequiredString("delegate"); + accusedBakerId = Cache.Accounts.GetDelegate(accusedBaker).Id; + } var accuser = block.Proposer; - var offender = Cache.Accounts.GetDelegate(accusedRight.BakerId); + var offender = Cache.Accounts.GetDelegate(accusedBakerId); var operation = new DoubleBakingOperation {