Skip to content
Merged
Show file tree
Hide file tree
Changes from 107 commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
a5bd8df
initial commit
olegshmuelov Dec 3, 2025
11b7a47
improve error handling and address code review issues
olegshmuelov Dec 3, 2025
1936909
decouple updater from timing calculation
olegshmuelov Dec 4, 2025
2cbf35f
migrate to zap structured logging
olegshmuelov Dec 7, 2025
afe61fc
deduplicate syncOnce by delegating to SyncToBlock
olegshmuelov Dec 7, 2025
ad3185a
simplify schema for forward-only processing
olegshmuelov Dec 7, 2025
533ab69
refactor: integrate updater into oracle with --updater flag
olegshmuelov Dec 7, 2025
1329a0f
remove mock mode and consolidate to single SSV Network contract
olegshmuelov Dec 7, 2025
641583a
migrate beacon client to go-eth2-client
olegshmuelov Dec 7, 2025
d2c1a95
refactor storage interfaces and improve graceful shutdown
olegshmuelov Dec 7, 2025
ad9dc92
use typed map keys instead of hex strings
olegshmuelov Dec 7, 2025
b8e1f42
rename TimingPhase to CommitPhase
olegshmuelov Dec 7, 2025
de63a37
simplify logging by removing passed logger parameters
olegshmuelov Dec 7, 2025
c5d81f5
simplify merkle package: remove unused code and fix tests
olegshmuelov Dec 7, 2025
6294517
improve error handling and logging
olegshmuelov Dec 7, 2025
db006b5
simplify Makefile
olegshmuelov Dec 8, 2025
1355206
update docs with new Makefile commands
olegshmuelov Dec 8, 2025
0908780
add wallet abstraction and commit status tracking
olegshmuelov Dec 8, 2025
fcfcffc
add txmanager package for transaction lifecycle management
olegshmuelov Dec 8, 2025
b6049dd
add ClusterBalanceUpdated event and refactor parsers to use Cluster type
olegshmuelov Dec 8, 2025
343116d
docker: production-ready image with OCI labels and build improvements
olegshmuelov Dec 8, 2025
bc2e9a9
use composite interface and consolidate constants
olegshmuelov Dec 8, 2025
d5e2a50
remove redundant comments and add missing doc comments
olegshmuelov Dec 8, 2025
c46ad0b
improve code quality and observability
olegshmuelov Dec 8, 2025
a9baf8a
extract cluster event helpers to reduce duplication
olegshmuelov Dec 8, 2025
db34c50
review adjustments
olegshmuelov Dec 8, 2025
e15c0d3
rename timing to phase
olegshmuelov Dec 9, 2025
c4650fa
improve test quality
olegshmuelov Dec 9, 2025
3a3c06b
remove unused test mocks
olegshmuelov Dec 9, 2025
8d70a10
improve oracle
olegshmuelov Dec 9, 2025
2410560
exclude unknown events from sync count
olegshmuelov Dec 9, 2025
d48e29d
cleanup and optimize syncer/parser
olegshmuelov Dec 9, 2025
4a3b7cd
classify tx errors to avoid retrying permanent failures
olegshmuelov Dec 9, 2025
a9b492a
bump receiptPollInterval to 4s
olegshmuelov Dec 9, 2025
8be2f73
extract version from git in Dockerfile automatically
olegshmuelov Dec 9, 2025
846c0b6
add GitHub Actions CI/CD workflows
olegshmuelov Dec 9, 2025
af6bb62
cosmetic changes
olegshmuelov Dec 9, 2025
f5abb8f
improve log
olegshmuelov Dec 9, 2025
4ace249
use golangci-lint v2.7.2 for Go 1.25 support
olegshmuelov Dec 9, 2025
136c1cc
upgrade to Go 1.25.5 for security patches
olegshmuelov Dec 9, 2025
c405e58
use golangci-lint-action v7 for v2.x support
olegshmuelov Dec 9, 2025
7d9623f
update ClusterBalanceUpdated event to new ABI signature
olegshmuelov Dec 9, 2025
6243bcc
address lint warnings
olegshmuelov Dec 9, 2025
7ce2bf5
use build args for Docker version injection
olegshmuelov Dec 9, 2025
bc11d7e
remove unused release workflow
olegshmuelov Dec 9, 2025
0f90cef
delete unused doc
olegshmuelov Dec 9, 2025
4991e3a
pre-audit review
olegshmuelov Dec 9, 2025
0725cf6
reorganize codebase following Go conventions
olegshmuelov Dec 10, 2025
6585ec0
improve event handling: fix ABI, add tests, support ClusterMigratedToETH
olegshmuelov Dec 10, 2025
21d75cc
apply 32 ETH floor for low/missing validator balances
olegshmuelov Dec 10, 2025
79521ae
refactor: complete SQLite migration from PostgreSQL
olegshmuelov Dec 10, 2025
090d3d0
chore: add SQLite database to gitignore
olegshmuelov Dec 10, 2025
3659bf3
fix: address linter errors in storage tests
olegshmuelov Dec 10, 2025
3e21185
modernize Go code and add db_path default
olegshmuelov Dec 10, 2025
47b6d75
fix: align ClusterBalanceUpdated event with new ABI
olegshmuelov Dec 10, 2025
fc8874e
fix: simplify balance floor logic to 32 ETH minimum
olegshmuelov Dec 10, 2025
bef0c75
use balanceFloorGwei constant instead of magic number
olegshmuelov Dec 10, 2025
4e1e14a
go fmt ./..
olegshmuelov Dec 10, 2025
f3d8764
chore: log db_path on startup
olegshmuelov Dec 10, 2025
d9cb034
feat: sync clusters to head before updating balances
olegshmuelov Dec 11, 2025
cea9596
simplify oracle architecture and improve context handling
olegshmuelov Dec 11, 2025
b64fc15
feat: add SSVNetworkViews integration with lazy head sync
olegshmuelov Dec 11, 2025
b0a47ea
minor optimizations
olegshmuelov Dec 14, 2025
2eea0ef
feat: replace polling with SSE for beacon finalization
olegshmuelov Dec 14, 2025
9235da5
beacon finalization semantics and add retry support
olegshmuelov Dec 14, 2025
f97fb20
refactor: config and startup improvements
olegshmuelov Dec 15, 2025
a092366
refactor(oracle): replace lastCommitted with nextTarget
olegshmuelov Dec 15, 2025
335241c
fix(oracle): prevent stale data commits when missing target
olegshmuelov Dec 15, 2025
39b12ea
address PR review feedback part1
olegshmuelov Dec 17, 2025
f41639c
refactor: restructure packages for better separation of concerns
olegshmuelov Dec 17, 2025
98a1f02
address PR review feedback part2
olegshmuelov Dec 17, 2025
95080c7
add retry for finalized checkpoint block fetch
olegshmuelov Dec 17, 2025
0294add
log duplicate round_id in InsertPendingCommit
olegshmuelov Dec 17, 2025
bd2f156
refactor(txmanager): improve error classification and handling
olegshmuelov Dec 18, 2025
787e884
fix(beacon): query validator balances by state root
olegshmuelov Dec 18, 2025
59fe37c
simplify stale cluster detection and consistent error decoding
olegshmuelov Dec 18, 2025
e9a5720
address PR review feedback part3
olegshmuelov Dec 21, 2025
27e1f97
align with updated ABIs and simplify updater error handling
olegshmuelov Dec 21, 2025
6122840
refactor(merkle): use OpenZeppelin StandardMerkleTree format
olegshmuelov Dec 22, 2025
1f58c1b
simplify merkle naming
olegshmuelov Dec 22, 2025
67ad7a3
chore(ci): avoid duplicate runs on PRs
olegshmuelov Dec 22, 2025
544dcff
fix(syncer): parse ClusterBalanceUpdated and improve error logging
olegshmuelov Dec 24, 2025
8777272
align with updated ABIs and deduplicate RootCommitted events
olegshmuelov Dec 24, 2025
a37c44f
refactor: use short-form error messages
olegshmuelov Dec 24, 2025
fccf2bf
refactor(logger): use config file for log level
olegshmuelov Dec 24, 2025
667740c
fix(updater): retry commit lookup to handle multi-oracle race condition
olegshmuelov Dec 25, 2025
0b0c75f
simplify retry logic by removing Permanent errors
olegshmuelov Dec 28, 2025
4fa2102
chore: codebase cleanup and improvements
olegshmuelov Dec 29, 2025
3ba2c7d
chore: codebase cleanup and improvements
olegshmuelov Dec 30, 2025
3494466
Update README.md
olegshmuelov Dec 30, 2025
0222743
fix(beacon): use finalized state for validator balance queries
olegshmuelov Dec 30, 2025
0781c90
skip retries for non-retriable HTTP errors
olegshmuelov Dec 31, 2025
d18efff
improve commit loop logging consistency
olegshmuelov Dec 31, 2025
f8d9724
feat(api): add HTTP API server with merkle tree visualization UI
olegshmuelov Jan 1, 2026
e71695f
chore: update docs and add balance change logging
olegshmuelov Jan 1, 2026
b8bd62d
feat(sync): sync optimizations
olegshmuelov Jan 2, 2026
286e027
refactor(logging): apply outcome-based logging pattern
olegshmuelov Jan 2, 2026
0880815
feat(beacon): query balances by state root instead of finalized alias
olegshmuelov Jan 4, 2026
d61c11b
refactor(txmanager): improve gas handling and retry semantics
olegshmuelov Jan 4, 2026
b00c06a
fix(txmanager): abort on base-fee cap
olegshmuelov Jan 4, 2026
b6c7726
feat(oracle): skip commit when root already confirmed on-chain
olegshmuelov Jan 6, 2026
20ebc74
add cluster_id to contract_events, stop deleting empty clusters
olegshmuelov Jan 6, 2026
6639980
ui: improve cluster selection panel transitions
olegshmuelov Jan 6, 2026
60145d2
fix(logging): add units to duration fields in log output
olegshmuelov Jan 6, 2026
135fccb
fix(beacon): improve WaitForStateReady retry logic for transient errors
olegshmuelov Jan 8, 2026
d16b0ef
fix(beacon): use finalized keyword instead of state root for non-arch…
olegshmuelov Jan 11, 2026
3b1accf
address PR review feedback
olegshmuelov Jan 12, 2026
a2cfcf3
chore: rename module to github.com/ssvlabs/ssv-oracle
olegshmuelov Jan 12, 2026
36b1bc3
fix: address PR review feedback [part2]
olegshmuelov Jan 12, 2026
2c35ae1
test(execution): add unit tests for error categorization and log grou…
olegshmuelov Jan 13, 2026
4f4b273
refactor(eth): make WithRetry generic with isRetriable callback
olegshmuelov Jan 13, 2026
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
97 changes: 34 additions & 63 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,74 +1,45 @@
# -------------------------------------------------------
# 1. Git metadata and version-control artifacts
# -------------------------------------------------------
.git
# Binaries
ssv-oracle
*.exe
*.dll
*.so
*.dylib

