Lido V3 — Design & Implementation Proposal

Lido V3 — Deployment update and upcoming voting details

TL;DR

  • Technical pre-deployment complete: All Lido V3 contracts have been pre-deployed to Ethereum mainnet and verified on Etherscan. Source code used matches the latest audited commit.
  • Final verification in progress: Deployment artifacts have been sent to auditors for independent verification. Before the vote begins, finalized audit reports will be published in a thread, also MixBytes will provide a deployment verification note.
  • Vote timeline: Providing no last-minute security findings and audit reports published, an on-chain Aragon vote is tentatively targeted to commence on December 10th, 2025, with enactment optimistically (if supported and non-contentious) expected around December 19th, 2025 (within the 14:00–23:00 UTC window).
  • This follow-up note provides complete contract addresses, constructor parameters with rationale, voting structure breakdown, and expected next steps.

Context recap

Following the proposal approval via Snapshot vote, testnet phases left behind, and audit campaign finished, Lido contributors have completed the technical mainnet pre-deployment of all V3 contracts. This update serves as the upcoming voting announcement and details thread ahead of the on-chain vote.

For those new to this topic, Lido V3 introduces staking Vaults (stVaults) — isolated, non-custodial contracts allowing stakers to choose their operator and stake setup while still minting stETH. The existing Core Pool remains unchanged. V3 = Core Pool + stVaults.


Deployment summary

Source code references

Component Repository Audited Commit Deploy Commit
Core Protocol lidofinance/core b98371488 b8d51cc7 (UPDATED: 2025-12-11)
Easy Track lidofinance/easy-track c64468ca5 Same

Note: The deploy commit contains updates to tests, scripts, and voting contracts only. These changes do not affect the bytecode of core protocol contracts — deployed contracts have identical bytecode to the audited commit. View diff.


Contract addresses

Voting tooling contracts

Contract Address Purpose
V3TemporaryAdmin 0xf738A2C7d69694B618dbB547C1c5A152D7958f06 Auxiliary contract for intermediate admin tasks during deployment; transfers admin to Agent afterward
V3VoteScript 0xE1F4c16908fCE6935b5Ad38C6e3d58830fe86442 (UPDATED: 2025-12-11) Vote script orchestrating all upgrade actions
V3Template 0x34E01ecFebd403370b0879C628f8A5319dDb8507 Upgrade template with two-step procedure: startUpgrade() / finishUpgrade()

Core protocol upgrades

Contract Proxy Address New Implementation Notes
Lido (stETH) 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84 0x6ca84080381E43938476814be61B779A8bB6a600 Upgrades to V3 logic via Aragon Kernel
LidoLocator 0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb 0x2f8779042EFaEd4c53db2Ce293eB6B3f7096C72d Registry with protocol contract addresses
AccountingOracle 0x852deD011285fe67063a08005c71a85690503Cee 0x1455B96780A93e08abFE41243Db92E2fCbb0141c Upgrades to v4 with stVaults state root reporting (consensus version v5)

New protocol contracts (to perform migrations)

Contract Proxy Address Implementation Notes
Burner 0xE76c52750019b80B43E36DF30bf4060EB73F573a 0xEe1E3B4f047122650086985f794f0dB5f10Ae49D New upgradeable burner replacing old non-upgradeable contract
OracleReportSanityChecker 0xf1647c86E6D7959f638DD9CE1d90e2F3C9503129 New instance with V3-compatible limits
TokenRateNotifier 0x25e35855783bec3E49355a29e110f02Ed8b05ba9 New instance; observers migrated from old notifier

Newly introduced stVaults system contracts

Contract Proxy Address Implementation Notes
VaultHub 0x1d201BE093d847f6446530Efb0E8Fb426d176709 0x7c7d957D0752AB732E73400624C4a1eb1cb6CF50 Central hub for stVault coordination and stETH minting
PredepositGuarantee 0xF4bF42c6D6A0E38825785048124DBAD6c9eaaac3 0xCC08C36BD5bb78FDcB10F35B404ada6Ffc71a023 Protects deposits from front-running attacks
OperatorGrid 0xC69685E89Cefc327b43B7234AC646451B27c544d 0xA612E30D71d7D54aEaf4e5A21023F3F270932C2C Manages operator groups and risk tiers
Accounting 0x23ED611be0e1a820978875C0122F92260804cdDf 0xd43a3E984071F40d5d840f60708Af0e9526785df New accounting module for V3
LazyOracle 0x5DB427080200c235F2Ae8Cd17A7be87921f7AD6c 0x47f3a6b1E70F7Ec7dBC3CB510B1fdB948C863a5B “Lazy oracle” for vault value updates with quarantine

