Settle and disburse fees
Two distinct fee streams accrue against a vault as it operates, and both need to be cleared periodically. This guide covers the execute-it side of fees:
- Settle Lido protocol fees: pays Lido its protocol-level cut from the vault.
- Disburse node-operator fees: pays the node operator its accrued reward share.
For the configure-it side (changing the fee rate or the operator-grid tier), see Manage operator fees. For what each fee is, how it's calculated, and how the rates compose, see Fee model.
The two fee streams
Both accrue silently against the vault. The Vault page surfaces them: see Vault metrics → Fees and obligations for where to read them.
| Stream | Surfaced as | Cleared by | Available on |
|---|---|---|---|
| Lido protocol fees | vaultData.obligations.feesToSettle | settleLidoFees | SVM (everyone) |
| Node-operator fees | vaultData.accruedFee | disburseFee | SVM Pro |
Both reduce Total Value when they execute. Both require a fresh oracle report before the call will succeed. Both are permissionless on-chain: anyone can trigger them once the conditions are met.
Settle Lido protocol fees (SVM)
Calls VaultHub.settleLidoFees() to send unsettled Lido protocol fees from the vault to Lido's treasury.
When to run it
- The vault's
feesToSettleis non-trivial. - You're about to do something that materially changes Total Value (e.g. exit several validators) and want the protocol's cut taken before the change, not after.
- As a recurring hygiene task: once per pay period, or whenever the obligation grows past your internal threshold.
How to do it
to settle Lido fees in the UI: from a vault page open Operations → Settle Lido fees. The modal previews the amount to settle, the resulting Total Value, and the new Health Factor. Review and sign.
</>to settle Lido fees via the API: seesettleLidoFees. The call is permissionless on-chain, but requires a fresh oracle report: the API auto-prompts a report update if needed.
Verify
vaultData.obligations.feesToSettledrops to zero (or close to it: a small residue can remain if rounding is involved).- Vault Total Value drops by the settled amount.
- Health Factor drops slightly as a result. If it now sits near the warning band, consider rebalancing.
Disburse node-operator fees (SVM Pro)
Pays the vault's accrued node-operator fee out to the operator's fee recipient. The fee recipient is set via setFeeRecipient; by default it's the operator's manager wallet.
When to run it
- The vault's
accruedFeeis at or above your operator's payout threshold (often a per-vault agreement). - A reporting period closes and you settle on a schedule (monthly, quarterly).
- The operator requests payout.
How to do it
to disburse the operator fee in the UI: from a vault page open Operations → Disburse operator fee. The modal shows the accrued fee, the recipient address, and the post-disburse Total Value. Review and sign.
</>to disburse the operator fee via the API: seedisburseFee. Permissionless on-chain as long as the accrued fee isn't abnormally high relative to recent reports: a guard against bad oracle data.
Verify
vaultData.accruedFeedrops to zero.- The fee recipient address receives the disbursed amount.
- Vault Total Value drops by the disbursed amount → Health Factor drops slightly. Same recovery options as above if it now sits low.
A reasonable recurring schedule
Both operations are silent drags between executions, so leaving them un-cleared for long stretches inflates the obligations and amplifies the eventual Total Value dip. A practical cadence:
- Monitor weekly. Check
feesToSettleandaccruedFeeon the Vault metrics page or via the API. - Settle / disburse monthly (or whenever the obligation crosses your internal threshold: e.g. > 1% of Total Value).
- Always settle before a major exit. Exiting validators changes Total Value; settling first keeps the protocol's cut clean and the post-exit Health Factor predictable.
- Settle before a tier change if the new tier tightens the FRT: clearing obligations first gives you more accurate post-change HF projections.
Common pitfalls
- Stale oracle report. Both calls require a fresh report and revert if the obligation values are out of date. The UI auto-prompts an Update report transaction; API callers should call
getLazyOracleReportCallDatafirst if the report is stale. - Settling when there's nothing to settle.
settleLidoFeesreverts iffeesToSettleis zero. Check the value before calling. - Disbursing with an abnormally high accrued fee. The
disburseFeeguard rejects calls when the accrued fee is suspiciously large versus recent reports. If you hit this, sync with your operator and Lido before forcing the call. - Forgetting to update the fee recipient. If the operator's recipient address has moved, set it via
setFeeRecipientbefore disbursing: otherwise the funds land at the old address. - Mistaking this guide for fee setup. Changing the rate or the tier lives in Manage operator fees. This guide only covers paying out what's already accrued.
Related
- Fee model: what each fee is and how it's computed
- Manage operator fees: the configuration side: fee rate and tier
- Vault metrics → Fees and obligations: where to read the pending amounts
- Rebalance a vault: when settling pushes the Health Factor too low
Updated about 4 hours ago
