Skip to content
Open
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
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added
- Add support for ethrex execution client on mainnet, sepolia and hoodi networks.

## [v1.11.1] - 2026-02-10

### Changed
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ Integrating Charon with Sedge would make it easy for stakers to setup and run a
| Nethermind | Lodestar | Lodestar |
| Erigon | Prysm | Prysm |
| Besu | Teku | Teku |
| | Nimbus | Nimbus |
| ethrex | Nimbus | Nimbus |

### Hoodi

Expand All @@ -161,7 +161,7 @@ Integrating Charon with Sedge would make it easy for stakers to setup and run a
| Nethermind | Lodestar | Lodestar |
| Erigon | Teku | Teku |
| Besu | Prysm | Prysm |
| | Nimbus | Nimbus |
| ethrex | Nimbus | Nimbus |

### Sepolia

Expand All @@ -171,7 +171,7 @@ Integrating Charon with Sedge would make it easy for stakers to setup and run a
| Nethermind | Lodestar | Lodestar |
| Erigon | Prysm | Prysm |
| Besu | Teku | Teku |
| | Nimbus | Nimbus |
| ethrex | Nimbus | Nimbus |


### Gnosis
Expand Down
8 changes: 4 additions & 4 deletions cli/sub_gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the
}
// Bind flags
cmd.Flags().StringVarP(&flags.consensusName, "consensus", "c", "", "Consensus engine client, e.g. teku, lodestar, prysm, lighthouse, Nimbus. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name")
cmd.Flags().StringVarP(&flags.executionName, "execution", "e", "", "Execution engine client, e.g. geth, nethermind, besu, erigon. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name")
cmd.Flags().StringVarP(&flags.executionName, "execution", "e", "", "Execution engine client, e.g. geth, nethermind, besu, erigon, ethrex. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name")
cmd.Flags().StringVarP(&flags.validatorName, "validator", "v", "", "Validator engine client, e.g. teku, lodestar, prysm, lighthouse, Nimbus. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name")
cmd.Flags().BoolVar(&flags.distributed, "distributed", false, "Deploy a node configured to run as part of a Distributed Validator Cluster.")
cmd.Flags().StringVarP(&flags.distributedValidatorName, "distributedValidator", "d", "", "Distributed Validator client, e.g. charon. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name")
Expand Down Expand Up @@ -155,7 +155,7 @@ This command does not generate a validator configuration, as Optimism and Base u
cmd.Flags().StringVarP(&flags.consensusName, "consensus", "c", "", "Consensus engine client, e.g. teku, lodestar, prysm, lighthouse, Nimbus. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name")
cmd.Flags().StringVar(&flags.optimismName, "op-image", "", "Optimism consensus client image.")
cmd.Flags().StringVar(&flags.optimismExecutionName, "op-execution", "", "Optimism Execution client to be used, op-nethermind, op-geth, or op-reth. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name.")
cmd.Flags().StringVarP(&flags.executionName, "execution", "e", "", "Execution engine client, e.g. geth, nethermind, besu, erigon. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name")
cmd.Flags().StringVarP(&flags.executionName, "execution", "e", "", "Execution engine client, e.g. geth, nethermind, besu, erigon, ethrex. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name")
cmd.Flags().StringVarP(&flags.executionApiUrl, "execution-api-url", "", "", "Set execution api url. If Set, will omit the creation of execution and beacon nodes, and only create optimism nodes.")
cmd.Flags().StringVarP(&flags.consensusApiUrl, "consensus-url", "", "", "Set consensus api url. If Set, will omit the creation of execution and beacon nodes, and only create optimism nodes.")
cmd.Flags().BoolVar(&flags.latestVersion, "latest", false, "Use the latest version of clients. This sets the \"latest\" tag on the client's docker images. Latest version might not work.")
Expand Down Expand Up @@ -184,7 +184,7 @@ func ExecutionSubCmd(sedgeAction actions.SedgeActions) *cobra.Command {
Short: "Generate a execution node config",
Long: "Generate a docker-compose and an environment file with a execution node configuration.\n" +
"Valid args: name of execution clients according to network\n\n" +
"Should be one of: nethermind, geth, besu, erigon. If you don't provide one, it will chosen randomly.\n" +
"Should be one of: nethermind, geth, besu, erigon, ethrex. If you don't provide one, it will chosen randomly.\n" +
"Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client, for example 'sedge generate execution nethermind:docker.image'. If you want to use the default docker image, just use the client name",
Args: func(cmd *cobra.Command, args []string) error {
if len(args) > 0 {
Expand Down Expand Up @@ -420,7 +420,7 @@ Additionally, you can use the syntax '<CLIENT>:<DOCKER_IMAGE>' to override the d
cmd.Flags().StringArrayVar(&flags.aztecExtraFlags, "aztec-extra-flag", []string{}, "Additional flag to configure the Aztec node service in the generated docker-compose script. Example: 'sedge generate aztec --aztec-extra-flag \"p2p.maxPeers=200\" --aztec-extra-flag \"txPool.maxSize=10000\"'")
cmd.Flags().Uint16Var(&flags.aztecOtelMetricsPort, "otel-metrics-port", 4318, "OTLP HTTP metrics port on the monitoring stack collector (default: 4318). The host is fixed to sedge_aztec_exporter and path to /v1/metrics.")
cmd.Flags().StringVarP(&flags.consensusName, "consensus", "c", "", "Consensus engine client, e.g. teku, lodestar, prysm, lighthouse, Nimbus. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name")
cmd.Flags().StringVarP(&flags.executionName, "execution", "e", "", "Execution engine client, e.g. geth, nethermind, besu, erigon. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name")
cmd.Flags().StringVarP(&flags.executionName, "execution", "e", "", "Execution engine client, e.g. geth, nethermind, besu, erigon, ethrex. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name")
cmd.Flags().StringVarP(&flags.executionApiUrl, "execution-api-url", "", "", "Set execution api url. If Set, will omit the creation of execution and beacon nodes, and only create azte nodes.")
cmd.Flags().StringVarP(&flags.consensusApiUrl, "consensus-url", "", "", "Set consensus api url. If Set, will omit the creation of execution and beacon nodes, and only create aztec nodes.")
cmd.Flags().BoolVar(&flags.latestVersion, "latest", false, "Use the latest version of clients. This sets the \"latest\" tag on the client's docker images. Latest version might not work.")
Expand Down
3 changes: 3 additions & 0 deletions configs/client_images.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ execution:
erigon:
name: erigontech/erigon
version: v3.2.2
ethrex:
name: ghcr.io/lambdaclass/ethrex
version: 21.0.0
consensus:
lighthouse:
name: sigp/lighthouse
Expand Down
1 change: 1 addition & 0 deletions configs/images.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ var ClientImages struct {
Besu Image `yaml:"besu"`
Nethermind Image `yaml:"nethermind"`
Erigon Image `yaml:"erigon"`
Ethrex Image `yaml:"ethrex"`
}
Consensus struct {
Lighthouse Image `yaml:"lighthouse"`
Expand Down
6 changes: 3 additions & 3 deletions docs/docs/commands/clients.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ $ sedge clients
2 │geth │prysm │prysm
3 │erigon │teku │teku
4 │besu │lodestar │lodestar
5 │- │nimbus │nimbus
5 │ethrex │nimbus │nimbus


2025-03-21 17:55:50 -- [INFO] Listing supported clients for network mainnet
Expand All @@ -91,7 +91,7 @@ $ sedge clients
2 │geth │prysm │prysm
3 │erigon │teku │teku
4 │besu │lodestar │lodestar
5 │- │nimbus │nimbus
5 │ethrex │nimbus │nimbus


2025-03-21 17:55:50 -- [INFO] Listing supported clients for network sepolia
Expand All @@ -104,6 +104,6 @@ $ sedge clients
2 │geth │prysm │prysm
3 │erigon │teku │teku
4 │besu │lodestar │lodestar
5 │- │nimbus │nimbus
5 │ethrex │nimbus │nimbus

```
6 changes: 3 additions & 3 deletions docs/docs/commands/generate.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ Usage:

Flags:
-c, --consensus string Consensus engine client, e.g. teku, lodestar, prysm, lighthouse, Nimbus. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name
-e, --execution string Execution engine client, e.g. geth, nethermind, besu, erigon. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name
-e, --execution string Execution engine client, e.g. geth, nethermind, besu, erigon, ethrex. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name
-v, --validator string Validator engine client, e.g. teku, lodestar, prysm, lighthouse, Nimbus. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name
--distributed boolean Deploy a node configured to run as part of a Distributed Validator Cluster.
-d --distributedValidator string Distributed Validator client, e.g. charon. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name
Expand Down Expand Up @@ -151,7 +151,7 @@ Flags:
-c, --consensus string Consensus engine client, e.g. teku, lodestar, prysm, lighthouse, Nimbus. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name
--op-image string Optimism consensus client image.
--op-execution string Optimism Execution client to be used, op-nethermind, op-geth, or op-reth. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name.
-e, --execution string Execution engine client, e.g. geth, nethermind, besu, erigon. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name
-e, --execution string Execution engine client, e.g. geth, nethermind, besu, erigon, ethrex. Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client. If you want to use the default docker image, just use the client name
--execution-api-url string Set execution api url. If Set, will omit the creation of execution and beacon nodes, and only create optimism nodes.
--consensus-url string Set consensus api url. If Set, will omit the creation of execution and beacon nodes, and only create optimism nodes.
--latest Use the latest version of clients. This sets the "latest" tag on the client's docker images. Latest version might not work.
Expand Down Expand Up @@ -236,7 +236,7 @@ $ sedge generate execution -h
Generate a docker-compose and an environment file with a execution node configuration.
Valid args: name of execution clients according to network

Should be one of: nethermind, geth, besu, erigon. If you don't provide one, it will chosen randomly.
Should be one of: nethermind, geth, besu, erigon, ethrex. If you don't provide one, it will chosen randomly.
Additionally, you can use this syntax '<CLIENT>:<DOCKER_IMAGE>' to override the docker image used for the client, for example 'sedge generate execution nethermind:docker.image'. If you want to use the default docker image, just use the client name

Usage:
Expand Down
1 change: 1 addition & 0 deletions docs/docs/networks/hoodi.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Hoodi is Ethereum's public testnet that serves as a technical experimentation pl
- [Geth](https://geth.ethereum.org/docs/)
- [Erigon](https://github.com/ledgerwatch/erigon)
- [Besu](https://besu.hyperledger.org/en/stable/)
- [ethrex](https://docs.ethrex.xyz/)

## Supported Consensus Clients
- [Lighthouse](https://lighthouse-book.sigmaprime.io/)
Expand Down
1 change: 1 addition & 0 deletions docs/docs/networks/mainnet.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ secured by the Proof-of-Stake (PoS) algorithm.
- [Geth](https://geth.ethereum.org/docs/)
- [Erigon](https://github.com/ledgerwatch/erigon)
- [Besu](https://besu.hyperledger.org/en/stable/)
- [ethrex](https://docs.ethrex.xyz/)

## Supported Consensus Clients
- [Lighthouse](https://lighthouse-book.sigmaprime.io/)
Expand Down
1 change: 1 addition & 0 deletions docs/docs/networks/sepolia.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Sepolia is a permissioned Ethereum test network. It is one of the testnets that
- [Geth](https://geth.ethereum.org/docs/)
- [Erigon](https://github.com/ledgerwatch/erigon)
- [Besu](https://besu.hyperledger.org/en/stable/)
- [ethrex](https://docs.ethrex.xyz/)

## Supported Consensus Clients
- [Lighthouse](https://lighthouse-book.sigmaprime.io/)
Expand Down
8 changes: 4 additions & 4 deletions internal/pkg/clients/clients_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ func TestClients(t *testing.T) {
map[string][]string{
"consensus": {"lighthouse", "prysm", "teku", "lodestar", "nimbus"},
"validator": {"lighthouse", "prysm", "teku", "lodestar", "nimbus"},
"execution": {"nethermind", "geth", "besu", "erigon"},
"execution": {"nethermind", "geth", "besu", "erigon", "ethrex"},
},
[]string{"consensus"},
"mainnet",
Expand All @@ -113,7 +113,7 @@ func TestClients(t *testing.T) {
{
map[string][]string{
"validator": {"lighthouse", "prysm", "teku", "lodestar", "nimbus"},
"execution": {"nethermind", "geth", "besu", "erigon"},
"execution": {"nethermind", "geth", "besu", "erigon", "ethrex"},
},
[]string{"execution", "validator"},
"mainnet",
Expand All @@ -123,7 +123,7 @@ func TestClients(t *testing.T) {
map[string][]string{
"validator": {"lighthouse", "prysm", "teku", "lodestar", "nimbus"},
"consensus": {"lighthouse", "prysm", "teku", "lodestar", "nimbus"},
"execution": {"nethermind", "geth", "besu", "erigon"},
"execution": {"nethermind", "geth", "besu", "erigon", "ethrex"},
},
[]string{"consensus", "other"},
"mainnet",
Expand All @@ -143,7 +143,7 @@ func TestClients(t *testing.T) {
map[string][]string{
"validator": {"lighthouse", "prysm", "teku", "lodestar", "nimbus"},
"consensus": {"lighthouse", "prysm", "teku", "lodestar", "nimbus"},
"execution": {"nethermind", "geth", "besu", "erigon"},
"execution": {"nethermind", "geth", "besu", "erigon", "ethrex"},
"distributedValidator": {"charon"},
},
[]string{"consensus", "execution", "validator", "distributedValidator"},
Expand Down
1 change: 1 addition & 0 deletions internal/pkg/clients/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ var AllClients map[string][]string = map[string][]string{
"geth",
"erigon",
"besu",
"ethrex",
},
"consensus": {
"lighthouse",
Expand Down
2 changes: 2 additions & 0 deletions internal/pkg/clients/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ func (c *Client) setExecutionImage(image string) {
c.Image = valueOrDefault(image, configs.ClientImages.Execution.Nethermind.String())
case "erigon":
c.Image = valueOrDefault(image, configs.ClientImages.Execution.Erigon.String())
case "ethrex":
c.Image = valueOrDefault(image, configs.ClientImages.Execution.Ethrex.String())
}
}

Expand Down
7 changes: 7 additions & 0 deletions internal/pkg/clients/types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,13 @@ func TestSetImageOrDefault_Execution(t *testing.T) {
},
expectedImage: *regexp.MustCompile(`^erigontech/erigon:v\d+\.\d+\.\d+$`),
},
{
client: Client{
Name: "ethrex",
Type: "execution",
},
expectedImage: *regexp.MustCompile(`^ghcr.io/lambdaclass/ethrex:\d+\.\d+\.\d+$`),
},
}
for _, test := range tests {
t.Run(test.client.Name, func(t *testing.T) {
Expand Down
3 changes: 3 additions & 0 deletions internal/pkg/generate/generate_scripts_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,9 @@ func checkECBootnodesOnExecution(t *testing.T, data *GenData, compose, env io.Re
if composeData.Services.Execution != nil && data.ExecutionClient.Name == "geth" {
checkFlagOnCommands(t, composeData.Services.Execution.Command, "--bootnodes="+bootnodes)
}
if composeData.Services.Execution != nil && data.ExecutionClient.Name == "ethrex" {
checkFlagOnCommands(t, composeData.Services.Execution.Command, "--bootnodes="+bootnodes)
}
}
return nil
}
Expand Down
4 changes: 4 additions & 0 deletions scripts/check-image-updates.sh
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ update-client "Nethermind" "execution" ".execution.nethermind" "$NETHERMIND_LATE
ERIGON_LATEST=$(curl -H "Authorization: Bearer $PAT" -sL https://api.github.com/repos/ledgerwatch/erigon/releases/latest | jq -r ".tag_name")
update-client "Erigon" "execution" ".execution.erigon" "$ERIGON_LATEST"

# Ethrex
ETHREX_LATEST_VERSION=$(curl -H "Authorization: Bearer $PAT" -sL https://api.github.com/repos/lambdaclass/ethrex/releases/latest | jq -r '.tag_name | ltrimstr("v")')
update-client "Ethrex" "execution" ".execution.ethrex" "$ETHREX_LATEST_VERSION"

# Lighthouse
LIGHTHOUSE_LATEST_VERSION=$(curl -H "Authorization: Bearer $PAT" -sL https://api.github.com/repos/sigp/lighthouse/releases/latest | jq -r ".tag_name")
update-client "Lighthouse" "consensus" ".consensus.lighthouse" "$LIGHTHOUSE_LATEST_VERSION"
Expand Down
9 changes: 9 additions & 0 deletions templates/envs/hoodi/execution/ethrex.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{{/* ethrex.tmpl */}}
{{ define "execution" }}
# --- Execution Layer - Execution Node - configuration ---
EC_IMAGE_VERSION={{.ElImage}}
ETHREX_LOG_LEVEL=info
EC_DATA_DIR={{.ElDataDir}}
EC_SYNC_MODE=snap
EC_JWT_SECRET_PATH={{.JWTSecretPath}}
{{ end }}
9 changes: 9 additions & 0 deletions templates/envs/mainnet/execution/ethrex.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{{/* ethrex.tmpl */}}
{{ define "execution" }}
# --- Execution Layer - Execution Node - configuration ---
EC_IMAGE_VERSION={{.ElImage}}
ETHREX_LOG_LEVEL=info
EC_DATA_DIR={{.ElDataDir}}
EC_SYNC_MODE=snap
EC_JWT_SECRET_PATH={{.JWTSecretPath}}
{{ end }}
9 changes: 9 additions & 0 deletions templates/envs/sepolia/execution/ethrex.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{{/* ethrex.tmpl */}}
{{ define "execution" }}
# --- Execution Layer - Execution Node - configuration ---
EC_IMAGE_VERSION={{.ElImage}}
ETHREX_LOG_LEVEL=info
EC_DATA_DIR={{.ElDataDir}}
EC_SYNC_MODE=snap
EC_JWT_SECRET_PATH={{.JWTSecretPath}}
{{ end }}
Loading