stVaults factory stack

Contract Address Notes
VaultFactory 0x02Ca7772FF14a9F6c1a08aF385aA96bb1b34175A Factory for creating new stVaults
UpgradeableBeacon 0x5FbE8cEf9CCc56ad245736D3C5bAf82ad54Ca789 Beacon proxy pattern for stVault upgrades
StakingVault (impl) 0x06A56487494aa080deC7Bf69128EdA9225784553 Reference implementation for vaults
Dashboard (impl) 0x294825c2764c7D412dc32d87E2242c4f1D989AF3 Dashboard helper for vault management
ValidatorConsolidationRequests 0xaC4Aae7123248684C405A4b0038C1560EC7fE018 Handles validator consolidation requests

GateSeal

Contract Address Notes
GateSeal (VaultHub + PDG) 0x881dAd714679A6FeaA636446A0499101375A365c Emergency pause for VaultHub and PredepositGuarantee

GateSeal Blueprint: 0xEe06EA501f7d9DC6F4200385A8D910182D155d3e
GateSeal Factory: 0x6c82877cac5a7a739f16ca0a89c0a328b8764a24
Sealing Committee: 0x8772E3a2D86B9347A2688f9bc1808A6d8917760C (existing GateSeal Committee)

Easy Track factories for stVaults Committee

Factory Address Purpose Phase
RegisterGroupsInOperatorGrid 0x194A46DA1947E98c9D79af13E06Cfbee0D8610cC Register new operator groups Phase 1 (50k stETH max)
RegisterGroupsInOperatorGrid 0xE73842AEbEC99Dacf2aAEec61409fD01A033f478 Register new operator groups Phase 2/3 (1M stETH max)
UpdateGroupsShareLimitInOperatorGrid 0x8Bdc726a3147D8187820391D7c6F9F942606aEe6 Update group share limits Phase 1 (50k stETH max)
UpdateGroupsShareLimitInOperatorGrid 0xf23559De8ab37fF7a154384B0822dA867Cfa7Eac Update group share limits Phase 2/3 (1M stETH max)
RegisterTiersInOperatorGrid 0x5292A1284e4695B95C0840CF8ea25A818751C17F Register new risk tiers All phases
AlterTiersInOperatorGrid 0xa29173C7BCf39dA48D5E404146A652d7464aee14 Modify existing tier parameters Phase 1 (0 default tier limit)
AlterTiersInOperatorGrid 0x73f80240ad9363d5d3C5C3626953C351cA36Bfe9 Modify existing tier parameters Phase 2/3 (1M default tier limit)
SetJailStatusInOperatorGrid 0x93F1DEE4473Ee9F42c8257C201e33a6Da30E5d67 Jail/unjail vault minting capability All phases
UpdateVaultsFeesInOperatorGrid 0x5C3bDFa3E7f312d8cf72F56F2b797b026f6B471c Update vault fee rates All phases
ForceValidatorExitsInVaultHub 0x6C968cD89CA358fbAf57B18e77a8973Fa869a6aA Trigger forced validator exits All phases
SocializeBadDebtInVaultHub 0x1dF50522A1D868C12bF71747Bb6F24A18Fe6d32C Socialize bad debt between vaults All phases
VaultsAdapter 0xe2DE6d2DefF15588a71849c0429101F8ca9FB14D Helper contract for Easy Track operations All phases

Notes:

  1. SetLiabilitySharesTargetInVaultHub (0x4E5Cc771c7b77f1417fa6BA9262d83C6CCc1e969) is deployed but will not be connected in the initial vote, as there are no current plans to use it.
  2. Phase 2/3 factories RegisterGroupsInOperatorGrid 0xE73842AEbEC99Dacf2aAEec61409fD01A033f478, UpdateGroupsShareLimitInOperatorGrid 0xf23559De8ab37fF7a154384B0822dA867Cfa7Eac, AlterTiersInOperatorGrid 0x73f80240ad9363d5d3C5C3626953C351cA36Bfe9 are deployed but also will not be connected in the initial vote.

