From 40f7edbf5f32a9c90f5515a9d5a603d1b9375069 Mon Sep 17 00:00:00 2001 From: Fornax <23104993+fornax2@users.noreply.github.com> Date: Mon, 1 Jun 2026 17:08:18 -0300 Subject: [PATCH] Checks which validator states should be considered and use skimmable amount to avoid negative values on the rewards estimate --- rocketpool/node/collectors/node-collector.go | 31 +++++++++++++------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/rocketpool/node/collectors/node-collector.go b/rocketpool/node/collectors/node-collector.go index 208a2522a..32b6cf526 100644 --- a/rocketpool/node/collectors/node-collector.go +++ b/rocketpool/node/collectors/node-collector.go @@ -650,26 +650,37 @@ func (collector *NodeCollector) Collect(channel chan<- prometheus.Metric) { megapoolPendingRewardsPDAO = eth.WeiToEth(mpPendingRewards.ProtocolDAORewards) megapoolPendingRewardsReth = eth.WeiToEth(mpPendingRewards.RethRewards) - // Iterate over the megapool pubkeys + currentEpoch := state.BeaconConfig.SlotToEpoch(state.BeaconSlotNumber) + totalEffectiveBeaconBalance := big.NewInt(0) for _, pubkey := range megapoolPubkeys { + info, infoExists := state.MegapoolValidatorInfo[pubkey] + if !infoExists { + continue + } + if !info.ValidatorInfo.Staked || info.ValidatorInfo.Exited || info.ValidatorInfo.Exiting { + continue + } validator, exists := state.MegapoolValidatorDetails[pubkey] if !exists { continue } - if validator.Balance > uint64(0) { - megapoolBeaconBalanceTotal.Add(megapoolBeaconBalanceTotal, eth.GweiToWei(float64(validator.Balance))) + // Skip validators that haven't activated yet + if currentEpoch <= validator.ActivationEpoch { + continue } + megapoolBeaconBalanceTotal.Add(megapoolBeaconBalanceTotal, eth.GweiToWei(float64(validator.Balance))) + totalEffectiveBeaconBalance.Add(totalEffectiveBeaconBalance, eth.GweiToWei(float64(validator.EffectiveBalance))) } megapoolBeaconBalance = eth.WeiToEth(megapoolBeaconBalanceTotal) - // rewards = beacon balance total - node bond - user capital - rewardsBeaconBalance := big.NewInt(0).Sub(megapoolBeaconBalanceTotal, megapoolDetails.NodeBond) - rewardsBeaconBalance = big.NewInt(0).Sub(rewardsBeaconBalance, megapoolDetails.UserCapital) - rewardsSplit, err := mp.CalculateRewards(rewardsBeaconBalance, nil) - if err != nil { - return fmt.Errorf("Error calculating megapool rewards: %w", err) + if megapoolBeaconBalanceTotal.Cmp(totalEffectiveBeaconBalance) > 0 { + toBeSkimmed := big.NewInt(0).Sub(megapoolBeaconBalanceTotal, totalEffectiveBeaconBalance) + rewardsSplit, err := mp.CalculateRewards(toBeSkimmed, nil) + if err != nil { + return fmt.Errorf("Error calculating megapool rewards: %w", err) + } + nodeShareofBeaconBalance = eth.WeiToEth(big.NewInt(0).Add(rewardsSplit.NodeRewards, megapoolDetails.NodeBond)) } - nodeShareofBeaconBalance = eth.WeiToEth(rewardsSplit.NodeRewards.Add(rewardsSplit.NodeRewards, megapoolDetails.NodeBond)) return nil })