Skip to main content
This guide helps validators set up and manage staking pools to offer liquid staking services to their communities.

Quick reference

Key parameters

ParameterRangePurpose
Validator Commission0-20%Commission on incentive token distribution
Protocol Fee0-20%Fee on BGT balance growth
Minimum Effective Balance≥ 250,000 BERAActivation threshold and full exit safeguard
Withdrawal Delay129,600 blocks (≈3 days at ~2s block time)Time before withdrawals can be finalized

Key roles

RoleControlsFunction
VALIDATOR_ADMIN_ROLEAll other rolesGrant/revoke operational roles
REWARDS_ALLOCATION_MANAGER_ROLEReward allocationDirect PoL incentives to applications
COMMISSION_MANAGER_ROLECommission rateAdjust validator commission (0-20%)
PROTOCOL_FEE_MANAGER_ROLEProtocol feeAdjust protocol fee percentage (0-20%)
INCENTIVE_COLLECTOR_MANAGER_ROLEPayout amountAdjust incentive collector payout
BGT_MANAGER_ROLEBGT operationsQueue drop boost, redeem BGT

Essential functions

FunctionContractPurpose
setMinEffectiveBalance()SmartOperatorSet activation threshold
queueValCommission()SmartOperatorQueue commission rate change
queueRewardsAllocation()SmartOperatorQueue reward allocation
claimBoostRewards()SmartOperatorForward rewards to IncentiveCollector
setProtocolFeePercentage()SmartOperatorSet protocol fee rate

Prerequisites

Before setting up a staking pool, ensure you have a fully operational Berachain validator node. You’ll need at least 10,000 BERA to register the pool, though activation requires at least 250,000 BERA. See the Validator Lifecycle and Become a Validator guides.
Staking pools follow the standard Berachain validator lifecycle. After deployment, your validator will progress through the Deposited → Eligible states, but activation to the Active state depends on the ValidatorSetCap and your validator’s priority relative to other validators.

Validator lifecycle

Your staking pool integrates with Berachain’s validator lifecycle. For details on validator states (Deposited, Eligible, Active, Exited, Withdrawn) and transitions, see the Validator Lifecycle documentation. The key consideration for staking pools is ensuring sufficient stake for activation. See Setting Minimum Effective Balance below.

Key terms and concepts

  • Active Threshold: The point at which your pool has sufficient stake (totalDeposits >= minEffectiveBalance) to activate the validator. When activeThresholdReached() returns true, your validator enters a cooldown period before activation.
  • Minimum Effective Balance (minEffectiveBalance): The minimum stake amount required for validator activation and a safeguard that triggers full exit if deposits fall below it. This must match or exceed the current consensus layer minimum (250,000 BERA when the set is not full; when the set is full, the minimum is 10,000 BERA more than the lowest active validator).
  • Withdrawal Delay: 129,600 blocks (≈3 days at ~2s block time) that must pass after a withdrawal request before it can be finalized.
  • Cooldown Period: After activeThresholdReached() becomes true, there is a cooldown period before the validator activates.

Configuration

Commission rates

You can set commission rates within 0-20%. Commission applies to the distribution of incentive tokens from Proof of Liquidity rewards. For step-by-step instructions, see Manage Validator Incentives Commission Rate.

Reward allocations

Direct PoL incentives to specific applications. For instructions, see Managing Validator Reward Allocations.

Setting minimum effective balance

The minEffectiveBalance parameter is critical for validator activation. The consensus layer enforces a base minimum of 250,000 BERA. When the validator set is full (69 validators), the minimum required increases in increments of 10,000 BERA. Set minEffectiveBalance to match the current consensus layer requirement. You can check the current lowest active stake on Berachain Hub.

Routine operations

  • Monitor pool status: Use isActive(), totalAssets(), bufferedAssets(), activeThresholdReached() on your StakingPool and SmartOperator.
  • BGT operations: Use queueDropBoost(), redeemBGT(), queueBoost(), activateBoost() as needed. Forward rewards to IncentiveCollector by calling claimBoostRewards() on SmartOperator.
  • Protocol fee: Set via setProtocolFeePercentage() (up to 20%). Call accrueEarnedBGTFees() to trigger fee calculation and minting.

Withdrawal system

The centralized WithdrawalVault handles all withdrawal operations. Withdrawals can use a short-circuit path (when the pool has not reached active threshold and has sufficient buffered funds) or the standard path (consensus layer processing). In both cases, stakers must wait the full withdrawal delay (129,600 blocks ≈ 3 days) before finalization.

Building your front-end

Your front-end should:
  • Display withdrawal status and when each request can be finalized (use getWithdrawalRequest(requestId) and requestBlock + 129600).
  • Support batch finalization with finalizeWithdrawalRequests([...]).
  • Show staker balance, share price, and total rewards (e.g. via previewRedeem(shares)).
Berachain provides a React-based example template in the guides repository. Use generate-frontend-config.sh from install-helpers to generate config.json from your environment.

Delegation

If you have received a delegation from the Berachain Foundation, see the Delegation Guide and the DelegationHandler contract reference.

More information