Discontinued Contracts

Contract Address Notes
Burner (old) 0xD15a672319Cf0352560eE76d9e89eAB0889046D3 Non-upgradeable; replaced by new Burner
OracleReportSanityChecker (old) 0x6232397ebac4f5772e53285b26c47914e9461e75 Replaced by new instance
TokenRateNotifier (old) 0xe6793B9e4FbA7DE0ee833F9D02bba7DB5EB27823 Observers migrated to new notifier
LegacyOracle 0x442af784A788A5bd6F42A01Ebe9F287a871243fb Fully deprecated; no longer referenced

Constructor/initializer parameters and rationale

V3Template Constructor

constructorArgs: [
  V3AddressesParams (struct with 29 addresses and lido app id),
  expireSinceInclusive: 1768435200,  // Unix timestamp: Jan 15, 2026
  initialMaxExternalRatioBP: 300     // 3% = 300 basis points
]
Parameter Value Rationale
expireSinceInclusive 1768435200 (Jan 15, 2026 00:00:00 UTC) Safety mechanism: if the upgrade isn’t enacted by this date, the template becomes unusable. Provides ~4 weeks buffer from expected enactment.
initialMaxExternalRatioBP 300 (3%) Phase 1 global cap: At most 3% of total stETH supply can be minted via stVaults initially. Ensures Core Pool remains ≥97% of Lido TVL during pilot phase. Per the Risk Assessment Framework and Phase 1 limits ratified via the snapshot.

V3VoteScript Constructor

constructorArgs: [
  upgradeTemplate: 0x34E01ecFebd403370b0879C628f8A5319dDb8507,
  timeConstraints: 0x2a30F5aC03187674553024296bed35Aa49749DDa,
  odcSlashingReserveWeRightShiftEpochs: 8192,
  odcSlashingReserveWeLeftShiftEpochs: 8192
]
Parameter Value Rationale
timeConstraints 0x2a30F5aC03187674553024296bed35Aa49749DDa An axuliary contracts that allows to create time windows eligible for the vote enactments, used in DG before
odcSlashingReserveWeRightShiftEpochs 8192 Oracle daemon config: epochs to look back from withdrawable_epoch when including slashings in stVault oracle reports. 8192 epochs ≈ 36 days — covers possible correlation penalty period effects.
odcSlashingReserveWeLeftShiftEpochs 8192 Oracle daemon config: forward-looking window for slashing inclusion. Symmetric with right shift for consistent accounting.
ENABLED_DAY_SPAN_START 50400 (14:00 UTC) Execution window start — ensures enactment happens somewhere after regular AccountingOracle report arrival.
ENABLED_DAY_SPAN_END 82800 (23:00 UTC) Execution window end — 9-hour window accommodates global contributors availability.

VaultHub Constructor

constructorArgs: [
  lidoLocator: 0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb,
  lido: 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84,
  hashConsensusForAccountingOracle: 0xD624B08C83bAECF0807Dd2c6880C3154a5F0B288,
  maxRelativeShareLimitBP: 1000  // 10%
]
Parameter Value Rationale
maxRelativeShareLimitBP 1000 (10%) Maximum share limit any single vault can have relative to total stETH. Sanity check defensive parameter.

OperatorGrid Initialization

initialize params (encoded):
  admin: 0xf738A2C7d69694B618dbB547C1c5A152D7958f06 (V3TemporaryAdmin),
  defaultTierId: 0,
  defaultTierReserveRatio: 5000,             // 50%
  defaultTierForceRebalanceThreshold: 4975,  // 49.75%
  defaultTierInfraFeeBP: 100,                // 1%
  defaultTierLiquidityFeeBP: 650,            // 6.5%
  defaultTierReservationFeeBP: 0             // 0%
