Loading...
Loading...
Execute liquid staking operations on Bifrost SLPx protocol across Ethereum, Base, Optimism, and Arbitrum. Mint vETH by staking ETH/WETH, redeem vETH back to ETH, and claim after redemption completes. Supports manual signing and agent-side signing via ERC-4626 vault. Use when users want to stake, unstake, mint, redeem, or claim ETH on Bifrost DeFi.
npx skill4agent add bifrost-io/skills bifrost-slpx-stake| Chain | ChainId | VETH Contract | WETH (underlying) | Default RPC | Fallback RPC |
|---|---|---|---|---|---|
| Ethereum | 1 | | | | |
| Base | 8453 | | | | |
| Optimism | 10 | | | | |
| Arbitrum | 42161 | | | | |
| Variable | Description | Default |
|---|---|---|
| Target chain name ( | |
| Custom RPC endpoint | Per-chain default from table above |
| VETH contract address (override) | |
| Private key for agent-side signing (hex, with or without 0x prefix) | Not set (manual signing mode) |
BIFROST_PRIVATE_KEYcast wallet import bifrost-agent --interactiveBIFROST_PRIVATE_KEYcast send| Operation | Function | Selector | Description |
|---|---|---|---|
| Mint vETH (via ETH) | | | Stake native ETH to mint vETH. ETH is sent as |
| Mint vETH (via WETH) | | | Deposit WETH directly to mint vETH for |
| Redeem vETH | | | Burn |
| Claim as ETH | | | Claim ALL completed withdrawals as native ETH. Internally calls |
| Claim as WETH | | | Claim ALL completed withdrawals as WETH to |
| Claim to address | | | Claim ALL completed withdrawals as WETH to a specified |
| Query | Function | Selector | Description |
|---|---|---|---|
| Preview deposit | | | Simulate deposit and return exact vETH shares to be minted |
| Preview redeem | | | Simulate redemption and return exact ETH to be returned |
| Fallback: shares calc | | | Convert ETH amount to vETH shares using current Oracle exchange rate |
| Fallback: assets calc | | | Convert vETH shares to ETH value using current Oracle exchange rate |
| vETH balance | | | Get vETH token balance of a specific address |
| Max redeemable | | | Maximum vETH shares the owner can redeem in a single tx |
| Claimable ETH | | | Returns |
eth_call# Method A: cast (preferred)
cast call <VETH_CONTRACT> \
"<FUNCTION_SIGNATURE>(<ARG_TYPES>)(<RETURN_TYPES>)" <ARGS> \
--rpc-url <RPC_URL>
# Method B: curl (if cast unavailable)
curl -s -X POST <RPC_URL> \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"<VETH_CONTRACT>","data":"<SELECTOR><ENCODED_ARGS>"},"latest"]}'previewDepositpreviewRedeemconvertToSharesconvertToAssetscast send# Mint vETH (stake native ETH)
cast send <VETH_CONTRACT> \
"depositWithETH()" --value <AMOUNT_IN_WEI> \
--rpc-url <RPC_URL> --private-key <PRIVATE_KEY>
# Redeem vETH (unstake)
cast send <VETH_CONTRACT> \
"redeem(uint256,address,address)" <SHARES_IN_WEI> <USER_ADDR> <USER_ADDR> \
--rpc-url <RPC_URL> --private-key <PRIVATE_KEY>
# Claim ETH (withdraw completed redemptions)
cast send <VETH_CONTRACT> \
"withdrawCompleteToETH()" \
--rpc-url <RPC_URL> --private-key <PRIVATE_KEY>canWithdrawalAmount(totalAvailableAmount, pendingDeleteIndex, pendingDeleteAmount)previewDeposit(amount)BIFROST_PRIVATE_KEYbifrost-agent| Field | Value |
|---|---|
| To | |
| Value | User's ETH amount in wei |
| Data | |
| ChainId | Per selected chain |
To: <VETH_CONTRACT>
Value: {wei} ({amount} ETH)
Data: 0x1166dab6
ChainId: {chainId}balanceOf(user)previewRedeem(shares)maxRedeem(user)| Field | Value |
|---|---|
| To | |
| Value | |
| Data | ABI-encoded |
| ChainId | Per selected chain |
cast calldata "redeem(uint256,address,address)" <SHARES> <ADDR> <ADDR>canWithdrawalAmount(user)| Field | Value |
|---|---|
| To | |
| Value | |
| Data | |
| ChainId | Per selected chain |
BIFROST_CHAINBIFROST_RPC_URLBIFROST_PRIVATE_KEYBIFROST_RPC_URLBIFROST_PRIVATE_KEYbifrost-agenthttps://etherscan.io/tx/{hash}https://basescan.org/tx/{hash}https://optimistic.etherscan.io/tx/{hash}https://arbiscan.io/tx/{hash}| Error | User Message |
|---|---|
| "No ETH included. Please specify the amount." |
| "ETH transfer failed. Try claiming as WETH with withdrawComplete()." |
| "No claimable ETH. Your redemption may still be processing." |
| "Redeem exceeds your maximum. Check balance." |
| "VETH contract is paused. Try again later." |
| Insufficient ETH | "Insufficient ETH. Balance: {bal}, Needed: {amount + gas}." |
| Insufficient vETH | "Insufficient vETH. Balance: {bal}, Requested: {amount}." |
| Max withdraw count exceeded | "Too many pending redemptions. Claim existing ones first." |
| RPC failure | "Unable to connect. Retrying with backup endpoint..." |
depositWithETH()WETH.deposit()deposit(uint256,address)withdrawCompleteToETH()withdrawCompleteTo(address(this))WETH.withdraw()withdrawComplete()redeem()withdraw()whenNotPausednonReentrantcast estimate