diff --git a/cl/abstract/beacon_state.go b/cl/abstract/beacon_state.go index a4d098e3206..195b6ffe65d 100644 --- a/cl/abstract/beacon_state.go +++ b/cl/abstract/beacon_state.go @@ -162,6 +162,8 @@ type BeaconStateMinimal interface { Eth1Data() *cltypes.Eth1Data Eth1DataVotes() *solid.ListSSZ[*cltypes.Eth1Data] Eth1DepositIndex() uint64 + ValidatorSet() *solid.ValidatorSet + PreviousEpochParticipation() *solid.BitList ForEachValidator(fn func(v solid.Validator, idx int, total int) bool) ValidatorForValidatorIndex(index int) (solid.Validator, error) diff --git a/cl/antiquary/state_antiquary.go b/cl/antiquary/state_antiquary.go index 61c2c057b51..823be6a55ce 100644 --- a/cl/antiquary/state_antiquary.go +++ b/cl/antiquary/state_antiquary.go @@ -183,6 +183,8 @@ func (s *Antiquary) IncrementBeaconState(ctx context.Context, to uint64) error { defer eth1DataVotes.Close() stateEvents := etl.NewCollector(kv.StateEvents, s.dirs.Tmp, etl.NewSortableBuffer(etl.BufferOptimalSize), s.logger) defer stateEvents.Close() + activeValidatorIndicies := etl.NewCollector(kv.ActiveValidatorIndicies, s.dirs.Tmp, etl.NewSortableBuffer(etl.BufferOptimalSize), s.logger) + defer activeValidatorIndicies.Close() progress, err := state_accessors.GetStateProcessingProgress(tx) if err != nil { @@ -311,6 +313,23 @@ func (s *Antiquary) IncrementBeaconState(ctx context.Context, to uint64) error { if err := randaoMixes.Collect(base_encoding.Encode64ToBytes4(prevEpoch*s.cfg.SlotsPerEpoch), mix[:]); err != nil { return err } + // Write active validator indicies + actives := s.currentState.GetActiveValidatorsIndices(prevEpoch) + commonBuffer.Reset() + if err := base_encoding.WriteRabbits(actives, commonBuffer); err != nil { + return err + } + if err := activeValidatorIndicies.Collect(base_encoding.Encode64ToBytes4(prevEpoch), libcommon.Copy(commonBuffer.Bytes())); err != nil { + return err + } + actives = s.currentState.GetActiveValidatorsIndices(epoch) + commonBuffer.Reset() + if err := base_encoding.WriteRabbits(actives, commonBuffer); err != nil { + return err + } + if err := activeValidatorIndicies.Collect(base_encoding.Encode64ToBytes4(epoch), libcommon.Copy(commonBuffer.Bytes())); err != nil { + return err + } // truncate the file return proposers.Collect(base_encoding.Encode64ToBytes4(epoch), getProposerDutiesValue(s.currentState)) }, @@ -504,6 +523,9 @@ func (s *Antiquary) IncrementBeaconState(ctx context.Context, to uint64) error { if err := stateRoots.Load(rwTx, kv.StateRoot, loadfunc, etl.TransformArgs{Quit: ctx.Done()}); err != nil { return err } + if err := activeValidatorIndicies.Load(rwTx, kv.ActiveValidatorIndicies, loadfunc, etl.TransformArgs{Quit: ctx.Done()}); err != nil { + return err + } if err := minimalBeaconStates.Load(rwTx, kv.MinimalBeaconState, loadfunc, etl.TransformArgs{Quit: ctx.Done()}); err != nil { return err @@ -758,7 +780,7 @@ func (s *Antiquary) collectGenesisState(ctx context.Context, compressor *zstd.En func (s *Antiquary) storeMinimalState(buffer *bytes.Buffer, st *state.CachingBeaconState, collector *etl.Collector) error { buffer.Reset() - minimalBeaconState := state_accessors.MinimalBeaconStateFromBeaconState(st.BeaconState) + minimalBeaconState := state_accessors.MinimalBeaconStateFromBeaconState(st) if err := minimalBeaconState.WriteTo(buffer); err != nil { return err diff --git a/cl/beacon/handler/attestation_rewards.go b/cl/beacon/handler/attestation_rewards.go new file mode 100644 index 00000000000..e043da40c16 --- /dev/null +++ b/cl/beacon/handler/attestation_rewards.go @@ -0,0 +1,450 @@ +package handler + +import ( + "encoding/json" + "io" + "net/http" + + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/kv" + "github.com/ledgerwatch/erigon/cl/beacon/beaconhttp" + "github.com/ledgerwatch/erigon/cl/clparams" + "github.com/ledgerwatch/erigon/cl/cltypes/solid" + "github.com/ledgerwatch/erigon/cl/persistence/beacon_indicies" + state_accessors "github.com/ledgerwatch/erigon/cl/persistence/state" + "github.com/ledgerwatch/erigon/cl/phase1/core/state" + "github.com/ledgerwatch/erigon/cl/transition/impl/eth2/statechange" + "github.com/ledgerwatch/erigon/cl/utils" +) + +type IdealReward struct { + EffectiveBalance int64 `json:"effective_balance,string"` + Head int64 `json:"head,string"` + Target int64 `json:"target,string"` + Source int64 `json:"source,string"` + InclusionDelay int64 `json:"inclusion_delay,string"` + Inactivity int64 `json:"inactivity,string"` +} + +type TotalReward struct { + ValidatorIndex int64 `json:"validator_index,string"` + Head int64 `json:"head,string"` + Target int64 `json:"target,string"` + Source int64 `json:"source,string"` + InclusionDelay int64 `json:"inclusion_delay,string"` + Inactivity int64 `json:"inactivity,string"` +} + +type attestationsRewardsResponse struct { + IdealRewards []IdealReward `json:"ideal_rewards"` + TotalRewards []TotalReward `json:"total_rewards"` +} + +func (a *ApiHandler) getAttestationsRewards(r *http.Request) (*beaconResponse, error) { + ctx := r.Context() + + tx, err := a.indiciesDB.BeginRo(ctx) + if err != nil { + return nil, err + } + defer tx.Rollback() + + epoch, err := epochFromRequest(r) + if err != nil { + return nil, beaconhttp.NewEndpointError(http.StatusBadRequest, err.Error()) + } + + req := []string{} + // read the entire body + jsonBytes, err := io.ReadAll(r.Body) + if err != nil { + return nil, beaconhttp.NewEndpointError(http.StatusBadRequest, err.Error()) + } + // parse json body request + if len(jsonBytes) > 0 { + if err := json.Unmarshal(jsonBytes, &req); err != nil { + return nil, beaconhttp.NewEndpointError(http.StatusBadRequest, err.Error()) + } + } + + filterIndicies, err := parseQueryValidatorIndicies(tx, req) + if err != nil { + return nil, err + } + _, headSlot, err := a.forkchoiceStore.GetHead() + if err != nil { + return nil, err + } + headEpoch := headSlot / a.beaconChainCfg.SlotsPerEpoch + if epoch > headEpoch { + return nil, beaconhttp.NewEndpointError(http.StatusNotFound, "epoch is in the future") + } + // Few cases to handle: + // 1) finalized data + // 2) not finalized data + version := a.beaconChainCfg.GetCurrentStateVersion(epoch) + + // finalized data + if epoch > a.forkchoiceStore.FinalizedCheckpoint().Epoch() { + minRange := epoch * a.beaconChainCfg.SlotsPerEpoch + maxRange := (epoch + 1) * a.beaconChainCfg.SlotsPerEpoch + var blockRoot libcommon.Hash + for i := maxRange - 1; i >= minRange; i-- { + blockRoot, err = beacon_indicies.ReadCanonicalBlockRoot(tx, i) + if err != nil { + return nil, err + } + if blockRoot == (libcommon.Hash{}) { + continue + } + s, err := a.forkchoiceStore.GetStateAtBlockRoot(blockRoot, true) + if err != nil { + return nil, err + } + if s == nil { + continue + } + if s.Version() == clparams.Phase0Version { + return a.computeAttestationsRewardsForPhase0(s, filterIndicies, epoch) + } + return a.computeAttestationsRewardsForAltair(s.ValidatorSet(), s.InactivityScores(), s.PreviousEpochParticipation(), state.InactivityLeaking(s), filterIndicies, epoch) + } + return nil, beaconhttp.NewEndpointError(http.StatusNotFound, "no block found for this epoch") + } + + if version == clparams.Phase0Version { + minRange := epoch * a.beaconChainCfg.SlotsPerEpoch + maxRange := (epoch + 1) * a.beaconChainCfg.SlotsPerEpoch + for i := maxRange - 1; i >= minRange; i-- { + s, err := a.stateReader.ReadHistoricalState(ctx, tx, i) + if err != nil { + return nil, err + } + if s == nil { + continue + } + if err := s.InitBeaconState(); err != nil { + return nil, err + } + return a.computeAttestationsRewardsForPhase0(s, filterIndicies, epoch) + } + return nil, beaconhttp.NewEndpointError(http.StatusNotFound, "no block found for this epoch") + } + lastSlot := epoch*a.beaconChainCfg.SlotsPerEpoch + a.beaconChainCfg.SlotsPerEpoch - 1 + stateProgress, err := state_accessors.GetStateProcessingProgress(tx) + if err != nil { + return nil, err + } + if lastSlot > stateProgress { + return nil, beaconhttp.NewEndpointError(http.StatusNotFound, "requested range is not yet processed or the node is not archivial") + } + validatorSet, err := a.stateReader.ReadValidatorsForHistoricalState(tx, lastSlot) + if err != nil { + return nil, err + } + + _, previousIdx, err := a.stateReader.ReadPartecipations(tx, lastSlot) + if err != nil { + return nil, err + } + _, _, finalizedCheckpoint, err := state_accessors.ReadCheckpoints(tx, epoch*a.beaconChainCfg.SlotsPerEpoch) + if err != nil { + return nil, err + } + inactivityScores := solid.NewUint64ListSSZ(int(a.beaconChainCfg.ValidatorRegistryLimit)) + if err := a.stateReader.ReconstructUint64ListDump(tx, lastSlot, kv.InactivityScores, validatorSet.Length(), inactivityScores); err != nil { + return nil, err + } + return a.computeAttestationsRewardsForAltair( + validatorSet, + inactivityScores, + previousIdx, + a.isInactivityLeaking(epoch, finalizedCheckpoint), + filterIndicies, + epoch) +} + +func (a *ApiHandler) isInactivityLeaking(epoch uint64, finalityCheckpoint solid.Checkpoint) bool { + prevEpoch := epoch + if epoch > 0 { + prevEpoch = epoch - 1 + } + return prevEpoch-finalityCheckpoint.Epoch() > a.beaconChainCfg.MinEpochsToInactivityPenalty +} + +func (a *ApiHandler) baseReward(version clparams.StateVersion, effectiveBalance, activeBalanceRoot uint64) uint64 { + basePerIncrement := a.beaconChainCfg.EffectiveBalanceIncrement * a.beaconChainCfg.BaseRewardFactor / activeBalanceRoot + if version != clparams.Phase0Version { + return (effectiveBalance / a.beaconChainCfg.EffectiveBalanceIncrement) * basePerIncrement + } + return effectiveBalance * a.beaconChainCfg.BaseRewardFactor / activeBalanceRoot / a.beaconChainCfg.BaseRewardsPerEpoch +} + +func (a *ApiHandler) computeAttestationsRewardsForAltair(validatorSet *solid.ValidatorSet, inactivityScores solid.Uint64ListSSZ, previousParticipation *solid.BitList, inactivityLeak bool, filterIndicies []uint64, epoch uint64) (*beaconResponse, error) { + totalActiveBalance := uint64(0) + flagsUnslashedIndiciesSet := statechange.GetUnslashedIndiciesSet(a.beaconChainCfg, epoch, validatorSet, previousParticipation) + weights := a.beaconChainCfg.ParticipationWeights() + flagsTotalBalances := make([]uint64, len(weights)) + + prevEpoch := uint64(0) + if epoch > 0 { + prevEpoch = epoch - 1 + } + + validatorSet.Range(func(validatorIndex int, v solid.Validator, l int) bool { + if v.Active(epoch) { + totalActiveBalance += v.EffectiveBalance() + } + + for i := range weights { + if flagsUnslashedIndiciesSet[i][validatorIndex] { + flagsTotalBalances[i] += v.EffectiveBalance() + } + } + return true + }) + version := a.beaconChainCfg.GetCurrentStateVersion(epoch) + inactivityPenaltyDenominator := a.beaconChainCfg.InactivityScoreBias * a.beaconChainCfg.GetPenaltyQuotient(version) + rewardMultipliers := make([]uint64, len(weights)) + for i := range weights { + rewardMultipliers[i] = weights[i] * (flagsTotalBalances[i] / a.beaconChainCfg.EffectiveBalanceIncrement) + } + + rewardDenominator := (totalActiveBalance / a.beaconChainCfg.EffectiveBalanceIncrement) * a.beaconChainCfg.WeightDenominator + var response *attestationsRewardsResponse + if len(filterIndicies) > 0 { + response = &attestationsRewardsResponse{ + IdealRewards: make([]IdealReward, 0, len(filterIndicies)), + TotalRewards: make([]TotalReward, 0, len(filterIndicies)), + } + } else { + response = &attestationsRewardsResponse{ + IdealRewards: make([]IdealReward, 0, validatorSet.Length()), + TotalRewards: make([]TotalReward, 0, validatorSet.Length()), + } + } + // make a map with the filter indicies + totalActiveBalanceSqrt := utils.IntegerSquareRoot(totalActiveBalance) + + fn := func(index uint64, v solid.Validator) error { + effectiveBalance := v.EffectiveBalance() + baseReward := a.baseReward(version, effectiveBalance, totalActiveBalanceSqrt) + // not eligible for rewards? then all empty + if !(v.Active(prevEpoch) || (v.Slashed() && prevEpoch+1 < v.WithdrawableEpoch())) { + response.IdealRewards = append(response.IdealRewards, IdealReward{EffectiveBalance: int64(effectiveBalance)}) + response.TotalRewards = append(response.TotalRewards, TotalReward{ValidatorIndex: int64(index)}) + return nil + } + idealReward := IdealReward{EffectiveBalance: int64(effectiveBalance)} + totalReward := TotalReward{ValidatorIndex: int64(index)} + if !inactivityLeak { + idealReward.Head = int64(baseReward * rewardMultipliers[a.beaconChainCfg.TimelyHeadFlagIndex] / rewardDenominator) + idealReward.Target = int64(baseReward * rewardMultipliers[a.beaconChainCfg.TimelyTargetFlagIndex] / rewardDenominator) + idealReward.Source = int64(baseReward * rewardMultipliers[a.beaconChainCfg.TimelySourceFlagIndex] / rewardDenominator) + } + // Note: for altair, we dont have the inclusion delay, always 0. + for flagIdx := range weights { + if flagsUnslashedIndiciesSet[flagIdx][index] { + if flagIdx == int(a.beaconChainCfg.TimelyHeadFlagIndex) { + totalReward.Head = idealReward.Head + } else if flagIdx == int(a.beaconChainCfg.TimelyTargetFlagIndex) { + totalReward.Target = idealReward.Target + } else if flagIdx == int(a.beaconChainCfg.TimelySourceFlagIndex) { + totalReward.Source = idealReward.Source + } + } else if flagIdx != int(a.beaconChainCfg.TimelyHeadFlagIndex) { + down := -int64(baseReward * weights[flagIdx] / a.beaconChainCfg.WeightDenominator) + if flagIdx == int(a.beaconChainCfg.TimelyHeadFlagIndex) { + totalReward.Head = down + } else if flagIdx == int(a.beaconChainCfg.TimelyTargetFlagIndex) { + totalReward.Target = down + } else if flagIdx == int(a.beaconChainCfg.TimelySourceFlagIndex) { + totalReward.Source = down + } + } + } + if !flagsUnslashedIndiciesSet[a.beaconChainCfg.TimelyTargetFlagIndex][index] { + inactivityScore := inactivityScores.Get(int(index)) + totalReward.Inactivity = -int64((effectiveBalance * inactivityScore) / inactivityPenaltyDenominator) + } + response.IdealRewards = append(response.IdealRewards, idealReward) + response.TotalRewards = append(response.TotalRewards, totalReward) + return nil + } + + if len(filterIndicies) > 0 { + for _, index := range filterIndicies { + if err := fn(index, validatorSet.Get(int(index))); err != nil { + return nil, err + } + } + } else { + for index := uint64(0); index < uint64(validatorSet.Length()); index++ { + if err := fn(index, validatorSet.Get(int(index))); err != nil { + return nil, err + } + } + } + return newBeaconResponse(response), nil +} + +// processRewardsAndPenaltiesPhase0 process rewards and penalties for phase0 state. +func (a *ApiHandler) computeAttestationsRewardsForPhase0(s *state.CachingBeaconState, filterIndicies []uint64, epoch uint64) (*beaconResponse, error) { + response := &attestationsRewardsResponse{} + beaconConfig := s.BeaconConfig() + if epoch == beaconConfig.GenesisEpoch { + return newBeaconResponse(response), nil + } + prevEpoch := uint64(0) + if epoch > 0 { + prevEpoch = epoch - 1 + } + if len(filterIndicies) > 0 { + response = &attestationsRewardsResponse{ + IdealRewards: make([]IdealReward, 0, len(filterIndicies)), + TotalRewards: make([]TotalReward, 0, len(filterIndicies)), + } + } else { + response = &attestationsRewardsResponse{ + IdealRewards: make([]IdealReward, 0, s.ValidatorLength()), + TotalRewards: make([]TotalReward, 0, s.ValidatorLength()), + } + } + + inactivityLeak := state.InactivityLeaking(s) + rewardDenominator := s.GetTotalActiveBalance() / beaconConfig.EffectiveBalanceIncrement + var unslashedMatchingSourceBalanceIncrements, unslashedMatchingTargetBalanceIncrements, unslashedMatchingHeadBalanceIncrements uint64 + var err error + s.ForEachValidator(func(validator solid.Validator, idx, total int) bool { + if validator.Slashed() { + return true + } + var previousMatchingSourceAttester, previousMatchingTargetAttester, previousMatchingHeadAttester bool + + if previousMatchingSourceAttester, err = s.ValidatorIsPreviousMatchingSourceAttester(idx); err != nil { + return false + } + if previousMatchingTargetAttester, err = s.ValidatorIsPreviousMatchingTargetAttester(idx); err != nil { + return false + } + if previousMatchingHeadAttester, err = s.ValidatorIsPreviousMatchingHeadAttester(idx); err != nil { + return false + } + if previousMatchingSourceAttester { + unslashedMatchingSourceBalanceIncrements += validator.EffectiveBalance() + } + if previousMatchingTargetAttester { + unslashedMatchingTargetBalanceIncrements += validator.EffectiveBalance() + } + if previousMatchingHeadAttester { + unslashedMatchingHeadBalanceIncrements += validator.EffectiveBalance() + } + return true + }) + if err != nil { + return nil, err + } + // Then compute their total increment. + unslashedMatchingSourceBalanceIncrements /= beaconConfig.EffectiveBalanceIncrement + unslashedMatchingTargetBalanceIncrements /= beaconConfig.EffectiveBalanceIncrement + unslashedMatchingHeadBalanceIncrements /= beaconConfig.EffectiveBalanceIncrement + fn := func(index uint64, currentValidator solid.Validator) error { + baseReward, err := s.BaseReward(index) + if err != nil { + return err + } + var previousMatchingSourceAttester, previousMatchingTargetAttester, previousMatchingHeadAttester bool + + if previousMatchingSourceAttester, err = s.ValidatorIsPreviousMatchingSourceAttester(int(index)); err != nil { + return err + } + if previousMatchingTargetAttester, err = s.ValidatorIsPreviousMatchingTargetAttester(int(index)); err != nil { + return err + } + if previousMatchingHeadAttester, err = s.ValidatorIsPreviousMatchingHeadAttester(int(index)); err != nil { + return err + } + totalReward := TotalReward{ValidatorIndex: int64(index)} + idealReward := IdealReward{EffectiveBalance: int64(currentValidator.EffectiveBalance())} + + // check inclusion delay + if !currentValidator.Slashed() && previousMatchingSourceAttester { + var attestation *solid.PendingAttestation + if attestation, err = s.ValidatorMinPreviousInclusionDelayAttestation(int(index)); err != nil { + return err + } + proposerReward := (baseReward / beaconConfig.ProposerRewardQuotient) + maxAttesterReward := baseReward - proposerReward + idealReward.InclusionDelay = int64(maxAttesterReward / attestation.InclusionDelay()) + totalReward.InclusionDelay = idealReward.InclusionDelay + } + // if it is not eligible for rewards, then do not continue further + if !(currentValidator.Active(prevEpoch) || (currentValidator.Slashed() && prevEpoch+1 < currentValidator.WithdrawableEpoch())) { + response.IdealRewards = append(response.IdealRewards, idealReward) + response.TotalRewards = append(response.TotalRewards, totalReward) + return nil + } + if inactivityLeak { + idealReward.Source = int64(baseReward) + idealReward.Target = int64(baseReward) + idealReward.Head = int64(baseReward) + } else { + idealReward.Source = int64(baseReward * unslashedMatchingSourceBalanceIncrements / rewardDenominator) + idealReward.Target = int64(baseReward * unslashedMatchingTargetBalanceIncrements / rewardDenominator) + idealReward.Head = int64(baseReward * unslashedMatchingHeadBalanceIncrements / rewardDenominator) + } + // we can use a multiplier to account for all attesting + var attested, missed uint64 + if currentValidator.Slashed() { + missed = 3 + } else { + if previousMatchingSourceAttester { + attested++ + totalReward.Source = idealReward.Source + } + if previousMatchingTargetAttester { + attested++ + totalReward.Target = idealReward.Target + } + if previousMatchingHeadAttester { + attested++ + totalReward.Head = idealReward.Head + } + missed = 3 - attested + } + // process inactivities + if inactivityLeak { + proposerReward := baseReward / beaconConfig.ProposerRewardQuotient + totalReward.Inactivity = -int64(beaconConfig.BaseRewardsPerEpoch*baseReward - proposerReward) + if currentValidator.Slashed() || !previousMatchingTargetAttester { + totalReward.Inactivity -= int64(currentValidator.EffectiveBalance() * state.FinalityDelay(s) / beaconConfig.InactivityPenaltyQuotient) + } + } + totalReward.Inactivity -= int64(baseReward * missed) + response.IdealRewards = append(response.IdealRewards, idealReward) + response.TotalRewards = append(response.TotalRewards, totalReward) + return nil + } + if len(filterIndicies) > 0 { + for _, index := range filterIndicies { + v, err := s.ValidatorForValidatorIndex(int(index)) + if err != nil { + return nil, err + } + if err := fn(index, v); err != nil { + return nil, err + } + } + } else { + for index := uint64(0); index < uint64(s.ValidatorLength()); index++ { + v, err := s.ValidatorForValidatorIndex(int(index)) + if err != nil { + return nil, err + } + if err := fn(index, v); err != nil { + return nil, err + } + } + } + return newBeaconResponse(response), nil +} diff --git a/cl/beacon/handler/attestation_rewards_test.go b/cl/beacon/handler/attestation_rewards_test.go new file mode 100644 index 00000000000..f5823765c14 --- /dev/null +++ b/cl/beacon/handler/attestation_rewards_test.go @@ -0,0 +1,150 @@ +package handler + +import ( + "fmt" + "io" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/ledgerwatch/erigon/cl/clparams" + "github.com/ledgerwatch/erigon/cl/cltypes/solid" + "github.com/stretchr/testify/require" +) + +func TestAttestationRewardsBellatrix(t *testing.T) { + _, blocks, _, _, _, handler, _, _, fcu := setupTestingHandler(t, clparams.BellatrixVersion) + var err error + fcu.HeadVal, err = blocks[len(blocks)-1].Block.HashSSZ() + require.NoError(t, err) + + fcu.HeadSlotVal = blocks[len(blocks)-1].Block.Slot + + fcu.JustifiedCheckpointVal = solid.NewCheckpointFromParameters(fcu.HeadVal, fcu.HeadSlotVal/32) + fcu.FinalizedCheckpointVal = solid.NewCheckpointFromParameters(fcu.HeadVal, 99999999) + + cases := []struct { + name string + epoch uint64 + code int + request string + expected string + }{ + { + name: "all validators", + epoch: (fcu.HeadSlotVal / 32) - 1, + code: http.StatusOK, + expected: `{"data":{"ideal_rewards":[{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"}],"total_rewards":[{"validator_index":"0","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"1","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"2","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"3","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"4","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"5","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"6","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"7","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"8","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"9","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"10","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"11","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"12","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"13","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"14","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"15","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"16","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"17","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"18","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"19","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"20","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"21","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"22","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"23","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"24","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"25","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"26","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"27","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"28","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"29","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"30","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"31","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"32","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"33","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"34","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"35","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"36","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"37","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"38","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"39","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"40","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"41","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"42","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"43","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"44","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"45","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"46","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"47","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"48","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"49","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"50","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"51","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"52","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"53","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"54","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"55","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"56","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"57","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"58","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"59","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"60","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"61","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"62","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"63","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"64","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"65","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"66","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"67","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"68","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"69","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"70","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"71","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"72","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"73","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"74","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"75","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"76","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"77","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"78","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"79","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"80","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"81","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"82","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"83","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"84","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"85","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"86","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"87","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"88","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"89","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"90","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"91","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"92","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"93","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"94","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"95","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"96","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"97","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"98","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"99","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"100","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"101","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"102","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"103","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"104","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"105","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"106","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"107","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"108","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"109","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"110","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"111","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"112","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"113","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"114","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"115","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"116","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"117","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"118","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"119","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"120","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"121","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"122","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"123","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"124","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"125","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"126","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"127","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"128","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"129","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"130","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"131","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"132","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"133","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"134","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"135","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"136","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"137","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"138","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"139","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"140","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"141","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"142","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"143","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"144","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"145","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"146","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"147","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"148","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"149","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"150","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"151","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"152","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"153","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"154","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"155","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"156","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"157","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"158","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"159","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"160","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"161","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"162","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"163","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"164","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"165","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"166","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"167","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"168","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"169","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"170","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"171","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"172","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"173","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"174","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"175","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"176","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"177","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"178","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"179","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"180","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"181","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"182","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"183","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"184","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"185","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"186","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"187","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"188","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"189","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"190","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"191","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"192","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"193","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"194","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"195","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"196","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"197","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"198","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"199","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"200","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"201","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"202","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"203","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"204","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"205","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"206","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"207","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"208","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"209","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"210","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"211","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"212","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"213","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"214","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"215","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"216","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"217","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"218","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"219","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"220","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"221","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"222","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"223","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"224","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"225","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"226","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"227","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"228","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"229","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"230","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"231","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"232","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"233","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"234","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"235","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"236","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"237","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"238","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"239","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"240","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"241","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"242","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"243","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"244","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"245","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"246","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"247","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"248","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"249","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"250","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"251","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"252","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"253","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"254","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"255","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"}]}}` + "\n", // Add your expected response + }, + { + epoch: 99999999, + code: http.StatusNotFound, + }, + { + name: "2 validators", + epoch: (fcu.HeadSlotVal / 32) - 1, + request: `["1","4"]`, + code: http.StatusOK, + expected: `{"data":{"ideal_rewards":[{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"290680","source":"0","inclusion_delay":"0","inactivity":"0"}],"total_rewards":[{"validator_index":"1","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"},{"validator_index":"4","head":"0","target":"290680","source":"-156520","inclusion_delay":"0","inactivity":"0"}]}}` + "\n", // Add your expected response + }, + } + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + server := httptest.NewServer(handler.mux) + defer server.Close() + url := fmt.Sprintf("%s/eth/v1/beacon/rewards/attestations/%d", server.URL, c.epoch) + + // Create a request + req, err := http.NewRequest("POST", url, strings.NewReader(c.request)) + require.NoError(t, err) + req.Header.Set("Content-Type", "application/json") + + // Perform the request + resp, err := http.DefaultClient.Do(req) + require.NoError(t, err) + defer resp.Body.Close() + + // Check status code + require.Equal(t, c.code, resp.StatusCode) + + if resp.StatusCode != http.StatusOK { + return + } + + // Read the response body + out, err := io.ReadAll(resp.Body) + require.NoError(t, err) + // Compare the response with the expected result + require.Equal(t, c.expected, string(out)) + }) + } +} + +func TestAttestationRewardsPhase0(t *testing.T) { + _, blocks, _, _, _, handler, _, _, fcu := setupTestingHandler(t, clparams.Phase0Version) + var err error + fcu.HeadVal, err = blocks[len(blocks)-1].Block.HashSSZ() + require.NoError(t, err) + + fcu.HeadSlotVal = blocks[len(blocks)-1].Block.Slot + + fcu.JustifiedCheckpointVal = solid.NewCheckpointFromParameters(fcu.HeadVal, fcu.HeadSlotVal/32) + fcu.FinalizedCheckpointVal = solid.NewCheckpointFromParameters(fcu.HeadVal, 99999999) + + cases := []struct { + name string + epoch uint64 + code int + request string + expected string + }{ + { + name: "all validators", + epoch: (fcu.HeadSlotVal / 32) - 1, + code: http.StatusOK, + expected: `{"data":{"ideal_rewards":[{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"20000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"25000000000","head":"84353","target":"84353","source":"84353","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"14217","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4316","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"22000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"11151","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4460","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"22302","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"7871","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"66906","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"7434","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"26000000000","head":"87727","target":"87727","source":"87727","inclusion_delay":"4348","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"6462","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"10155","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"26762","inactivity":"0"},{"effective_balance":"20000000000","head":"67482","target":"67482","source":"67482","inclusion_delay":"4646","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"26000000000","head":"87727","target":"87727","source":"87727","inclusion_delay":"4941","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"24000000000","head":"80979","target":"80979","source":"80979","inclusion_delay":"9123","inactivity":"0"},{"effective_balance":"21000000000","head":"70856","target":"70856","source":"70856","inclusion_delay":"17562","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4181","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"25000000000","head":"84353","target":"84353","source":"84353","inclusion_delay":"17423","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"4181","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"4442","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"33453","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"25000000000","head":"84353","target":"84353","source":"84353","inclusion_delay":"4355","inactivity":"0"},{"effective_balance":"22000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5352","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"10155","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"3231","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4614","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4614","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"21000000000","head":"70856","target":"70856","source":"70856","inclusion_delay":"5854","inactivity":"0"},{"effective_balance":"18000000000","head":"60734","target":"60734","source":"60734","inclusion_delay":"8363","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4614","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6372","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"4442","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"10155","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"11151","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"18000000000","head":"60734","target":"60734","source":"60734","inclusion_delay":"10752","inactivity":"0"},{"effective_balance":"30000000000","head":"101224","target":"101224","source":"101224","inclusion_delay":"3920","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"8363","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"8363","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"35543","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"9558","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6082","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5575","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"26000000000","head":"87727","target":"87727","source":"87727","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"10293","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2221","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"14217","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6690","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"28000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"12164","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"22302","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"14868","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4181","inactivity":"0"},{"effective_balance":"19000000000","head":"64108","target":"64108","source":"64108","inclusion_delay":"5675","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4316","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4956","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2632","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"33453","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6372","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"3231","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"23000000000","head":"77605","target":"77605","source":"77605","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"7871","inactivity":"0"},{"effective_balance":"27000000000","head":"91101","target":"91101","source":"91101","inclusion_delay":"3763","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"8363","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4460","inactivity":"0"},{"effective_balance":"23000000000","head":"77605","target":"77605","source":"77605","inclusion_delay":"10686","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"10293","inactivity":"0"},{"effective_balance":"24000000000","head":"80979","target":"80979","source":"80979","inclusion_delay":"4561","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"11151","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5575","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"5923","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4460","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"22302","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"33453","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2538","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"4442","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"19116","inactivity":"0"},{"effective_balance":"20000000000","head":"67482","target":"67482","source":"67482","inclusion_delay":"2697","inactivity":"0"},{"effective_balance":"22000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"7871","inactivity":"0"},{"effective_balance":"23000000000","head":"77605","target":"77605","source":"77605","inclusion_delay":"8743","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"66906","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4460","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"7898","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"17771","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"26762","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"14217","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4316","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5352","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"14868","inactivity":"0"},{"effective_balance":"19000000000","head":"64108","target":"64108","source":"64108","inclusion_delay":"5675","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"19000000000","head":"64108","target":"64108","source":"64108","inclusion_delay":"4673","inactivity":"0"},{"effective_balance":"26000000000","head":"87727","target":"87727","source":"87727","inclusion_delay":"4348","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6690","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"4181","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"7434","inactivity":"0"},{"effective_balance":"27000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"24000000000","head":"80979","target":"80979","source":"80979","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"4442","inactivity":"0"},{"effective_balance":"20000000000","head":"67482","target":"67482","source":"67482","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6690","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"3949","inactivity":"0"},{"effective_balance":"28000000000","head":"94475","target":"94475","source":"94475","inclusion_delay":"7805","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"18000000000","head":"60734","target":"60734","source":"60734","inclusion_delay":"8363","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"6462","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2843","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"26762","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"12164","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"22302","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"5468","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"23000000000","head":"77605","target":"77605","source":"77605","inclusion_delay":"3434","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2369","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"17771","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"31000000000","head":"104598","target":"104598","source":"104598","inclusion_delay":"5401","inactivity":"0"},{"effective_balance":"29000000000","head":"97850","target":"97850","source":"97850","inclusion_delay":"20211","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6082","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"11847","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2538","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"19116","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"22302","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"7434","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"14217","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"19116","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2843","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"4181","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4316","inactivity":"0"},{"effective_balance":"27000000000","head":"91101","target":"91101","source":"91101","inclusion_delay":"5131","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"9558","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2221","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"effective_balance":"23000000000","head":"77605","target":"77605","source":"77605","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"26000000000","head":"87727","target":"87727","source":"87727","inclusion_delay":"3507","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"5077","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4316","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4614","inactivity":"0"},{"effective_balance":"18000000000","head":"60734","target":"60734","source":"60734","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"21000000000","head":"70856","target":"70856","source":"70856","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4316","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6372","inactivity":"0"},{"effective_balance":"29000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"effective_balance":"18000000000","head":"60734","target":"60734","source":"60734","inclusion_delay":"2508","inactivity":"0"},{"effective_balance":"28000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"28000000000","head":"94475","target":"94475","source":"94475","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"28000000000","head":"94475","target":"94475","source":"94475","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"31000000000","head":"104598","target":"104598","source":"104598","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2632","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4614","inactivity":"0"},{"effective_balance":"21000000000","head":"70856","target":"70856","source":"70856","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"7871","inactivity":"0"},{"effective_balance":"23000000000","head":"77605","target":"77605","source":"77605","inclusion_delay":"13739","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"19116","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"66906","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"effective_balance":"21000000000","head":"70856","target":"70856","source":"70856","inclusion_delay":"14635","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"7434","inactivity":"0"},{"effective_balance":"21000000000","head":"70856","target":"70856","source":"70856","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4614","inactivity":"0"},{"effective_balance":"29000000000","head":"97850","target":"97850","source":"97850","inclusion_delay":"20211","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"7434","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"effective_balance":"23000000000","head":"77605","target":"77605","source":"77605","inclusion_delay":"19235","inactivity":"0"},{"effective_balance":"18000000000","head":"60734","target":"60734","source":"60734","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"66906","inactivity":"0"},{"effective_balance":"30000000000","head":"101224","target":"101224","source":"101224","inclusion_delay":"5227","inactivity":"0"},{"effective_balance":"25000000000","head":"84353","target":"84353","source":"84353","inclusion_delay":"3604","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4460","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"27000000000","head":"91101","target":"91101","source":"91101","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"30000000000","head":"101224","target":"101224","source":"101224","inclusion_delay":"6272","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"17771","inactivity":"0"},{"effective_balance":"19000000000","head":"64108","target":"64108","source":"64108","inclusion_delay":"8827","inactivity":"0"},{"effective_balance":"24000000000","head":"80979","target":"80979","source":"80979","inclusion_delay":"20071","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"31000000000","head":"104598","target":"104598","source":"104598","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6690","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6082","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"5923","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5352","inactivity":"0"},{"effective_balance":"19000000000","head":"64108","target":"64108","source":"64108","inclusion_delay":"3310","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"7434","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"8363","inactivity":"0"},{"effective_balance":"25000000000","head":"84353","target":"84353","source":"84353","inclusion_delay":"14934","inactivity":"0"},{"effective_balance":"26000000000","head":"87727","target":"87727","source":"87727","inclusion_delay":"54361","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"26762","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"20000000000","head":"67482","target":"67482","source":"67482","inclusion_delay":"3636","inactivity":"0"},{"effective_balance":"27000000000","head":"91101","target":"91101","source":"91101","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"19000000000","head":"64108","target":"64108","source":"64108","inclusion_delay":"6111","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"14868","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"3554","inactivity":"0"},{"effective_balance":"24000000000","head":"80979","target":"80979","source":"80979","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"8363","inactivity":"0"},{"effective_balance":"25000000000","head":"84353","target":"84353","source":"84353","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"27000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"14868","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"3385","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"5468","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"12164","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"3554","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"9558","inactivity":"0"},{"effective_balance":"20000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6372","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"3385","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2843","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"9558","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"31000000000","head":"104598","target":"104598","source":"104598","inclusion_delay":"4470","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2369","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"effective_balance":"22000000000","head":"74230","target":"74230","source":"74230","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"26762","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"26000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5352","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"3554","inactivity":"0"},{"effective_balance":"23000000000","head":"77605","target":"77605","source":"77605","inclusion_delay":"3316","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"4181","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4181","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2538","inactivity":"0"},{"effective_balance":"25000000000","head":"84353","target":"84353","source":"84353","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"5468","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2221","inactivity":"0"},{"effective_balance":"27000000000","head":"91101","target":"91101","source":"91101","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"66906","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"29000000000","head":"97850","target":"97850","source":"97850","inclusion_delay":"60633","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"effective_balance":"20000000000","head":"67482","target":"67482","source":"67482","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"7898","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"14217","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"18000000000","head":"60734","target":"60734","source":"60734","inclusion_delay":"4704","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2843","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"25000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"3554","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"10293","inactivity":"0"},{"effective_balance":"28000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"20000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"8363","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"35543","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5575","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2293","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6690","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"4442","inactivity":"0"},{"effective_balance":"22000000000","head":"74230","target":"74230","source":"74230","inclusion_delay":"5110","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"5923","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2632","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6372","inactivity":"0"},{"effective_balance":"24000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"31000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2369","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"11847","inactivity":"0"},{"effective_balance":"27000000000","head":"91101","target":"91101","source":"91101","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6372","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2369","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"4739","inactivity":"0"},{"effective_balance":"18000000000","head":"60734","target":"60734","source":"60734","inclusion_delay":"4427","inactivity":"0"},{"effective_balance":"28000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5575","inactivity":"0"},{"effective_balance":"28000000000","head":"94475","target":"94475","source":"94475","inclusion_delay":"29271","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5575","inactivity":"0"},{"effective_balance":"30000000000","head":"101224","target":"101224","source":"101224","inclusion_delay":"25089","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"30000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"29000000000","head":"97850","target":"97850","source":"97850","inclusion_delay":"3789","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"21000000000","head":"70856","target":"70856","source":"70856","inclusion_delay":"7317","inactivity":"0"},{"effective_balance":"31000000000","head":"104598","target":"104598","source":"104598","inclusion_delay":"7201","inactivity":"0"},{"effective_balance":"22000000000","head":"74230","target":"74230","source":"74230","inclusion_delay":"5411","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"24000000000","head":"80979","target":"80979","source":"80979","inclusion_delay":"7168","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4460","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4316","inactivity":"0"},{"effective_balance":"19000000000","head":"64108","target":"64108","source":"64108","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"5468","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2843","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"7434","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"10293","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5352","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"3385","inactivity":"0"},{"effective_balance":"26000000000","head":"87727","target":"87727","source":"87727","inclusion_delay":"4530","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"5077","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6082","inactivity":"0"},{"effective_balance":"19000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"3554","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"14868","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"22302","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"10155","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"10155","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"12164","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2632","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"5468","inactivity":"0"},{"effective_balance":"31000000000","head":"104598","target":"104598","source":"104598","inclusion_delay":"4050","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"17771","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2961","inactivity":"0"},{"effective_balance":"24000000000","head":"80979","target":"80979","source":"80979","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"30000000000","head":"101224","target":"101224","source":"101224","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"5077","inactivity":"0"},{"effective_balance":"21000000000","head":"70856","target":"70856","source":"70856","inclusion_delay":"7983","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"5923","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2538","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"14868","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"29000000000","head":"97850","target":"97850","source":"97850","inclusion_delay":"5272","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6082","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"30000000000","head":"101224","target":"101224","source":"101224","inclusion_delay":"4646","inactivity":"0"},{"effective_balance":"19000000000","head":"64108","target":"64108","source":"64108","inclusion_delay":"39725","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"7434","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"12164","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"3554","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"10155","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2369","inactivity":"0"},{"effective_balance":"29000000000","head":"97850","target":"97850","source":"97850","inclusion_delay":"4181","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6082","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"10155","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"11847","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"effective_balance":"31000000000","head":"104598","target":"104598","source":"104598","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6082","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2632","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2632","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"12164","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"29000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"30000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4956","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4614","inactivity":"0"},{"effective_balance":"22000000000","head":"74230","target":"74230","source":"74230","inclusion_delay":"22998","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"11151","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4614","inactivity":"0"},{"effective_balance":"17000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2293","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"3385","inactivity":"0"},{"effective_balance":"22000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"2221","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"6690","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"11151","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"8363","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"4956","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"35543","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"5077","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"6462","inactivity":"0"},{"effective_balance":"32000000000","head":"107972","target":"107972","source":"107972","inclusion_delay":"5352","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"32000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"}],"total_rewards":[{"validator_index":"0","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"1","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"2","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-358422"},{"validator_index":"3","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"4","head":"57360","target":"57360","source":"57360","inclusion_delay":"14217","inactivity":"0"},{"validator_index":"5","head":"107972","target":"107972","source":"107972","inclusion_delay":"4316","inactivity":"0"},{"validator_index":"6","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"7","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"8","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"9","head":"107972","target":"107972","source":"107972","inclusion_delay":"11151","inactivity":"0"},{"validator_index":"10","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"validator_index":"11","head":"107972","target":"107972","source":"107972","inclusion_delay":"4460","inactivity":"0"},{"validator_index":"12","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"13","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"14","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"validator_index":"15","head":"107972","target":"107972","source":"107972","inclusion_delay":"22302","inactivity":"0"},{"validator_index":"16","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"17","head":"107972","target":"107972","source":"107972","inclusion_delay":"7871","inactivity":"0"},{"validator_index":"18","head":"107972","target":"107972","source":"107972","inclusion_delay":"66906","inactivity":"0"},{"validator_index":"19","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"20","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"validator_index":"21","head":"107972","target":"107972","source":"107972","inclusion_delay":"7434","inactivity":"0"},{"validator_index":"22","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"23","head":"87727","target":"87727","source":"87727","inclusion_delay":"4348","inactivity":"0"},{"validator_index":"24","head":"57360","target":"57360","source":"57360","inclusion_delay":"6462","inactivity":"0"},{"validator_index":"25","head":"57360","target":"57360","source":"57360","inclusion_delay":"10155","inactivity":"0"},{"validator_index":"26","head":"107972","target":"107972","source":"107972","inclusion_delay":"26762","inactivity":"0"},{"validator_index":"27","head":"67482","target":"67482","source":"67482","inclusion_delay":"4646","inactivity":"0"},{"validator_index":"28","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"29","head":"87727","target":"87727","source":"87727","inclusion_delay":"4941","inactivity":"0"},{"validator_index":"30","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"31","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"32","head":"80979","target":"80979","source":"80979","inclusion_delay":"9123","inactivity":"0"},{"validator_index":"33","head":"70856","target":"70856","source":"70856","inclusion_delay":"17562","inactivity":"0"},{"validator_index":"34","head":"107972","target":"107972","source":"107972","inclusion_delay":"4181","inactivity":"0"},{"validator_index":"35","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"validator_index":"36","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"37","head":"84353","target":"84353","source":"84353","inclusion_delay":"17423","inactivity":"0"},{"validator_index":"38","head":"57360","target":"57360","source":"57360","inclusion_delay":"4181","inactivity":"0"},{"validator_index":"39","head":"57360","target":"57360","source":"57360","inclusion_delay":"4442","inactivity":"0"},{"validator_index":"40","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"41","head":"107972","target":"107972","source":"107972","inclusion_delay":"33453","inactivity":"0"},{"validator_index":"42","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"43","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"44","head":"84353","target":"84353","source":"84353","inclusion_delay":"4355","inactivity":"0"},{"validator_index":"45","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"46","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"47","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"48","head":"107972","target":"107972","source":"107972","inclusion_delay":"5352","inactivity":"0"},{"validator_index":"49","head":"57360","target":"57360","source":"57360","inclusion_delay":"10155","inactivity":"0"},{"validator_index":"50","head":"57360","target":"57360","source":"57360","inclusion_delay":"3231","inactivity":"0"},{"validator_index":"51","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"52","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"53","head":"107972","target":"107972","source":"107972","inclusion_delay":"4614","inactivity":"0"},{"validator_index":"54","head":"107972","target":"107972","source":"107972","inclusion_delay":"4614","inactivity":"0"},{"validator_index":"55","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"56","head":"70856","target":"70856","source":"70856","inclusion_delay":"5854","inactivity":"0"},{"validator_index":"57","head":"60734","target":"60734","source":"60734","inclusion_delay":"8363","inactivity":"0"},{"validator_index":"58","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"validator_index":"59","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"validator_index":"60","head":"107972","target":"107972","source":"107972","inclusion_delay":"4614","inactivity":"0"},{"validator_index":"61","head":"107972","target":"107972","source":"107972","inclusion_delay":"6372","inactivity":"0"},{"validator_index":"62","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"63","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"64","head":"57360","target":"57360","source":"57360","inclusion_delay":"4442","inactivity":"0"},{"validator_index":"65","head":"57360","target":"57360","source":"57360","inclusion_delay":"10155","inactivity":"0"},{"validator_index":"66","head":"107972","target":"107972","source":"107972","inclusion_delay":"11151","inactivity":"0"},{"validator_index":"67","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"68","head":"60734","target":"60734","source":"60734","inclusion_delay":"10752","inactivity":"0"},{"validator_index":"69","head":"101224","target":"101224","source":"101224","inclusion_delay":"3920","inactivity":"0"},{"validator_index":"70","head":"107972","target":"107972","source":"107972","inclusion_delay":"8363","inactivity":"0"},{"validator_index":"71","head":"107972","target":"107972","source":"107972","inclusion_delay":"8363","inactivity":"0"},{"validator_index":"72","head":"57360","target":"57360","source":"57360","inclusion_delay":"35543","inactivity":"0"},{"validator_index":"73","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"74","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"75","head":"107972","target":"107972","source":"107972","inclusion_delay":"9558","inactivity":"0"},{"validator_index":"76","head":"107972","target":"107972","source":"107972","inclusion_delay":"6082","inactivity":"0"},{"validator_index":"77","head":"107972","target":"107972","source":"107972","inclusion_delay":"5575","inactivity":"0"},{"validator_index":"78","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"79","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"80","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"81","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-372759"},{"validator_index":"82","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"83","head":"107972","target":"107972","source":"107972","inclusion_delay":"10293","inactivity":"0"},{"validator_index":"84","head":"57360","target":"57360","source":"57360","inclusion_delay":"2221","inactivity":"0"},{"validator_index":"85","head":"57360","target":"57360","source":"57360","inclusion_delay":"14217","inactivity":"0"},{"validator_index":"86","head":"107972","target":"107972","source":"107972","inclusion_delay":"6690","inactivity":"0"},{"validator_index":"87","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"88","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"89","head":"107972","target":"107972","source":"107972","inclusion_delay":"12164","inactivity":"0"},{"validator_index":"90","head":"107972","target":"107972","source":"107972","inclusion_delay":"22302","inactivity":"0"},{"validator_index":"91","head":"107972","target":"107972","source":"107972","inclusion_delay":"14868","inactivity":"0"},{"validator_index":"92","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"93","head":"107972","target":"107972","source":"107972","inclusion_delay":"4181","inactivity":"0"},{"validator_index":"94","head":"64108","target":"64108","source":"64108","inclusion_delay":"5675","inactivity":"0"},{"validator_index":"95","head":"107972","target":"107972","source":"107972","inclusion_delay":"4316","inactivity":"0"},{"validator_index":"96","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"validator_index":"97","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"98","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"validator_index":"99","head":"107972","target":"107972","source":"107972","inclusion_delay":"4956","inactivity":"0"},{"validator_index":"100","head":"57360","target":"57360","source":"57360","inclusion_delay":"2632","inactivity":"0"},{"validator_index":"101","head":"107972","target":"107972","source":"107972","inclusion_delay":"33453","inactivity":"0"},{"validator_index":"102","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"103","head":"107972","target":"107972","source":"107972","inclusion_delay":"6372","inactivity":"0"},{"validator_index":"104","head":"57360","target":"57360","source":"57360","inclusion_delay":"3231","inactivity":"0"},{"validator_index":"105","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"106","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"107","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-329748"},{"validator_index":"108","head":"107972","target":"107972","source":"107972","inclusion_delay":"7871","inactivity":"0"},{"validator_index":"109","head":"91101","target":"91101","source":"91101","inclusion_delay":"3763","inactivity":"0"},{"validator_index":"110","head":"107972","target":"107972","source":"107972","inclusion_delay":"8363","inactivity":"0"},{"validator_index":"111","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"112","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"113","head":"107972","target":"107972","source":"107972","inclusion_delay":"4460","inactivity":"0"},{"validator_index":"114","head":"77605","target":"77605","source":"77605","inclusion_delay":"10686","inactivity":"0"},{"validator_index":"115","head":"107972","target":"107972","source":"107972","inclusion_delay":"10293","inactivity":"0"},{"validator_index":"116","head":"80979","target":"80979","source":"80979","inclusion_delay":"4561","inactivity":"0"},{"validator_index":"117","head":"107972","target":"107972","source":"107972","inclusion_delay":"11151","inactivity":"0"},{"validator_index":"118","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"119","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"120","head":"107972","target":"107972","source":"107972","inclusion_delay":"5575","inactivity":"0"},{"validator_index":"121","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"122","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"123","head":"57360","target":"57360","source":"57360","inclusion_delay":"5923","inactivity":"0"},{"validator_index":"124","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"125","head":"107972","target":"107972","source":"107972","inclusion_delay":"4460","inactivity":"0"},{"validator_index":"126","head":"107972","target":"107972","source":"107972","inclusion_delay":"22302","inactivity":"0"},{"validator_index":"127","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"128","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"129","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"130","head":"107972","target":"107972","source":"107972","inclusion_delay":"33453","inactivity":"0"},{"validator_index":"131","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"132","head":"57360","target":"57360","source":"57360","inclusion_delay":"2538","inactivity":"0"},{"validator_index":"133","head":"57360","target":"57360","source":"57360","inclusion_delay":"4442","inactivity":"0"},{"validator_index":"134","head":"107972","target":"107972","source":"107972","inclusion_delay":"19116","inactivity":"0"},{"validator_index":"135","head":"67482","target":"67482","source":"67482","inclusion_delay":"2697","inactivity":"0"},{"validator_index":"136","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"137","head":"107972","target":"107972","source":"107972","inclusion_delay":"7871","inactivity":"0"},{"validator_index":"138","head":"77605","target":"77605","source":"77605","inclusion_delay":"8743","inactivity":"0"},{"validator_index":"139","head":"107972","target":"107972","source":"107972","inclusion_delay":"66906","inactivity":"0"},{"validator_index":"140","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"141","head":"107972","target":"107972","source":"107972","inclusion_delay":"4460","inactivity":"0"},{"validator_index":"142","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"143","head":"57360","target":"57360","source":"57360","inclusion_delay":"7898","inactivity":"0"},{"validator_index":"144","head":"57360","target":"57360","source":"57360","inclusion_delay":"17771","inactivity":"0"},{"validator_index":"145","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"146","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"validator_index":"147","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"148","head":"107972","target":"107972","source":"107972","inclusion_delay":"26762","inactivity":"0"},{"validator_index":"149","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"150","head":"57360","target":"57360","source":"57360","inclusion_delay":"14217","inactivity":"0"},{"validator_index":"151","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"152","head":"107972","target":"107972","source":"107972","inclusion_delay":"4316","inactivity":"0"},{"validator_index":"153","head":"107972","target":"107972","source":"107972","inclusion_delay":"5352","inactivity":"0"},{"validator_index":"154","head":"107972","target":"107972","source":"107972","inclusion_delay":"14868","inactivity":"0"},{"validator_index":"155","head":"64108","target":"64108","source":"64108","inclusion_delay":"5675","inactivity":"0"},{"validator_index":"156","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"157","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"158","head":"64108","target":"64108","source":"64108","inclusion_delay":"4673","inactivity":"0"},{"validator_index":"159","head":"87727","target":"87727","source":"87727","inclusion_delay":"4348","inactivity":"0"},{"validator_index":"160","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"161","head":"107972","target":"107972","source":"107972","inclusion_delay":"6690","inactivity":"0"},{"validator_index":"162","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"163","head":"57360","target":"57360","source":"57360","inclusion_delay":"4181","inactivity":"0"},{"validator_index":"164","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"165","head":"107972","target":"107972","source":"107972","inclusion_delay":"7434","inactivity":"0"},{"validator_index":"166","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"167","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-344085"},{"validator_index":"168","head":"57360","target":"57360","source":"57360","inclusion_delay":"4442","inactivity":"0"},{"validator_index":"169","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-286737"},{"validator_index":"170","head":"107972","target":"107972","source":"107972","inclusion_delay":"6690","inactivity":"0"},{"validator_index":"171","head":"57360","target":"57360","source":"57360","inclusion_delay":"3949","inactivity":"0"},{"validator_index":"172","head":"94475","target":"94475","source":"94475","inclusion_delay":"7805","inactivity":"0"},{"validator_index":"173","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"174","head":"60734","target":"60734","source":"60734","inclusion_delay":"8363","inactivity":"0"},{"validator_index":"175","head":"57360","target":"57360","source":"57360","inclusion_delay":"6462","inactivity":"0"},{"validator_index":"176","head":"57360","target":"57360","source":"57360","inclusion_delay":"2843","inactivity":"0"},{"validator_index":"177","head":"107972","target":"107972","source":"107972","inclusion_delay":"26762","inactivity":"0"},{"validator_index":"178","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"179","head":"107972","target":"107972","source":"107972","inclusion_delay":"12164","inactivity":"0"},{"validator_index":"180","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"181","head":"107972","target":"107972","source":"107972","inclusion_delay":"22302","inactivity":"0"},{"validator_index":"182","head":"57360","target":"57360","source":"57360","inclusion_delay":"5468","inactivity":"0"},{"validator_index":"183","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"validator_index":"184","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"185","head":"77605","target":"77605","source":"77605","inclusion_delay":"3434","inactivity":"0"},{"validator_index":"186","head":"57360","target":"57360","source":"57360","inclusion_delay":"2369","inactivity":"0"},{"validator_index":"187","head":"57360","target":"57360","source":"57360","inclusion_delay":"17771","inactivity":"0"},{"validator_index":"188","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"validator_index":"189","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"190","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"191","head":"104598","target":"104598","source":"104598","inclusion_delay":"5401","inactivity":"0"},{"validator_index":"192","head":"97850","target":"97850","source":"97850","inclusion_delay":"20211","inactivity":"0"},{"validator_index":"193","head":"107972","target":"107972","source":"107972","inclusion_delay":"6082","inactivity":"0"},{"validator_index":"194","head":"57360","target":"57360","source":"57360","inclusion_delay":"11847","inactivity":"0"},{"validator_index":"195","head":"57360","target":"57360","source":"57360","inclusion_delay":"2538","inactivity":"0"},{"validator_index":"196","head":"107972","target":"107972","source":"107972","inclusion_delay":"19116","inactivity":"0"},{"validator_index":"197","head":"107972","target":"107972","source":"107972","inclusion_delay":"22302","inactivity":"0"},{"validator_index":"198","head":"107972","target":"107972","source":"107972","inclusion_delay":"7434","inactivity":"0"},{"validator_index":"199","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"200","head":"57360","target":"57360","source":"57360","inclusion_delay":"14217","inactivity":"0"},{"validator_index":"201","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"validator_index":"202","head":"107972","target":"107972","source":"107972","inclusion_delay":"19116","inactivity":"0"},{"validator_index":"203","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"204","head":"57360","target":"57360","source":"57360","inclusion_delay":"2843","inactivity":"0"},{"validator_index":"205","head":"57360","target":"57360","source":"57360","inclusion_delay":"4181","inactivity":"0"},{"validator_index":"206","head":"107972","target":"107972","source":"107972","inclusion_delay":"4316","inactivity":"0"},{"validator_index":"207","head":"91101","target":"91101","source":"91101","inclusion_delay":"5131","inactivity":"0"},{"validator_index":"208","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"209","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"210","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"211","head":"107972","target":"107972","source":"107972","inclusion_delay":"9558","inactivity":"0"},{"validator_index":"212","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"213","head":"57360","target":"57360","source":"57360","inclusion_delay":"2221","inactivity":"0"},{"validator_index":"214","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"validator_index":"215","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-329748"},{"validator_index":"216","head":"87727","target":"87727","source":"87727","inclusion_delay":"3507","inactivity":"0"},{"validator_index":"217","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"validator_index":"218","head":"57360","target":"57360","source":"57360","inclusion_delay":"5077","inactivity":"0"},{"validator_index":"219","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"validator_index":"220","head":"107972","target":"107972","source":"107972","inclusion_delay":"4316","inactivity":"0"},{"validator_index":"221","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"222","head":"107972","target":"107972","source":"107972","inclusion_delay":"4614","inactivity":"0"},{"validator_index":"223","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-258063"},{"validator_index":"224","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-301074"},{"validator_index":"225","head":"107972","target":"107972","source":"107972","inclusion_delay":"4316","inactivity":"0"},{"validator_index":"226","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"227","head":"107972","target":"107972","source":"107972","inclusion_delay":"6372","inactivity":"0"},{"validator_index":"228","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"229","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"validator_index":"230","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"231","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"validator_index":"232","head":"60734","target":"60734","source":"60734","inclusion_delay":"2508","inactivity":"0"},{"validator_index":"233","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"234","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-401433"},{"validator_index":"235","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-401433"},{"validator_index":"236","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"237","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"238","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"239","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-444444"},{"validator_index":"240","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"241","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"242","head":"57360","target":"57360","source":"57360","inclusion_delay":"2632","inactivity":"0"},{"validator_index":"243","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"244","head":"107972","target":"107972","source":"107972","inclusion_delay":"4614","inactivity":"0"},{"validator_index":"245","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-301074"},{"validator_index":"246","head":"107972","target":"107972","source":"107972","inclusion_delay":"7871","inactivity":"0"},{"validator_index":"247","head":"77605","target":"77605","source":"77605","inclusion_delay":"13739","inactivity":"0"},{"validator_index":"248","head":"107972","target":"107972","source":"107972","inclusion_delay":"19116","inactivity":"0"},{"validator_index":"249","head":"107972","target":"107972","source":"107972","inclusion_delay":"66906","inactivity":"0"},{"validator_index":"250","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"validator_index":"251","head":"70856","target":"70856","source":"70856","inclusion_delay":"14635","inactivity":"0"},{"validator_index":"252","head":"107972","target":"107972","source":"107972","inclusion_delay":"7434","inactivity":"0"},{"validator_index":"253","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-301074"},{"validator_index":"254","head":"107972","target":"107972","source":"107972","inclusion_delay":"4614","inactivity":"0"},{"validator_index":"255","head":"97850","target":"97850","source":"97850","inclusion_delay":"20211","inactivity":"0"},{"validator_index":"256","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"257","head":"107972","target":"107972","source":"107972","inclusion_delay":"7434","inactivity":"0"},{"validator_index":"258","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"validator_index":"259","head":"77605","target":"77605","source":"77605","inclusion_delay":"19235","inactivity":"0"},{"validator_index":"260","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-258063"},{"validator_index":"261","head":"107972","target":"107972","source":"107972","inclusion_delay":"66906","inactivity":"0"},{"validator_index":"262","head":"101224","target":"101224","source":"101224","inclusion_delay":"5227","inactivity":"0"},{"validator_index":"263","head":"84353","target":"84353","source":"84353","inclusion_delay":"3604","inactivity":"0"},{"validator_index":"264","head":"107972","target":"107972","source":"107972","inclusion_delay":"4460","inactivity":"0"},{"validator_index":"265","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"266","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-387096"},{"validator_index":"267","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"268","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"269","head":"101224","target":"101224","source":"101224","inclusion_delay":"6272","inactivity":"0"},{"validator_index":"270","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"validator_index":"271","head":"57360","target":"57360","source":"57360","inclusion_delay":"17771","inactivity":"0"},{"validator_index":"272","head":"64108","target":"64108","source":"64108","inclusion_delay":"8827","inactivity":"0"},{"validator_index":"273","head":"80979","target":"80979","source":"80979","inclusion_delay":"20071","inactivity":"0"},{"validator_index":"274","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"275","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-444444"},{"validator_index":"276","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"277","head":"107972","target":"107972","source":"107972","inclusion_delay":"6690","inactivity":"0"},{"validator_index":"278","head":"107972","target":"107972","source":"107972","inclusion_delay":"6082","inactivity":"0"},{"validator_index":"279","head":"57360","target":"57360","source":"57360","inclusion_delay":"5923","inactivity":"0"},{"validator_index":"280","head":"107972","target":"107972","source":"107972","inclusion_delay":"5352","inactivity":"0"},{"validator_index":"281","head":"64108","target":"64108","source":"64108","inclusion_delay":"3310","inactivity":"0"},{"validator_index":"282","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"283","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"284","head":"107972","target":"107972","source":"107972","inclusion_delay":"7434","inactivity":"0"},{"validator_index":"285","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"286","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"287","head":"107972","target":"107972","source":"107972","inclusion_delay":"8363","inactivity":"0"},{"validator_index":"288","head":"84353","target":"84353","source":"84353","inclusion_delay":"14934","inactivity":"0"},{"validator_index":"289","head":"87727","target":"87727","source":"87727","inclusion_delay":"54361","inactivity":"0"},{"validator_index":"290","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"291","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"292","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"293","head":"107972","target":"107972","source":"107972","inclusion_delay":"26762","inactivity":"0"},{"validator_index":"294","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"295","head":"67482","target":"67482","source":"67482","inclusion_delay":"3636","inactivity":"0"},{"validator_index":"296","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-387096"},{"validator_index":"297","head":"64108","target":"64108","source":"64108","inclusion_delay":"6111","inactivity":"0"},{"validator_index":"298","head":"107972","target":"107972","source":"107972","inclusion_delay":"14868","inactivity":"0"},{"validator_index":"299","head":"57360","target":"57360","source":"57360","inclusion_delay":"3554","inactivity":"0"},{"validator_index":"300","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-344085"},{"validator_index":"301","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"302","head":"107972","target":"107972","source":"107972","inclusion_delay":"8363","inactivity":"0"},{"validator_index":"303","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-358422"},{"validator_index":"304","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"305","head":"107972","target":"107972","source":"107972","inclusion_delay":"14868","inactivity":"0"},{"validator_index":"306","head":"57360","target":"57360","source":"57360","inclusion_delay":"3385","inactivity":"0"},{"validator_index":"307","head":"57360","target":"57360","source":"57360","inclusion_delay":"5468","inactivity":"0"},{"validator_index":"308","head":"107972","target":"107972","source":"107972","inclusion_delay":"12164","inactivity":"0"},{"validator_index":"309","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"310","head":"57360","target":"57360","source":"57360","inclusion_delay":"3554","inactivity":"0"},{"validator_index":"311","head":"107972","target":"107972","source":"107972","inclusion_delay":"9558","inactivity":"0"},{"validator_index":"312","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"313","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"314","head":"107972","target":"107972","source":"107972","inclusion_delay":"6372","inactivity":"0"},{"validator_index":"315","head":"57360","target":"57360","source":"57360","inclusion_delay":"3385","inactivity":"0"},{"validator_index":"316","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"317","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"318","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"319","head":"57360","target":"57360","source":"57360","inclusion_delay":"2843","inactivity":"0"},{"validator_index":"320","head":"107972","target":"107972","source":"107972","inclusion_delay":"9558","inactivity":"0"},{"validator_index":"321","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"322","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"323","head":"104598","target":"104598","source":"104598","inclusion_delay":"4470","inactivity":"0"},{"validator_index":"324","head":"57360","target":"57360","source":"57360","inclusion_delay":"2369","inactivity":"0"},{"validator_index":"325","head":"107972","target":"107972","source":"107972","inclusion_delay":"8920","inactivity":"0"},{"validator_index":"326","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-315411"},{"validator_index":"327","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"328","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"validator_index":"329","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"330","head":"107972","target":"107972","source":"107972","inclusion_delay":"26762","inactivity":"0"},{"validator_index":"331","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"332","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"333","head":"107972","target":"107972","source":"107972","inclusion_delay":"5352","inactivity":"0"},{"validator_index":"334","head":"57360","target":"57360","source":"57360","inclusion_delay":"3554","inactivity":"0"},{"validator_index":"335","head":"77605","target":"77605","source":"77605","inclusion_delay":"3316","inactivity":"0"},{"validator_index":"336","head":"57360","target":"57360","source":"57360","inclusion_delay":"4181","inactivity":"0"},{"validator_index":"337","head":"107972","target":"107972","source":"107972","inclusion_delay":"4181","inactivity":"0"},{"validator_index":"338","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"339","head":"57360","target":"57360","source":"57360","inclusion_delay":"2538","inactivity":"0"},{"validator_index":"340","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-358422"},{"validator_index":"341","head":"57360","target":"57360","source":"57360","inclusion_delay":"5468","inactivity":"0"},{"validator_index":"342","head":"57360","target":"57360","source":"57360","inclusion_delay":"2221","inactivity":"0"},{"validator_index":"343","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-387096"},{"validator_index":"344","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"345","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"346","head":"107972","target":"107972","source":"107972","inclusion_delay":"66906","inactivity":"0"},{"validator_index":"347","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"348","head":"97850","target":"97850","source":"97850","inclusion_delay":"60633","inactivity":"0"},{"validator_index":"349","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"validator_index":"350","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-286737"},{"validator_index":"351","head":"57360","target":"57360","source":"57360","inclusion_delay":"7898","inactivity":"0"},{"validator_index":"352","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"353","head":"57360","target":"57360","source":"57360","inclusion_delay":"14217","inactivity":"0"},{"validator_index":"354","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"355","head":"60734","target":"60734","source":"60734","inclusion_delay":"4704","inactivity":"0"},{"validator_index":"356","head":"57360","target":"57360","source":"57360","inclusion_delay":"2843","inactivity":"0"},{"validator_index":"357","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"358","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"359","head":"57360","target":"57360","source":"57360","inclusion_delay":"3554","inactivity":"0"},{"validator_index":"360","head":"107972","target":"107972","source":"107972","inclusion_delay":"10293","inactivity":"0"},{"validator_index":"361","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"362","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"363","head":"107972","target":"107972","source":"107972","inclusion_delay":"8363","inactivity":"0"},{"validator_index":"364","head":"57360","target":"57360","source":"57360","inclusion_delay":"35543","inactivity":"0"},{"validator_index":"365","head":"107972","target":"107972","source":"107972","inclusion_delay":"5575","inactivity":"0"},{"validator_index":"366","head":"57360","target":"57360","source":"57360","inclusion_delay":"2293","inactivity":"0"},{"validator_index":"367","head":"107972","target":"107972","source":"107972","inclusion_delay":"6690","inactivity":"0"},{"validator_index":"368","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"369","head":"57360","target":"57360","source":"57360","inclusion_delay":"4442","inactivity":"0"},{"validator_index":"370","head":"74230","target":"74230","source":"74230","inclusion_delay":"5110","inactivity":"0"},{"validator_index":"371","head":"57360","target":"57360","source":"57360","inclusion_delay":"5923","inactivity":"0"},{"validator_index":"372","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"373","head":"57360","target":"57360","source":"57360","inclusion_delay":"2632","inactivity":"0"},{"validator_index":"374","head":"107972","target":"107972","source":"107972","inclusion_delay":"6372","inactivity":"0"},{"validator_index":"375","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"376","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"377","head":"57360","target":"57360","source":"57360","inclusion_delay":"2369","inactivity":"0"},{"validator_index":"378","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"379","head":"57360","target":"57360","source":"57360","inclusion_delay":"11847","inactivity":"0"},{"validator_index":"380","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-387096"},{"validator_index":"381","head":"107972","target":"107972","source":"107972","inclusion_delay":"6372","inactivity":"0"},{"validator_index":"382","head":"57360","target":"57360","source":"57360","inclusion_delay":"2369","inactivity":"0"},{"validator_index":"383","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"384","head":"57360","target":"57360","source":"57360","inclusion_delay":"4739","inactivity":"0"},{"validator_index":"385","head":"60734","target":"60734","source":"60734","inclusion_delay":"4427","inactivity":"0"},{"validator_index":"386","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"387","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"validator_index":"388","head":"107972","target":"107972","source":"107972","inclusion_delay":"5575","inactivity":"0"},{"validator_index":"389","head":"94475","target":"94475","source":"94475","inclusion_delay":"29271","inactivity":"0"},{"validator_index":"390","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"391","head":"107972","target":"107972","source":"107972","inclusion_delay":"5575","inactivity":"0"},{"validator_index":"392","head":"101224","target":"101224","source":"101224","inclusion_delay":"25089","inactivity":"0"},{"validator_index":"393","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"394","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"395","head":"97850","target":"97850","source":"97850","inclusion_delay":"3789","inactivity":"0"},{"validator_index":"396","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"397","head":"70856","target":"70856","source":"70856","inclusion_delay":"7317","inactivity":"0"},{"validator_index":"398","head":"104598","target":"104598","source":"104598","inclusion_delay":"7201","inactivity":"0"},{"validator_index":"399","head":"74230","target":"74230","source":"74230","inclusion_delay":"5411","inactivity":"0"},{"validator_index":"400","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"401","head":"80979","target":"80979","source":"80979","inclusion_delay":"7168","inactivity":"0"},{"validator_index":"402","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"403","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"404","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"405","head":"107972","target":"107972","source":"107972","inclusion_delay":"4460","inactivity":"0"},{"validator_index":"406","head":"107972","target":"107972","source":"107972","inclusion_delay":"4316","inactivity":"0"},{"validator_index":"407","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-272400"},{"validator_index":"408","head":"57360","target":"57360","source":"57360","inclusion_delay":"5468","inactivity":"0"},{"validator_index":"409","head":"57360","target":"57360","source":"57360","inclusion_delay":"2843","inactivity":"0"},{"validator_index":"410","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"411","head":"107972","target":"107972","source":"107972","inclusion_delay":"7434","inactivity":"0"},{"validator_index":"412","head":"107972","target":"107972","source":"107972","inclusion_delay":"10293","inactivity":"0"},{"validator_index":"413","head":"107972","target":"107972","source":"107972","inclusion_delay":"5352","inactivity":"0"},{"validator_index":"414","head":"57360","target":"57360","source":"57360","inclusion_delay":"3385","inactivity":"0"},{"validator_index":"415","head":"87727","target":"87727","source":"87727","inclusion_delay":"4530","inactivity":"0"},{"validator_index":"416","head":"57360","target":"57360","source":"57360","inclusion_delay":"5077","inactivity":"0"},{"validator_index":"417","head":"107972","target":"107972","source":"107972","inclusion_delay":"6082","inactivity":"0"},{"validator_index":"418","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"419","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"420","head":"57360","target":"57360","source":"57360","inclusion_delay":"3554","inactivity":"0"},{"validator_index":"421","head":"107972","target":"107972","source":"107972","inclusion_delay":"14868","inactivity":"0"},{"validator_index":"422","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"423","head":"107972","target":"107972","source":"107972","inclusion_delay":"22302","inactivity":"0"},{"validator_index":"424","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"425","head":"57360","target":"57360","source":"57360","inclusion_delay":"10155","inactivity":"0"},{"validator_index":"426","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"427","head":"57360","target":"57360","source":"57360","inclusion_delay":"10155","inactivity":"0"},{"validator_index":"428","head":"107972","target":"107972","source":"107972","inclusion_delay":"12164","inactivity":"0"},{"validator_index":"429","head":"57360","target":"57360","source":"57360","inclusion_delay":"2632","inactivity":"0"},{"validator_index":"430","head":"57360","target":"57360","source":"57360","inclusion_delay":"5468","inactivity":"0"},{"validator_index":"431","head":"104598","target":"104598","source":"104598","inclusion_delay":"4050","inactivity":"0"},{"validator_index":"432","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"433","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"434","head":"57360","target":"57360","source":"57360","inclusion_delay":"17771","inactivity":"0"},{"validator_index":"435","head":"57360","target":"57360","source":"57360","inclusion_delay":"2961","inactivity":"0"},{"validator_index":"436","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-344085"},{"validator_index":"437","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"438","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-430107"},{"validator_index":"439","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"440","head":"57360","target":"57360","source":"57360","inclusion_delay":"5077","inactivity":"0"},{"validator_index":"441","head":"70856","target":"70856","source":"70856","inclusion_delay":"7983","inactivity":"0"},{"validator_index":"442","head":"57360","target":"57360","source":"57360","inclusion_delay":"5923","inactivity":"0"},{"validator_index":"443","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"444","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"445","head":"57360","target":"57360","source":"57360","inclusion_delay":"2538","inactivity":"0"},{"validator_index":"446","head":"107972","target":"107972","source":"107972","inclusion_delay":"14868","inactivity":"0"},{"validator_index":"447","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"448","head":"97850","target":"97850","source":"97850","inclusion_delay":"5272","inactivity":"0"},{"validator_index":"449","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"450","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"451","head":"107972","target":"107972","source":"107972","inclusion_delay":"6082","inactivity":"0"},{"validator_index":"452","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"453","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"454","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"455","head":"101224","target":"101224","source":"101224","inclusion_delay":"4646","inactivity":"0"},{"validator_index":"456","head":"64108","target":"64108","source":"64108","inclusion_delay":"39725","inactivity":"0"},{"validator_index":"457","head":"107972","target":"107972","source":"107972","inclusion_delay":"7434","inactivity":"0"},{"validator_index":"458","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"459","head":"107972","target":"107972","source":"107972","inclusion_delay":"12164","inactivity":"0"},{"validator_index":"460","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"461","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"462","head":"57360","target":"57360","source":"57360","inclusion_delay":"3554","inactivity":"0"},{"validator_index":"463","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"464","head":"107972","target":"107972","source":"107972","inclusion_delay":"5817","inactivity":"0"},{"validator_index":"465","head":"57360","target":"57360","source":"57360","inclusion_delay":"10155","inactivity":"0"},{"validator_index":"466","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"467","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"468","head":"57360","target":"57360","source":"57360","inclusion_delay":"2369","inactivity":"0"},{"validator_index":"469","head":"97850","target":"97850","source":"97850","inclusion_delay":"4181","inactivity":"0"},{"validator_index":"470","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"471","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"472","head":"107972","target":"107972","source":"107972","inclusion_delay":"6082","inactivity":"0"},{"validator_index":"473","head":"57360","target":"57360","source":"57360","inclusion_delay":"10155","inactivity":"0"},{"validator_index":"474","head":"57360","target":"57360","source":"57360","inclusion_delay":"11847","inactivity":"0"},{"validator_index":"475","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"validator_index":"476","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-444444"},{"validator_index":"477","head":"107972","target":"107972","source":"107972","inclusion_delay":"6082","inactivity":"0"},{"validator_index":"478","head":"57360","target":"57360","source":"57360","inclusion_delay":"2632","inactivity":"0"},{"validator_index":"479","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"480","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"481","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"validator_index":"482","head":"57360","target":"57360","source":"57360","inclusion_delay":"2632","inactivity":"0"},{"validator_index":"483","head":"107972","target":"107972","source":"107972","inclusion_delay":"12164","inactivity":"0"},{"validator_index":"484","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"485","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"486","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"487","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"488","head":"107972","target":"107972","source":"107972","inclusion_delay":"4956","inactivity":"0"},{"validator_index":"489","head":"107972","target":"107972","source":"107972","inclusion_delay":"4614","inactivity":"0"},{"validator_index":"490","head":"74230","target":"74230","source":"74230","inclusion_delay":"22998","inactivity":"0"},{"validator_index":"491","head":"107972","target":"107972","source":"107972","inclusion_delay":"11151","inactivity":"0"},{"validator_index":"492","head":"107972","target":"107972","source":"107972","inclusion_delay":"4614","inactivity":"0"},{"validator_index":"493","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"494","head":"57360","target":"57360","source":"57360","inclusion_delay":"2293","inactivity":"0"},{"validator_index":"495","head":"57360","target":"57360","source":"57360","inclusion_delay":"3385","inactivity":"0"},{"validator_index":"496","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"497","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"498","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"499","head":"57360","target":"57360","source":"57360","inclusion_delay":"2221","inactivity":"0"},{"validator_index":"500","head":"107972","target":"107972","source":"107972","inclusion_delay":"6690","inactivity":"0"},{"validator_index":"501","head":"107972","target":"107972","source":"107972","inclusion_delay":"4779","inactivity":"0"},{"validator_index":"502","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-243726"},{"validator_index":"503","head":"107972","target":"107972","source":"107972","inclusion_delay":"11151","inactivity":"0"},{"validator_index":"504","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"-458781"},{"validator_index":"505","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"506","head":"107972","target":"107972","source":"107972","inclusion_delay":"8363","inactivity":"0"},{"validator_index":"507","head":"107972","target":"107972","source":"107972","inclusion_delay":"4956","inactivity":"0"},{"validator_index":"508","head":"57360","target":"57360","source":"57360","inclusion_delay":"35543","inactivity":"0"},{"validator_index":"509","head":"57360","target":"57360","source":"57360","inclusion_delay":"5077","inactivity":"0"},{"validator_index":"510","head":"57360","target":"57360","source":"57360","inclusion_delay":"6462","inactivity":"0"},{"validator_index":"511","head":"107972","target":"107972","source":"107972","inclusion_delay":"5352","inactivity":"0"},{"validator_index":"512","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"513","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"514","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"515","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"516","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"517","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"518","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"519","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"520","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"521","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"522","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"523","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"524","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"525","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"526","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"527","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"}]}}` + "\n", // Add your expected response + }, + { + epoch: 99999999, + code: http.StatusNotFound, + }, + { + name: "2 validators", + epoch: (fcu.HeadSlotVal / 32) - 1, + request: `["1","4"]`, + code: http.StatusOK, + expected: `{"data":{"ideal_rewards":[{"effective_balance":"20000000000","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"effective_balance":"17000000000","head":"57360","target":"57360","source":"57360","inclusion_delay":"14217","inactivity":"0"}],"total_rewards":[{"validator_index":"1","head":"0","target":"0","source":"0","inclusion_delay":"0","inactivity":"0"},{"validator_index":"4","head":"57360","target":"57360","source":"57360","inclusion_delay":"14217","inactivity":"0"}]}}` + "\n", // Add your expected response + }, + } + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + server := httptest.NewServer(handler.mux) + defer server.Close() + url := fmt.Sprintf("%s/eth/v1/beacon/rewards/attestations/%d", server.URL, c.epoch) + + // Create a request + req, err := http.NewRequest("POST", url, strings.NewReader(c.request)) + require.NoError(t, err) + req.Header.Set("Content-Type", "application/json") + + // Perform the request + resp, err := http.DefaultClient.Do(req) + require.NoError(t, err) + defer resp.Body.Close() + + // Check status code + require.Equal(t, c.code, resp.StatusCode) + + if resp.StatusCode != http.StatusOK { + return + } + + // Read the response body + out, err := io.ReadAll(resp.Body) + require.NoError(t, err) + // Compare the response with the expected result + require.Equal(t, c.expected, string(out)) + }) + } +} diff --git a/cl/beacon/handler/handler.go b/cl/beacon/handler/handler.go index 32580ed8e2c..909bdf52188 100644 --- a/cl/beacon/handler/handler.go +++ b/cl/beacon/handler/handler.go @@ -41,6 +41,7 @@ func (a *ApiHandler) init() { // otterscn specific ones are commented as such r.Route("/eth", func(r chi.Router) { r.Route("/v1", func(r chi.Router) { + r.Get("/events", http.NotFound) r.Route("/config", func(r chi.Router) { r.Get("/spec", beaconhttp.HandleEndpointFunc(a.getSpec)) @@ -48,6 +49,11 @@ func (a *ApiHandler) init() { r.Get("/fork_schedule", beaconhttp.HandleEndpointFunc(a.getForkSchedule)) }) r.Route("/beacon", func(r chi.Router) { + r.Route("/rewards", func(r chi.Router) { + r.Get("/sync_committee/{block_id}", http.NotFound) + r.Get("/blocks/{block_id}", http.NotFound) + r.Post("/attestations/{epoch}", beaconhttp.HandleEndpointFunc(a.getAttestationsRewards)) + }) r.Route("/headers", func(r chi.Router) { r.Get("/", beaconhttp.HandleEndpointFunc(a.getHeaders)) r.Get("/{block_id}", beaconhttp.HandleEndpointFunc(a.getHeader)) diff --git a/cl/beacon/handler/states_test.go b/cl/beacon/handler/states_test.go index cae5933da6e..cd145f1e729 100644 --- a/cl/beacon/handler/states_test.go +++ b/cl/beacon/handler/states_test.go @@ -2,7 +2,6 @@ package handler import ( "encoding/json" - "fmt" "io" "net/http" "net/http/httptest" @@ -28,7 +27,6 @@ func TestGetStateFork(t *testing.T) { require.NoError(t, err) fcu.HeadSlotVal = blocks[len(blocks)-1].Block.Slot - fmt.Println(fcu.HeadSlotVal) cases := []struct { blockID string @@ -87,7 +85,6 @@ func TestGetStateRoot(t *testing.T) { require.NoError(t, err) fcu.HeadSlotVal = blocks[len(blocks)-1].Block.Slot - fmt.Println(fcu.HeadSlotVal) fcu.FinalizedCheckpointVal = solid.NewCheckpointFromParameters(fcu.HeadVal, fcu.HeadSlotVal/32) @@ -213,7 +210,6 @@ func TestGetStateFullForkchoice(t *testing.T) { require.NoError(t, err) fcu.HeadSlotVal = blocks[len(blocks)-1].Block.Slot - fmt.Println(fcu.HeadSlotVal) fcu.FinalizedCheckpointVal = solid.NewCheckpointFromParameters(fcu.HeadVal, fcu.HeadSlotVal/32) @@ -429,7 +425,7 @@ func TestGetStateFinalityCheckpoints(t *testing.T) { code: http.StatusOK, }, } - expected := `{"data":{"finalized_checkpoint":{"epoch":"1","root":"0xde46b0f2ed5e72f0cec20246403b14c963ec995d7c2825f3532b0460c09d5693"},"current_justified_checkpoint":{"epoch":"3","root":"0xa6e47f164b1a3ca30ea3b2144bd14711de442f51e5b634750a12a1734e24c987"},"previous_justified_checkpoint":{"epoch":"2","root":"0x4c3ee7969e485696669498a88c17f70e6999c40603e2f4338869004392069063"}},"finalized":false,"version":0,"execution_optimistic":false}` + "\n" + expected := `{"data":{"finalized_checkpoint":{"epoch":"1","root":"0xde46b0f2ed5e72f0cec20246403b14c963ec995d7c2825f3532b0460c09d5693"},"current_justified_checkpoint":{"epoch":"3","root":"0xa6e47f164b1a3ca30ea3b2144bd14711de442f51e5b634750a12a1734e24c987"},"previous_justified_checkpoint":{"epoch":"2","root":"0x4c3ee7969e485696669498a88c17f70e6999c40603e2f4338869004392069063"}},"finalized":false,"version":2,"execution_optimistic":false}` + "\n" for _, c := range cases { t.Run(c.blockID, func(t *testing.T) { server := httptest.NewServer(handler.mux) diff --git a/cl/beacon/handler/utils_test.go b/cl/beacon/handler/utils_test.go index 8f513ac7f66..9dd231bd83a 100644 --- a/cl/beacon/handler/utils_test.go +++ b/cl/beacon/handler/utils_test.go @@ -24,9 +24,12 @@ import ( ) func setupTestingHandler(t *testing.T, v clparams.StateVersion) (db kv.RwDB, blocks []*cltypes.SignedBeaconBlock, f afero.Fs, preState, postState *state.CachingBeaconState, handler *ApiHandler, opPool pool.OperationsPool, syncedData *synced_data.SyncedDataManager, fcu *forkchoice.ForkChoiceStorageMock) { + bcfg := clparams.MainnetBeaconConfig if v == clparams.Phase0Version { blocks, preState, postState = tests.GetPhase0Random() } else if v == clparams.BellatrixVersion { + bcfg.AltairForkEpoch = 1 + bcfg.BellatrixForkEpoch = 1 blocks, preState, postState = tests.GetBellatrixRandom() } else { require.FailNow(t, "unknown state version") @@ -37,9 +40,8 @@ func setupTestingHandler(t *testing.T, v clparams.StateVersion) (db kv.RwDB, blo reader, f = tests.LoadChain(blocks, postState, db, t) rawDB := persistence.NewAferoRawBlockSaver(f, &clparams.MainnetBeaconConfig) - - bcfg := clparams.MainnetBeaconConfig bcfg.InitializeForkSchedule() + ctx := context.Background() vt := state_accessors.NewStaticValidatorTable() a := antiquary.NewAntiquary(ctx, preState, vt, &bcfg, datadir.New("/tmp"), nil, db, nil, reader, nil, log.New(), true, true, f) diff --git a/cl/beacon/handler/validators.go b/cl/beacon/handler/validators.go index db1204464e9..22ae44fd340 100644 --- a/cl/beacon/handler/validators.go +++ b/cl/beacon/handler/validators.go @@ -248,7 +248,11 @@ func (a *ApiHandler) getAllValidators(r *http.Request) (*beaconResponse, error) return nil, err } if state == nil { - validatorSet, balances, err := a.stateReader.ReadValidatorsData(tx, *slot) + validatorSet, err := a.stateReader.ReadValidatorsForHistoricalState(tx, *slot) + if err != nil { + return nil, err + } + balances, err := a.stateReader.ReadValidatorsBalances(tx, *slot) if err != nil { return nil, err } @@ -320,7 +324,6 @@ func (a *ApiHandler) getSingleValidator(r *http.Request) (*beaconResponse, error if err != nil { return nil, beaconhttp.NewEndpointError(http.StatusBadRequest, err.Error()) } - fmt.Println(validatorId) validatorIndex, err := parseQueryValidatorIndex(tx, validatorId) if err != nil { @@ -352,7 +355,11 @@ func (a *ApiHandler) getSingleValidator(r *http.Request) (*beaconResponse, error return nil, err } if state == nil { - validatorSet, balances, err := a.stateReader.ReadValidatorsData(tx, *slot) + validatorSet, err := a.stateReader.ReadValidatorsForHistoricalState(tx, *slot) + if err != nil { + return nil, err + } + balances, err := a.stateReader.ReadValidatorsBalances(tx, *slot) if err != nil { return nil, err } diff --git a/cl/beacon/handler/validators_test.go b/cl/beacon/handler/validators_test.go index 904047ed2ce..698577aeb21 100644 --- a/cl/beacon/handler/validators_test.go +++ b/cl/beacon/handler/validators_test.go @@ -1,7 +1,6 @@ package handler import ( - "fmt" "io" "net/http" "net/http/httptest" @@ -72,9 +71,6 @@ func TestGetAllValidators(t *testing.T) { // unmarshal the json out, err := io.ReadAll(resp.Body) require.NoError(t, err) - if string(out) != c.expectedResp { - fmt.Println(string(out)) - } require.Equal(t, c.expectedResp, string(out)) }) @@ -134,9 +130,6 @@ func TestGetValidatorsBalances(t *testing.T) { // unmarshal the json out, err := io.ReadAll(resp.Body) require.NoError(t, err) - if string(out) != c.expectedResp { - fmt.Println(string(out)) - } require.Equal(t, c.expectedResp, string(out)) }) @@ -197,9 +190,6 @@ func TestGetSingleValidator(t *testing.T) { // unmarshal the json out, err := io.ReadAll(resp.Body) require.NoError(t, err) - if string(out) != c.expectedResp { - fmt.Println(string(out)) - } require.Equal(t, c.expectedResp, string(out)) }) diff --git a/cl/persistence/base_encoding/rabbit.go b/cl/persistence/base_encoding/rabbit.go new file mode 100644 index 00000000000..7478d17fd5b --- /dev/null +++ b/cl/persistence/base_encoding/rabbit.go @@ -0,0 +1,86 @@ +package base_encoding + +import ( + "encoding/binary" + "errors" + "io" + + "github.com/klauspost/compress/zstd" +) + +func WriteRabbits(in []uint64, w io.Writer) error { + // Retrieve compressor first + compressor := compressorPool.Get().(*zstd.Encoder) + defer compressorPool.Put(compressor) + compressor.Reset(w) + + expectedNum := uint64(0) + count := 0 + // write length + if err := binary.Write(compressor, binary.LittleEndian, uint64(len(in))); err != nil { + return err + } + for _, element := range in { + if expectedNum != element { + // [1,2,5,6] + // write contiguous sequence + if err := binary.Write(compressor, binary.LittleEndian, uint64(count)); err != nil { + return err + } + // write non-contiguous element + if err := binary.Write(compressor, binary.LittleEndian, element-expectedNum); err != nil { + return err + } + count = 0 + } + count++ + expectedNum = element + 1 + + } + // write last contiguous sequence + if err := binary.Write(compressor, binary.LittleEndian, uint64(count)); err != nil { + return err + } + return compressor.Close() +} + +func ReadRabbits(out []uint64, r io.Reader) ([]uint64, error) { + // Retrieve compressor first + decompressor, err := zstd.NewReader(r) + if err != nil { + return nil, err + } + defer decompressor.Close() + + var length uint64 + if err := binary.Read(decompressor, binary.LittleEndian, &length); err != nil { + return nil, err + } + + if cap(out) < int(length) { + out = make([]uint64, 0, length) + } + out = out[:0] + var count uint64 + var current uint64 + active := true + for err != io.EOF { + err = binary.Read(decompressor, binary.LittleEndian, &count) + if errors.Is(err, io.EOF) { + break + } + if err != nil { + return nil, err + } + if active { + for i := current; i < current+count; i++ { + out = append(out, i) + } + current += count + } else { + current += count + } + active = !active + } + return out, nil +} diff --git a/cl/persistence/base_encoding/rabbit_test.go b/cl/persistence/base_encoding/rabbit_test.go new file mode 100644 index 00000000000..fe98fe3bc34 --- /dev/null +++ b/cl/persistence/base_encoding/rabbit_test.go @@ -0,0 +1,22 @@ +package base_encoding + +import ( + "bytes" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestRabbit(t *testing.T) { + list := []uint64{2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 17, 23, 90} + var w bytes.Buffer + if err := WriteRabbits(list, &w); err != nil { + t.Fatal(err) + } + var out []uint64 + out, err := ReadRabbits(out, &w) + if err != nil { + t.Fatal(err) + } + require.Equal(t, list, out) +} diff --git a/cl/persistence/state/historical_states_reader/attesting_indicies.go b/cl/persistence/state/historical_states_reader/attesting_indicies.go index e3d5f717b59..510168da90c 100644 --- a/cl/persistence/state/historical_states_reader/attesting_indicies.go +++ b/cl/persistence/state/historical_states_reader/attesting_indicies.go @@ -3,20 +3,24 @@ package historical_states_reader import ( "fmt" + libcommon "github.com/ledgerwatch/erigon-lib/common" + "github.com/ledgerwatch/erigon-lib/kv" "github.com/ledgerwatch/erigon/cl/clparams" "github.com/ledgerwatch/erigon/cl/cltypes/solid" + "github.com/ledgerwatch/erigon/cl/persistence/base_encoding" + state_accessors "github.com/ledgerwatch/erigon/cl/persistence/state" "github.com/ledgerwatch/erigon/cl/phase1/core/state/shuffling" "github.com/ledgerwatch/erigon/cl/utils" ) -func (r *HistoricalStatesReader) attestingIndicies(attestation solid.AttestationData, aggregationBits []byte, checkBitsLength bool, randaoMixes solid.HashVectorSSZ, idxs []uint64) ([]uint64, error) { +func (r *HistoricalStatesReader) attestingIndicies(attestation solid.AttestationData, aggregationBits []byte, checkBitsLength bool, mix libcommon.Hash, idxs []uint64) ([]uint64, error) { slot := attestation.Slot() committeesPerSlot := committeeCount(r.cfg, slot/r.cfg.SlotsPerEpoch, idxs) committeeIndex := attestation.ValidatorIndex() index := (slot%r.cfg.SlotsPerEpoch)*committeesPerSlot + committeeIndex count := committeesPerSlot * r.cfg.SlotsPerEpoch - committee, err := r.computeCommittee(randaoMixes, idxs, attestation.Slot(), count, index) + committee, err := r.computeCommittee(mix, idxs, attestation.Slot(), count, index) if err != nil { return nil, err } @@ -40,7 +44,7 @@ func (r *HistoricalStatesReader) attestingIndicies(attestation solid.Attestation } // computeCommittee uses cache to compute compittee -func (r *HistoricalStatesReader) computeCommittee(randaoMixes solid.HashVectorSSZ, indicies []uint64, slot uint64, count, index uint64) ([]uint64, error) { +func (r *HistoricalStatesReader) computeCommittee(mix libcommon.Hash, indicies []uint64, slot uint64, count, index uint64) ([]uint64, error) { cfg := r.cfg lenIndicies := uint64(len(indicies)) @@ -48,12 +52,9 @@ func (r *HistoricalStatesReader) computeCommittee(randaoMixes solid.HashVectorSS end := (lenIndicies * (index + 1)) / count var shuffledIndicies []uint64 epoch := slot / cfg.SlotsPerEpoch - - mixPosition := (epoch + cfg.EpochsPerHistoricalVector - cfg.MinSeedLookahead - 1) % - cfg.EpochsPerHistoricalVector - // Input for the seed hash. - mix := randaoMixes.Get(int(mixPosition)) - + /* + mixPosition := (epoch + cfg.EpochsPerHistoricalVector - cfg.MinSeedLookahead - 1) % cfg.EpochsPerHistoricalVector + */ if shuffledIndicesInterface, ok := r.shuffledSetsCache.Get(epoch); ok { shuffledIndicies = shuffledIndicesInterface } else { @@ -75,3 +76,92 @@ func committeeCount(cfg *clparams.BeaconChainConfig, epoch uint64, idxs []uint64 } return committeCount } + +func (r *HistoricalStatesReader) readHistoricalBlockRoot(tx kv.Tx, slot, index uint64) (libcommon.Hash, error) { + slotSubIndex := slot % r.cfg.SlotsPerHistoricalRoot + needFromGenesis := true + + var slotLookup uint64 + if index <= slotSubIndex { + if slot > (slotSubIndex - index) { + slotLookup = slot - (slotSubIndex - index) + needFromGenesis = false + } + } else { + if slot > (slotSubIndex + (r.cfg.SlotsPerHistoricalRoot - index)) { + slotLookup = slot - (slotSubIndex + (r.cfg.SlotsPerHistoricalRoot - index)) + needFromGenesis = false + } + } + + if needFromGenesis { + return r.genesisState.GetBlockRootAtSlot(slot) + } + br, err := tx.GetOne(kv.BlockRoot, base_encoding.Encode64ToBytes4(slotLookup)) + if err != nil { + return libcommon.Hash{}, err + } + if len(br) != 32 { + return libcommon.Hash{}, fmt.Errorf("invalid block root length %d", len(br)) + } + return libcommon.BytesToHash(br), nil + +} + +func (r *HistoricalStatesReader) getAttestationParticipationFlagIndicies(tx kv.Tx, stateSlot uint64, data solid.AttestationData, inclusionDelay uint64, skipAssert bool) ([]uint8, error) { + currentCheckpoint, previousCheckpoint, _, err := state_accessors.ReadCheckpoints(tx, r.cfg.RoundSlotToEpoch(stateSlot)) + if err != nil { + return nil, err + } + if currentCheckpoint == nil { + currentCheckpoint = r.genesisState.CurrentJustifiedCheckpoint() + } + if previousCheckpoint == nil { + previousCheckpoint = r.genesisState.PreviousJustifiedCheckpoint() + } + + var justifiedCheckpoint solid.Checkpoint + // get checkpoint from epoch + if data.Target().Epoch() == stateSlot/r.cfg.SlotsPerEpoch { + justifiedCheckpoint = currentCheckpoint + } else { + justifiedCheckpoint = previousCheckpoint + } + // Matching roots + if !data.Source().Equal(justifiedCheckpoint) && !skipAssert { + // jsonify the data.Source and justifiedCheckpoint + jsonSource, err := data.Source().MarshalJSON() + if err != nil { + return nil, err + } + jsonJustifiedCheckpoint, err := justifiedCheckpoint.MarshalJSON() + if err != nil { + return nil, err + } + return nil, fmt.Errorf("GetAttestationParticipationFlagIndicies: source does not match. source: %s, justifiedCheckpoint: %s", jsonSource, jsonJustifiedCheckpoint) + } + i := (data.Target().Epoch() * r.cfg.SlotsPerEpoch) % r.cfg.SlotsPerHistoricalRoot + targetRoot, err := r.readHistoricalBlockRoot(tx, stateSlot, i) + if err != nil { + return nil, err + } + + i = data.Slot() % r.cfg.SlotsPerHistoricalRoot + headRoot, err := r.readHistoricalBlockRoot(tx, stateSlot, i) + if err != nil { + return nil, err + } + matchingTarget := data.Target().BlockRoot() == targetRoot + matchingHead := matchingTarget && data.BeaconBlockRoot() == headRoot + participationFlagIndicies := []uint8{} + if inclusionDelay <= utils.IntegerSquareRoot(r.cfg.SlotsPerEpoch) { + participationFlagIndicies = append(participationFlagIndicies, r.cfg.TimelySourceFlagIndex) + } + if matchingTarget && inclusionDelay <= r.cfg.SlotsPerEpoch { + participationFlagIndicies = append(participationFlagIndicies, r.cfg.TimelyTargetFlagIndex) + } + if matchingHead && inclusionDelay == r.cfg.MinAttestationInclusionDelay { + participationFlagIndicies = append(participationFlagIndicies, r.cfg.TimelyHeadFlagIndex) + } + return participationFlagIndicies, nil +} diff --git a/cl/persistence/state/historical_states_reader/historical_states_reader.go b/cl/persistence/state/historical_states_reader/historical_states_reader.go index da224cc3e28..a7d54b2d758 100644 --- a/cl/persistence/state/historical_states_reader/historical_states_reader.go +++ b/cl/persistence/state/historical_states_reader/historical_states_reader.go @@ -23,6 +23,8 @@ import ( "github.com/ledgerwatch/erigon/turbo/snapshotsync/freezeblocks" "github.com/spf13/afero" "golang.org/x/exp/slices" + + libcommon "github.com/ledgerwatch/erigon-lib/common" ) type HistoricalStatesReader struct { @@ -65,7 +67,7 @@ func (r *HistoricalStatesReader) ReadHistoricalState(ctx context.Context, tx kv. return nil, fmt.Errorf("slot %d is greater than latest processed state %d", slot, latestProcessedState) } - if slot == 0 { + if slot == r.genesisState.Slot() { return r.genesisState.Copy() } // Read the current block (we need the block header) + other stuff @@ -74,7 +76,7 @@ func (r *HistoricalStatesReader) ReadHistoricalState(ctx context.Context, tx kv. return nil, err } if block == nil { - return nil, fmt.Errorf("block at slot %d not found", slot) + return nil, nil } blockHeader := block.SignedBeaconBlockHeader().Header blockHeader.Root = common.Hash{} @@ -136,7 +138,7 @@ func (r *HistoricalStatesReader) ReadHistoricalState(ctx context.Context, tx kv. } ret.SetBalances(balances) - validatorSet, currActiveIdxs, prevActiveIdxs, err := r.readValidatorsForHistoricalState(tx, slot, minimalBeaconState.ValidatorLength) + validatorSet, err := r.ReadValidatorsForHistoricalState(tx, slot) if err != nil { return nil, fmt.Errorf("failed to read validators: %w", err) } @@ -149,7 +151,7 @@ func (r *HistoricalStatesReader) ReadHistoricalState(ctx context.Context, tx kv. ret.SetRandaoMixes(randaoMixes) slashingsVector := solid.NewUint64VectorSSZ(int(r.cfg.EpochsPerSlashingsVector)) // Slashings - err = r.reconstructUint64ListDump(tx, slot, kv.ValidatorSlashings, int(r.cfg.EpochsPerSlashingsVector), slashingsVector) + err = r.ReconstructUint64ListDump(tx, slot, kv.ValidatorSlashings, int(r.cfg.EpochsPerSlashingsVector), slashingsVector) if err != nil { return nil, fmt.Errorf("failed to read slashings: %w", err) } @@ -182,7 +184,7 @@ func (r *HistoricalStatesReader) ReadHistoricalState(ctx context.Context, tx kv. ret.SetCurrentEpochAttestations(currentAtts) ret.SetPreviousEpochAttestations(previousAtts) } else { - currentIdxs, previousIdxs, err := r.readPartecipations(tx, slot, minimalBeaconState.ValidatorLength, currActiveIdxs, prevActiveIdxs, ret, currentCheckpoint, previousCheckpoint) + currentIdxs, previousIdxs, err := r.ReadPartecipations(tx, slot) if err != nil { return nil, fmt.Errorf("failed to read participations: %w", err) } @@ -195,7 +197,7 @@ func (r *HistoricalStatesReader) ReadHistoricalState(ctx context.Context, tx kv. } inactivityScores := solid.NewUint64ListSSZ(int(r.cfg.ValidatorRegistryLimit)) // Inactivity - err = r.reconstructUint64ListDump(tx, slot, kv.InactivityScores, int(minimalBeaconState.ValidatorLength), inactivityScores) + err = r.ReconstructUint64ListDump(tx, slot, kv.InactivityScores, int(minimalBeaconState.ValidatorLength), inactivityScores) if err != nil { return nil, fmt.Errorf("failed to read inactivity scores: %w", err) } @@ -480,7 +482,7 @@ func (r *HistoricalStatesReader) reconstructBalances(tx kv.Tx, slot uint64, diff return currentList, err } -func (r *HistoricalStatesReader) reconstructUint64ListDump(tx kv.Tx, slot uint64, bkt string, size int, out solid.Uint64ListSSZ) error { +func (r *HistoricalStatesReader) ReconstructUint64ListDump(tx kv.Tx, slot uint64, bkt string, size int, out solid.Uint64ListSSZ) error { diffCursor, err := tx.Cursor(bkt) if err != nil { return err @@ -520,44 +522,39 @@ func (r *HistoricalStatesReader) reconstructUint64ListDump(tx kv.Tx, slot uint64 return out.DecodeSSZ(currentList, 0) } -func (r *HistoricalStatesReader) readValidatorsForHistoricalState(tx kv.Tx, slot, validatorSetLength uint64) (*solid.ValidatorSet, []uint64, []uint64, error) { +func (r *HistoricalStatesReader) ReadValidatorsForHistoricalState(tx kv.Tx, slot uint64) (*solid.ValidatorSet, error) { + // Read the minimal beacon state which have the small fields. + minimalBeaconState, err := state_accessors.ReadMinimalBeaconState(tx, slot) + if err != nil { + return nil, err + } + // State not found + if minimalBeaconState == nil { + return nil, nil + } + validatorSetLength := minimalBeaconState.ValidatorLength + out := solid.NewValidatorSetWithLength(int(r.cfg.ValidatorRegistryLimit), int(validatorSetLength)) // Read the static validator field which are hot in memory (this is > 70% of the whole beacon state) - activeIds := make([]uint64, 0, validatorSetLength) - epoch := slot / r.cfg.SlotsPerEpoch - - prevActiveIds := make([]uint64, 0, validatorSetLength) - if epoch == 0 { - prevActiveIds = activeIds - } r.validatorTable.ForEach(func(validatorIndex uint64, validator *state_accessors.StaticValidator) bool { if validatorIndex >= validatorSetLength { return false } currValidator := out.Get(int(validatorIndex)) validator.ToValidator(currValidator, slot) - if currValidator.Active(epoch) { - activeIds = append(activeIds, validatorIndex) - } - if epoch == 0 { - return true - } - if currValidator.Active(epoch - 1) { - prevActiveIds = append(prevActiveIds, validatorIndex) - } return true }) // Read the balances bytesEffectiveBalances, err := r.reconstructDiffedUint64List(tx, slot, kv.ValidatorEffectiveBalance, "effective_balances") if err != nil { - return nil, nil, nil, err + return nil, err } for i := 0; i < int(validatorSetLength); i++ { out.Get(i). SetEffectiveBalanceFromBytes(bytesEffectiveBalances[(i * 8) : (i*8)+8]) } - return out, activeIds, prevActiveIds, nil + return out, nil } func (r *HistoricalStatesReader) readPendingEpochs(tx kv.Tx, slot uint64, currentEpochAttestationsLength, previousEpochAttestationsLength uint64) (*solid.ListSSZ[*solid.PendingAttestation], *solid.ListSSZ[*solid.PendingAttestation], error) { @@ -580,18 +577,42 @@ func (r *HistoricalStatesReader) readPendingEpochs(tx kv.Tx, slot uint64, curren } // readParticipations shuffles active indicies and returns the participation flags for the given epoch. -func (r *HistoricalStatesReader) readPartecipations(tx kv.Tx, slot uint64, validatorLength uint64, - currentActiveIndicies, previousActiveIndicies []uint64, ret *state.CachingBeaconState, - currentJustifiedCheckpoint, previousJustifiedCheckpoint solid.Checkpoint) (*solid.BitList, *solid.BitList, error) { - randaoMixes := ret.RandaoMixes() +func (r *HistoricalStatesReader) ReadPartecipations(tx kv.Tx, slot uint64) (*solid.BitList, *solid.BitList, error) { var beginSlot uint64 epoch, prevEpoch := r.computeRelevantEpochs(slot) beginSlot = prevEpoch * r.cfg.SlotsPerEpoch + currentActiveIndicies, err := state_accessors.ReadActiveIndicies(tx, epoch) + if err != nil { + return nil, nil, err + } + var previousActiveIndicies []uint64 + if epoch == 0 { + previousActiveIndicies = currentActiveIndicies + } else { + previousActiveIndicies, err = state_accessors.ReadActiveIndicies(tx, epoch-1) + if err != nil { + return nil, nil, err + } + } + + // Read the minimal beacon state which have the small fields. + minimalBeaconState, err := state_accessors.ReadMinimalBeaconState(tx, slot) + if err != nil { + return nil, nil, err + } + // State not found + if minimalBeaconState == nil { + return nil, nil, nil + } + validatorLength := minimalBeaconState.ValidatorLength + currentIdxs := solid.NewBitList(int(validatorLength), int(r.cfg.ValidatorRegistryLimit)) previousIdxs := solid.NewBitList(int(validatorLength), int(r.cfg.ValidatorRegistryLimit)) // trigger the cache for shuffled sets in parallel - r.tryCachingEpochsInParallell(randaoMixes, [][]uint64{currentActiveIndicies, previousActiveIndicies}, []uint64{epoch, prevEpoch}) + if err := r.tryCachingEpochsInParallell(tx, [][]uint64{currentActiveIndicies, previousActiveIndicies}, []uint64{epoch, prevEpoch}); err != nil { + return nil, nil, err + } // Read the previous idxs for i := beginSlot; i <= slot; i++ { // Read the block @@ -602,7 +623,6 @@ func (r *HistoricalStatesReader) readPartecipations(tx kv.Tx, slot uint64, valid if block == nil { continue } - ret.SetSlot(i) currentEpoch := i / r.cfg.SlotsPerEpoch // Read the participation flags @@ -624,13 +644,21 @@ func (r *HistoricalStatesReader) readPartecipations(tx kv.Tx, slot uint64, valid activeIndicies = previousActiveIndicies } + attestationEpoch := data.Slot() / r.cfg.SlotsPerEpoch + + mixPosition := (attestationEpoch + r.cfg.EpochsPerHistoricalVector - r.cfg.MinSeedLookahead - 1) % r.cfg.EpochsPerHistoricalVector + mix, err := r.ReadRandaoMixBySlotAndIndex(tx, data.Slot(), mixPosition) + if err != nil { + return false + } + var attestingIndicies []uint64 - attestingIndicies, err = r.attestingIndicies(attestation.AttestantionData(), attestation.AggregationBits(), true, randaoMixes, activeIndicies) + attestingIndicies, err = r.attestingIndicies(data, attestation.AggregationBits(), true, mix, activeIndicies) if err != nil { return false } var participationFlagsIndicies []uint8 - participationFlagsIndicies, err = ret.GetAttestationParticipationFlagIndicies(data, ret.Slot()-data.Slot(), true) + participationFlagsIndicies, err = r.getAttestationParticipationFlagIndicies(tx, i, data, i-data.Slot(), true) if err != nil { return false } @@ -670,56 +698,84 @@ func (r *HistoricalStatesReader) computeRelevantEpochs(slot uint64) (uint64, uin return epoch, epoch - 1 } -func (r *HistoricalStatesReader) tryCachingEpochsInParallell(randaoMixes solid.HashVectorSSZ, activeIdxs [][]uint64, epochs []uint64) { +func (r *HistoricalStatesReader) tryCachingEpochsInParallell(tx kv.Tx, activeIdxs [][]uint64, epochs []uint64) error { var wg sync.WaitGroup wg.Add(len(epochs)) for i, epoch := range epochs { - go func(epoch uint64, idxs []uint64) { + mixPosition := (epoch + r.cfg.EpochsPerHistoricalVector - r.cfg.MinSeedLookahead - 1) % r.cfg.EpochsPerHistoricalVector + mix, err := r.ReadRandaoMixBySlotAndIndex(tx, epochs[0]*r.cfg.SlotsPerEpoch, mixPosition) + if err != nil { + return err + } + + go func(mix libcommon.Hash, epoch uint64, idxs []uint64) { defer wg.Done() - _, _ = r.computeCommittee(randaoMixes, idxs, epoch*r.cfg.SlotsPerEpoch, r.cfg.TargetCommitteeSize, 0) - }(epoch, activeIdxs[i]) + + _, _ = r.computeCommittee(mix, idxs, epoch*r.cfg.SlotsPerEpoch, r.cfg.TargetCommitteeSize, 0) + }(mix, epoch, activeIdxs[i]) } wg.Wait() + return nil } -func (r *HistoricalStatesReader) ReadValidatorsData(tx kv.Tx, slot uint64) (*solid.ValidatorSet, solid.Uint64ListSSZ, error) { +func (r *HistoricalStatesReader) ReadValidatorsBalances(tx kv.Tx, slot uint64) (solid.Uint64ListSSZ, error) { minimalBeaconState, err := state_accessors.ReadMinimalBeaconState(tx, slot) if err != nil { - return nil, nil, err + return nil, err } // State not found if minimalBeaconState == nil { - return nil, nil, nil + return nil, nil } - validatorSet, _, _, err := r.readValidatorsForHistoricalState(tx, slot, minimalBeaconState.ValidatorLength) - if err != nil { - return nil, nil, err - } balances, err := r.reconstructBalances(tx, slot, kv.ValidatorBalance) if err != nil { - return nil, nil, err + return nil, err } balancesList := solid.NewUint64ListSSZ(int(r.cfg.ValidatorRegistryLimit)) - return validatorSet, balancesList, balancesList.DecodeSSZ(balances, 0) + return balancesList, balancesList.DecodeSSZ(balances, 0) } -func (r *HistoricalStatesReader) ReadValidatorsBalances(tx kv.Tx, slot uint64) (solid.Uint64ListSSZ, error) { - minimalBeaconState, err := state_accessors.ReadMinimalBeaconState(tx, slot) - if err != nil { - return nil, err +func (r *HistoricalStatesReader) ReadRandaoMixBySlotAndIndex(tx kv.Tx, slot, index uint64) (libcommon.Hash, error) { + epoch := slot / r.cfg.SlotsPerEpoch + epochSubIndex := epoch % r.cfg.EpochsPerHistoricalVector + if index == epochSubIndex { + intraRandaoMix, err := tx.GetOne(kv.IntraRandaoMixes, base_encoding.Encode64ToBytes4(slot)) + if err != nil { + return libcommon.Hash{}, err + } + if len(intraRandaoMix) != 32 { + return libcommon.Hash{}, fmt.Errorf("invalid intra randao mix length %d", len(intraRandaoMix)) + } + return libcommon.BytesToHash(intraRandaoMix), nil + } + needFromGenesis := true + var epochLookup uint64 + if index <= epochSubIndex { + if epoch > (epochSubIndex - index) { + needFromGenesis = false + epochLookup = epoch - (epochSubIndex - index) + } + } else { + if epoch > (epochSubIndex + (r.cfg.EpochsPerHistoricalVector - index)) { + needFromGenesis = false + epochLookup = epoch - (epochSubIndex + (r.cfg.EpochsPerHistoricalVector - index)) + } } - // State not found - if minimalBeaconState == nil { - return nil, nil + if epochLookup < r.genesisState.Slot()/r.cfg.SlotsPerEpoch { + needFromGenesis = true } - balances, err := r.reconstructBalances(tx, slot, kv.ValidatorBalance) + if needFromGenesis { + return r.genesisState.GetRandaoMixes(epoch), nil + } + mixBytes, err := tx.GetOne(kv.RandaoMixes, base_encoding.Encode64ToBytes4(epochLookup*r.cfg.SlotsPerEpoch)) if err != nil { - return nil, err + return libcommon.Hash{}, err } - balancesList := solid.NewUint64ListSSZ(int(r.cfg.ValidatorRegistryLimit)) - - return balancesList, balancesList.DecodeSSZ(balances, 0) + if len(mixBytes) != 32 { + return libcommon.Hash{}, fmt.Errorf("invalid mix length %d", len(mixBytes)) + } + return libcommon.BytesToHash(mixBytes), nil } diff --git a/cl/persistence/state/historical_states_reader/historical_states_reader_test.go b/cl/persistence/state/historical_states_reader/historical_states_reader_test.go index ebbae5bb65a..cec53451589 100644 --- a/cl/persistence/state/historical_states_reader/historical_states_reader_test.go +++ b/cl/persistence/state/historical_states_reader/historical_states_reader_test.go @@ -48,21 +48,18 @@ func runTest(t *testing.T, blocks []*cltypes.SignedBeaconBlock, preState, postSt func TestStateAntiquaryCapella(t *testing.T) { t.Skip() - //t.Skip() blocks, preState, postState := tests.GetCapellaRandom() runTest(t, blocks, preState, postState) } func TestStateAntiquaryPhase0(t *testing.T) { t.Skip() - // t.Skip() blocks, preState, postState := tests.GetPhase0Random() runTest(t, blocks, preState, postState) } func TestStateAntiquaryBellatrix(t *testing.T) { t.Skip() - // t.Skip() blocks, preState, postState := tests.GetBellatrixRandom() runTest(t, blocks, preState, postState) } diff --git a/cl/persistence/state/minimal_state.go b/cl/persistence/state/minimal_state.go index b22923767b2..7c7961fc763 100644 --- a/cl/persistence/state/minimal_state.go +++ b/cl/persistence/state/minimal_state.go @@ -7,7 +7,7 @@ import ( "github.com/ledgerwatch/erigon/cl/clparams" "github.com/ledgerwatch/erigon/cl/cltypes" - "github.com/ledgerwatch/erigon/cl/phase1/core/state/raw" + "github.com/ledgerwatch/erigon/cl/phase1/core/state" ssz2 "github.com/ledgerwatch/erigon/cl/ssz" ) @@ -21,6 +21,7 @@ type MinimalBeaconState struct { CurrentEpochAttestationsLength uint64 HistoricalSummariesLength uint64 HistoricalRootsLength uint64 + TotalActiveBalance uint64 // Phase0 Eth1Data *cltypes.Eth1Data Eth1DepositIndex uint64 @@ -31,7 +32,7 @@ type MinimalBeaconState struct { NextWithdrawalValidatorIndex uint64 } -func MinimalBeaconStateFromBeaconState(s *raw.BeaconState) *MinimalBeaconState { +func MinimalBeaconStateFromBeaconState(s *state.CachingBeaconState) *MinimalBeaconState { justificationCopy := &cltypes.JustificationBits{} jj := s.JustificationBits() copy(justificationCopy[:], jj[:]) @@ -49,8 +50,8 @@ func MinimalBeaconStateFromBeaconState(s *raw.BeaconState) *MinimalBeaconState { JustificationBits: justificationCopy, NextWithdrawalIndex: s.NextWithdrawalIndex(), NextWithdrawalValidatorIndex: s.NextWithdrawalValidatorIndex(), + TotalActiveBalance: s.GetTotalActiveBalance(), } - } // Serialize serializes the state into a byte slice with zstd compression. @@ -106,7 +107,7 @@ func (m *MinimalBeaconState) ReadFrom(r io.Reader) error { } func (m *MinimalBeaconState) getSchema() []interface{} { - schema := []interface{}{m.Eth1Data, m.Fork, &m.Eth1DepositIndex, m.JustificationBits, &m.ValidatorLength, &m.Eth1DataLength, &m.PreviousEpochAttestationsLength, &m.CurrentEpochAttestationsLength, &m.HistoricalSummariesLength, &m.HistoricalRootsLength} + schema := []interface{}{m.Eth1Data, &m.TotalActiveBalance, m.Fork, &m.Eth1DepositIndex, m.JustificationBits, &m.ValidatorLength, &m.Eth1DataLength, &m.PreviousEpochAttestationsLength, &m.CurrentEpochAttestationsLength, &m.HistoricalSummariesLength, &m.HistoricalRootsLength} if m.Version >= clparams.CapellaVersion { schema = append(schema, &m.NextWithdrawalIndex, &m.NextWithdrawalValidatorIndex) } diff --git a/cl/persistence/state/state_accessors.go b/cl/persistence/state/state_accessors.go index 60bbfda059e..f92ed45cff0 100644 --- a/cl/persistence/state/state_accessors.go +++ b/cl/persistence/state/state_accessors.go @@ -243,7 +243,13 @@ func ReadCurrentEpochAttestations(tx kv.Tx, slot uint64, limit int) (*solid.List return nil, err } if len(v) == 0 { - return nil, nil + has, err := tx.Has(kv.CurrentEpochAttestations, base_encoding.Encode64ToBytes4(slot)) + if err != nil { + return nil, err + } + if !has { + return nil, nil + } } attestations := solid.NewDynamicListSSZ[*solid.PendingAttestation](limit) reader, err := zstd.NewReader(bytes.NewReader(v)) @@ -267,7 +273,13 @@ func ReadPreviousEpochAttestations(tx kv.Tx, slot uint64, limit int) (*solid.Lis return nil, err } if len(v) == 0 { - return nil, nil + has, err := tx.Has(kv.PreviousEpochAttestations, base_encoding.Encode64ToBytes4(slot)) + if err != nil { + return nil, err + } + if !has { + return nil, nil + } } attestations := solid.NewDynamicListSSZ[*solid.PendingAttestation](limit) reader, err := zstd.NewReader(bytes.NewReader(v)) @@ -312,5 +324,17 @@ func ReadValidatorsTable(tx kv.Tx, out *StaticValidatorTable) error { } out.slot = slot return err +} +func ReadActiveIndicies(tx kv.Tx, epoch uint64) ([]uint64, error) { + key := base_encoding.Encode64ToBytes4(epoch) + v, err := tx.GetOne(kv.ActiveValidatorIndicies, key) + if err != nil { + return nil, err + } + if len(v) == 0 { + return nil, nil + } + buf := bytes.NewBuffer(v) + return base_encoding.ReadRabbits(nil, buf) } diff --git a/cl/phase1/core/state/accessors.go b/cl/phase1/core/state/accessors.go index e5faa8e2eb8..14d6d74c03d 100644 --- a/cl/phase1/core/state/accessors.go +++ b/cl/phase1/core/state/accessors.go @@ -82,12 +82,9 @@ func InactivityLeaking(b abstract.BeaconState) bool { } // IsUnslashedParticipatingIndex -func IsUnslashedParticipatingIndex(b abstract.BeaconState, epoch, index uint64, flagIdx int) bool { - validator, err := b.ValidatorForValidatorIndex(int(index)) - if err != nil { - return false - } - return validator.Active(epoch) && cltypes.ParticipationFlags(b.EpochParticipation(false).Get(int(index))).HasFlag(flagIdx) && !validator.Slashed() +func IsUnslashedParticipatingIndex(validatorSet *solid.ValidatorSet, previousEpochParticipation *solid.BitList, epoch, index uint64, flagIdx int) bool { + validator := validatorSet.Get(int(index)) + return validator.Active(epoch) && cltypes.ParticipationFlags(previousEpochParticipation.Get(int(index))).HasFlag(flagIdx) && !validator.Slashed() } // EligibleValidatorsIndicies Implementation of get_eligible_validator_indices as defined in the eth 2.0 specs. diff --git a/cl/phase1/core/state/raw/getters.go b/cl/phase1/core/state/raw/getters.go index a1676714b28..9d8fc435548 100644 --- a/cl/phase1/core/state/raw/getters.go +++ b/cl/phase1/core/state/raw/getters.go @@ -84,6 +84,14 @@ func (b *BeaconState) Eth1DepositIndex() uint64 { return b.eth1DepositIndex } +func (b *BeaconState) ValidatorSet() *solid.ValidatorSet { + return b.validators +} + +func (b *BeaconState) PreviousEpochParticipation() *solid.BitList { + return b.previousEpochParticipation +} + func (b *BeaconState) ValidatorLength() int { return b.validators.Length() } diff --git a/cl/phase1/stages/clstages.go b/cl/phase1/stages/clstages.go index bbf1da29c8b..87a40186a37 100644 --- a/cl/phase1/stages/clstages.go +++ b/cl/phase1/stages/clstages.go @@ -98,7 +98,6 @@ func ClStagesCfg( type StageName = string const ( - WaitForPeers StageName = "WaitForPeers" CatchUpEpochs StageName = "CatchUpEpochs" CatchUpBlocks StageName = "CatchUpBlocks" ForkChoice StageName = "ForkChoice" @@ -113,9 +112,6 @@ const ( ) func MetaCatchingUp(args Args) StageName { - if args.peers < minPeersForDownload { - return WaitForPeers - } if !args.hasDownloaded { return DownloadHistoricalBlocks } @@ -218,39 +214,6 @@ func ConsensusClStages(ctx context.Context, return }, Stages: map[string]clstages.Stage[*Cfg, Args]{ - WaitForPeers: { - Description: `wait for enough peers. This is also a safe stage to go to when unsure of what stage to use`, - TransitionFunc: func(cfg *Cfg, args Args, err error) string { - if x := MetaCatchingUp(args); x != "" { - return x - } - return CatchUpBlocks - }, - ActionFunc: func(ctx context.Context, logger log.Logger, cfg *Cfg, args Args) error { - peersCount, err := cfg.rpc.Peers() - if err != nil { - return nil - } - waitWhenNotEnoughPeers := 3 * time.Second - for { - if peersCount >= minPeersForDownload { - break - } - select { - case <-ctx.Done(): - return ctx.Err() - default: - } - logger.Info("[Caplin] Waiting For Peers", "have", peersCount, "needed", minPeersForDownload, "retryIn", waitWhenNotEnoughPeers) - time.Sleep(waitWhenNotEnoughPeers) - peersCount, err = cfg.rpc.Peers() - if err != nil { - peersCount = 0 - } - } - return nil - }, - }, DownloadHistoricalBlocks: { Description: "Download historical blocks", TransitionFunc: func(cfg *Cfg, args Args, err error) string { @@ -369,7 +332,7 @@ func ConsensusClStages(ctx context.Context, ) respCh := make(chan *peers.PeeredObject[[]*cltypes.SignedBeaconBlock]) errCh := make(chan error) - sources := []persistence.BlockSource{gossipSource} + sources := []persistence.BlockSource{gossipSource, rpcSource} // if we are more than one block behind, we request the rpc source as well if totalRequest > 2 { @@ -387,28 +350,64 @@ func ConsensusClStages(ctx context.Context, // we go ask all the sources and see who gets back to us first. whoever does is the winner!! for _, v := range sources { sourceFunc := v.GetRange - go func() { + go func(source persistence.BlockSource) { + if _, ok := source.(*persistence.BeaconRpcSource); ok { + time.Sleep(2 * time.Second) + var blocks *peers.PeeredObject[[]*cltypes.SignedBeaconBlock] + Loop: + for { + from := args.seenSlot - 2 + currentSlot := utils.GetCurrentSlot(cfg.genesisCfg.GenesisTime, cfg.beaconCfg.SecondsPerSlot) + count := (currentSlot - from) + 2 + if currentSlot <= cfg.forkChoice.HighestSeen() { + time.Sleep(100 * time.Millisecond) + continue + } + blocks, err = sourceFunc(ctx, tx, from, count) + if err != nil { + errCh <- err + return + } + for _, block := range blocks.Data { + if block.Block.Slot >= currentSlot { + break Loop + } + } + } + respCh <- blocks + return + } blocks, err := sourceFunc(ctx, tx, args.seenSlot+1, totalRequest) if err != nil { errCh <- err return } respCh <- blocks - }() + }(v) } logTimer := time.NewTicker(30 * time.Second) defer logTimer.Stop() - select { - case err := <-errCh: - return err - case blocks := <-respCh: - for _, block := range blocks.Data { - if err := processBlock(tx, block, true, true); err != nil { - return err + MainLoop: + for { + select { + case <-ctx.Done(): + return errors.New("timeout waiting for blocks") + case err := <-errCh: + return err + case blocks := <-respCh: + for _, block := range blocks.Data { + if err := processBlock(tx, block, true, true); err != nil { + log.Error("bad blocks segment received", "err", err) + cfg.rpc.BanPeer(blocks.Peer) + continue MainLoop + } + if block.Block.Slot >= args.targetSlot { + break MainLoop + } } + case <-logTimer.C: + logger.Info("[Caplin] Progress", "progress", cfg.forkChoice.HighestSeen(), "from", args.seenSlot, "to", args.targetSlot) } - case <-logTimer.C: - logger.Info("[Caplin] Progress", "progress", cfg.forkChoice.HighestSeen(), "from", args.seenEpoch, "to", args.targetSlot) } return tx.Commit() }, @@ -620,7 +619,10 @@ func ConsensusClStages(ctx context.Context, SleepForSlot: { Description: `sleep until the next slot`, TransitionFunc: func(cfg *Cfg, args Args, err error) string { - return WaitForPeers + if x := MetaCatchingUp(args); x != "" { + return x + } + return ListenForForks }, ActionFunc: func(ctx context.Context, logger log.Logger, cfg *Cfg, args Args) error { nextSlot := args.seenSlot + 1 diff --git a/cl/spectest/consensus_tests/epoch_processing.go b/cl/spectest/consensus_tests/epoch_processing.go index 390c2ae4289..8fea8841bbd 100644 --- a/cl/spectest/consensus_tests/epoch_processing.go +++ b/cl/spectest/consensus_tests/epoch_processing.go @@ -1,12 +1,14 @@ package consensus_tests import ( - "github.com/ledgerwatch/erigon/spectest" "io/fs" "os" "testing" + "github.com/ledgerwatch/erigon/spectest" + "github.com/ledgerwatch/erigon/cl/abstract" + "github.com/ledgerwatch/erigon/cl/clparams" "github.com/ledgerwatch/erigon/cl/phase1/core/state" "github.com/ledgerwatch/erigon/cl/transition/impl/eth2/statechange" @@ -66,7 +68,11 @@ var historicalRootsUpdateTest = NewEpochProcessing(func(s abstract.BeaconState) }) var inactivityUpdateTest = NewEpochProcessing(func(s abstract.BeaconState) error { - return statechange.ProcessInactivityScores(s, state.EligibleValidatorsIndicies(s), statechange.GetUnslashedIndiciesSet(s)) + var unslashedIndiciesSet [][]bool + if s.Version() >= clparams.AltairVersion { + unslashedIndiciesSet = statechange.GetUnslashedIndiciesSet(s.BeaconConfig(), state.PreviousEpoch(s), s.ValidatorSet(), s.PreviousEpochParticipation()) + } + return statechange.ProcessInactivityScores(s, state.EligibleValidatorsIndicies(s), unslashedIndiciesSet) }) var justificationFinalizationTest = NewEpochProcessing(func(s abstract.BeaconState) error { @@ -91,7 +97,11 @@ var registryUpdatesTest = NewEpochProcessing(func(s abstract.BeaconState) error }) var rewardsAndPenaltiesTest = NewEpochProcessing(func(s abstract.BeaconState) error { - return statechange.ProcessRewardsAndPenalties(s, state.EligibleValidatorsIndicies(s), statechange.GetUnslashedIndiciesSet(s)) + var unslashedIndiciesSet [][]bool + if s.Version() >= clparams.AltairVersion { + unslashedIndiciesSet = statechange.GetUnslashedIndiciesSet(s.BeaconConfig(), state.PreviousEpoch(s), s.ValidatorSet(), s.PreviousEpochParticipation()) + } + return statechange.ProcessRewardsAndPenalties(s, state.EligibleValidatorsIndicies(s), unslashedIndiciesSet) }) var slashingsTest = NewEpochProcessing(func(s abstract.BeaconState) error { diff --git a/cl/transition/impl/eth2/statechange/process_epoch.go b/cl/transition/impl/eth2/statechange/process_epoch.go index 304a218ebc7..f42c5a1263d 100644 --- a/cl/transition/impl/eth2/statechange/process_epoch.go +++ b/cl/transition/impl/eth2/statechange/process_epoch.go @@ -7,20 +7,16 @@ import ( "github.com/ledgerwatch/erigon/cl/phase1/core/state" ) -func GetUnslashedIndiciesSet(s abstract.BeaconState) [][]bool { - if s.Version() == clparams.Phase0Version { - return nil - } - weights := s.BeaconConfig().ParticipationWeights() +func GetUnslashedIndiciesSet(cfg *clparams.BeaconChainConfig, previousEpoch uint64, validatorSet *solid.ValidatorSet, previousEpochPartecipation *solid.BitList) [][]bool { + weights := cfg.ParticipationWeights() flagsUnslashedIndiciesSet := make([][]bool, len(weights)) for i := range weights { - flagsUnslashedIndiciesSet[i] = make([]bool, s.ValidatorLength()) + flagsUnslashedIndiciesSet[i] = make([]bool, validatorSet.Length()) } - previousEpoch := state.PreviousEpoch(s) - s.ForEachValidator(func(validator solid.Validator, validatorIndex, total int) bool { + validatorSet.Range(func(validatorIndex int, validator solid.Validator, total int) bool { for i := range weights { - flagsUnslashedIndiciesSet[i][validatorIndex] = state.IsUnslashedParticipatingIndex(s, previousEpoch, uint64(validatorIndex), i) + flagsUnslashedIndiciesSet[i][validatorIndex] = state.IsUnslashedParticipatingIndex(validatorSet, previousEpochPartecipation, previousEpoch, uint64(validatorIndex), i) } return true }) @@ -31,8 +27,10 @@ func GetUnslashedIndiciesSet(s abstract.BeaconState) [][]bool { func ProcessEpoch(s abstract.BeaconState) error { eligibleValidators := state.EligibleValidatorsIndicies(s) // start := time.Now() - - unslashedIndiciesSet := GetUnslashedIndiciesSet(s) + var unslashedIndiciesSet [][]bool + if s.Version() >= clparams.AltairVersion { + unslashedIndiciesSet = GetUnslashedIndiciesSet(s.BeaconConfig(), state.PreviousEpoch(s), s.ValidatorSet(), s.PreviousEpochParticipation()) + } if err := ProcessJustificationBitsAndFinality(s, unslashedIndiciesSet); err != nil { return err } diff --git a/cl/transition/impl/eth2/statechange/process_epoch_test.go b/cl/transition/impl/eth2/statechange/process_epoch_test.go index 18c7377afff..98970ce9985 100644 --- a/cl/transition/impl/eth2/statechange/process_epoch_test.go +++ b/cl/transition/impl/eth2/statechange/process_epoch_test.go @@ -91,7 +91,11 @@ var startingSlashingsResetState []byte func TestProcessRewardsAndPenalties(t *testing.T) { runEpochTransitionConsensusTest(t, startingRewardsPenaltyState, expectedRewardsPenaltyState, func(s abstract.BeaconState) error { - return ProcessRewardsAndPenalties(s, state.EligibleValidatorsIndicies(s), GetUnslashedIndiciesSet(s)) + var unslashedIndiciesSet [][]bool + if s.Version() >= clparams.AltairVersion { + unslashedIndiciesSet = GetUnslashedIndiciesSet(s.BeaconConfig(), state.PreviousEpoch(s), s.ValidatorSet(), s.PreviousEpochParticipation()) + } + return ProcessRewardsAndPenalties(s, state.EligibleValidatorsIndicies(s), unslashedIndiciesSet) }) } @@ -161,6 +165,11 @@ var startingInactivityScoresState []byte func TestInactivityScores(t *testing.T) { runEpochTransitionConsensusTest(t, startingInactivityScoresState, expectedInactivityScoresState, func(s abstract.BeaconState) error { - return ProcessInactivityScores(s, state.EligibleValidatorsIndicies(s), GetUnslashedIndiciesSet(s)) + var unslashedIndiciesSet [][]bool + if s.Version() >= clparams.AltairVersion { + unslashedIndiciesSet = GetUnslashedIndiciesSet(s.BeaconConfig(), state.PreviousEpoch(s), s.ValidatorSet(), s.PreviousEpochParticipation()) + } + + return ProcessInactivityScores(s, state.EligibleValidatorsIndicies(s), unslashedIndiciesSet) }) } diff --git a/cmd/caplin/caplin1/run.go b/cmd/caplin/caplin1/run.go index 9a2f7a63230..239e4f51a5e 100644 --- a/cmd/caplin/caplin1/run.go +++ b/cmd/caplin/caplin1/run.go @@ -229,7 +229,7 @@ func RunCaplinPhase1(ctx context.Context, sentinel sentinel.SentinelClient, engi sync := stages.ConsensusClStages(ctx, stageCfg) logger.Info("[Caplin] starting clstages loop") - err = sync.StartWithStage(ctx, "WaitForPeers", logger, stageCfg) + err = sync.StartWithStage(ctx, "DownloadHistoricalBlocks", logger, stageCfg) logger.Info("[Caplin] exiting clstages loop") if err != nil { return err diff --git a/erigon-lib/kv/tables.go b/erigon-lib/kv/tables.go index 6ccdc45ef03..0285a584de7 100644 --- a/erigon-lib/kv/tables.go +++ b/erigon-lib/kv/tables.go @@ -469,6 +469,7 @@ const ( ValidatorBalance = "ValidatorBalance" StaticValidators = "StaticValidators" StateEvents = "StateEvents" + ActiveValidatorIndicies = "ActiveValidatorIndicies" // External data StateRoot = "StateRoot" @@ -679,6 +680,7 @@ var ChaindataTables = []string{ PreviousEpochAttestations, Eth1DataVotes, IntraRandaoMixes, + ActiveValidatorIndicies, } const (