Parameter Value Rationale
Default Tier Reserve Ratio 5000 (50%) Permissionless vaults must hold 50% collateral unminted. Identified operators get lower RR via custom tiers. Per Default Parameters Proposal.
Default Tier Force Rebalance Threshold 4975 (49.75%) 0.25% below RR. If a vault’s reserve falls below this (e.g., due to slashing), forced rebalancing becomes possible. Small buffer prevents trivial fluctuations triggering rebalance.
Default Tier Infrastructure Fee 100 (1%) DAO’s share of vault rewards for platform usage. Covers oracle/operational costs. Per Default Parameters Proposal.
Default Tier Liquidity Fee 650 (6.5%) Fee for stETH liquidity provision. Compensates for liquidity risk. Per Default Parameters Proposal.
Default Tier Reservation Fee 0 (0%) Initially 0% to simplify initial Lido V3 design. May be revisited to incentivize efficient capital use in future protocol versions.

LazyOracle Initialization

initialize params (encoded):
  admin: 0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c (Agent),
  quarantinePeriod: 259200,                     // 3 days in seconds
  rewardRatioBP: 350,                           // 3.5%
  maxLidoFeeRatePerSecond: 2880000000000000000  // ~0.0029 ETH/s
Parameter Value Rationale
quarantinePeriod 259200 (3 days) Per LIP-32: suspicious vault value increases are quarantined for 3 days before being credited. Prevents manipulation via fake value increases.
rewardRatioBP 350 (3.5%) Maximum reward ratio per oracle report. Sanity check against abnormal reward spikes.
maxLidoFeeRatePerSecond ~2.88e18 Maximum theoretical fee rate the protocol can charge per second. Safety bound.

Easy Track Factory Limits

Factory Type Phase 1 Limit Phase 2/3 Limit Rationale
Group registration/update 50,000 stETH 1,000,000 stETH Phase 1: Conservative per-operator cap. Later phases allow larger operators.
Default tier share limit 0 stETH 1,000,000 stETH Phase 1: Permissionless minting disabled. Phase 3 enables permissionless minting vaults.
Fee bounds (infrastructure) ≤1% (100 BP) Committee can adjust within bounds; higher requires DAO vote.
Fee bounds (liquidity) ≤10% (1000 BP) Committee can adjust within bounds; higher requires DAO vote.
Fee bounds (reservation) =0% (fixed) Currently unused.
Validator exit fee limit 0.1 ETH Max EIP-7002 fee paid for forced exit operations (under EL requests congestion).

OracleReportSanityChecker Constructor

constructorArgs: [
  lidoLocator,
  accountingOracle,
  accounting,
  agent,
  limits: [3600, 1800, 1000, 50, 600, 8, 24, 7680, 750000, 8, 101, 50]
]
Limit Value Meaning
exitedValidatorsPerDayLimit 3600 The max possible number of validators that might be reported as exited
appearedValidatorsPerDayLimit 1800 The max possible number of validators that might be reported as appeared
annualBalanceIncreaseBPLimit 1000 (10%) Max annual CL balance increase rate
simulatedShareRateDeviationBPLimit 50 (0.5%) Max share rate deviation in simulation
maxValidatorExitRequestsPerReport 600 Max exit requests per validator exit bus oracle report
maxItemsPerExtraDataTransaction 8 Max extra data items in accounting reports
maxNodeOperatorsPerExtraDataItem 24 Max operators per extra data item
requestTimestampMargin 7680 Timestamp margin for requests (seconds)
maxPositiveTokenRebase 750000 Max positive rebase (in 1e9 precision)
initialSlashingAmountPWei 8 Initial slashing amount (peta-wei)
inactivityPenaltiesAmountPWei 101 Inactivity penalties (peta-wei)
clBalanceOraclesErrorUpperBPLimit 50 CL balance oracle error upper bound

Note: these parameters are 1:1 with the currently plugged and used OracleReportSanityChecker version.

AccountingOracle Constructor

constructorArgs: [
  lidoLocator: 0xC1d0b3DE6792Bf6b4b37EccdcC24e45978Cfd2Eb,
  secondsPerSlot: 12,
  genesisTime: 1606824023
]
Parameter Value Rationale
secondsPerSlot 12 Ethereum mainnet slot duration
genesisTime 1606824023 Ethereum mainnet beacon chain genesis (Dec 1, 2020)
Post-upgrade consensus version 5 Bumped from 4 to support stVaults state root reporting
Post-upgrade contract version 4 Bumped from 3 to reflect new capabilities

