๐ stVault Disconnect Guide
This guide walks you through the process of disconnecting your stVault from Lido protocol. Disconnecting is a multi-step process and each step must be completed in the given order.
Why disconnect an stVault and what changes afterโ
Disconnecting an stVault is a deliberate action fully controlled by the Vault Owner. It allows the Vault Owner to remove the stVaultโs connection to the Lido protocol and operate it independently.
Why disconnect?โ
A Vault Owner may choose to disconnect for several reasons:
-
Withdraw the connection deposit The 1 ETH deposit used for stVault connection can be withdrawn after disconnection.
-
Stop using Lido protocol services
Disconnecting disables Lido-provided accounting, liquidity by stETH, and fee mechanisms, and therefore stops Lido fee accrual. -
Make the stVault irrevocably independent (ossification)
The stVault can be ossified to prevent any future upgrades or changes, effectively removing any potential influence from Lido DAO. Disconnection does not imply ossification: ossification is an optional, separate action available after disconnection.
What stops working after disconnectionโ
After disconnection, all integrations with Lido protocol components are disabled.
Dashboard contract is abandoned, which means:
- Granular roles and permissions are no longer available.
- Most of the Web UI functionality becomes unavailable.
- Node Operator fee distribution stops.
Node Operators must independently monitor disconnection events, as validation continues after disconnection, but Node Operator fees are no longer accrued. Disconnection can be detected by monitoring the VaultDisconnectInitiated(address indexed vault) event emitted by the VaultHub contract on-chain.
No connection to VaultHub:
- All stETH-related operations are disabled: Minting, Repayment, Rebalancing.
No oracles reports:
- No accounting updates are performed, including Total Value updates and any oracle-driven state changes.
- No Lido fees are charged.
What remains functional after disconnectionโ
stVault disconnection from VaultHub does not affect validators.
The following functionality remains available at the smart contract / CLI level:
- Supplying ETH to the stVault.
- Predeposit Guarantee contract functionality.
- Validator operations continue unaffected: validators keep running and validation rewards continue to accrue.
If the stVault is not ossified, it can be reconnected to VaultHub in the future.
Prerequisitesโ
Before starting the disconnection process, make sure:
- All minted stETH is repaid. Your vault must have zero liability shares. If you have outstanding stETH minted against the vault, repay it first.
- Your vault has a fresh oracle report. The disconnect will revert if the report is stale. Apply a fresh report if needed.
- The vault has sufficient balance to cover all unsettled fees. Both Lido protocol fees and accrued Node Operator fees (if applicable) are settled from the vault balance during the initiation step. If the vault balance is insufficient to cover them, the transaction will revert.
Once completed, the vault is removed from Lido protocol. However, the same vault can be reconnected later unless it has been ossified.
- With Dashboard
- Without Dashboard
Step 1. Initiate voluntary disconnectโ
The disconnection process starts by calling Dashboard.voluntaryDisconnect(). The caller must have the VOLUNTARY_DISCONNECT_ROLE or DEFAULT_ADMIN_ROLE on the Dashboard.
This call:
- Collects any accrued Node Operator fees and transfers them to the Dashboard contract as
feeLeftover, for later recovery (see Step 6). - Stops further fee accrual.
- Settles all outstanding Lido protocol fees from the vault balance to the Lido treasury.
- Marks the vault as pending disconnection in VaultHub.
using Command-line Interface
yarn start contracts dashboard w voluntary-disconnect <dashboardAddress>
using Etherscan UI
- Open Etherscan and navigate to the Dashboard contract by its address.
- Since this contract is a proxy, complete the verification steps once (if not done before):
- Go to Contract โ Code.
- Click More options.
- Select Is this a proxy?.
- Click Verify in the dialog.
- Return to the contract details page.
- Open the Contract tab โ Write as Proxy.
- Click Connect to Web3 and connect your wallet in the dialog window.
- Find the
voluntaryDisconnectmethod in the list and click Write. - Sign the transaction in your wallet.
- Click View your transaction and wait for it to be executed.
Once the transaction succeeds, your vault enters the pending disconnection state. While pending:
- No new stETH can be minted.
- No ETH can be withdrawn through VaultHub.
- The vault awaits the next oracle report to finalize the disconnection.
Step 2. Apply the next oracle reportโ
Wait for the next oracle report, then apply the report data to your vault via LazyOracle.updateVaultData(). This is the step that finalizes the disconnection.
Normally the oracle report occurs daily shortly after 12 PM UTC.
When the oracle report is applied and the report timestamp is after your disconnect initiation:
- If there are no slashing obligations and no remaining liability shares, the disconnect completes successfully. VaultHub transfers ownership of the StakingVault to the Dashboard and removes all vault records.
- If slashing was reported or liabilities remain, the disconnect is aborted and the vault returns to connected state.
This is a permissionless operation โ anyone can apply the report.
using Command-line Interface
yarn start report w submit -v <vaultAddress>
The CLI automatically fetches the latest report CID, retrieves the Merkle tree from IPFS, generates the proof, and submits the transaction.
using Etherscan UI
- Query the LazyOracle contract's
latestReportData()method to get the currentreportCid. - Fetch the Merkle tree JSON from IPFS using the CID:
https://ipfs.io/ipfs/<reportCid> - Locate your vault's entry in the tree and extract the data fields and proof.
- Open Etherscan and navigate to the LazyOracle contract by its address (available in the stVaults contract addresses list, see Basic stVault with optional liquidity: Environments).
- Since this contract is a proxy, complete the verification steps once (if not done before):
- Go to Contract โ Code.
- Click More options.
- Select Is this a proxy?.
- Click Verify in the dialog.
- Return to the contract details page.
- Open the Contract tab โ Write as Proxy.
- Click Connect to Web3 and connect your wallet in the dialog window.
- Find the
updateVaultDatamethod in the list, fill out the fields with the data from IPFS, and click Write. - Sign the transaction in your wallet.
- Click View your transaction and wait for it to be executed.
You can verify the disconnection completed by calling VaultHub.isVaultConnected(vaultAddress) or checking for the VaultDisconnectCompleted event in the transaction logs. If the disconnect was aborted due to slashing or liabilities, a VaultDisconnectAborted event will appear instead, and you will need to resolve the issue before trying again.
For more about applying report, read Applying Report Guide.
Step 3. Abandon Dashboard and transfer ownershipโ
After disconnection completes, the Dashboard holds pending ownership of the StakingVault. Since the Dashboard is tightly coupled to VaultHub, you need to transfer ownership away from it to your account.
Call Dashboard.abandonDashboard(newOwner). This:
- Accepts the pending ownership on behalf of the Dashboard.
- Initiates an ownership transfer to the specified
newOwneraddress.
The caller must have DEFAULT_ADMIN_ROLE on the Dashboard. The newOwner can be any account including the current vault owner (DEFAULT_ADMIN_ROLE) except the Dashboard itself.
using Command-line Interface
yarn start contracts dashboard w abandon-dashboard <dashboardAddress> <newOwnerAddress>
using Etherscan UI
- Open Etherscan and navigate to the Dashboard contract by its address.
- Since this contract is a proxy, complete the verification steps once (if not done before):
- Go to Contract โ Code.
- Click More options.
- Select Is this a proxy?.
- Click Verify in the dialog.
- Return to the contract details page.
- Open the Contract tab โ Write as Proxy.
- Click Connect to Web3 and connect your wallet in the dialog window.
- Find the
abandonDashboardmethod in the list, enter the new owner address, and click Write. - Sign the transaction in your wallet.
- Click View your transaction and wait for it to be executed.
Step 4. Accept ownershipโ
The StakingVault uses a two-step ownership transfer. After the Dashboard initiates the transfer in the previous step, you must accept it from the newOwner address.
Call StakingVault.acceptOwnership() from the address specified as newOwner in the previous step.
using Command-line Interface
yarn start contracts vault w accept-ownership <vaultAddress>
using Etherscan UI
- Open Etherscan and navigate to the StakingVault contract by its address.
- Since this contract is a proxy, complete the verification steps once (if not done before):
- Go to Contract โ Code.
- Click More options.
- Select Is this a proxy?.
- Click Verify in the dialog.
- Return to the contract details page.
- Open the Contract tab โ Write as Proxy.
- Click Connect to Web3 and connect the wallet for the
newOwneraddress. - Find the
acceptOwnershipmethod and click Write. - Sign the transaction in your wallet.
- Click View your transaction and wait for it to be executed.
After this step, you are the full owner of the StakingVault with no dependency on VaultHub or the Dashboard.
Step 5. Withdraw ETHโ
When your vault was connected to VaultHub, 1 ETH was locked as a connection deposit (minimal reserve). Now that the vault is fully disconnected, you can withdraw this deposit along with any other remaining balance.
Call StakingVault.withdraw(recipient, amount) from the owner address.
using Command-line Interface
yarn start contracts vault w withdraw <vaultAddress> <recipientAddress> <amountInETH>
using Etherscan UI
- Open Etherscan and navigate to the StakingVault contract by its address.
- Since this contract is a proxy, complete the verification steps once (if not done before):
- Go to Contract โ Code.
- Click More options.
- Select Is this a proxy?.
- Click Verify in the dialog.
- Return to the contract details page.
- Open the Contract tab โ Write as Proxy.
- Click Connect to Web3 and connect the wallet for the
newOwneraddress. - Find the
withdrawmethod in the list and fill out the fields:_recipient: the address to receive the ETH._ether: the amount in wei (e.g.,1000000000000000000for 1 ETH).
- Click Write and sign the transaction in your wallet.
- Click View your transaction and wait for it to be executed.
Step 6. Recover Node Operator feesโ
During Step 1, accrued Node Operator fees were withdrawn from the vault and stored on the Dashboard contract as feeLeftover rather than sent directly to the feeRecipient. This is intentional: if the feeRecipient were a contract that rejects ETH transfers, sending fees directly would revert and block the disconnect.
To send the stored fees to the configured feeRecipient, call Dashboard.recoverFeeLeftover(). This is a permissionless operation, anyone can call it, and the fees will be sent to the feeRecipient address configured on the Dashboard.
using Command-line Interface
yarn start contracts dashboard w recover-fee-leftover <dashboardAddress>
using Etherscan UI
- Open Etherscan and navigate to the Dashboard contract by its address.
- Since this contract is a proxy, complete the verification steps once (if not done before):
- Go to Contract โ Code.
- Click More options.
- Select Is this a proxy?.
- Click Verify in the dialog.
- Return to the contract details page.
- Open the Contract tab โ Write as Proxy.
- Click Connect to Web3 and connect your wallet in the dialog window.
- Find the
recoverFeeLeftovermethod in the list and click Write. - Sign the transaction in your wallet.
- Click View your transaction and wait for it to be executed.
Step 1. Initiate voluntary disconnectโ
Call VaultHub.voluntaryDisconnect(vaultAddress) directly. The caller must be the vault's owner as recorded in VaultHub (connection.owner).
This call:
- Settles all outstanding Lido protocol fees from the vault balance to the Lido treasury.
- Marks the vault as pending disconnection in VaultHub.
using Command-line Interface
yarn start contracts hub w v-owner-disconnect <vaultAddress>
using Etherscan UI
- Open Etherscan and navigate to the VaultHub contract by its address (available in the stVaults contract addresses list, see Basic stVault with optional liquidity: Environments).
- Since this contract is a proxy, complete the verification steps once (if not done before):
- Go to Contract โ Code.
- Click More options.
- Select Is this a proxy?.
- Click Verify in the dialog.
- Return to the contract details page.
- Open the Contract tab โ Write as Proxy.
- Click Connect to Web3 and connect the wallet for the
connection.owneraddress. - Find the
voluntaryDisconnectmethod in the list, enter your vault address, and click Write. - Sign the transaction in your wallet.
- Click View your transaction and wait for it to be executed.
Once the transaction succeeds, your vault enters the pending disconnection state. While pending:
- No new stETH can be minted.
- No ETH can be withdrawn through VaultHub.
- The vault awaits the next oracle report to finalize the disconnection.
Step 2. Apply the next oracle reportโ
Wait for the next oracle report, then apply the report data to your vault via LazyOracle.updateVaultData(). This is the step that finalizes the disconnection.
Normally the oracle report occurs daily shortly after 12 PM UTC.
When the oracle report is applied and the report timestamp is after your disconnect initiation:
- If there are no slashing obligations and no remaining liability shares, the disconnect completes successfully. VaultHub transfers ownership of the StakingVault to
connection.ownerand removes all vault records. - If slashing was reported or liabilities remain, the disconnect is aborted and the vault returns to connected state.
This is a permissionless operation โ anyone can apply the report.
using Command-line Interface
yarn start report w submit -v <vaultAddress>
The CLI automatically fetches the latest report CID, retrieves the Merkle tree from IPFS, generates the proof, and submits the transaction.
using Etherscan UI
- Query the LazyOracle contract's
latestReportData()method to get the currentreportCid. - Fetch the Merkle tree JSON from IPFS using the CID:
https://ipfs.io/ipfs/<reportCid> - Locate your vault's entry in the tree and extract the data fields and proof.
- Open Etherscan and navigate to the LazyOracle contract by its address (available in the stVaults contract addresses list, see Basic stVault with optional liquidity: Environments).
- Since this contract is a proxy, complete the verification steps once (if not done before):
- Go to Contract โ Code.
- Click More options.
- Select Is this a proxy?.
- Click Verify in the dialog.
- Return to the contract details page.
- Open the Contract tab โ Write as Proxy.
- Click Connect to Web3 and connect your wallet in the dialog window.
- Find the
updateVaultDatamethod in the list, fill out the fields with the data from IPFS, and click Write. - Sign the transaction in your wallet.
- Click View your transaction and wait for it to be executed.
You can verify the disconnection completed by calling VaultHub.isVaultConnected(vaultAddress) or checking for the VaultDisconnectCompleted event in the transaction logs. If the disconnect was aborted due to slashing or liabilities, a VaultDisconnectAborted event will appear instead, and you will need to resolve the issue before trying again.
For more about applying report, read Applying Report Guide.
Step 3. Accept ownershipโ
The StakingVault uses a two-step ownership transfer. After the disconnect completes, VaultHub transfers pending ownership to connection.owner. You must accept it from that address.
Call StakingVault.acceptOwnership() from the connection.owner address.
using Command-line Interface
yarn start contracts vault w accept-ownership <vaultAddress>
using Etherscan UI
- Open Etherscan and navigate to the StakingVault contract by its address.
- Since this contract is a proxy, complete the verification steps once (if not done before):
- Go to Contract โ Code.
- Click More options.
- Select Is this a proxy?.
- Click Verify in the dialog.
- Return to the contract details page.
- Open the Contract tab โ Write as Proxy.
- Click Connect to Web3 and connect the wallet for the
connection.owneraddress. - Find the
acceptOwnershipmethod and click Write. - Sign the transaction in your wallet.
- Click View your transaction and wait for it to be executed.
After this step, you are the full owner of the StakingVault with no dependency on VaultHub.
Step 4. Withdraw ETHโ
When your vault was connected to VaultHub, 1 ETH was locked as a connection deposit (minimal reserve). Now that the vault is fully disconnected, you can withdraw this deposit along with any other remaining balance.
Call StakingVault.withdraw(recipient, amount) from the owner address.
using Command-line Interface
yarn start contracts vault w withdraw <vaultAddress> <recipientAddress> <amountInETH>
using Etherscan UI
- Open Etherscan and navigate to the StakingVault contract by its address.
- Since this contract is a proxy, complete the verification steps once (if not done before):
- Go to Contract โ Code.
- Click More options.
- Select Is this a proxy?.
- Click Verify in the dialog.
- Return to the contract details page.
- Open the Contract tab โ Write as Proxy.
- Click Connect to Web3 and connect the wallet for the owner address.
- Find the
withdrawmethod in the list and fill out the fields:_recipient: the address to receive the ETH._ether: the amount in wei (e.g.,1000000000000000000for 1 ETH).
- Click Write and sign the transaction in your wallet.
- Click View your transaction and wait for it to be executed.