You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This guide walks you through the process of disconnecting your stVault from Lido protocol. Disconnecting is a multi-step process that involves initiating the disconnect, waiting for an oracle report, abandoning the Dashboard, and accepting ownership on your EOA. Each step must be completed in order.
10
+
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.
8
11
9
12
## Prerequisites
10
13
11
14
Before starting the disconnection process, make sure:
12
15
13
16
1.**All minted stETH is repaid.** Your vault must have zero liability shares. If you have outstanding stETH minted against the vault, [repay it first](./voluntary-rebalancing-and-vault-closure.md).
14
17
2.**Your vault has a fresh oracle report.** The disconnect will revert if the report is stale. [Apply a fresh report](./applying-report-guide.md) if needed.
15
-
3.**The vault has sufficient balance to cover all unsettled fees.** Both Lido protocol fees and accrued Node Operator fees are settled from the vault balance during the initiation step. If the vault balance is insufficient to cover them, the transaction will revert.
18
+
3.**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.
16
19
17
20
:::info
18
21
Once completed, the vault is removed from Lido protocol. However, the same vault can be reconnected later unless it has been ossified.
The disconnection process starts by calling `Dashboard.voluntaryDisconnect()`. The caller must have the `VOLUNTARY_DISCONNECT_ROLE` or `DEFAULT_ADMIN_ROLE` on the Dashboard.
@@ -29,10 +35,6 @@ This call:
29
35
- Settles all outstanding Lido protocol fees from the vault balance to the Lido treasury.
30
36
- Marks the vault as **pending disconnection** in VaultHub.
31
37
32
-
:::tip Advanced: vault without a Dashboard
33
-
If your vault is not managed through a Dashboard, call `VaultHub.voluntaryDisconnect(vaultAddress)` directly. The caller must be the vault's owner as recorded in VaultHub (`connection.owner`).
34
-
:::
35
-
36
38
<details>
37
39
<summary>using Command-line Interface</summary>
38
40
@@ -70,7 +72,7 @@ Once the transaction succeeds, your vault enters the **pending disconnection** s
70
72
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.
71
73
72
74
:::info
73
-
Normally the oracle report occurs daily at 12 PM UTC.
75
+
Normally the oracle report occurs daily shortly after 12 PM UTC.
74
76
:::
75
77
76
78
When the oracle report is applied and the report timestamp is after your disconnect initiation:
@@ -119,14 +121,14 @@ For more about applying report, read [Applying Report Guide](./applying-report-g
119
121
120
122
## Step 3. Abandon Dashboard and transfer ownership
121
123
122
-
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 EOA.
124
+
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.
- Accepts the pending ownership on behalf of the Dashboard.
127
129
- Initiates an ownership transfer to the specified `newOwner` address.
128
130
129
-
The caller must have `DEFAULT_ADMIN_ROLE` on the Dashboard. The `newOwner` can be any address including the current vault owner (`DEFAULT_ADMIN_ROLE`) **except** the Dashboard itself.
131
+
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.
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 `VaultHub.voluntaryDisconnect(vaultAddress)` directly. The caller must be the vault's owner as recorded in VaultHub (`connection.owner`).
265
+
266
+
This call:
267
+
268
+
- Settles all outstanding Lido protocol fees from the vault balance to the Lido treasury.
269
+
- Marks the vault as **pending disconnection** in VaultHub.
270
+
271
+
<details>
272
+
<summary>using Command-line Interface</summary>
273
+
274
+
```bash
275
+
yarn start contracts hub w v-owner-disconnect <vaultAddress>
276
+
```
277
+
278
+
</details>
279
+
<details>
280
+
<summary>using Etherscan UI</summary>
281
+
282
+
1. 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](../building-guides/basic-stvault#environments)).
283
+
2. Since this contract is a proxy, complete the verification steps once (if not done before):
284
+
- Go to **Contract → Code**.
285
+
- Click **More options**.
286
+
- Select **Is this a proxy?**.
287
+
- Click **Verify** in the dialog.
288
+
- Return to the contract details page.
289
+
3. Open the **Contract** tab → **Write as Proxy**.
290
+
4. Click **Connect to Web3** and connect the wallet for the `connection.owner` address.
291
+
5. Find the `voluntaryDisconnect` method in the list, enter your vault address, and click **Write**.
292
+
6. Sign the transaction in your wallet.
293
+
7. Click **View your transaction** and wait for it to be executed.
294
+
295
+
</details>
296
+
297
+
Once the transaction succeeds, your vault enters the **pending disconnection** state. While pending:
298
+
299
+
- No new stETH can be minted.
300
+
- No ETH can be withdrawn through VaultHub.
301
+
- The vault awaits the next oracle report to finalize the disconnection.
302
+
303
+
## Step 2. Apply the next oracle report
304
+
305
+
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.
306
+
307
+
:::info
308
+
Normally the oracle report occurs daily shortly after 12 PM UTC.
309
+
:::
310
+
311
+
When the oracle report is applied and the report timestamp is after your disconnect initiation:
312
+
313
+
- If there are no slashing obligations and no remaining liability shares, the disconnect **completes successfully**. VaultHub transfers ownership of the StakingVault to `connection.owner` and removes all vault records.
314
+
- If slashing was reported or liabilities remain, the disconnect is **aborted** and the vault returns to connected state.
315
+
316
+
This is a **permissionless operation** — anyone can apply the report.
317
+
318
+
<details>
319
+
<summary>using Command-line Interface</summary>
320
+
321
+
```bash
322
+
yarn start report w submit -v <vaultAddress>
323
+
```
324
+
325
+
The CLI automatically fetches the latest report CID, retrieves the Merkle tree from IPFS, generates the proof, and submits the transaction.
326
+
327
+
</details>
328
+
<details>
329
+
<summary>using Etherscan UI</summary>
330
+
331
+
1. Query the **LazyOracle** contract's `latestReportData()` method to get the current `reportCid`.
332
+
2. Fetch the Merkle tree JSON from IPFS using the CID: `https://ipfs.io/ipfs/<reportCid>`
333
+
3. Locate your vault's entry in the tree and extract the data fields and proof.
334
+
4. 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](../building-guides/basic-stvault#environments)).
335
+
5. Since this contract is a proxy, complete the verification steps once (if not done before):
336
+
- Go to **Contract → Code**.
337
+
- Click **More options**.
338
+
- Select **Is this a proxy?**.
339
+
- Click **Verify** in the dialog.
340
+
- Return to the contract details page.
341
+
6. Open the **Contract** tab → **Write as Proxy**.
342
+
7. Click **Connect to Web3** and connect your wallet in the dialog window.
343
+
8. Find the `updateVaultData` method in the list, fill out the fields with the data from IPFS, and click **Write**.
344
+
9. Sign the transaction in your wallet.
345
+
10. Click **View your transaction** and wait for it to be executed.
346
+
347
+
</details>
348
+
349
+
:::info
350
+
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.
351
+
:::
352
+
353
+
For more about applying report, read [Applying Report Guide](./applying-report-guide.md).
354
+
355
+
## Step 3. Accept ownership
356
+
357
+
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.
358
+
359
+
Call `StakingVault.acceptOwnership()` from the `connection.owner` address.
360
+
361
+
<details>
362
+
<summary>using Command-line Interface</summary>
363
+
364
+
```bash
365
+
yarn start contracts vault w accept-ownership <vaultAddress>
366
+
```
367
+
368
+
</details>
369
+
<details>
370
+
<summary>using Etherscan UI</summary>
371
+
372
+
1. Open **Etherscan** and navigate to the **StakingVault** contract by its address.
373
+
2. Since this contract is a proxy, complete the verification steps once (if not done before):
374
+
- Go to **Contract → Code**.
375
+
- Click **More options**.
376
+
- Select **Is this a proxy?**.
377
+
- Click **Verify** in the dialog.
378
+
- Return to the contract details page.
379
+
3. Open the **Contract** tab → **Write as Proxy**.
380
+
4. Click **Connect to Web3** and connect the wallet for the `connection.owner` address.
381
+
5. Find the `acceptOwnership` method and click **Write**.
382
+
6. Sign the transaction in your wallet.
383
+
7. Click **View your transaction** and wait for it to be executed.
384
+
385
+
</details>
386
+
387
+
After this step, you are the full owner of the StakingVault with no dependency on VaultHub.
388
+
389
+
## Step 4. Withdraw ETH
390
+
391
+
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.
392
+
393
+
Call `StakingVault.withdraw(recipient, amount)` from the owner address.
394
+
395
+
<details>
396
+
<summary>using Command-line Interface</summary>
397
+
398
+
```bash
399
+
yarn start contracts vault w withdraw <vaultAddress><recipientAddress><amountInETH>
400
+
```
401
+
402
+
</details>
403
+
<details>
404
+
<summary>using Etherscan UI</summary>
405
+
406
+
1. Open **Etherscan** and navigate to the **StakingVault** contract by its address.
407
+
2. Since this contract is a proxy, complete the verification steps once (if not done before):
408
+
- Go to **Contract → Code**.
409
+
- Click **More options**.
410
+
- Select **Is this a proxy?**.
411
+
- Click **Verify** in the dialog.
412
+
- Return to the contract details page.
413
+
3. Open the **Contract** tab → **Write as Proxy**.
414
+
4. Click **Connect to Web3** and connect the wallet for the owner address.
415
+
5. Find the `withdraw` method in the list and fill out the fields:
416
+
-`_recipient`: the address to receive the ETH.
417
+
-`_ether`: the amount in wei (e.g., `1000000000000000000` for 1 ETH).
418
+
6. Click **Write** and sign the transaction in your wallet.
419
+
7. Click **View your transaction** and wait for it to be executed.
0 commit comments