GateSeal Configuration

Parameter Value Rationale
Seal Duration 14 days Pause duration before automatic expiry. Ensures system can’t be halted indefinitely.
Sealing Committee 0x8772E3a2D86B9347A2688f9bc1808A6d8917760C Existing GateSeal Committee multisig.
Sealables VaultHub, PredepositGuarantee New V3 contracts requiring emergency pause capability.
Expiration timestamp 1796302499 Roughly 1 year duration, corresponds to Thursday, December 3, 2026 12:54:59 PM

Voting Structure

The on-chain Aragon vote is an omnibus proposal with two distinct parts:

Part 1: Voting Items (8 items) — Execute Immediately

These items are executed when the Aragon vote passes (no Dual Governance delay):

# Action Contract Target Permission Granted
2 Add AlterTiersInOperatorGrid (Phase 1) factory to Easy Track EasyTrack operatorGrid.alterTiers
3 Add RegisterGroupsInOperatorGrid (Phase 1) factory to Easy Track EasyTrack operatorGrid.registerGroup, operatorGrid.registerTiers
4 Add RegisterTiersInOperatorGrid factory to Easy Track EasyTrack operatorGrid.registerTiers
5 Add UpdateGroupsShareLimitInOperatorGrid (Phase 1) factory to Easy Track EasyTrack operatorGrid.updateGroupShareLimit
6 Add SetJailStatusInOperatorGrid factory to Easy Track EasyTrack vaultsAdapter.setVaultJailStatus
7 Add UpdateVaultsFeesInOperatorGrid factory to Easy Track EasyTrack vaultsAdapter.updateVaultFees
8 Add ForceValidatorExitsInVaultHub factory to Easy Track EasyTrack vaultsAdapter.forceValidatorExit
9 Add SocializeBadDebtInVaultHub factory to Easy Track EasyTrack vaultsAdapter.socializeBadDebt

Part 2: Dual Governance Items (21 items) — Subject to DG Veto Period

These items go through Dual Governance and execute only after the veto period:

# Action Purpose
1.1 Check execution time window (14:00–23:00 UTC) Ensure DG proposal enactment aligned with oracle reports and during monitored hours
1.2 Call V3Template.startUpgrade() Lock upgrade window, record initial state
1.3 Upgrade LidoLocator implementation Point to new V3 contract registry
1.4 Grant APP_MANAGER_ROLE to Agent Temporary permission for Lido upgrade
1.5 Set Lido implementation in Aragon Kernel Upgrade stETH contract to V3 logic
1.6 Revoke APP_MANAGER_ROLE from Agent Clean up temporary permission
1.7 Revoke REQUEST_BURN_SHARES_ROLE from Lido on old Burner Remove obsolete permission
1.8 Revoke REQUEST_BURN_SHARES_ROLE from Curated Module on old Burner Remove obsolete permission
1.9 Revoke REQUEST_BURN_SHARES_ROLE from SimpleDVT on old Burner Remove obsolete permission
1.10 Revoke REQUEST_BURN_SHARES_ROLE from CSM Accounting on old Burner Remove obsolete permission
1.11 Upgrade AccountingOracle implementation Enable stVaults state root reporting
1.12 Revoke REPORT_REWARDS_MINTED_ROLE from Lido on StakingRouter Transfer responsibility to Accounting
1.13 Grant REPORT_REWARDS_MINTED_ROLE to Accounting on StakingRouter New rewards reporting path
1.14 Grant CONFIG_MANAGER_ROLE to Agent on OracleDaemonConfig Temporary permission for config update
1.15 Set SLASHING_RESERVE_WE_RIGHT_SHIFT in OracleDaemonConfig Configure oracle slashing lookback (8192 epochs)
1.16 Set SLASHING_RESERVE_WE_LEFT_SHIFT in OracleDaemonConfig Configure oracle slashing look-ahead (8192 epochs)
1.17 Revoke CONFIG_MANAGER_ROLE from Agent on OracleDaemonConfig Clean up temporary permission
1.18 Grant PAUSE_ROLE to Agent on PredepositGurantee Temporary permission for PDG state update
1.19 Pause PredepositGurantee indefinitely Disable PDG-guided deposit flows
1.20 Revoke PAUSE_ROLE to Agent from PredepositGurantee Clean up temporary permission
1.21 Call V3Template.finishUpgrade() Finalize upgrade, migrate burner state, set external ratio

