Convert a 0x00 validator to 0x01
Validators created without a withdrawal address have 0x00 credentials. They earn rewards like any other validator, but you can't send anything to an Ethereum address: neither rewards nor, after an exit, the balance. To fix this, sign a change with your mnemonic in the deposit CLI, then submit it with prysmctl. It turns the validator into a regular (0x01) validator, with the withdrawal address you choose. You can do this once per validator.
Check your credentials
Ask your beacon node:
curl -s http://127.0.0.1:3500/eth/v1/beacon/states/head/validators/<VALIDATOR_INDEX_OR_PUBKEY> | jq '.data.validator.withdrawal_credentials'
curl.exe -s http://127.0.0.1:3500/eth/v1/beacon/states/head/validators/<VALIDATOR_INDEX_OR_PUBKEY> | jq '.data.validator.withdrawal_credentials'
If they start with 0x00, the validator has no withdrawal address yet: follow this page. If they start with 0x01 or 0x02, it already has one, and you can't change it.
Set the withdrawal address
Use an address you control, never an exchange address, and compare every character. Only ever type your mnemonic into the deposit CLI on a machine you trust, ideally offline. Websites that offer to "help" with this step are phishing.
-
Download the deposit CLI for your platform from the releases page and check its SHA-256 sum against the
.sha256file next to it.Extract the archive. It contains the
depositexecutable.Extract the archive. It contains the
deposit.exeexecutable. -
Collect the inputs:
--validator_start_index: the position of the first key in your mnemonic (usually0). It's the number in the keystore file name,keystore-m_12381_3600_<INDEX>_0_0-..., not the validator's index on the beacon chain.--validator_indices: each validator's index on the beacon chain, as shown by the command above or a block explorer.--bls_withdrawal_credentials_list: each validator's current0x00credentials, from the command above.
The CLI takes one key per validator, starting at
--validator_start_index, and pairs them in order: keystartwith the first validator and first credentials, keystart + 1with the second, and so on. So list validators in the order their keys appear in the mnemonic. If the keys aren't consecutive (for example,0,1and5), run the command once for each consecutive run of keys. If a key doesn't match its credentials, the CLI stops with an error and signs nothing. -
Sign the change from the extracted folder:
./deposit generate-bls-to-execution-change \--chain=mainnet \--validator_start_index=<FIRST_KEY_INDEX> \--validator_indices=<VALIDATOR_INDEX_1>,<VALIDATOR_INDEX_2> \--bls_withdrawal_credentials_list=<OLD_CREDENTIALS_1>,<OLD_CREDENTIALS_2> \--withdrawal_address=<YOUR_WITHDRAWAL_ADDRESS>.\deposit.exe generate-bls-to-execution-change `--chain=mainnet `--validator_start_index=<FIRST_KEY_INDEX> `"--validator_indices=<VALIDATOR_INDEX_1>,<VALIDATOR_INDEX_2>" `"--bls_withdrawal_credentials_list=<OLD_CREDENTIALS_1>,<OLD_CREDENTIALS_2>" `--withdrawal_address=<YOUR_WITHDRAWAL_ADDRESS>It asks for your mnemonic and writes a file to
bls_to_execution_changes/. Check that everyto_execution_addressin it is your address. -
Submit it with prysmctl to a synced beacon node (any client's REST API):
./prysm.sh prysmctl validator withdraw \--beacon-node-host=http://127.0.0.1:3500 \--path=<PATH_TO>/bls_to_execution_changes \--accept-terms-of-use \--confirm.\prysm.bat prysmctl validator withdraw `--beacon-node-host=http://127.0.0.1:3500 `--path=<PATH_TO>\bls_to_execution_changes `--accept-terms-of-use `--confirmYou should see:
INFO validator: Successfully published messages to update 2 withdrawal addresses.
Check that it works
The change is usually included within minutes. Run the credentials check again: the credentials now start with 0x01 and end with your address.