Skip to main content

stVaults Metrics

This page defines every stVault metric and gives the formula behind it.

The metrics fall into two families:

  • State metrics describe the stVault right now. They are derived from the latest oracle report plus the on-chain flows since that report, and every one of them can be read from the Dashboard contract.
  • Performance metrics describe what happened between two oracle reports. They are computed off-chain from consecutive reports by the Web UI and the CLI.

Notation​

Formulas below use these short names:

SymbolMeaning
TVTVTotal Value
LLstETH Liability, in ETH
RRRRReserve Ratio, as a fraction
FRTFRTForced Rebalance Threshold, as a fraction
MRMRMinimal Reserve
unsettledFees\text{unsettledFees}unsettled Lido fees
accruedFee\text{accruedFee}undisbursed Node Operator fee
periodSeconds\text{periodSeconds}length of the report period, in seconds
secondsInYear\text{secondsInYear}31,536,000 β€” the annualization constant (365 days)

On-chain the ratios are stored in basis points (10000 = 100%), and share amounts are converted with the stETH share rate. The formulas here use fractions and ETH for readability.

stVault parameters​

Reserve Ratio​

Defines the share of the collateral that is reserved when the Vault Owner mints stETH. stETH isn't minted for this amount. Set by the Tier the stVault belongs to.

Forced Rebalance Threshold​

Defines the minimum allowed ratio of Total Value to stETH Liability. Crossing it makes the stVault subject to forced rebalancing. Always lower than the Reserve Ratio.

Minimal Reserve​

The amount of ETH that is always reserved in the stVault regardless of Total Value. 1 ETH by default, and may be increased in response to a correlated slashing event according to the Risk management framework.

stETH minting limit​

Absolute maximum for the minting capacity, defined by the stVault's Tier. Changing it requires changing the Tier.

Node Operator fee​

The share of the gross staking rewards that the Node Operator charges for providing validation services. Stored as feeRate in basis points, and changing it requires confirmation from both the Vault Owner and the Node Operator Manager β€” see Roles and permissions.

State metrics​

Total Value​

The total amount of ETH attributed to the stVault. It splits into ETH deposited to validators and ETH held on the stVault balance, and rewards accrue to both:

TV=staked+notStakedTV = \text{staked} + \text{notStaked}

Between reports it is the last reported value adjusted by the net flows that happened since:

TV=TVreport+inOutDeltanowβˆ’inOutDeltareportTV = TV_{\text{report}} + \text{inOutDelta}_{\text{now}} - \text{inOutDelta}_{\text{report}}

Not Staked stVault Balance​

ETH held on the stVault contract balance and not deposited to validators, and therefore not earning rewards. ETH staged for pending validator activations is excluded.

notStaked=stVaultΒ balanceβˆ’staged\text{notStaked} = \text{stVault balance} - \text{staged}

stETH Liability​

The amount of stETH the Vault Owner minted in the stVault, backed by the ETH collateral. Stored in shares, so its ETH value increases daily with the stETH rebase:

L=liabilitySharesΓ—shareRateL = \text{liabilityShares} \times \text{shareRate}

Undisbursed Node Operator fee​

Accumulated but not yet disbursed Node Operator fee. Increases the total locked ETH.

growth=TVreport+quarantinedβˆ’inOutDeltareportaccruedFee=max⁑(0,β€…β€Š(growthβˆ’settledGrowth)Γ—feeRate)\begin{aligned} \text{growth} &= TV_{\text{report}} + \text{quarantined} - \text{inOutDelta}_{\text{report}} \\[2pt] \text{accruedFee} &= \max\bigl(0,\; (\text{growth} - \text{settledGrowth}) \times \text{feeRate}\bigr) \end{aligned}

Growth is the value the stVault gained on its own, as opposed to the ETH that was supplied into it. Two details matter here: it is measured from the latest oracle report, not from the live Total Value, and it includes value still held in quarantine β€” the fee accrues on quarantined value too.

settledGrowth\text{settledGrowth} is the high-water mark of growth already accounted for: it moves up whenever the fee is disbursed, and also when an amount is explicitly exempted from the fee base. Because of the max⁑(0,… )\max(0, \dots), a drop in stVault value accrues no new fee until the growth exceeds that mark again β€” the Node Operator is not paid twice for recovering the same value.

Unsettled Lido fees​

Accumulated but not yet settled Lido fees. Increases the total locked ETH. The Lido fee is charged on every oracle report and consists of the infrastructure fee, the liquidity fee and the reservation liquidity fee.

unsettledFees=cumulativeLidoFeesβˆ’settledLidoFees\text{unsettledFees} = \text{cumulativeLidoFees} - \text{settledLidoFees}

Locked by fees obligations (unsettled fees)​