NOTE: Items 1.18—1.20 added according to the 2025-12-11 update by @tamtamchik

Role Changes Summary

New Burner roles (post-upgrade):

  • DEFAULT_ADMIN_ROLE: Agent
  • REQUEST_BURN_SHARES_ROLE: Accounting, CSM Accounting
  • REQUEST_BURN_MY_STETH_ROLE: ∅ (none)

VaultHub roles:

  • DEFAULT_ADMIN_ROLE: Agent
  • VALIDATOR_EXIT_ROLE: VaultsAdapter
  • BAD_DEBT_MASTER_ROLE: VaultsAdapter
  • PAUSE_ROLE: GateSeal, ResealManager
  • RESUME_ROLE: ResealManager
  • VAULT_MASTER_ROLE: ∅ (none)
  • REDEMPTION_MASTER_ROLE: ∅ (none)

OperatorGrid roles:

  • DEFAULT_ADMIN_ROLE: Agent
  • REGISTRY_ROLE: EVMScriptExecutor, VaultsAdapter

PredepositGuarantee roles:

  • DEFAULT_ADMIN_ROLE: Agent
  • PAUSE_ROLE: GateSeal, ResealManager
  • RESUME_ROLE: ResealManager

StakingRouter changes:

  • REPORT_REWARDS_MINTED_ROLE: Lido → Accounting

Tentative Timeline

NOTE: Timing subject to security findings and operational readiness. Any delays will be communicated.

Date Milestone
December 10th On-chain Aragon vote commences (~3 days voting + 2 days objection)
December 15th Vote enactment; Easy Track factories become active; DG submission for core upgrade
December 15th–19th Dual Governance veto collection period (~3 days) + pre-execution timelock (~1 day)
December 19th Rollout date — Enactment window 14:00–23:00 UTC. First stVaults can be created and connected to VaultHub.
December 20th First AccountingOracle report containing stVaults state data (may have slight delays)
Late Dec 2025+ Active monitoring, running-in period, phase transition planning
~Jan 2026 If 30 days pass with no incidents, DAO considers Phase 2 transition (30% cap)
~Q1 2026 Target for Phase 3 (permissionless minting) if conditions met

Verification and Audit Status

Audits

Lido V3 has undergone multiple independent audits:

Firm Scope Status
Certora Formal verification + on/off-chain audit rounds Completed, reports to be published
ConsenSys Diligence An on-chain audit + invariant fuzzing Completed, report to be published
Composable Security Oracle/infra audit, threat models beyond Completed, report to be published
MixBytes Vault logic, global accounting math, Easy Track factories, governance wiring Completed, reports to be published

Final audit reports will be published in the Lido Audits repository and linked here once available.

Deployment Verification

An independent deployment verification report by MixBytes will be published before the vote begins. This report will confirm:

  • Bytecode matches audited commit
  • Constructor parameters are correct
  • Access control is properly configured
  • State initialization is valid

Bug Bounty

The Immunefi bug bounty program are to be extended to cover V3 contracts. Also, there is an ongoing Lido V3 bug bounty competition with boosted rewards for any severe vulnerabilities found.


What this means for stakers

Existing stETH/wstETH holders: No action required. The upgrade is backward-compatible. All existing functionality (staking, wrapping, withdrawals, transfers, permits) continues to work exactly as before.

New vault users: After enactment, you can create stVaults and stake ETH immediately. stETH minting will be available for identified operators within the 3% global cap (Phase 1). Permissionless minting is disabled until Phase 3.

Node Operators: Early adopters and Lido V3 supporters will be onboarded first. Contact the stVaults Committee for participation details.


Next Steps

  1. Final audit reports — To be published and linked
  2. MixBytes deployment verification report — Expected before vote launch
  3. On-chain vote — Tentatively penciled for December, 10th
  4. Community monitoring — Post-upgrade observation period

If you have questions about the upgrade mechanics, contract parameters, or any edge cases, please ask below. Lido contributors are here to address your queries.

Thank you for your engagement in the Lido DAO governance. Onwards to Lido V3! :rocket:

11 Likes