Staking pools

A pool vault accepts deposits from multiple parties. Depositors receive LP tokens proportional to their share; the vault's underlying validators are operated jointly. For the dedicated-vs-pool distinction and the contracts deployed under any vault, see Staking vaults.

⚠️

Pro only: pool vaults are an SVM Pro feature. Creating, configuring, or running a pool vault requires a SVM Pro account.

For the underlying mechanics, Lido's own documentation is the canonical reference: see Pooled staking product (Lido docs). This page covers the Northstake surface.

Sub-types

Sub-typeCode valueWhat it adds
STVstvSimple staking pool powered by LP tokens.
STV stETHstvStethPool with native stETH integration: depositors receive stETH

The choice between stv and stvSteth is permanent at pool creation. You can't migrate between sub-types after deployment.

Contracts behind a pool vault

A pool vault deploys three contracts on top of the Dashboard and Staking Vault that every vault gets (see Staking vaults → The contracts behind a vault):

ContractPurpose
PoolLP-token contract. Mints / burns depositor shares and enforces the allowlist if allowList: true.
Withdrawal QueueHandles withdrawal requests, finalization, and claims.
TimelockEnforces a delay between scheduling and executing sensitive owner operations.

Pool configuration

When a pool vault is created, the configuration step collects the following fields. The 1-day (86,400 seconds) minima are enfroce at the contract level.

FieldWhat it controls
poolTypestv or stvSteth
nodeOperatorAddress of the node operator running validators for this pool
nodeOperatorManagerManager wallet for the node operator: can update the operator fee and approve config changes
nodeOperatorFeeBPOperator fee in basis points (1% = 100 BP). See Fee model
confirmExpiryHow long the operator + admin have to confirm a config change before it expires. Minimum 1 day
minWithdrawalDelayTimeMinimum wait between requesting a withdrawal and claiming it. Minimum 1 day
tokenName / tokenSymbolThe ERC-20 share token's display name and ticker (e.g. stvETH)
emergencyCommitteeAddress authorized to pause minting / deposits / withdrawals in emergencies
minDelaySecondsTimelock delay between proposing and executing an operation. Minimum 1 day
proposerAddress authorized to propose timelock operations
executorAddress authorized to execute scheduled timelock operations after their delay elapses
allowlistEnabledIf true, deposits are restricted to addresses holding DEPOSIT_ROLE
allowlistManagerHolder of ALLOW_LIST_MANAGER_ROLE: only required when allowlistEnabled is true
reserveRatioGapBPMax allowed gap between the pool reserve ratio and the underlying vault's, in basis points

For the open-pool variant, omit allowlistEnabled (or set it to false).

Deposits

A participant sends ETH to the Pool contract and receives shares in return:

  • STV: depositor receives the pool's ERC-20 LP token. The amount of shares is proportional to the deposit relative to the pool's total value.
  • STV stETH: depositor receives stETH (or wstETH) directly. The deposit and mint happen in a single transaction.

If allowList: true, the depositor's address must hold DEPOSIT_ROLE on the Pool contract: see Allowlist below.

🖱️

to deposit into a pool in the UI: from the Pools page or a pool vault page, click Deposit, enter an amount, review, and sign.

</> to deposit into a pool via the API

STV pools: see fundVault: pass sharesRecipient (the address that receives the LP token).

STV stETH pools: see depositAndMintSteth or depositAndMintWsteth.

Withdrawals

Pool withdrawals are a three-step flow on the Withdrawal Queue contract:

  1. Request: the participant calls requestWithdrawal. Their shares are locked and the request enters the queue.
  2. Finalize: once the pool has enough liquid ETH (the node operator may need to exit validators first), an address holding FINALIZE_ROLE finalizes pending requests in batches.
  3. Claim: the participant calls claimWithdrawals to receive the ETH for any of their finalized requests.

minWithdrawalDelayTime (set at pool creation) is the minimum gap between request and claim.

For the full mechanics (liquidity management, finalizer gas compensation, ordering rules) see Withdrawals (Lido docs).

🖱️

to use the withdrawal queue in the UI

Participants request and claim withdrawals from the Withdrawals tab on a pool vault page. The node operator finalizes requests from the same tab.

</> to use the withdrawal queue via the API

Request: requestWithdrawal. Finalize: finalizeWithdrawals. Claim: claimWithdrawals.

Timelock-gated operations

Every pool vault has a Timelock contract that delays sensitive owner operations. The proposer schedules the operation; after minDelaySeconds elapses, the executor runs it. Proposer and executor are set at pool creation.

Operations that go through the timelock:

  • Role administration: granting / revoking roles on the Dashboard, Pool, or Withdrawal Queue (grantRoles, revokeRoles).
  • PDG policy change (setPDGPolicy): see Staking and the PDG flow → PDG policy.
  • Tier changes (changeTier, syncTier): operator-grid tier moves.
  • Fee rate change (setFeeRate): see Fee model.
  • ERC-20 recovery (recoverERC20, collectERC20): recover ERC-20 tokens stuck in the Dashboard or Staking Vault.
🖱️

to schedule a timelock operation in the UI: from the vault's settings, change the field you want (role, tier, fee, PDG policy) and the modal walks you through scheduling and, after the delay, executing.

</> to use the timelock via the API

Schedule: timelockSchedule. Execute (after the delay): timelockExecute. Cancel a scheduled op: timelockCancel. List pending ops: getTimelockOperations.

Allowlist

A pool is permissioned when allowList = true (set as allowlistEnabled at creation). Permissioned pools only accept deposits from addresses holding DEPOSIT_ROLE on the Pool contract.

  • The allowlist is the set of DEPOSIT_ROLE holders: there's no separate registry.
  • The allowlist manager (ALLOW_LIST_MANAGER_ROLE) grants and revokes DEPOSIT_ROLE. The role is narrow by design, so compliance ops can be delegated without exposing broader vault privileges.
  • Revoking the role prevents new deposits but doesn't claw back existing shares or force a withdrawal.

For the underlying access-control model see Roles & permissions (Lido docs).

🖱️

to manage the allowlist in the UI: from the Allowlist tab on a permissioned pool, use Add or Remove with the depositor's address.

</> to manage the allowlist via the API

Add: addToAllowList. Remove: removeFromAllowList. Read current members: getAllRoleMembers: data.pool.DEPOSIT_ROLE.

Related