ETH locked in the stVault because of the undisbursed Node Operator fee and unsettled Lido fees.

feeObligation=accruedFee+unsettledFees\text{feeObligation} = \text{accruedFee} + \text{unsettledFees}

Reserve​

The part of the collateral that is reserved when minting and for which stETH isn't minted. It is capped by the value the stVault has on top of its liability:

reserve=min⁑(TVβˆ’L,β€…β€ŠLΓ—RR1βˆ’RR)\text{reserve} = \min\Bigl(TV - L,\; \frac{L \times RR}{1 - RR}\Bigr)

Collateral​

The ETH locked to cover the stETH liability under the Reserve Ratio, or to maintain the connection to Lido Core.

collateral=L+max⁑(reserve,β€…β€ŠMR)\text{collateral} = L + \max(\text{reserve},\; MR)
note

The liability used here is the maximum liability observed during the current report period, not the current one. Minting and then repaying within the same period does not release the collateral until the next report.

Total Lock​

The total amount of ETH locked in the stVault: the collateral plus everything the stVault owes in fees.

totalLock=collateral+accruedFee+unsettledFees\text{totalLock} = \text{collateral} + \text{accruedFee} + \text{unsettledFees}

Pending unlock​

ETH eligible for unlocking after stETH was repaid, but still awaiting confirmation from the next oracle report. It is the gap between the liability the collateral is still sized for and the liability that remains:

pendingUnlock=max⁑(0,β€…β€ŠLmaxβ‘βˆ’L)\text{pendingUnlock} = \max(0,\; L_{\max} - L)

where Lmax⁑L_{\max} is the maximum liability observed during the current report period.

Total stETH minting capacity​

The amount of stETH the Vault Owner can mint within the Reserve Ratio boundaries, respecting the Minimal Reserve:

maxLockable=max⁑(0,β€…β€ŠTVβˆ’unsettledFeesβˆ’accruedFee)capacity=max⁑(0,β€…β€ŠmaxLockableβˆ’max⁑(MR,β€…β€ŠmaxLockableΓ—RR))\begin{aligned} \text{maxLockable} &= \max(0,\; TV - \text{unsettledFees} - \text{accruedFee}) \\[2pt] \text{capacity} &= \max\bigl(0,\; \text{maxLockable} - \max(MR,\; \text{maxLockable} \times RR)\bigr) \end{aligned}

On-chain the capacity is denominated in shares, not in ETH.

It can additionally be capped by:

  • the stVault's personal stETH minting limit;
  • the Tier remaining capacity;
  • the Node Operator remaining capacity;
  • the total stVaults remaining capacity;
  • Lido Core staking rate limits (learn more).

Remaining stETH minting capacity​

How much more stETH can still be minted:

remaining=max⁑(0,β€…β€Šcapacityβˆ’L)\text{remaining} = \max(0,\; \text{capacity} - L)

Utilization Ratio​

The share of the minting capacity currently used:

UR=LcapacityΓ—100%UR = \frac{L}{\text{capacity}} \times 100\%

At 100% no further stETH can be minted. Above 100% the stVault is at or beyond its intended liability limit and approaches the forced rebalancing zone.

Health Factor​

Shows how well the stETH Liability is backed by the Total Value. The primary indicator of stVault health:

HF=TVΓ—(1βˆ’FRT)LΓ—100%HF = \frac{TV \times (1 - FRT)}{L} \times 100\%

The stVault is healthy while HF β‰₯ 100%. Below that it becomes subject to forced rebalancing. See the Health monitoring guide for the risk bands used in the Web UI.

Available to withdraw​

ETH that can be withdrawn from the stVault balance right now. It is the lower of what is liquid and what is unlocked, reduced by the fees the stVault owes:

liquid=min⁑(stVaultΒ balanceβˆ’staged,β€…β€ŠTV)βˆ’lidoRedemptionsunlocked=max⁑(0,β€…β€ŠTVβˆ’collateral)available=max⁑(0,β€…β€Šmin⁑(liquid,β€…β€Šunlocked)βˆ’unsettledFeesβˆ’accruedFee)\begin{aligned} \text{liquid} &= \min(\text{stVault balance} - \text{staged},\; TV) - \text{lidoRedemptions} \\[2pt] \text{unlocked} &= \max(0,\; TV - \text{collateral}) \\[2pt] \text{available} &= \max\bigl(0,\; \min(\text{liquid},\; \text{unlocked}) - \text{unsettledFees} - \text{accruedFee}\bigr) \end{aligned}

While the stVault is pending disconnection, nothing is withdrawable.

Lido Core reference metrics​

Lido Core APR​

Gross annualized rewards earned by validators in Lido Core, before the protocol fee is taken. This is the rate the Lido fee components are charged against.

