Staking withdrawals

To get staked ETH back to a wallet, it is necessary to

  1. unstake the ETH via a partial withdrawal or a full exit (see below for more information) and
  2. withdraw the ETH once it reaches the vault.

Staking withdrawal — leaving the beacon chain

A validator's balance lives on the beacon chain. Two operations bring it back to the vault, and the difference is just how much:

  • Partial withdrawal (unstake). withdraws any balance above the 32 ETH minimum from the validator. The validator stays active and keeps producing rewards.
  • Full exit. Withdraws the validator's entire balance and exits it. The validator transitions active → exited → withdrawn as the beacon chain processes the exit.

Both are triggered with the same call — triggerValidatorWithdrawals (EIP-7002) — which is gated by TRIGGER_VALIDATOR_WITHDRAWAL_ROLE. The amount you request is what decides whether it's a partial withdrawal or a full exit. For the exact per-validator parameters, see Unstake a validator.

ℹ️

How to exit a validator. triggerValidatorWithdrawals forces the withdrawal directly from the execution layer.

Where the ETH lands. Once a validator is exited, its principal and accumulated rewards are swept into the vault's own balance on the execution layer. The waiting time depends on a) whether the withdrawal was partial or a full exits, and b) network conditions (exit queue, number of active validators, etc.).

ℹ️

Background on Ethereum withdrawals. This step is standard Ethereum staking-withdrawal behaviour. For the protocol-level mechanics — partial-withdrawals, the exit queue, the ~27-hour withdrawability delay, and the 16-withdrawals-per-block sweep — see:

🖱️

to withdraw or exit a validator in the UI: from the Validators table, choose Withdraw for a partial amount or Exit for a full exit. Pick the validator(s), enter the amounts, review, and sign.

</> to withdraw or exit a validator via the API: see triggerValidatorWithdrawals. Pass amountsGwei per validator; an amount equal to the validator's full balance triggers a full exit.

Withdrawing from a dedicated vault

For a dedicated (single-owner) vault, the swept ETH simply raises the vault's balance, and the owner moves it to a wallet with a single withdraw call gated by WITHDRAW_ROLE. There is no request/finalize/claim queue — that exists only for pools.

The one constraint that surprises people: you can only withdraw unlocked ETH. A vault's withdrawableValue is the ETH that is not locked behind minted stETH and not reserved for fees and obligations. If the vault has minted stETH against its stake, that portion is locked — you must burn stETH or rebalance the vault to free it before it can be withdrawn.

The withdrawable amount is read from the vault's latest oracle report. As with funding and minting, a stale report is refreshed with an Update report step before the withdrawal goes through. See Vault health for how locked vs. unlocked ETH is tracked, and Fee model for the fees held back from withdrawable value.

🖱️

to withdraw ETH from a vault in the UI: open the vault, click Withdraw, enter an amount (the Max button fills in the full withdrawable balance), choose the destination wallet, and sign. The review screen shows the vault's ETH and health factor before and after.

</> to withdraw ETH from a vault via the API: see withdrawFromVault. Pass ether (in wei) and the recipient address. The call reverts if the amount exceeds the vault's withdrawable value.

Withdrawing from a pool vault

⚠️

Pro only: pool vaults are an SVM Pro feature. Pool withdrawals require an SVM Pro account.

A pool vault is shared by many depositors, so its withdrawals run through a dedicated Withdrawal Queue contract in three steps:

  1. Request — the depositor calls requestWithdrawal with the amount to withdraw and the address that will be allowed to claim it (the owner). Their LP shares (and, for stETH pools, the matching liability shares) are transferred into the queue and a request record is created. Requests are processed in order (FIFO).
  2. Finalize — once the pool holds enough liquid ETH, an address with FINALIZE_ROLE finalizes pending requests in batches, locking in the rate at which each request converts to ETH. If the pool is short on liquidity, the node operator must first withdraw staked ETH from validators (layer 1) to top it up. A request can only be finalized after the pool's minimum withdrawal delay (minWithdrawalDelayTime, set at pool creation) has elapsed since it was made.
  3. Claim — the owner calls claimWithdrawal for any of their finalized requests and receives the ETH at the recipient address.

This is the same flow described in Staking pools → Withdrawals, viewed from the withdrawal side. Finalization can also be paused independently of new requests via the queue's pause roles; see Roles and permissions.

🖱️

to use the pool withdrawal queue in the UI: on a pool vault, open the Withdraw flow and choose Request withdrawal (enter an amount and the claim address) or Claim withdrawal (pick from your finalized requests). The node operator finalizes requests from the same area.

</> to use the pool withdrawal queue via the API

Request: requestWithdrawal. Finalize: finalizeWithdrawals. Claim: claimWithdrawals. Track a depositor's requests and what's claimable with getWithdrawalQueueUserStats.

After a consolidation

A consolidation merges several validators into one target validator. The exited source validators don't get a separate withdrawal: their principal and pending rewards sweep back to the vault and are released through the same withdrawal process described above (a dedicated-vault withdraw, or the pool queue). The consolidated balance itself stays staked on the target validator. See Validator consolidations.

Related