🔌 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.
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.