stETH APR​

What an stETH holder receives: the Lido Core APR net of the Lido protocol fee, currently 10% of staking rewards.

The fee is collected by minting new shares, so this return is exactly the growth of the stETH share rate:

APRstETH=shareRatecurrβˆ’shareRateprevshareRateprevΓ—secondsInYearperiodSecondsΓ—100%APR_{\text{stETH}} = \frac{\text{shareRate}_{curr} - \text{shareRate}_{prev}}{\text{shareRate}_{prev}} \times \frac{\text{secondsInYear}}{\text{periodSeconds}} \times 100\%

This is the benchmark to compare the stVault's own Net staking APR against: if the stVault earns less than plain stETH after fees, its configuration or performance needs a review. See Last Lido APR for stETH for the canonical calculation.

Node Operator fee at Lido Core​

The average share of staking rewards that Lido Core Node Operators receive for providing validation services.

Performance metrics​

These are computed between two consecutive oracle reports. prev and curr denote the opening and closing report of the period.

Gross staking rewards​

The ETH earned by validators β€” the increase in Total Value with ETH inflows and outflows excluded:

grossStakingRewards=(TVcurrβˆ’TVprev)βˆ’(inOutDeltacurrβˆ’inOutDeltaprev)\text{grossStakingRewards} = (TV_{curr} - TV_{prev}) - (\text{inOutDelta}_{curr} - \text{inOutDelta}_{prev})
note

Any change in stVault value not captured by inOutDelta is currently counted as staking rewards. Slashing penalties and other stVault-level ETH movements therefore land in this metric rather than being tracked separately.

Node Operator rewards​

The ETH payable to the Node Operator as its fee β€” its share of the gross staking rewards.

Because the Node Operator can disburse the fee at any moment, the period fee is computed from a claim-invariant helper rather than from the balance:

noEarnings(T)=settledGrowth(T)Γ—feeRate⏟alreadyΒ settled+accruedFee(T)⏟owed,Β notΒ yetΒ takennodeOperatorFee=noEarnings(curr)βˆ’noEarnings(prev)\begin{aligned} \text{noEarnings}(T) &= \underbrace{\text{settledGrowth}(T) \times \text{feeRate}}_{\text{already settled}} + \underbrace{\text{accruedFee}(T)}_{\text{owed, not yet taken}} \\[4pt] \text{nodeOperatorFee} &= \text{noEarnings}(curr) - \text{noEarnings}(prev) \end{aligned}

The two terms do not overlap: accruedFee\text{accruedFee} subtracts the settled mark rather than including it, so together they cover the whole growth the fee has been charged on, taken or not.

warning

settledGrowth\text{settledGrowth} moves up on fee exemptions and manual corrections as well as on disbursements, so the first term is not the same as ETH actually paid out. In a period where growth was exempted or the mark was corrected, this figure counts that value as Node Operator earnings. Read it together with the actual disbursements when either has happened.

Lido fees​

The Lido protocol fee for the period, tracked as a running cumulative sum in the report:

lidoFees=feecurrβˆ’feeprev\text{lidoFees} = \text{fee}_{curr} - \text{fee}_{prev}

The Lido fee is the sum of three components infraFee + liquidityFee + reservationFee, each charged on a different base.

The fee rates are annual, and a report covers a fraction of a year, so every component is scaled by the elapsed share of the year:

Ξ”year=tcurrβˆ’tprev1Β year\Delta_{\text{year}} = \frac{t_{curr} - t_{prev}}{\text{1 year}}

Infrastructure fee​

Charged for using the stVaults infrastructure, calculated from Total Value:

infraFee=TVΓ—APRLidoΒ CoreΓ—infraFeeRateΓ—Ξ”year\text{infraFee} = TV \times APR_{\text{Lido Core}} \times \text{infraFeeRate} \times \Delta_{\text{year}}

Liquidity fee​

Charged for actual liquidity usage, calculated from the stETH Liability:

liquidityFee=LΓ—APRLidoΒ CoreΓ—liquidityFeeRateΓ—Ξ”year\text{liquidityFee} = L \times APR_{\text{Lido Core}} \times \text{liquidityFeeRate} \times \Delta_{\text{year}}

Reservation liquidity fee​

Charged for liquidity on demand, calculated from the stETH minting capacity:

reservationFee=capacityΓ—APRLidoΒ CoreΓ—reservationFeeRateΓ—Ξ”year\text{reservationFee} = \text{capacity} \times APR_{\text{Lido Core}} \times \text{reservationFeeRate} \times \Delta_{\text{year}}

Net staking rewards​

What remains of the staking rewards after both fees:

