diff --git a/bindings/utils/state/megapool.go b/bindings/utils/state/megapool.go index 8787570d7..3154aeb5b 100644 --- a/bindings/utils/state/megapool.go +++ b/bindings/utils/state/megapool.go @@ -44,6 +44,9 @@ type NativeMegapoolDetails struct { // Get the normalized bond per 32 eth validator // This is used in treegen to calculate attestation scores func (m *NativeMegapoolDetails) GetMegapoolBondNormalized() *big.Int { + if m.ActiveValidatorCount == 0 { + return big.NewInt(0) + } return big.NewInt(0).Div(m.NodeBond, big.NewInt(int64(m.ActiveValidatorCount))) } diff --git a/shared/services/rewards/generator-impl-v11.go b/shared/services/rewards/generator-impl-v11.go index a8928fbb2..79ef8468b 100644 --- a/shared/services/rewards/generator-impl-v11.go +++ b/shared/services/rewards/generator-impl-v11.go @@ -580,12 +580,16 @@ func (r *treeGeneratorImpl_v11) calculateEthRewards(checkBeaconPerformance bool) // Repeat, for megapools if nodeInfo.Megapool != nil { megapool := nodeInfo.Megapool + details := r.networkState.MegapoolDetails[megapool.Address] + // Skip megapools with no active validators (all exited/dissolved) + if details.ActiveValidatorCount == 0 { + continue + } + nodeFee := r.networkState.NetworkDetails.MegapoolRevenueSplitTimeWeightedAverages.NodeShare + voterFee := r.networkState.NetworkDetails.MegapoolRevenueSplitTimeWeightedAverages.VoterShare + pdaoFee := r.networkState.NetworkDetails.MegapoolRevenueSplitTimeWeightedAverages.PdaoShare + bond := details.GetMegapoolBondNormalized() for _, validator := range megapool.Validators { - details := r.networkState.MegapoolDetails[megapool.Address] - bond := details.GetMegapoolBondNormalized() - nodeFee := r.networkState.NetworkDetails.MegapoolRevenueSplitTimeWeightedAverages.NodeShare - voterFee := r.networkState.NetworkDetails.MegapoolRevenueSplitTimeWeightedAverages.VoterShare - pdaoFee := r.networkState.NetworkDetails.MegapoolRevenueSplitTimeWeightedAverages.PdaoShare // The megapool score is given by: // (bond + effectiveNodeFee*(32-bond)) / 32