# Test files
*_test.go
testdata/
coverage.*

# Documentation
*.md
!README.md

# Git
.git/
.gitignore
.gitattributes
.github

# -------------------------------------------------------
# 2. Local development files & folders
# -------------------------------------------------------
node_modules
npm-debug.log*
yarn-error.log*
pnpm-debug.log*

__pycache__/
*.py[cod]
*.pyo
*.pyd
*.egg-info/

vendor/
dist/
target/

# -------------------------------------------------------
# 3. Environment & credential files
# -------------------------------------------------------
.env
.env.local
.env.*.local

# -------------------------------------------------------
# 4. Editor and OS-specific files
# -------------------------------------------------------
# IDE
.vscode/
.idea/
*.swp
*.swo
.DS_Store
Thumbs.db

# -------------------------------------------------------
# 5. Dockerfiles and Docker-related artifacts (optional)
# -------------------------------------------------------
# CI/CD
.github/

# Docker
Dockerfile
.dockerignore
Dockerfile*
docker-compose*.yaml

# -------------------------------------------------------
# 6. Logs, caches, and coverage outputs
# -------------------------------------------------------
logs/
*.log
coverage/
*.lcov
.cache/
# Config (may contain secrets)
.env*
config.yaml

# -------------------------------------------------------
# 7. Testing artifacts (optional)
# -------------------------------------------------------
test-results/
pytest-report.html
*.spec.ts
*.test.js
*.test.ts
# AI assistant
.claude/
CLAUDE.md