netStakingRewards=grossStakingRewardsβˆ’nodeOperatorFeeβˆ’lidoFees\text{netStakingRewards} = \text{grossStakingRewards} - \text{nodeOperatorFee} - \text{lidoFees}

stETH rebase​

The growth of the stETH liability caused by the stETH rebase. The liability grows at exactly the stETH APR β€” both are the same share rate growth, one expressed in ETH and the other as a percentage.

Only the shares held at the start of the period are counted, which keeps the metric comparable to the APR figures:

rebaseCost=liabilitySharesprevΓ—(shareRatecurrβˆ’shareRateprev)\text{rebaseCost} = \text{liabilityShares}_{prev} \times (\text{shareRate}_{curr} - \text{shareRate}_{prev})

stVault bottom line​

The final result for the Vault Owner inside the stVault perimeter β€” net staking rewards after the stETH liability growth:

bottomLine=netStakingRewardsβˆ’rebaseCost\text{bottomLine} = \text{netStakingRewards} - \text{rebaseCost}

A negative bottom line means the stETH liability grew faster than the stVault earned, which is common while new validators sit in the activation queue.

APR metrics​

All three annualize a period result against the opening Total Value:

APR=numeratorTVprevΓ—secondsInYearperiodSecondsΓ—100%APR = \frac{\text{numerator}}{TV_{prev}} \times \frac{\text{secondsInYear}}{\text{periodSeconds}} \times 100\%

They differ only in the numerator.

note

The denominator is the Total Value at the start of the period, so ETH supplied mid-period is not reflected in it. A large deposit therefore produces a one-period spike or dip in all three APR figures, which levels out in the next period.

Gross staking APR​

Validator rewards expressed as a yearly percentage of Total Value, before any fee deductions.

APRgross=grossStakingRewardsTVprevΓ—secondsInYearperiodSecondsΓ—100%APR_{\text{gross}} = \frac{\text{grossStakingRewards}}{TV_{prev}} \times \frac{\text{secondsInYear}}{\text{periodSeconds}} \times 100\%

Net staking APR​

Estimated yearly return after fees, but without the stETH liability growth from the rebase.

APRnet=netStakingRewardsTVprevΓ—secondsInYearperiodSecondsΓ—100%APR_{\text{net}} = \frac{\text{netStakingRewards}}{TV_{prev}} \times \frac{\text{secondsInYear}}{\text{periodSeconds}} \times 100\%

Carry Spread​

Estimated yearly return after both fees and stETH liability growth.

carrySpread=bottomLineTVprevΓ—secondsInYearperiodSecondsΓ—100%\text{carrySpread} = \frac{\text{bottomLine}}{TV_{prev}} \times \frac{\text{secondsInYear}}{\text{periodSeconds}} \times 100\%

A positive Carry Spread does not guarantee an increase in Health Factor. With a fixed Forced Rebalance Threshold, Health Factor rises when assets grow faster than liabilities in percentage terms and falls when liabilities grow faster than assets.

Restoring an unhealthy stVault​

Three metrics show how much of each corrective action is needed to bring the Utilization Ratio back to 100%. See the Health emergency guide for a worked comparison.

ETH to rebalance​

The ETH to send from the stVault balance to Lido Core, writing off the same stETH liability 1:1:

ETHΒ toΒ rebalance=max⁑ ⁣(0,β€…β€ŠLβˆ’(1βˆ’RR)Γ—TVRR)\text{ETH to rebalance} = \max\!\left(0,\; \frac{L - (1 - RR) \times TV}{RR}\right)

This brings the liability back to exactly the Reserve Ratio capacity, and it is the same expression VaultHub uses for forced rebalancing. The amount is positive whenever the Utilization Ratio is above 100%, which can happen while the stVault is still healthy β€” the protocol only enforces the rebalance once the Forced Rebalance Threshold is breached. On-chain the result is additionally capped at the full liability, and if the liability already exceeds Total Value, rebalancing alone cannot fix the position and the stVault is considered to have bad debt.

info

Unlike the two metrics below, this expression ignores the fee obligation, exactly as the contract does. While unsettled fees are outstanding, they shrink the capacity, so rebalancing this amount leaves the Utilization Ratio slightly above 100%.

stETH to repay​

The stETH to acquire externally and repay, which reduces the liability without touching Total Value:

repay=max⁑(0,β€…β€ŠLβˆ’(TVβˆ’feeObligation)Γ—(1βˆ’RR))\text{repay} = \max\bigl(0,\; L - (TV - \text{feeObligation}) \times (1 - RR)\bigr)

ETH to supply​

The ETH to add to the stVault, which raises Total Value without touching the liability:

supply=repay1βˆ’RR\text{supply} = \frac{\text{repay}}{1 - RR}