Method 1: Configure on validator keys

Validator Clients

Assuming your Teku validator client is already set up, stop your Teku validator client.

sudo systemctl stop tekuvalidator.service

Find the pubkey values of your own non-CSM validator keystores generated.

sudo find /var/lib -name "keystore*.json"

For each resulting filepath, run:

grep -oP '"pubkey": *"\K[^"]+' RESULTING_FILEPATH

You should now have a list of all your own non-CSM validator keystore pubkeys.

Create a custom proposer configuration file.

sudo nano /var/lib/teku_validator/validator/proposer_configuration.json

Paste the following contents into the file.

{
  "proposer_config": {
    "YOUR_OWN_VALIDATOR_PUBKEY_(NOT_CSM)_01": {
      "fee_recipient": "YOUR_OWN_FEE_RECIPIENT_ADDRESS",
      "builder": {
        "enabled": true
      }
    },
    "YOUR_OWN_VALIDATOR_PUBKEY_(NOT_CSM)_02": {
      "fee_recipient": "YOUR_OWN_FEE_RECIPIENT_ADDRESS",
      "builder": {
        "enabled": true
      }
    },
    "YOUR_OWN_VALIDATOR_PUBKEY_(NOT_CSM)_03": {
      "fee_recipient": "YOUR_OWN_FEE_RECIPIENT_ADDRESS",
      "builder": {
        "enabled": true
      }
    }
  },
  "default_config": {
    "fee_recipient": "LIDO_EXECUTION_LAYER_REWARDS_VAULT",
    "builder": {
      "enabled": true
    }
  }
}

Replace YOUR_OWN_VALIDATOR_PUBKEY_(NOT_CSM) with your own actual validator pubkeys (NOT CSM).

Replace YOUR_OWN_FEE_RECIPIENT_ADDRESS with your desired wallet address.

Replace LIDO_EXECUTION_LAYER_REWARDS_VAULT with the following options.

  • Mainnet

suggested_fee_recipient: "0x388C818CA8B9251b393131C08a736A67ccB19297"
  • Holesky

suggested_fee_recipient: "0xE73a3602b99f1f913e72F8bdcBC235e206794Ac8"

CTRL+O, ENTER, CTRL+X to save and exit.

Set the permissions of the custom proposer configuration file.

sudo chown -R teku_validator:teku_validator /var/lib/teku_validator/validator

Adding more non-CSM validator keystores:

If you want to add more of your own validator keystores, replicate the following segment, taking note of the indentation.

    "YOUR_OWN_VALIDATOR_PUBKEY_(NOT_CSM)_03": {
      "fee_recipient": "YOUR_OWN_FEE_RECIPIENT_ADDRESS",
      "builder": {
        "enabled": true
      }
    }

CTRL+O, ENTER, CTRL+X to save and exit.

Edit the Teku validator client service file.

sudo nano /etc/systemd/system/tekuvalidator.service

Add the --validators-proposer-config flag and point it to the proposer_configuration.json file. Then remove the --validators-proposer-default-fee-recipient flag. e.g.,

[Unit]
Description=Teku Validator Client (Holesky)
Wants=network-online.target
After=network-online.target

[Service]
User=teku_validator
Group=teku_validator
Type=simple
Restart=always
RestartSec=5
Environment="JAVA_OPTS=-Xmx6g"
Environment="TEKU_OPTS=-XX:-HeapDumpOnOutOfMemoryError"
ExecStart=/usr/local/bin/teku/bin/teku vc \
  --network=holesky \
  --data-path=/var/lib/teku_validator \
  --validator-keys=/var/lib/teku_validator/validator_keystores:/var/lib/teku_validator/keystore_password \
  --beacon-node-api-endpoint=http://<Internal_IP_address>:5051 \
  --validators-proposer-config=/var/lib/teku_validator/validator/proposer_configuration.json \
  --validators-proposer-blinded-blocks-enabled=true \
  --validators-graffiti="<your_graffiti_of_choice>" \
  --metrics-enabled=true \
  --metrics-port=8108 \
  --doppelganger-detection-enabled=true 

[Install]
WantedBy=multi-user.target

CTRL+O, ENTER, CTRL+X to save and exit.

Restart your Teku validator client.

sudo systemctl daemon-reload
sudo systemctl start tekuvalidator.service
sudo systemctl status tekuvalidator.service

Monitor for errors.

sudo journalctl -fu tekuvalidator -o cat | ccze -A

Automation Tools

With ETH Docker running (i.e., ethd up), run

./ethd keys list

then

./ethd keys set-recipient 0xPUBKEY 0xADDRESS 

with the public key of the key you wish to set a separate fee recipient for, and the Ethereum address fees should go to.

Last updated