From 141d656ac6466be752cc558fe3bfdf57faebc2cc Mon Sep 17 00:00:00 2001 From: pablomendezroyo Date: Tue, 26 Aug 2025 13:14:05 +0200 Subject: [PATCH 1/2] Add justified epoch to notification --- internal/adapters/notifier/notifier.go | 6 +++--- internal/application/ports/notifier.go | 6 +++--- internal/application/services/dutieschecker_service.go | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/internal/adapters/notifier/notifier.go b/internal/adapters/notifier/notifier.go index 24f6b3b..2d81aa7 100644 --- a/internal/adapters/notifier/notifier.go +++ b/internal/adapters/notifier/notifier.go @@ -105,7 +105,7 @@ func (n *Notifier) sendNotification(payload NotificationPayload) error { } // SendValidatorLivenessNot sends a notification when one or more validators go offline or online. -func (n *Notifier) SendValidatorLivenessNot(validators []domain.ValidatorIndex, live bool) error { +func (n *Notifier) SendValidatorLivenessNot(validators []domain.ValidatorIndex, epoch domain.Epoch, live bool) error { var title, body string var priority Priority var status Status @@ -147,7 +147,7 @@ func (n *Notifier) SendValidatorLivenessNot(validators []domain.ValidatorIndex, } // SendValidatorsSlashedNot sends a notification when one or more validators are slashed. -func (n *Notifier) SendValidatorsSlashedNot(validators []domain.ValidatorIndex) error { +func (n *Notifier) SendValidatorsSlashedNot(validators []domain.ValidatorIndex, epoch domain.Epoch) error { title := fmt.Sprintf("Validator(s) Slashed: %s", indexesToString(validators, true)) body := fmt.Sprintf("🚨 Validator(s) %s have been slashed on %s! Immediate attention required.", indexesToString(validators, true), n.Network) priority := Critical @@ -174,7 +174,7 @@ func (n *Notifier) SendValidatorsSlashedNot(validators []domain.ValidatorIndex) } // SendBlockProposalNot sends a notification when a block is proposed or missed by one or more validators. -func (n *Notifier) SendBlockProposalNot(validators []domain.ValidatorIndex, epoch int, proposed bool) error { +func (n *Notifier) SendBlockProposalNot(validators []domain.ValidatorIndex, epoch domain.Epoch, proposed bool) error { var title, body string var priority Priority var status Status = Triggered diff --git a/internal/application/ports/notifier.go b/internal/application/ports/notifier.go index fd6f4bd..d67a1f8 100644 --- a/internal/application/ports/notifier.go +++ b/internal/application/ports/notifier.go @@ -3,7 +3,7 @@ package ports import "github.com/dappnode/validator-tracker/internal/application/domain" type NotifierPort interface { - SendValidatorLivenessNot(validators []domain.ValidatorIndex, live bool) error - SendValidatorsSlashedNot(validators []domain.ValidatorIndex) error - SendBlockProposalNot(validators []domain.ValidatorIndex, epoch int, proposed bool) error + SendValidatorLivenessNot(validators []domain.ValidatorIndex, epoch domain.Epoch, live bool) error + SendValidatorsSlashedNot(validators []domain.ValidatorIndex, epoch domain.Epoch) error + SendBlockProposalNot(validators []domain.ValidatorIndex, epoch domain.Epoch, proposed bool) error } diff --git a/internal/application/services/dutieschecker_service.go b/internal/application/services/dutieschecker_service.go index fcc22ee..10a670f 100644 --- a/internal/application/services/dutieschecker_service.go +++ b/internal/application/services/dutieschecker_service.go @@ -99,7 +99,7 @@ func (a *DutiesChecker) performChecks(ctx context.Context, justifiedEpoch domain if len(offline) > 0 && a.PreviouslyAllLive { if notificationsEnabled[domain.Notifications.Liveness] { logger.Debug("Sending notification for validators going offline: %v", offline) - if err := a.Notifier.SendValidatorLivenessNot(offline, false); err != nil { + if err := a.Notifier.SendValidatorLivenessNot(offline, justifiedEpoch, false); err != nil { logger.Warn("Error sending validator liveness notification: %v", err) } } @@ -111,7 +111,7 @@ func (a *DutiesChecker) performChecks(ctx context.Context, justifiedEpoch domain if allLive && a.PreviouslyOffline { if notificationsEnabled[domain.Notifications.Liveness] { logger.Debug("Sending notification for all validators back online: %v", indices) - if err := a.Notifier.SendValidatorLivenessNot(indices, true); err != nil { + if err := a.Notifier.SendValidatorLivenessNot(indices, justifiedEpoch, true); err != nil { logger.Warn("Error sending validator liveness notification: %v", err) } } @@ -126,12 +126,12 @@ func (a *DutiesChecker) performChecks(ctx context.Context, justifiedEpoch domain return err } if len(proposed) > 0 && notificationsEnabled[domain.Notifications.Proposal] { - if err := a.Notifier.SendBlockProposalNot(proposed, int(justifiedEpoch), true); err != nil { + if err := a.Notifier.SendBlockProposalNot(proposed, justifiedEpoch, true); err != nil { logger.Warn("Error sending block proposal notification: %v", err) } } if len(missed) > 0 && notificationsEnabled[domain.Notifications.Proposal] { - if err := a.Notifier.SendBlockProposalNot(missed, int(justifiedEpoch), false); err != nil { + if err := a.Notifier.SendBlockProposalNot(missed, justifiedEpoch, false); err != nil { logger.Warn("Error sending block proposal notification: %v", err) } } @@ -153,7 +153,7 @@ func (a *DutiesChecker) performChecks(ctx context.Context, justifiedEpoch domain } if len(toNotify) > 0 && notificationsEnabled[domain.Notifications.Slashed] { - if err := a.Notifier.SendValidatorsSlashedNot(toNotify); err != nil { + if err := a.Notifier.SendValidatorsSlashedNot(toNotify, justifiedEpoch); err != nil { logger.Warn("Error sending validator slashed notification: %v", err) } } From 7963db4117a14121822de7c112bd0b2afcb3126b Mon Sep 17 00:00:00 2001 From: pablomendezroyo Date: Tue, 26 Aug 2025 13:16:31 +0200 Subject: [PATCH 2/2] mention epoch in noti --- internal/adapters/notifier/notifier.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/adapters/notifier/notifier.go b/internal/adapters/notifier/notifier.go index 2d81aa7..c670230 100644 --- a/internal/adapters/notifier/notifier.go +++ b/internal/adapters/notifier/notifier.go @@ -121,13 +121,13 @@ func (n *Notifier) SendValidatorLivenessNot(validators []domain.ValidatorIndex, } if live { title = fmt.Sprintf("All validators back online (%d)", len(validators)) - body = fmt.Sprintf("✅ All validators are back online and atesting on %s (%d).", n.Network, len(validators)) + body = fmt.Sprintf("✅ All validators are back online and atesting at epoch %d on %s (%d).", epoch, n.Network, len(validators)) priority = Low status = Resolved isBanner = false } else { title = fmt.Sprintf("Validator(s) Offline: %s", indexesToString(validators, true)) - body = fmt.Sprintf("❌ Validator(s) %s are not attesting on %s.", indexesToString(validators, true), n.Network) + body = fmt.Sprintf("❌ Validator(s) %s are not attesting at epoch %d on %s.", indexesToString(validators, true), epoch, n.Network) priority = High status = Triggered isBanner = true @@ -149,7 +149,7 @@ func (n *Notifier) SendValidatorLivenessNot(validators []domain.ValidatorIndex, // SendValidatorsSlashedNot sends a notification when one or more validators are slashed. func (n *Notifier) SendValidatorsSlashedNot(validators []domain.ValidatorIndex, epoch domain.Epoch) error { title := fmt.Sprintf("Validator(s) Slashed: %s", indexesToString(validators, true)) - body := fmt.Sprintf("🚨 Validator(s) %s have been slashed on %s! Immediate attention required.", indexesToString(validators, true), n.Network) + body := fmt.Sprintf("🚨 Validator(s) %s have been slashed at epoch %d on %s! Immediate attention required.", indexesToString(validators, true), epoch, n.Network) priority := Critical status := Triggered isBanner := true