# -------------------------------------------------------
# 8. Miscellaneous (customize as needed)
# -------------------------------------------------------
*.local
*.bak
*.tmp
*.swp
# Misc
.DS_Store
*.log
14 changes: 14 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# SSV Oracle Environment Variables
# Copy this to .env and fill in your values:
# cp .env.example .env

# Private key for signing transactions (with or without 0x prefix)
# WARNING: For development/testing only. For production, use keystore in config.yaml.
# Generate a test key with: cast wallet new
# PRIVATE_KEY=your_private_key_here

# Keystore password (for wallet type: keystore)
# KEYSTORE_PASSWORD=your_keystore_password

# DEV: Set to "true" for development mode (colored console output, debug level by default)
# DEV=true
68 changes: 68 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: CI

on:
push:
branches: [main, stage]
pull_request:

env:
GO_VERSION: "1.25.5"

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6

- uses: actions/setup-go@v6
with:
go-version: ${{ env.GO_VERSION }}

- name: Build
run: go build ./...

- name: Test
run: go test ./...

lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6

- uses: actions/setup-go@v6
with:
go-version: ${{ env.GO_VERSION }}

- name: golangci-lint
uses: golangci/golangci-lint-action@v7
with:
version: v2.7.2

docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0 # Full history for git describe

