Skills bifrost-slpx-info

install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/ark930/bifrost-slpx-info" ~/.claude/skills/clawdbot-skills-bifrost-slpx-info && rm -rf "$T"
manifest: skills/ark930/bifrost-slpx-info/SKILL.md
source content

Bifrost SLPx Info

Query Bifrost vETH liquid staking data via on-chain calls to the VETH ERC-4626 vault contract.

Contract & Network

vETH is deployed on Ethereum and three L2 networks. The same contract address is used across all chains.

ChainChainIdVETH ContractWETH (underlying)Default RPCFallback RPC
Ethereum1
0xc3997ff81f2831929499c4eE4Ee4e0F08F42D4D8
0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
https://ethereum.publicnode.com
https://1rpc.io/eth
Base8453
0xc3997ff81f2831929499c4eE4Ee4e0F08F42D4D8
0x4200000000000000000000000000000000000006
https://base.publicnode.com
https://1rpc.io/base
Optimism10
0xc3997ff81f2831929499c4eE4Ee4e0F08F42D4D8
0x4200000000000000000000000000000000000006
https://optimism.publicnode.com
https://1rpc.io/op
Arbitrum42161
0xc3997ff81f2831929499c4eE4Ee4e0F08F42D4D8
0x82aF49447D8a07e3bd95BD0d56f35241523fBab1
https://arbitrum-one.publicnode.com
https://1rpc.io/arb

Configuration (Environment Variables)

On first run, ask the user whether they want to configure custom settings. If not, use the defaults above.

VariableDescriptionDefault
BIFROST_CHAIN
Target chain name (
ethereum
,
base
,
optimism
,
arbitrum
)
ethereum
BIFROST_RPC_URL
Custom RPC endpointPer-chain default from table above
BIFROST_VETH_ADDRESS
VETH contract address (override)
0xc3997ff81f2831929499c4eE4Ee4e0F08F42D4D8

Bifrost Backend API

Protocol-level statistics available via the Bifrost REST API (no RPC needed):

GET https://api.bifrost.app/api/site

Returns JSON with

vETH
object containing:

FieldDescription
apy
Total APY (Base + Farming), e.g.
"8.24"
apyBase
Base staking APY from Ethereum validators, e.g.
"3.12"
apyReward
Additional Bifrost farming reward APY, e.g.
"5.12"
tvl
Total value locked in USD
tvm
Total vETH minted (in ETH)
totalIssuance
Total vETH supply (on Bifrost chain)
holders
Number of vETH holders across all chains

Use this API when users ask about APY, yield, TVL, or holder count.

Quick Reference

VETH is an ERC-4626 vault inheriting from

VToken → VTokenBase → ERC4626Upgradeable
. All standard ERC-4626 view functions are available. Exchange rates are Oracle-backed.

Token Info

QueryFunctionSelectorArgsReturnsDescription
Token name
name()
0x06fdde03
nonestringReturns
"Bifrost Voucher ETH"
Token symbol
symbol()
0x95d89b41
nonestringReturns
"vETH"
Decimals
decimals()
0x313ce567
noneuint8Returns
18
Underlying asset
asset()
0x38d52e0f
noneaddressReturns the WETH address (differs per chain, see Contract & Network table)

Exchange Rate Queries

QueryFunctionSelectorArgsReturnsDescription
ETH → vETH rate
convertToShares(uint256)
0xc6e6f592
assets (wei)uint256 (shares)Convert an ETH amount to the equivalent vETH shares using the current Oracle exchange rate
vETH → ETH rate
convertToAssets(uint256)
0x07a2d13a
shares (wei)uint256 (assets)Convert a vETH shares amount to the equivalent ETH value using the current Oracle exchange rate
Preview deposit
previewDeposit(uint256)
0xef8b30f7
assets (wei)uint256 (shares)Simulate a deposit and return the exact vETH shares that would be minted
Preview mint
previewMint(uint256)
0xb3d7f6b9
shares (wei)uint256 (assets)Simulate minting a specific amount of vETH shares and return the ETH required
Preview withdraw
previewWithdraw(uint256)
0x0a28a477
assets (wei)uint256 (shares)Simulate withdrawing a specific ETH amount and return the vETH shares that would be burned
Preview redeem
previewRedeem(uint256)
0x4cdad506
shares (wei)uint256 (assets)Simulate a redemption and return the exact ETH that would be returned

User Balance & Withdrawal Queries

QueryFunctionSelectorArgsReturnsDescription
vETH balance
balanceOf(address)
0x70a08231
owner addressuint256Get the vETH token balance of a specific address
Claimable ETH
canWithdrawalAmount(address)
0x52a630b9
target address(uint256, uint256, uint256)Returns
(totalAvailableAmount, pendingDeleteIndex, pendingDeleteAmount)
. First value = ETH ready to claim
Withdrawal queue
getWithdrawals(address)
0x3a2b643a
target addressWithdrawal[]Returns array of withdrawal entries, each with
queued
(amount in queue) and
pending
(amount being processed) fields
Max redeemable
maxRedeem(address)
0xd905777e
owner addressuint256Maximum vETH shares the owner can redeem in a single tx
Max withdrawable
maxWithdraw(address)
0xce96cb77
owner addressuint256Maximum ETH the owner can withdraw in a single tx
Max depositable
maxDeposit(address)
0x402d267d
receiver addressuint256Maximum ETH that can be deposited for receiver (typically type(uint256).max = unlimited)
Max mintable
maxMint(address)
0xc63d75b6
receiver addressuint256Maximum vETH shares that can be minted for receiver (typically type(uint256).max = unlimited)
Allowance
allowance(address,address)
0xdd62ed3e
owner, spenderuint256Check vETH spending allowance granted by owner to spender

