Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import (
func main() {
// Load config
cfg := config.LoadConfig()
logger.Info("Loaded e config: network=%s, beaconEndpoint=%s, web3SignerEndpoint=%s",
logger.Info("Loaded config: network=%s, beaconEndpoint=%s, web3SignerEndpoint=%s",
cfg.Network, cfg.BeaconEndpoint, cfg.Web3SignerEndpoint)

// Initialize adapters
Expand Down
22 changes: 18 additions & 4 deletions internal/adapters/web3signer/web3signer.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package web3signer
import (
"encoding/json"
"fmt"
"io"
"net/http"
"time"

Expand All @@ -14,6 +15,7 @@ type Web3SignerAdapter struct {
Endpoint string
}

// KeystoreResponse models the expected JSON from /eth/v1/keystores
type KeystoreResponse struct {
Data []struct {
ValidatingPubkey string `json:"validating_pubkey"`
Expand All @@ -25,19 +27,31 @@ func NewWeb3SignerAdapter(endpoint string) ports.Web3SignerAdapter {
}

func (w *Web3SignerAdapter) GetValidatorPubkeys() ([]string, error) {
url := fmt.Sprintf("%s/eth/v1/keystores", w.Endpoint)
client := &http.Client{Timeout: 30 * time.Second}
resp, err := client.Get(fmt.Sprintf("%s/eth/v1/keystores", w.Endpoint))

req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, fmt.Errorf("creating Web3Signer request: %w", err)
}

resp, err := client.Do(req)
if err != nil {
return nil, fmt.Errorf("failed to fetch keystores: %w", err)
return nil, fmt.Errorf("error sending Web3Signer request: %w", err)
}
defer resp.Body.Close()

if resp.StatusCode != http.StatusOK {
body, _ := io.ReadAll(resp.Body)
return nil, fmt.Errorf("unexpected Web3Signer status %d: %s", resp.StatusCode, string(body))
}

var keystoreResp KeystoreResponse
if err := json.NewDecoder(resp.Body).Decode(&keystoreResp); err != nil {
return nil, fmt.Errorf("failed to parse keystores: %w", err)
return nil, fmt.Errorf("error decoding Web3Signer response: %w", err)
}

var pubkeys []string
pubkeys := make([]string, 0, len(keystoreResp.Data))
for _, item := range keystoreResp.Data {
pubkeys = append(pubkeys, item.ValidatingPubkey)
}
Expand Down
2 changes: 2 additions & 0 deletions internal/application/services/dutieschecker_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,8 +162,10 @@ func (a *DutiesChecker) checkLiveness(
if !ok || !isLive {
offline = append(offline, idx)
allLive = false
logger.Warn("❌ Validator %d was not seen in epoch %d", idx, epochToTrack)
} else {
online = append(online, idx)
logger.Info("✅ Validator %d seen in epoch %d", idx, epochToTrack)
}
}
return offline, online, allLive, nil
Expand Down