- name: Build Docker image
run: |
docker build \
--build-arg VERSION=$(git describe --tags --always --dirty) \
--build-arg GIT_COMMIT=$(git rev-parse --short HEAD) \
-t ssv-oracle:test .

security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6

- uses: actions/setup-go@v6
with:
go-version: ${{ env.GO_VERSION }}

- name: Install govulncheck
run: go install golang.org/x/vuln/cmd/govulncheck@latest

- name: Run govulncheck
run: govulncheck ./...
191 changes: 12 additions & 179 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,186 +1,19 @@
# ─────────────────────────────────────────────────────────────────────────
# 1. Operating System Files
# ─────────────────────────────────────────────────────────────────────────
# macOS
.DS_Store
.AppleDouble
.LSOverride

# Linux
*~

# ─────────────────────────────────────────────────────────────────────────
# 2. Version Control and Git Metadata
# ─────────────────────────────────────────────────────────────────────────
# If someone accidentally commits a sensitive file, it's still in history-
# but ignoring it helps stop new copies from getting added.
.gitattributes
/.git/ # Don't include your .git directory as part of a submodule/context

# ─────────────────────────────────────────────────────────────────────────
# 3. Editor, IDE, and Workspace Settings
# ─────────────────────────────────────────────────────────────────────────
# VSCode
.vscode/
.vscode/*

# IntelliJ IDEA / WebStorm / PhpStorm / etc.
.idea/
*.iml

# Eclipse
.project
.classpath
.settings/

# Sublime Text
*.sublime-workspace
*.sublime-project
# Binaries
ssv-oracle

# Vim / Emacs / Nano swap files
*.swp
*.swo
*~
# Database
data/

# JetBrains Rider
# IDE
.idea/
*.sln.iml

# Miscellaneous editors
*.kate-swp
*.kate-swp.*
*.komodoproject
*.komodotoolbar
*.kdev4
*.kdev4.*
# ...

# ─────────────────────────────────────────────────────────────────────────
# 4. Language-Agnostic Build Artifacts
# ─────────────────────────────────────────────────────────────────────────
# Logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

/logs
*.log
*.log.*

# Dependency directories (if you want to rebuild inside the container or CI)
node_modules/
jspm_packages/

# Coverage reports
coverage/
*.lcov
*.lcov.*
*.clover

# Temporary files
tmp/
temp/
*.tmp
*.swp
*.pid
*.seed
*.pid.lock

# Compiled Python artifacts
__pycache__/
*.py[cod]
*$py.class

# Compiled JavaScript (bundles, minified, maps)
*.min.js
*.map




# ─────────────────────────────────────────────────────────────────────────
# 5. Language-Specific Temporary Files
# ─────────────────────────────────────────────────────────────────────────
# Python
*.egg-info/
*.egg
*.whl
pip-log.txt
pip-delete-this-directory.txt
dist/
build/
.eggs/

/.env
.venv/
venv/
ENV/
env.bak/
venv.bak/

# Node.js / JavaScript
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
/node_modules/
# If you are using Yarn Plug'n'Play
.pnp.cjs
.pnp.loader.mjs

# TypeScript
*.tsbuildinfo

# Go
/bin/
/vendor/
/*.exe

.vscode/

# ─────────────────────────────────────────────────────────────────────────
# 6. Configuration and Secret Files
# ─────────────────────────────────────────────────────────────────────────
# Environment variables
# Environment files
.env
.env.*.local
.env.local
config.yaml

# ─────────────────────────────────────────────────────────────────────────
# 10. Miscellaneous
# ─────────────────────────────────────────────────────────────────────────
# Backup files
*.bak
*.old
*.orig

# Coverage
coverage/
*.lcov

# Database files
*.sqlite
*.sqlite3


# Archives
*.zip
*.tar.gz
*.rar


# Fonts
*.eot
*.otf
*.ttf
*.woff
*.woff2

# Executable packages
*.AppImage
*.deb
*.rpm
# OS
.DS_Store

# Editor temp files
~$*
# Claude Code
.claude/
Loading