vETH
On this page, you can find the contracts and their interactions involved when bridging to and from Ethereum (L1 - $ETH) and Cronos zkEVM (L2 - $vETH ), it includes:
Last updated
On this page, you can find the contracts and their interactions involved when bridging to and from Ethereum (L1 - $ETH) and Cronos zkEVM (L2 - $vETH ), it includes:
Last updated
[L1 -> L2] Minting $vETH with $ETH
[L2 -> L1] Withdrawing $ETH from $vETH
From Ethereum mainnet (L1) to Cronos zkEVM mainnet (L2)
To bridge $ETH from Ethereum mainnet -> Cronos zkEVM mainnet
, and obtain $vETH, we would need to interact with:
ybETHBridge
Ethereum:
$ybETH token contract
Ethereum:
Cronos zkEVM:
$vETH token contract
Cronos zkEVM:
ethAmount
The amount of $ETH (with 18 decimals) to be used to mint $ybETH.
Keep this amount for later steps.
_l2Receiver
The address on Cronos zkEVM that will receive $ybETH
_amount
The amount of $ETH to mint and bridge $ybETH, as calculate in Step 1
_l2Gaslimit
Maximum amount of L2 gas that transaction can consume during execution on L2. Reference value: 500,000
_l2GasPerPubdataByteLimit
The maximum amount of L2 gas that the operator may charge the user for a single byte of pubdata. Reference value: 800
_refundRecipient
Address to collect refund, if bridging is unsuccessful.
This will mint $ybETH on Ethereum and bridge it to the _l2Receiver
address.
On Cronos zkEVM, call approve
on the $ybETH contract to approve $vETH to spend $ybETH with appropriate amount.
On Cronos zkEVM, call mint
on $vETH contract , to mint $vETH
_receiver
Address to receive the minted $vETH tokens
_ybEthAmount
Amount of $ybETH to be used to mint $vETH
This will mint $vETH into the _receiver
address.
From Cronos zkEVM mainnet (L2) -> Ethereum mainnet (L1)
To redeem $vETH from Cronos zkEVM mainnet
, and withdraw $ETH on Ethereum mainnet
we would need to interact with the following contracts:
vETH
l2Bridge
zk Chain Shared Bridge
ybETH
vnoNFT
On Cronos zkEVM, call approve
on the $vETH contract to approve $vETH spend with appropriate amount.
On Cronos zkEVM, call redeem
on the vETH contract, to burn $vETH and redeem $ybETH
_receiver
Address to receive $ybETH on Cronos zkEVM
_vethAmount
Amount of vETH that will be burned to redeem ybETH
Once done, corresponding $ybETH will be transfer to the _reciever
address
On Cronos zkEVM, call approve
on the ybETH contract, to approve L2Bridge
to spend $ybETH.
On Cronos zkEVM, call withdraw on the L2Bridge contract
_l1Receiver
Address on Ethereum to receive the token
_l2Token
The token to be withdrawn, the Cronos zkEVM contract address $ybETH in this case.
_amount
amount of tokens to be withdrawn, note $ybETH has 18
decimals
Keep the transaction hash for later use in Step 5. This withdraws $ybETH from Cronos zkEVM to Ethereum. It takes at least 24 hours before the withdrawal can be finalized on Ethereum. Store the transaction hash from the withdrawal transaction; you will need it to finalize the withdrawal.
This takes the L2 withdrawal hash as parameters and returns the parameters required for finalizing a withdrawal in the next step.
Example outputs:
Once the transaction in Step 4 has been finalized on L1, we can claim the withdrawn $ybETH from the Shared Bridge contract by calling its finalizeWithdrawal
function. The inputs can be found in Step 5,
_chainId
Chain id for Cronos zkEVM, which is 388
_l2BatchNumber
The L2 batch number where the withdrawal was processed, obtained in Step 5.
_l2MessageIndex
The position in the L2 logs Merkle tree of the l2Log that was sent with the message, obtained in Step 5.
_l2TxNumberInBatch
The L2 transaction number in the batch, in which the log was sent, obtained in Step 5.
_message
The L2 withdraw data, stored in an L2 -> L1 message, obtained in Step 5.
_merkleProof
The Merkle Proof, obtained in Step 5.
Once finalizeWithdrawal
is completed, the withdrawn amount of $ybETH will go into the receiver's wallet on Ethereum.
withdrawalHash
The transaction hash of the L2 transaction includes the withdrawal transaction from Step 4
On Ethereum, call approve
on the $ybETH contract, to approve the contract to spend $ybETH.
On Ethereum, call requestUnbond
to request a unbonding of the staked $ETH.
_shareAmount
The amount of $ybETH that is to be burned to unbond $ETH
_receiver
The wallet address on ethereum to receive the receipt NFT. This NFT is needed to withdraw the $ETH once the unbond period has ended
This will burn $ybETH and mint a receipt NFT - Veno Unstaked ETH (vnoNFT) to the _receiver
address. The unbonding procress takes 1~10 days, hold on to the NFT to claim the $ETH once it's ready. Store the tokenId of the received NFT; it is needed to withdraw the $ETH in the next steps.
On Ethereum, call setApprovalForAll
on the vnoNFT contract, to approve $ybETH to transfer your vnoNFT obtained in Step 8).
operator
$ybETH contract address on Ethereum
_approved
Set to "True" to grant approval.
On Ethereum, call unbond
function on the ybETH contract to burn the receipt NFT and receive the underlying unstaked $ETH.
_tokenId
The tokenId of the receipt NFT, recieved in Step 7
_receiver
The address on Ethereum to receive $ETH
This transaction burns the receipt NFT and sends the unstaked $ETH to the specified receiver.
On Ethereum, use to call the convertToShare
function:
On Ethereum, call the mintAndBridge
function on the contract:
Cronos zkEVM:
Cronos zkEVM:
Ethereum:
Ethereum:
Cronos zkEVM:
Ethereum:
Extra information for the L2 -> L1 transaction is required for the next step in claiming the $ybETH on L1. This information can be gathered by , using zksync-ethers
package
We can use zksync-ethers
package call to confirm whether the withdrawal transaction is finalized on the L1 network.