Protocol Statistics

QueryFunctionSelectorArgsReturnsDescription
Total assets
totalAssets()
0x01e1d114
noneuint256Total ETH managed by the vault, sourced from Oracle
poolInfo(asset)
Total supply
totalSupply()
0x18160ddd
noneuint256Total vETH tokens in circulation on this chain
Vault balance
getTotalBalance()
0x12b58349
noneuint256ETH available for payouts (BridgeVault balance + completed withdrawals)
Queued withdrawals
queuedWithdrawal()
0x996e5c06
noneuint256Total ETH amount currently queued for withdrawal globally
Completed withdrawals
completedWithdrawal()
0x63ea1b92
noneuint256Total ETH amount that has completed withdrawal processing globally
Max withdraw count
maxWithdrawCount()
0xdc692cd7
noneuint256Maximum number of concurrent pending withdrawal entries per user
Paused
paused()
0x5c975abb
noneboolWhether the contract is currently paused (deposits/redeems disabled)

How to Call

All queries are read-only

eth_call
— no gas, no signing.

Method A: cast (preferred)

cast call <VETH_CONTRACT> \
  "<FUNCTION_SIGNATURE>(<ARG_TYPES>)(<RETURN_TYPES>)" <ARGS> \
  --rpc-url <RPC_URL>

Example — query exchange rate for 1 ETH on Ethereum:

cast call 0xc3997ff81f2831929499c4eE4Ee4e0F08F42D4D8 \
  "convertToShares(uint256)(uint256)" 1000000000000000000 \
  --rpc-url https://ethereum.publicnode.com

Method B: curl + JSON-RPC (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"]}'

Calldata Encoding

  • No-arg functions: calldata = selector only (e.g.,
    0x01e1d114
    for
    totalAssets()
    )
  • uint256 arg: selector + amount in hex, left-padded to 64 chars
    • Example: 1 ETH =
      0xDE0B6B3A7640000
      → pad to
      0000000000000000000000000000000000000000000000000de0b6b3a7640000
  • address arg: selector + address (no 0x), left-padded to 64 chars
    • Example:
      0xAbCd...1234
      000000000000000000000000AbCd...1234

Response Decoding

  • curl returns
    {"result":"0x<hex>"}
    . For single uint256: convert 64 hex chars to decimal, divide by 1e18.
  • canWithdrawalAmount
    returns 3 × uint256 (192 hex chars):
    (totalAvailableAmount, pendingDeleteIndex, pendingDeleteAmount)
    . First 64 chars = claimable ETH amount.

Agent Behavior

  1. Environment check: on first interaction, ask user if they want to configure
    BIFROST_CHAIN
    or
    BIFROST_RPC_URL
    . If not, use Ethereum Mainnet defaults
  2. RPC selection: use
    BIFROST_RPC_URL
    if set; otherwise use per-chain default RPC. Fall back to per-chain fallback RPC on failure
  3. Multi-chain awareness: when user specifies a chain (e.g. "on Base", "on Arbitrum"), switch to that chain's RPC and WETH address accordingly
  4. All values are in wei (18 decimals) — always convert to human-readable before displaying
  5. Default exchange rate query: show rate for 1 ETH if no amount specified
  6. Prompt for wallet address if not provided; display truncated (first 6 + last 4 chars)
  7. If
    canWithdrawalAmount
    first value > 0, indicate claimable and suggest "claim my redeemed ETH"
  8. Prefer
    cast call
    ; fall back to
    curl
    + JSON-RPC with pre-computed calldata if cast fails
  9. Always fetch fresh data — do not cache across requests
  10. If RPC fails, retry with fallback before reporting error
  11. Useful links: direct users to Bifrost vETH page or Bifrost App when relevant

Error Handling

ErrorUser Message
RPC failure"Unable to connect to Ethereum. Retrying with backup endpoint..."
Zero from
convertToShares
"The vETH exchange rate is temporarily unavailable. The contract may be paused."
Empty withdrawal array"You have no pending vETH redemptions."
Invalid address"Please provide a valid Ethereum address (0x + 40 hex characters)."
execution reverted
Retry with alternate method (cast ↔ curl). If both fail, report to user.

Notes

  1. VETH inherits
    VToken → VTokenBase → ERC4626Upgradeable / OwnableUpgradeable / PausableUpgradeable
    . All standard ERC-4626 view functions work
  2. Exchange rates are Oracle-backed via
    oracle.poolInfo(asset)
    — may lag slightly vs. actual staking rewards
  3. getWithdrawals
    returns
    Withdrawal[]
    where each entry has
    queued
    (amount waiting in queue) and
    pending
    (amount being processed by Bifrost)
  4. The same VETH contract address is deployed on Ethereum, Base, Optimism, and Arbitrum — but WETH (underlying asset) addresses differ per chain
  5. totalAssets()
    reflects the global pool size from Oracle, while
    totalSupply()
    is per-chain vETH circulation
  6. getTotalBalance()
    = BridgeVault balance + completed withdrawals — represents ETH available for immediate payouts