diff --git a/CHANGELOG.md b/CHANGELOG.md
index ba334e42..97ea7308 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+## [v1.1.0] - 2023-04-07
+
+### Added
+
+- Unit tests
+
+### Changed
+
+- Update client images to Shapella-ready version.
+- Update Nethermind client settings. Use default JSON-RPC modules, Prunning Cache size, and Snap Sync mode.
+- Update Goerli checkpoint sync to use [this]( https://goerli.checkpoint-sync.ethpandaops.io).
+
+### Fixed
+
+- Fix Erigon command line flags.
+- Checkpoint sync URL prompt is not longer mandatory.
+
## [v1.0.0] - 2023-3-23
### Added
diff --git a/README.md b/README.md
index 2777d814..3ef0f026 100644
--- a/README.md
+++ b/README.md
@@ -227,15 +227,16 @@ The following roadmap covers the main features and ideas we want to implement bu
- [x] Windows support
- [x] Bug fixes
-### Version 1.0 (Current)
+### Version 1.0
- [x] Full Ethereum PoS support with MEV-Boost
- [x] Set up and run only one node (execution/consensus/validator)
- [x] Keystore generation
- [x] Slashing protection
-### Version 1.X
+### Version 1.X (Current)
+- [ ] Support Erigon on Gnosis
- [ ] Include monitoring tool for alerting, tracking validator balance, and tracking sync progress and status of nodes
- [ ] More tests!!!
- [ ] Support for Nimbus client
diff --git a/cli/cli.go b/cli/cli.go
index c62253b5..8327365d 100644
--- a/cli/cli.go
+++ b/cli/cli.go
@@ -591,7 +591,7 @@ func checkCLIDependencies(p ui.Prompter, o *CliCmdOptions, a actions.SedgeAction
return err
}
}
- return fmt.Errorf("%w: %s. To install dependencies if supported run: 'sedge deps install", ErrMissingDependencies, strings.Join(pendingDependencies, ", "))
+ return fmt.Errorf("%w: %s. To install dependencies if supported run: 'sedge deps install'", ErrMissingDependencies, strings.Join(pendingDependencies, ", "))
}
// for _, s := range supported {
// if err := depsMgr.Install(s); err != nil {
@@ -975,17 +975,17 @@ func inputImportSlashingProtectionFrom(p ui.Prompter, o *CliCmdOptions) (err err
}
func inputExecutionAPIUrl(p ui.Prompter, o *CliCmdOptions) (err error) {
- o.genData.ExecutionApiUrl, err = p.InputURL("Execution API URL", "", false)
+ o.genData.ExecutionApiUrl, err = p.InputURL("Execution API URL", "", true)
return
}
func inputExecutionAuthUrl(p ui.Prompter, o *CliCmdOptions) (err error) {
- o.genData.ExecutionAuthUrl, err = p.InputURL("Execution Auth API URL", "", false)
+ o.genData.ExecutionAuthUrl, err = p.InputURL("Execution Auth API URL", "", true)
return
}
func inputConsensusAPIUrl(p ui.Prompter, o *CliCmdOptions) (err error) {
- o.genData.ConsensusApiUrl, err = p.InputURL("Consensus API URL", "", false)
+ o.genData.ConsensusApiUrl, err = p.InputURL("Consensus API URL", "", true)
return
}
diff --git a/cli/cli_test.go b/cli/cli_test.go
index 2e978f2a..f82701e6 100644
--- a/cli/cli_test.go
+++ b/cli/cli_test.go
@@ -256,8 +256,8 @@ func TestCli(t *testing.T) {
prompter.EXPECT().Select("Select consensus client", "", ETHClients["consensus"]).Return(3, nil),
prompter.EXPECT().InputURL("Checkpoint sync URL", configs.NetworksConfigs()[genData.Network].CheckpointSyncURL, false).Return("http://checkpoint.sync", nil),
prompter.EXPECT().InputURL("Mev-Boost endpoint", "", false).Return("http://mev-boost:3030", nil),
- prompter.EXPECT().InputURL("Execution API URL", "", false).Return("http://execution:5051", nil),
- prompter.EXPECT().InputURL("Execution Auth API URL", "", false).Return("http://execution:5051", nil),
+ prompter.EXPECT().InputURL("Execution API URL", "", true).Return("http://execution:5051", nil),
+ prompter.EXPECT().InputURL("Execution Auth API URL", "", true).Return("http://execution:5051", nil),
prompter.EXPECT().EthAddress("Please enter the Fee Recipient address (press enter to skip it)", "", false).Return("0x2d07a21ebadde0c13e8b91022a7e5732eb6bf5d5", nil),
prompter.EXPECT().Confirm("Do you want to expose all ports?", false).Return(true, nil),
prompter.EXPECT().Select("Select JWT source", "", []string{SourceTypeCreate, SourceTypeExisting, SourceTypeSkip}).Return(0, nil),
@@ -297,7 +297,7 @@ func TestCli(t *testing.T) {
prompter.EXPECT().Input("Generation path", configs.DefaultAbsSedgeDataPath, false, nil).Return(generationPath, nil),
prompter.EXPECT().Input("Container tag, sedge will add to each container and the network, a suffix with the tag", "", false, nil).Return("tag", nil),
prompter.EXPECT().Select("Select validator client", "", ETHClients["validator"]).Return(1, nil),
- prompter.EXPECT().InputURL("Consensus API URL", "", false).Return("http://localhost:5051", nil),
+ prompter.EXPECT().InputURL("Consensus API URL", "", true).Return("http://localhost:5051", nil),
prompter.EXPECT().Input("Graffiti to be used by the validator (press enter to skip it)", "", false, gomock.AssignableToTypeOf(ui.GraffitiValidator)).Return("test graffiti", nil),
prompter.EXPECT().InputInt64("Validator grace period. This is the number of epochs the validator will wait for security reasons before starting", int64(1)).Return(int64(2), nil),
prompter.EXPECT().EthAddress("Please enter the Fee Recipient address", "", true).Return("0x2d07a31ebadce0a13e8a91022a5e5732eb6bf5d5", nil),
diff --git a/cli/importKeys_test.go b/cli/importKeys_test.go
index a28b0de5..863eca82 100644
--- a/cli/importKeys_test.go
+++ b/cli/importKeys_test.go
@@ -50,6 +50,7 @@ func TestImportKeys_NumberOfArguments(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
cmd := ImportKeysCmd(nil, nil)
cmd.SetArgs(tt.args)
+ cmd.SetOutput(io.Discard)
err := cmd.Execute()
assert.ErrorIs(t, err, ErrInvalidNumberOfArguments)
})
diff --git a/configs/client_images.yaml b/configs/client_images.yaml
index e6a27674..0e9be3cf 100644
--- a/configs/client_images.yaml
+++ b/configs/client_images.yaml
@@ -4,36 +4,36 @@ execution:
version: v1.11.5
besu:
name: hyperledger/besu
- version: 23.1.1
+ version: 23.1.2
nethermind:
name: nethermind/nethermind
- version: 1.17.2
+ version: 1.17.3
erigon:
name: thorax/erigon
- version: v2.40.1
+ version: v2.42.0
consensus:
lighthouse:
name: sigp/lighthouse
- version: v3.5.1
+ version: v4.0.1
lodestar:
name: chainsafe/lodestar
- version: v1.6.0
+ version: v1.7.2
teku:
name: consensys/teku
- version: 23.3.0
+ version: 23.3.1
prysm:
name: gcr.io/prysmaticlabs/prysm/beacon-chain
- version: v3.2.2
+ version: v4.0.1
validator:
lighthouse:
name: sigp/lighthouse
- version: v3.5.1
+ version: v4.0.1
lodestar:
name: chainsafe/lodestar
- version: v1.6.0
+ version: v1.7.2
teku:
name: consensys/teku
- version: 23.3.0
+ version: 23.3.1
prysm:
name: gcr.io/prysmaticlabs/prysm/validator
- version: v3.2.2
+ version: v4.0.1
diff --git a/configs/init.go b/configs/init.go
index fc13cd48..1ae9ad79 100644
--- a/configs/init.go
+++ b/configs/init.go
@@ -89,7 +89,7 @@ var networksConfigs map[string]NetworkConfig = map[string]NetworkConfig{
"enr:-KG4QE5OIg5ThTjkzrlVF32WT_-XT14WeJtIz2zoTqLLjQhYAmJlnk4ItSoH41_2x0RX0wTFIe5GgjRzU2u7Q1fN4vADhGV0aDKQqP7o7pAAAHAyAAAAAAAAAIJpZIJ2NIJpcISlFsStiXNlY3AyNTZrMaEC-Rrd_bBZwhKpXzFCrStKp1q_HmGOewxY3KwM8ofAj_ODdGNwgiMog3VkcIIjKA",
"enr:-L64QC9Hhov4DhQ7mRukTOz4_jHm4DHlGL726NWH4ojH1wFgEwSin_6H95Gs6nW2fktTWbPachHJ6rUFu0iJNgA0SB2CARqHYXR0bmV0c4j__________4RldGgykDb6UBOQAABx__________-CaWSCdjSCaXCEA-2vzolzZWNwMjU2azGhA17lsUg60R776rauYMdrAz383UUgESoaHEzMkvm4K6k6iHN5bmNuZXRzD4N0Y3CCIyiDdWRwgiMo",
},
- CheckpointSyncURL: "https://sepolia.checkpoint-sync.ethdevops.io",
+ CheckpointSyncURL: "https://sepolia.checkpoint-sync.ethpandaops.io",
RelayURLs: []string{
"https://0x845bd072b7cd566f02faeb0a4033ce9399e42839ced64e8b2adcfc859ed1e8e1a5a293336a49feac6d9a5edb779be53a@builder-relay-sepolia.flashbots.net",
},
diff --git a/docs/docs/guidelines/new-clients.mdx b/docs/docs/guidelines/new-clients.mdx
index b20ca7d2..3c01a0f5 100644
--- a/docs/docs/guidelines/new-clients.mdx
+++ b/docs/docs/guidelines/new-clients.mdx
@@ -10,13 +10,13 @@ here and there.
## Adding a Consensus Client
-While adding a Consensus Client, you should follow this steps:
+While adding a Consensus Client, you should follow these steps:
1. Add a template under `templates/services/merge/consensus/` that contains all the docker compose parts for run that
new client.
2. Add what is going to be the environment vars for the docker compose file under each of the supported networks for this
new client, for example:
- `templates/envs/[network]/consensus/new_client.tmpl`
-3. Update the script that check for updates on the images at `scripts/check-image-updates.sh`.
+3. Update the script that checks for updates on the images at `scripts/check-image-updates.sh`.
4. Update documentation, including all the references on `docs/docs` folder, that are going to be displayed on Sedge
official documentation, and on the `Readme.md`
5. Add entry on the `CHANGELOG.md`
@@ -32,7 +32,7 @@ new client.
2. Add what is going to be the environment vars for the docker compose file under each of the supported networks for this
new client, for example:
- `templates/envs/[network]/execution/new_client.tmpl`
-3. Update the script that check for updates on the images at `scripts/check-image-updates.sh`.
+3. Update the script that checks for updates on the images at `scripts/check-image-updates.sh`.
4. Update documentation, including all the references on `docs/docs` folder, that are going to be displayed on Sedge
official documentation, and on the `Readme.md`
5. Add entry on the `CHANGELOG.md`
@@ -40,7 +40,7 @@ official documentation, and on the `Readme.md`
## Adding a Validator Client
-While adding a Validator Client, you should follow this steps:
+While adding a Validator Client, you should follow these steps:
1. Add a template under `templates/services/merge/validator/` that contains all the docker compose parts for run that
new client.
2. Make sure to add any necessary code for the validator keystore import service. Make your chances in the
diff --git a/docs/docs/hardware-requirements/index.md b/docs/docs/hardware-requirements/index.md
index 3940ddf9..4dec3876 100644
--- a/docs/docs/hardware-requirements/index.md
+++ b/docs/docs/hardware-requirements/index.md
@@ -12,7 +12,7 @@ keywords:
# Hardware requirements
-Hardware requirements are continuously changing from time to time but we can give you an idea of what do you need.
+Hardware requirements are continuously changing from time to time but we can give you an idea of what you need.
:::caution Warning
@@ -22,4 +22,4 @@ Don't follow these recommendations if you don't plan to use Sedge for the valida
**Running a validator node on a device that does not meet the hardware requirements poses risks to the device, including but not limited to the computer resources being depleted in their entirety. It is your responsibility to ensure you are using a device with sufficient resources.**
-:::
\ No newline at end of file
+:::
diff --git a/docs/docs/quickstart/complete-guide.mdx b/docs/docs/quickstart/complete-guide.mdx
index c1c24972..b123917b 100644
--- a/docs/docs/quickstart/complete-guide.mdx
+++ b/docs/docs/quickstart/complete-guide.mdx
@@ -18,7 +18,7 @@ This is a beginner-friendly guide. Familiarity with the command line is expected
We will walk through the following steps:
-1. Download and install Sedge in a new brand machine
+1. Download and install Sedge on a new brand machine
2. Generate validator keystore
3. Run Sedge's main workflow with default configuration values and use it to install dependencies (only for Linux)
4. Generate a `docker-compose.yml` script with a randomized set of execution, consensus and validator clients
@@ -31,7 +31,7 @@ The hardware specifications of the machine we are going to use are:
- 1 TB SSD
- Ubuntu 22.04/amd64
-### 1. Download and install Sedge in a new brand Linux machine
+### 1. Download and install Sedge on a new brand Linux machine
First open a console in the Home directory. Then use `curl` or `wget` to download a binary from the releases page
(we will be using the `1.0.0` version). Check the [installation guide](install-guide) for more information or if you
@@ -41,14 +41,14 @@ want to use another installation method:
```
- curl -L https://github.com/NethermindEth/sedge/releases/download/v1.0.0/sedge-v1.0.0-linux-amd64 --output sedge
+ curl -L https://github.com/NethermindEth/sedge/releases/download/v1.1.0/sedge-v1.1.0-linux-amd64 --output sedge
```
```
- wget https://github.com/NethermindEth/sedge/releases/download/v1.0.0/sedge-v1.0.0-linux-amd64 -O sedge
+ wget https://github.com/NethermindEth/sedge/releases/download/v1.1.0/sedge-v1.1.0-linux-amd64 -O sedge
```
diff --git a/docs/docs/quickstart/install-guide.mdx b/docs/docs/quickstart/install-guide.mdx
index 9b826780..e318c866 100644
--- a/docs/docs/quickstart/install-guide.mdx
+++ b/docs/docs/quickstart/install-guide.mdx
@@ -37,7 +37,7 @@ Downloading any binary from the internet risks downloading files that malicious,
- > Replace `` with the desired version number, e.g 1.0.0; `` with your OS, e.g linux; and `` with your architecture, e.g amd64.
+ > Replace `` with the desired version number, e.g 1.1.0; `` with your OS, e.g linux; and `` with your architecture, e.g amd64.
2. Open a console or terminal instance on the directory you downloaded the binary.
3. Set binary as executable executing `chmod +x ` in the Terminal. Replace `` with the name of the downloaded binary.
@@ -72,7 +72,7 @@ First, install the Go programming language following the [official instructions]
:::tip
-If you want to install Sedge in an M1 mac, then you need the `darwin-arm64` package. You can find it byclicking on [other downloads](https://go.dev/dl/) from the Go install page.
+If you want to install Sedge on an M1 mac, then you need the `darwin-arm64` package. You can find it byclicking on [other downloads](https://go.dev/dl/) from the Go install page.
:::
diff --git a/docs/docs/troubleshoot.md b/docs/docs/troubleshoot.md
index afeeb785..1e431bed 100644
--- a/docs/docs/troubleshoot.md
+++ b/docs/docs/troubleshoot.md
@@ -25,14 +25,14 @@ sudo cp ~/.docker/cli-plugins/docker-compose /root/.docker/cli-plugins/
If Prysm throws an error that indicates that can't find a wallet datadir, that means that the wallet was not created
correctly.
-To solve this, you should run `sedge import-key` with the flag `--start-validator` to starts the validator client after
+To solve this, you should run `sedge import-key` with the flag `--start-validator` to start the validator client after
import, regardless of the state the validator was in before.
This will create the wallet datadir and the validator will start correctly.
### Permissions issues
-If you found a permission issue while installing some dependencies, and you got a error like this:
+If you found a permission issue while installing some dependencies, and you got an error like this:
```
docker.service - Docker Application Container Engine
@@ -58,4 +58,4 @@ permission denied while trying to connect to the Docker daemon socket at unix://
You can run the command using sudo, something like:
```shell
sudo sedge deps install
-```
\ No newline at end of file
+```
diff --git a/internal/ui/prompterValidators.go b/internal/ui/prompterValidators.go
index 581eeeb3..a5f27260 100644
--- a/internal/ui/prompterValidators.go
+++ b/internal/ui/prompterValidators.go
@@ -74,6 +74,9 @@ func DirPathValidator(ans string) error {
func URLValidator(ans interface{}) error {
if str, ok := ans.(string); ok {
+ if str == "" {
+ return nil
+ }
if invalidURL, ok := utils.UriValidator([]string{str}); !ok {
return fmt.Errorf("%w: %s", ErrInvalidURL, invalidURL)
}
@@ -95,7 +98,6 @@ func Int64Validator(ans interface{}) error {
return nil
}
-// TODO: Write unit tests
func fileExtensionValidator(extensions []string) func(ans interface{}) error {
return func(ans interface{}) error {
if input, ok := ans.(string); ok {
@@ -110,7 +112,6 @@ func fileExtensionValidator(extensions []string) func(ans interface{}) error {
}
}
-// TODO: add unit tests
// DigitsStringValidator validates that the input is a valid string with only digits
func DigitsStringValidator(ttd string) error {
if !digitsString.MatchString(ttd) {
@@ -119,7 +120,6 @@ func DigitsStringValidator(ttd string) error {
return nil
}
-// TODO: add unit tests
func GraffitiValidator(str string) error {
if len(str) > 16 {
return fmt.Errorf(configs.ErrGraffitiLength, str, len(str))
diff --git a/internal/ui/prompterValidators_test.go b/internal/ui/prompterValidators_test.go
index 9d39ecae..e94232d7 100644
--- a/internal/ui/prompterValidators_test.go
+++ b/internal/ui/prompterValidators_test.go
@@ -16,10 +16,12 @@ limitations under the License.
package ui
import (
+ "fmt"
"os"
"path/filepath"
"testing"
+ "github.com/NethermindEth/sedge/configs"
"github.com/stretchr/testify/assert"
)
@@ -86,28 +88,28 @@ func TestFilePathValidator(t *testing.T) {
tests := []struct {
name string
input interface{}
- withErr bool
+ wantErr bool
}{
{
name: "valid file path",
input: tmpFilePath,
- withErr: false,
+ wantErr: false,
},
{
name: "invalid file path, not a file",
input: filepath.Join(tmpDir, "test_2.txt"),
- withErr: true,
+ wantErr: true,
},
{
name: "invalid file path, is a directory",
input: tmpDir,
- withErr: true,
+ wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := FilePathValidator(tt.input)
- if tt.withErr {
+ if tt.wantErr {
assert.Error(t, got)
} else {
assert.NoError(t, got)
@@ -155,3 +157,229 @@ func TestInt64Validator(t *testing.T) {
})
}
}
+
+func TestDirPathValidator(t *testing.T) {
+ tmpDir := t.TempDir()
+
+ tests := []struct {
+ name string
+ input string
+ wantErr bool
+ }{
+ {
+ name: "valid directory path",
+ input: tmpDir,
+ wantErr: false,
+ },
+ {
+ name: "invalid directory path, not a directory",
+ input: filepath.Join(tmpDir, "test.txt"),
+ wantErr: true,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ got := DirPathValidator(tt.input)
+ if tt.wantErr {
+ assert.Error(t, got)
+ } else {
+ assert.NoError(t, got)
+ }
+ })
+ }
+}
+
+func TestURLValidator(t *testing.T) {
+ tests := []struct {
+ name string
+ input string
+ want error
+ }{
+ {
+ name: "valid URL",
+ input: "https://www.google.com",
+ want: nil,
+ },
+ {
+ name: "valid URL, http",
+ input: "http://www.google.com",
+ want: nil,
+ },
+ {
+ name: "invalid URL protocol",
+ input: "https//www.google",
+ want: ErrInvalidURL,
+ },
+ {
+ name: "invalid URL, no protocol",
+ input: "www.google.com",
+ want: ErrInvalidURL,
+ },
+ {
+ name: "invalid URL, no domain",
+ input: "https://",
+ want: ErrInvalidURL,
+ },
+ {
+ name: "invalid URL, no domain, no protocol",
+ input: "www.",
+ want: ErrInvalidURL,
+ },
+ {
+ name: "empty url",
+ input: "",
+ want: nil,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ got := URLValidator(tt.input)
+ if tt.want != nil {
+ assert.ErrorContains(t, got, tt.want.Error())
+ } else {
+ assert.NoError(t, got)
+ }
+ })
+ }
+}
+
+func TestFileExtensionValidator(t *testing.T) {
+ tests := []struct {
+ name string
+ input []string
+ handlerInput string
+ want error
+ }{
+ {
+ name: "valid file extension",
+ input: []string{".txt"},
+ handlerInput: "test.txt",
+ want: nil,
+ },
+ {
+ name: "valid file extensions, test.txt",
+ input: []string{".txt", ".csv", ""},
+ handlerInput: "test.txt",
+ want: nil,
+ },
+ {
+ name: "valid file extensions, test",
+ input: []string{".txt", ".csv", ""},
+ handlerInput: "test",
+ want: nil,
+ },
+ {
+ name: "invalid file extension, no extension",
+ input: []string{".txt", ".csv"},
+ handlerInput: "test.json",
+ want: ErrInvalidFileExtension,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ got := fileExtensionValidator(tt.input)(tt.handlerInput)
+ if tt.want != nil {
+ assert.ErrorContains(t, got, tt.want.Error())
+ } else {
+ assert.NoError(t, got)
+ }
+ })
+ }
+}
+
+func TestDigitsStringValidator(t *testing.T) {
+ tests := []struct {
+ name string
+ input string
+ want error
+ }{
+ {
+ name: "valid digits string",
+ input: "123456789",
+ want: nil,
+ },
+ {
+ name: "invalid digits string, invalid string",
+ input: "14084s",
+ want: ErrInvalidDigitString,
+ },
+ {
+ name: "invalid digits string, too long",
+ input: "123456789123456789123456789123456789",
+ want: nil,
+ },
+ {
+ name: "invalid digits string, float",
+ input: "123456789.123456789",
+ want: ErrInvalidDigitString,
+ },
+ {
+ name: "invalid digits string, negative",
+ input: "-123456789",
+ want: ErrInvalidDigitString,
+ },
+ {
+ name: "invalid digits string, empty",
+ input: "",
+ want: ErrInvalidDigitString,
+ },
+ {
+ name: "valid digits string, zero",
+ input: "0",
+ want: nil,
+ },
+ {
+ name: "invalid digits string, starting with zero",
+ input: "0123456789",
+ want: ErrInvalidDigitString,
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ got := DigitsStringValidator(tt.input)
+ if tt.want != nil {
+ assert.ErrorContains(t, got, tt.want.Error())
+ } else {
+ assert.NoError(t, got)
+ }
+ })
+ }
+}
+
+func TestGraffitiValidator(t *testing.T) {
+ tests := []struct {
+ name string
+ input string
+ want error
+ }{
+ {
+ name: "valid graffiti",
+ input: "test",
+ },
+ {
+ name: "invalid graffiti, too long",
+ input: "GraffitiTooLongSupercalifragilisticexpialidocious",
+ want: fmt.Errorf(configs.ErrGraffitiLength, "GraffitiTooLongSupercalifragilisticexpialidocious", 49),
+ },
+ {
+ name: "valid graffiti, empty",
+ input: "",
+ },
+ {
+ name: "valid graffiti, exact 16 characters",
+ input: "GrafitiExactly16",
+ },
+ }
+
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ got := GraffitiValidator(tt.input)
+ if tt.want != nil {
+ assert.ErrorContains(t, got, tt.want.Error())
+ } else {
+ assert.NoError(t, got)
+ }
+ })
+ }
+}
diff --git a/templates/envs/chiado/execution/nethermind.tmpl b/templates/envs/chiado/execution/nethermind.tmpl
index 0581ddd2..e6092b35 100644
--- a/templates/envs/chiado/execution/nethermind.tmpl
+++ b/templates/envs/chiado/execution/nethermind.tmpl
@@ -3,9 +3,6 @@
# --- Execution Layer - Execution Node - configuration ---
EC_IMAGE_VERSION={{.ElImage}}
NETHERMIND_LOG_LEVEL=INFO
-EC_ENABLED_MODULES=[Web3,Eth,Subscribe,Net,]
-NETHERMIND_PRUNING_CACHEMB=2048
EC_DATA_DIR={{.ElDataDir}}
-EC_SNAP_SYNC_ENABLED=false
EC_JWT_SECRET_PATH={{.JWTSecretPath}}
-{{ end }}
+{{ end }}
\ No newline at end of file
diff --git a/templates/envs/custom/execution/nethermind.tmpl b/templates/envs/custom/execution/nethermind.tmpl
index 8c434a85..74071e4a 100644
--- a/templates/envs/custom/execution/nethermind.tmpl
+++ b/templates/envs/custom/execution/nethermind.tmpl
@@ -3,9 +3,6 @@
# --- Execution Layer - Execution Node - configuration ---
EC_IMAGE_VERSION={{if .ElImage}}{{.ElImage}}{{else}}nethermind/nethermind:1.14.6{{end}}
NETHERMIND_LOG_LEVEL=INFO
-EC_ENABLED_MODULES=[Web3,Eth,Subscribe,Net]
-NETHERMIND_PRUNING_CACHEMB=2048
EC_DATA_DIR={{.ElDataDir}}
-EC_SNAP_SYNC_ENABLED=false
EC_JWT_SECRET_PATH={{.JWTSecretPath}}
{{ end }}
\ No newline at end of file
diff --git a/templates/envs/gnosis/execution/nethermind.tmpl b/templates/envs/gnosis/execution/nethermind.tmpl
index 277eace1..25a605fb 100644
--- a/templates/envs/gnosis/execution/nethermind.tmpl
+++ b/templates/envs/gnosis/execution/nethermind.tmpl
@@ -3,11 +3,8 @@
# --- Execution Layer - Execution Node - configuration ---
EC_IMAGE_VERSION={{.ElImage}}
NETHERMIND_LOG_LEVEL=INFO
-EC_ENABLED_MODULES=[Web3,Eth,Subscribe,Net,]
EC_NODENAME=Nethermind
NETHERMIND_METRICS_PUSH_GATEWAY_URL=http://localhost:9090/metrics
-NETHERMIND_PRUNING_CACHEMB=2048
EC_DATA_DIR={{.ElDataDir}}
-EC_SNAP_SYNC_ENABLED=false
EC_JWT_SECRET_PATH={{.JWTSecretPath}}
{{ end }}
\ No newline at end of file
diff --git a/templates/envs/goerli/execution/nethermind.tmpl b/templates/envs/goerli/execution/nethermind.tmpl
index 7d5d6c69..e6092b35 100644
--- a/templates/envs/goerli/execution/nethermind.tmpl
+++ b/templates/envs/goerli/execution/nethermind.tmpl
@@ -3,9 +3,6 @@
# --- Execution Layer - Execution Node - configuration ---
EC_IMAGE_VERSION={{.ElImage}}
NETHERMIND_LOG_LEVEL=INFO
-EC_ENABLED_MODULES=[Web3,Eth,Subscribe,Net,]
-NETHERMIND_PRUNING_CACHEMB=2048
EC_DATA_DIR={{.ElDataDir}}
-EC_SNAP_SYNC_ENABLED=true
EC_JWT_SECRET_PATH={{.JWTSecretPath}}
{{ end }}
\ No newline at end of file
diff --git a/templates/envs/mainnet/execution/nethermind.tmpl b/templates/envs/mainnet/execution/nethermind.tmpl
index 39c705b8..e6092b35 100644
--- a/templates/envs/mainnet/execution/nethermind.tmpl
+++ b/templates/envs/mainnet/execution/nethermind.tmpl
@@ -3,9 +3,6 @@
# --- Execution Layer - Execution Node - configuration ---
EC_IMAGE_VERSION={{.ElImage}}
NETHERMIND_LOG_LEVEL=INFO
-EC_ENABLED_MODULES=[Web3,Eth,Subscribe,Net]
-NETHERMIND_PRUNING_CACHEMB=2048
EC_DATA_DIR={{.ElDataDir}}
-EC_SNAP_SYNC_ENABLED=true
EC_JWT_SECRET_PATH={{.JWTSecretPath}}
{{ end }}
\ No newline at end of file
diff --git a/templates/envs/sepolia/execution/nethermind.tmpl b/templates/envs/sepolia/execution/nethermind.tmpl
index 7d5d6c69..e6092b35 100644
--- a/templates/envs/sepolia/execution/nethermind.tmpl
+++ b/templates/envs/sepolia/execution/nethermind.tmpl
@@ -3,9 +3,6 @@
# --- Execution Layer - Execution Node - configuration ---
EC_IMAGE_VERSION={{.ElImage}}
NETHERMIND_LOG_LEVEL=INFO
-EC_ENABLED_MODULES=[Web3,Eth,Subscribe,Net,]
-NETHERMIND_PRUNING_CACHEMB=2048
EC_DATA_DIR={{.ElDataDir}}
-EC_SNAP_SYNC_ENABLED=true
EC_JWT_SECRET_PATH={{.JWTSecretPath}}
{{ end }}
\ No newline at end of file
diff --git a/templates/services/merge/execution/erigon.tmpl b/templates/services/merge/execution/erigon.tmpl
index f56a667a..7167bf4c 100644
--- a/templates/services/merge/execution/erigon.tmpl
+++ b/templates/services/merge/execution/erigon.tmpl
@@ -8,8 +8,8 @@
networks:
- sedge
volumes:
- - ${EC_DATA_DIR}:/home/erigon/.local/share/erigon
- - ${EC_JWT_SECRET_PATH}:/home/erigon/.local/share/erigon/jwt.hex
+ - ${EC_DATA_DIR}:/var/lib/erigon
+ - ${EC_JWT_SECRET_PATH}:/var/lib/erigon/jwtsecret
ports:
- "{{.ElDiscoveryPort}}:{{.ElDiscoveryPort}}/tcp"
- "{{.ElDiscoveryPort}}:{{.ElDiscoveryPort}}/udp"
@@ -21,18 +21,23 @@
- {{.ElAuthPort}}
user: root
command:
+ - --private.api.addr=0.0.0.0:9090
+ - --nat=any
- --externalcl
- --http
- --http.addr=0.0.0.0
- --http.port={{.ElApiPort}}
+ - --http.vhosts=*
+ - --http.corsdomain=*
+ - --http.api=web3,eth,net,engine
- --txpool.disable
- --chain={{if .SplittedNetwork}}${EL_NETWORK}{{else}}${NETWORK}{{end}}{{if .ECBootnodes}}
- --bootnodes={{.ECBootnodes}}{{end}}
- --authrpc.addr=0.0.0.0
- --authrpc.port={{.ElAuthPort}}
- --authrpc.vhosts=*
- - --authrpc.jwtsecret=/home/erigon/.local/share/erigon/jwt.hex
- - --datadir=/home/erigon/.local/share/erigon
+ - --authrpc.jwtsecret=/var/lib/erigon/jwtsecret
+ - --datadir=/var/lib/erigon
- --healthcheck
- --metrics
- --metrics.addr=0.0.0.0
diff --git a/templates/services/merge/execution/nethermind.tmpl b/templates/services/merge/execution/nethermind.tmpl
index ae1a2081..26ad57b3 100644
--- a/templates/services/merge/execution/nethermind.tmpl
+++ b/templates/services/merge/execution/nethermind.tmpl
@@ -26,11 +26,9 @@
- --datadir=/nethermind/data
- --log=${NETHERMIND_LOG_LEVEL}{{if .TTD}}
- --Merge.TerminalTotalDifficulty={{.TTD}}{{end}}
- - --Sync.SnapSync=${EC_SNAP_SYNC_ENABLED}
- --JsonRpc.Enabled=true
- --JsonRpc.Host=0.0.0.0
- --JsonRpc.Port={{.ElApiPort}}
- - --JsonRpc.EnabledModules=${EC_ENABLED_MODULES}
- --JsonRpc.JwtSecretFile=/tmp/jwt/jwtsecret
- --JsonRpc.EngineHost=0.0.0.0
- --JsonRpc.EnginePort={{.ElAuthPort}}
@@ -39,7 +37,6 @@
- --Discovery.Bootnodes={{.ECBootnodes}}
- --Network.StaticPeers={{.ECBootnodes}}{{end}}
- --HealthChecks.Enabled=true
- - --Pruning.CacheMb=${NETHERMIND_PRUNING_CACHEMB}
- --Metrics.Enabled=true
- --Metrics.ExposePort={{.ElMetricsPort}}{{range $flag := .ElExtraFlags}}
- --{{$flag}}{{end}}{{if .LoggingDriver}}