Withdrawing from opBNB, Optimism and Unichain
Venus is sunsetting opBNB, Optimism and Unichain. This guide explains how to close an existing position through the network’s block explorer when the Venus app no longer offers the relevant page. Your funds remain in the protocol.
Supplying and borrowing are paused. Market repayment and withdrawal remain enabled, subject to liquidity and account health. XVS Vault withdrawals and bridging have separate checks described below; the app’s XVS Bridge no longer offers these three networks.
Borrow interest keeps accruing and positions can still be liquidated, so repay first, then withdraw.
Positions on BNB Chain, Ethereum, Arbitrum, Base and ZKsync Era are separate deployments and are not affected.
Before you start
Section titled “Before you start”- Open the explorer for your network and connect the wallet that holds the position:
- opBNB (chain ID 204) — opBNBScan
- Optimism (chain ID 10) — Optimistic Etherscan
- Unichain (chain ID 130) — Uniscan
- On each contract page, open the Contract tab. Use Read as Proxy / Write as Proxy for vTokens, the Comptroller and XVS Vault; use Read Contract / Write Contract for the NativeTokenGateway and XVS bridge. For an underlying token, use the verified read/write interface shown by the explorer. If the required functions are unavailable, stop and ask for help — do not transact against an implementation address.
- Token function arguments use base units. Check
decimals()on the token: 1 USDC with 6 decimals is1000000. The explorer’s native-value field labelledpayableAmount (OPBNB)orpayableAmount (ether)uses whole BNB/ETH, not wei:0.01means 0.01 BNB/ETH. Divide a wei amount by10^18before entering it there. - Keep some native BNB or ETH for gas.
- Only use the addresses in the tables below. Token names and symbols can be imitated, and Venus will never ask for your seed phrase or private key.
Your contracts
Section titled “Your contracts”- Comptroller:
0xD6e3E2A1d8d95caE355D15b3b9f8E5c2511874dd - NativeTokenGateway (BNB/WBNB):
0x7bAf6019C90B93aD30f8aD6a2EcCD2B11427b29f
Optimism
Section titled “Optimism”- Comptroller:
0x5593FF68bE84C966821eEf5F0a988C285D5B7CeC - NativeTokenGateway (ETH/WETH):
0x5B1b7465cfDE450e267b562792b434277434413c
Unichain
Section titled “Unichain”- Comptroller:
0xe22af1e6b78318e1Fe1053Edbd7209b8Fc62c4Fe - NativeTokenGateway (ETH/WETH):
0x4441aE3bCEd3210edbA35d0F7348C493E79F1C52
Step 1 — Find your position
Section titled “Step 1 — Find your position”Open each vToken for your network and use Read as Proxy:
balanceOf(<your address>)— the vTokens you hold. A non-zero value means you have a supplied position.borrowBalanceStored(<your address>)— what you owe, in the underlying token. Your current debt can be higher because of interest accrued since this number was last updated.
A borrow can exist even when balanceOf is zero, so check every market in the table rather than only the tokens visible in your wallet.
Step 2 — Repay what you owe
Section titled “Step 2 — Repay what you owe”Skip to Step 3 if borrowBalanceStored is zero in every market. Otherwise, for each market with debt:
- Open the underlying token from the table and call
approve(spender, amount).spenderis the vToken address, andamountshould be slightly above your debt so it still covers the interest accrued by the time the next transaction lands. - Open the vToken → Write as Proxy →
repayBorrow(repayAmount). To repay in full, enter115792089237316195423570985008687907853269984665640564039457584007913129639935. The contract takes only what you actually owe.
If you owe WBNB or WETH and hold native BNB or ETH: open your network’s NativeTokenGateway → Write Contract → wrapAndRepay(), and enter the amount in whole BNB/ETH in the payableAmount (OPBNB) / payableAmount (ether) field. Send enough to cover accrued interest, keeping gas separate. It wraps your native token, repays the debt and refunds any excess.
Anyone can repay on your behalf with repayBorrowBehalf(borrower, repayAmount) after approving the vToken from their own wallet.
Afterwards, re-check borrowBalanceStored(<your address>) — it must be 0. Then revoke the leftover allowance on the underlying token with approve(<vToken address>, 0).
Step 3 — Withdraw your supply
Section titled “Step 3 — Withdraw your supply”For each market where balanceOf is non-zero, open the vToken → Write as Proxy:
redeem(redeemTokens)— enter the full value returned bybalanceOf(<your address>)to withdraw everything. Use this for a full exit.redeemUnderlying(redeemAmount)— a partial withdrawal, in the underlying token’s base units. Rounding means it will not cleanly empty the position.
Withdrawing from a WBNB or WETH market gives you the wrapped token. To receive native BNB or ETH instead, use the NativeTokenGateway:
- Comptroller → Write as Proxy →
updateDelegate(<gateway address>, true). - Gateway → Write Contract →
redeemAndUnwrap(redeemTokens)for a full exit, orredeemUnderlyingAndUnwrap(redeemAmount)for part of it. - Comptroller →
updateDelegate(<gateway address>, false)to revoke the permission.
Confirm that balanceOf(<your address>) is back to 0 and that the tokens reached your wallet.
Step 4 — Claim rewards (Unichain only)
Section titled “Step 4 — Claim rewards (Unichain only)”opBNB and Optimism have no Core Pool rewards. On Unichain no new rewards accrue, but anything already earned is still claimable.
- RewardsDistributor (XVS):
0x4630B71C1BD27c99DD86aBB2A18C50c3F75C88fb
Read as Proxy → rewardTokenAccrued(<your address>) shows what has been recorded so far. Write as Proxy → claimRewardToken(holder) with your address claims it. No approval is needed, and claiming is independent of repaying and withdrawing.
Step 5 — Unstake XVS
Section titled “Step 5 — Unstake XVS”XVS staked in the XVS Vault is separate from your market positions. There is a 7-day lock between requesting a withdrawal and receiving the tokens. Before submitting either withdrawal transaction, read vaultPaused(); if it is true, withdrawals are blocked until governance unpauses the vault. On October 29, 2026 the opBNB vault was paused; Optimism and Unichain were unpaused. Recheck before acting.
Each network has one pool, so every call below takes that network’s XVS address as the reward token and 0 as the pool id.
- Check your stake — Read as Proxy →
getUserInfo(<XVS address>, 0, <your address>). - Request the withdrawal — Write as Proxy →
requestWithdrawal(<XVS address>, 0, <amount>), with the amount in XVS base units (18 decimals). Request no more thanamount − pendingWithdrawalsfromgetUserInfo; tokens already requested do not need another request. This also pays out pending rewards and starts the 7-day lock. - After 7 days, check eligibility —
getEligibleWithdrawalAmount(<XVS address>, 0, <your address>). - Execute —
executeWithdrawal(<XVS address>, 0)sends the unlocked XVS back to your wallet.
If the vault cannot pay a reward in full it records the remainder, which stays claimable and can be read with pendingRewardTransfers(<XVS address>, <your address>). Unstaking itself is not affected.
Step 6 — Bridge XVS to BNB Chain
Section titled “Step 6 — Bridge XVS to BNB Chain”The app no longer lists these source networks. Their non-upgradeable XVS bridge contracts can be called through Read Contract / Write Contract. This is an advanced step: use a wallet address you control on both networks and verify every field before signing.
| Source network | XVS bridge | LayerZero source ID |
|---|---|---|
| opBNB | 0x100D331C1B5Dcd41eACB1eCeD0e83DCEbf3498B2 | 202 |
| Optimism | 0xbBe46bAec851355c3FC4856914c47eB6Cea0B8B4 | 111 |
| Unichain | 0x9c95f8aa28fFEB7ECdC0c407B9F632419c5daAF8 | 320 |
The destination is 102, BNB Chain’s LayerZero ID, not its EVM chain ID 56. The BNB receiving bridge is 0xf8F46791E3dB29a029Ec6c9d946226f3c613e854.
- Check availability first. On the source bridge,
paused()must befalse,token()must match the XVS token above, and the first of the seven values returned byisEligibleToSend(<your address>, 102, <amount>)must betrue. If the read reverts or that first value isfalse, stop. On October 29, 2026 the opBNB eligibility read reverted withinvalid resilient oracle priceeven though its bridge was unpaused; a fee quote alone does not establish that a transfer can succeed. - Check the receiving side. On the BNB bridge,
paused()must befalse. ReadchainIdToMaxSingleReceiveTransactionLimit(<source ID>),chainIdToMaxDailyReceiveLimit(<source ID>),chainIdToLast24HourReceived(<source ID>)andchainIdToLast24HourReceiveWindowStart(<source ID>). These limits are in USD with 18 decimals, shared by all users of the route, and can be tighter than the source limits. The receiving side uses its own XVS price: readoracle()andtoken()on the BNB bridge, thengetPrice(<token address>)on that oracle. For XVS, the transfer value in the limits’ units isamount × price / 10^18. Stop if the price read fails, and leave headroom for price changes and other transfers. A 24-hour window resets on the next transfer after it expires. If either side lacks capacity, wait; splitting a transfer does not bypass the daily cap. Exceeding a receive limit can leave a message awaiting recovery after the source transaction has succeeded. - Prepare the fields.
amountis in XVS base units (18 decimals); bridge precision is 8 decimals, so use a multiple of10000000000base units. Smaller dust remains on the source chain.recipientis your 20-byte address left-padded with 12 zero bytes:0x000000000000000000000000followed by your address without its0x. - Quote the fee. Read
minDstGasLookup(102, 0). At the October 29 check it was300000on all three bridges, giving version-1 adapter parameters0x000100000000000000000000000000000000000000000000000000000000000493e0. Use this value only while that minimum is unchanged; if it changes, obtain updated parameters before continuing. CallestimateSendFee(102, <recipient>, <amount>, false, <adapter params>); the first result is the native fee in wei. - Send from the wallet holding the XVS. Call
sendFromwith the fields below. These destination-chain bridges burn the caller’s XVS directly, so no ERC-20 approval is needed. Do not transfer XVS to the bridge address.
sendFrom field | Value |
|---|---|
_from | Your connected wallet address |
_dstChainId | 102 |
_toAddress | Your padded 32-byte recipient |
_amount | XVS base units |
_callParams.refundAddress | Your connected wallet address |
_callParams.zroPaymentAddress | 0x0000000000000000000000000000000000000000 |
_callParams.adapterParams | The adapter parameters used for the quote |
_callParams is one tuple containing the last three fields, not three additional top-level arguments. For a single _callParams (tuple) text box, paste the following JSON array, replacing <your address> with your connected wallet address. This example uses the 300000-gas adapter parameters verified in step 4; if those change, replace the third value with the parameters used for your new quote.
["<your address>","0x0000000000000000000000000000000000000000","0x000100000000000000000000000000000000000000000000000000000000000493e0"]If the explorer instead expands the tuple into three fields, enter each value separately in the order shown above. If the input is rejected, stop and ask for help.
Set payableAmount (OPBNB) / payableAmount (ether) in whole BNB/ETH: divide the fresh wei fee quote by 10^18 and add a small buffer. For example, a quote of 1000000000000000 wei is 0.001 BNB/ETH before the buffer. Excess is refunded. Keep additional native currency for transaction gas.
Delivery is asynchronous. Track the source transaction on LayerZero Scan and check your XVS balance on BNB Chain. If delivery is delayed or fails, retain the source transaction hash and seek help; do not send the same amount again, because the original message can still execute.
If a transaction fails
Section titled “If a transaction fails”Do not keep resubmitting. Open your network’s Comptroller under Read as Proxy and check:
isMarketListed(<vToken address>)returnstrue.actionPaused(<vToken address>, 3)returnsfalse— repayment is allowed.actionPaused(<vToken address>, 1)returnsfalse— withdrawal is allowed.getAccountLiquidity(<your address>)returns no shortfall. If it does, repay before trying to withdraw again.
Also confirm that you hold enough of the underlying token and that your allowance covers the repayment.
If it still fails, ask for help on the Venus community forum with the network, your wallet address, the contract address and the transaction hash or revert data. Never share your seed phrase or private key.