From bf04cae0ced9a8ff23fa96a835ca8edf94f7a3be Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 14 Oct 2025 09:08:19 +0000 Subject: [PATCH 1/3] Initial plan From c29c406371bf4d9f3b56f594a95d81a0b302ff2a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 14 Oct 2025 09:14:48 +0000 Subject: [PATCH 2/3] Implement configurable DutiesChecker poll interval via environment variable Co-authored-by: Marketen <36164126+Marketen@users.noreply.github.com> --- cmd/main.go | 2 +- internal/config/config_loader.go | 45 ++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index 3a30cd7..959716f 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -62,7 +62,7 @@ func main() { Brain: brain, Notifier: notifier, Dappmanager: dappmanager, - PollInterval: 1 * time.Minute, + PollInterval: time.Duration(cfg.PollIntervalSeconds) * time.Second, SlashedNotified: make(map[domain.ValidatorIndex]bool), PreviouslyAllLive: true, // assume all validators were live at start PreviouslyOffline: false, diff --git a/internal/config/config_loader.go b/internal/config/config_loader.go index b2b083c..33b27a7 100644 --- a/internal/config/config_loader.go +++ b/internal/config/config_loader.go @@ -3,20 +3,22 @@ package config import ( "fmt" "os" + "strconv" "strings" "github.com/dappnode/validator-tracker/internal/logger" ) type Config struct { - BeaconEndpoint string - Web3SignerEndpoint string - Network string - SignerDnpName string - BeaconchaUrl string - DappmanagerUrl string - NotifierUrl string - BrainUrl string + BeaconEndpoint string + Web3SignerEndpoint string + Network string + SignerDnpName string + BeaconchaUrl string + DappmanagerUrl string + NotifierUrl string + BrainUrl string + PollIntervalSeconds int } func LoadConfig() Config { @@ -49,6 +51,16 @@ func LoadConfig() Config { brainEndpoint = envBrain } + // Load poll interval for duties checker + pollIntervalSeconds := 60 // default to 60 seconds + if envPollInterval := os.Getenv("DUTIES_CHECKER_POLL_INTERVAL_SECONDS"); envPollInterval != "" { + if parsed, err := strconv.Atoi(envPollInterval); err == nil && parsed > 0 { + pollIntervalSeconds = parsed + } else { + logger.Warn("Invalid DUTIES_CHECKER_POLL_INTERVAL_SECONDS value '%s', using default 60 seconds", envPollInterval) + } + } + // Normalize network name for logs network = strings.ToLower(network) if network != "hoodi" && network != "holesky" && network != "mainnet" && network != "gnosis" && network != "lukso" { @@ -80,13 +92,14 @@ func LoadConfig() Config { } return Config{ - BeaconEndpoint: beaconEndpoint, - Web3SignerEndpoint: web3SignerEndpoint, - Network: network, - SignerDnpName: dnpName, - BeaconchaUrl: beaconchaUrl, - DappmanagerUrl: dappmanagerEndpoint, - NotifierUrl: notifierEndpoint, - BrainUrl: brainEndpoint, + BeaconEndpoint: beaconEndpoint, + Web3SignerEndpoint: web3SignerEndpoint, + Network: network, + SignerDnpName: dnpName, + BeaconchaUrl: beaconchaUrl, + DappmanagerUrl: dappmanagerEndpoint, + NotifierUrl: notifierEndpoint, + BrainUrl: brainEndpoint, + PollIntervalSeconds: pollIntervalSeconds, } } From 30ac87bd4955a26ec22ccffad4efeba9404d226d Mon Sep 17 00:00:00 2001 From: Marketen Date: Tue, 14 Oct 2025 11:35:30 +0200 Subject: [PATCH 3/3] default to 30s if gnosis --- internal/config/config_loader.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/internal/config/config_loader.go b/internal/config/config_loader.go index 33b27a7..0c4a1ce 100644 --- a/internal/config/config_loader.go +++ b/internal/config/config_loader.go @@ -24,7 +24,7 @@ type Config struct { func LoadConfig() Config { network := os.Getenv("NETWORK") if network == "" { - network = "hoodi" // default + network = "mainnet" } // Build the dynamic endpoints @@ -52,12 +52,17 @@ func LoadConfig() Config { } // Load poll interval for duties checker - pollIntervalSeconds := 60 // default to 60 seconds + var pollIntervalSeconds int + if network == "gnosis" { + pollIntervalSeconds = 30 // default to 30 seconds for gnosis + } else { + pollIntervalSeconds = 60 // default to 60 seconds for other networks + } if envPollInterval := os.Getenv("DUTIES_CHECKER_POLL_INTERVAL_SECONDS"); envPollInterval != "" { if parsed, err := strconv.Atoi(envPollInterval); err == nil && parsed > 0 { pollIntervalSeconds = parsed } else { - logger.Warn("Invalid DUTIES_CHECKER_POLL_INTERVAL_SECONDS value '%s', using default 60 seconds", envPollInterval) + logger.Warn("Invalid DUTIES_CHECKER_POLL_INTERVAL_SECONDS value '%s', using default %d seconds", envPollInterval, pollIntervalSeconds) } }