This guide walks validator operators through installing and activating a staking pool using the helper scripts.Documentation Index
Fetch the complete documentation index at: https://berachain-422fce37-feat-nodes-section-reno.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
What you’ll use
The helper scripts are available through GitHub:install-helpers/ which wrap multi-step operations into safe, review-first commands:
- register.sh: Deploys (registers) staking pool contracts and generates the deployment transaction
- activate.sh: Activates a deployed pool using validator proofs from the beacon chain
- status.sh: Verifies deployment, registration, and activation status
- stake.sh: Generates a staking transaction to add BERA to your pool
Requirements
- beacond (validator client) running and synced with your validator keys backed up somewhere safe
- Foundry
cast(getfoundry.sh) jq,bc,curl- Ledger hardware wallet (default) or a private key set via
PRIVATE_KEY - Funds: at least 10,000 BERA for the initial deposit; additional stake as desired
1. Configure environment
Ininstall-helpers/:
app.toml ([beacon-kit.node-api]) or provide NODE_API_ADDRESS in env.sh. The scripts will auto-detect when possible and verify connectivity before proceeding.
2. Register (deploy contracts)
Runregister.sh with your addresses to deploy the staking pool contracts:
- The chain (mainnet or Bepolia) is auto-detected from your beacond configuration.
- The initial stake is 10,000 BERA (fixed by the consensus layer). The script writes
deployment-command.shwith this deposit. Review it. Simulate it if you want. Then run it. This should dump a successful transaction receipt. - The script also predicts and shows your staking pool contract addresses ahead of time.
3. Wait for validator registration
After deploying the contracts, wait for your validator to be registered on the beacon chain. You can check registration status with:4. Activate the pool
Once your validator is registered, runactivate.sh to activate the pool:
activate.sh no longer takes --sr or --op; the pool’s shares recipient and operator are already baked in from register.sh. The script:
- Verifies the pool contract is deployed and not already active (
isActive()). - Confirms
BeaconDeposit.getOperator(pubkey)matches the pool’s SmartOperator and that the validator’s withdrawal credentials point at the pool’s WithdrawalVault. - Pins the beacon-chain head slot, fetches validator pubkey, withdrawal-credentials, and balance proofs at that single slot, and preflights
activateStakingPool()locally so a bad proof or stale timestamp surfaces before you broadcast. - Writes
generated/activation-command.shfor you to review and execute.
MAX_TIMESTAMP_AGE = 10 minutes). The generated script also hard-expires after that window; if you hit it, re-run activate.sh to regenerate.
5. Verify installation
Usestatus.sh to check deployment, registration, and activation:
6. Set minimum effective balance
Set the value using your SmartOperator contract:$SMART_OPERATOR_ADDRESS with your SmartOperator address and $CALCULATED_MIN_STAKE with the calculated minimum stake amount in wei (multiply BERA amount by 10^18).
For details on why this matters, how to determine the correct value, and how the consensus layer minimum works, see the Setting Minimum Effective Balance section in the operator guide.
7. (Optional) Stake additional BERA
Add stake to your pool and send stBERA to a receiver address:stake-command.sh. Review and execute the command to submit your stake.
Troubleshooting (quick)
- Node API not reachable: Enable
[beacon-kit.node-api]and confirm the address/port; or setNODE_API_ADDRESSinenv.sh. The script will examine your files and tell you how to activate the API if it isn’t enabled yet. - Missing tools: Install Foundry (
cast),jq,bc, andcurland ensure they are on your PATH.
What’s next
- Contract reference explains what you’ve deployed
- Delegation guide explains how to receive a Foundation delegation, which is very similar to this flow