bifrost-slpx-stake
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseBifrost SLPx Stake
Bifrost SLPx 质押操作
Execute Bifrost vETH liquid staking operations: mint, redeem, and claim.
执行Bifrost vETH流动性质押操作:铸造、赎回和领取。
Contract & Network
合约与网络
vETH is deployed on Ethereum and three L2 networks. The same contract address is used across all chains.
| Chain | ChainId | VETH Contract | WETH (underlying) | Default RPC | Fallback RPC |
|---|---|---|---|---|---|
| Ethereum | 1 | | | | |
| Base | 8453 | | | | |
| Optimism | 10 | | | | |
| Arbitrum | 42161 | | | | |
vETH已部署在Ethereum及三条L2链上,所有链使用相同的合约地址。
| 链名称 | ChainId | vETH合约地址 | 底层WETH地址 | 默认RPC | 备用RPC |
|---|---|---|---|---|---|
| Ethereum | 1 | | | | |
| Base | 8453 | | | | |
| Optimism | 10 | | | | |
| Arbitrum | 42161 | | | | |
Configuration
配置
On first run, ask the user whether they want to configure custom settings. If not, use the defaults above.
首次运行时,询问用户是否需要配置自定义设置。若不需要,则使用上述默认值。
Environment Variables
环境变量
| 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) |
| 变量名称 | 描述 | 默认值 |
|---|---|---|
| 目标链名称( | |
| 自定义RPC端点 | 对应链的默认RPC(见上表) |
| vETH合约地址(覆盖默认值) | |
| 代理端签名用私钥(十六进制,可带或不带0x前缀) | 未设置(手动签名模式) |
Wallet Setup
钱包设置
Two signing modes. Default is manual signing (no setup needed).
Default: Manual Signing
Output complete transaction details (to, value, data, gas, chainId). User signs with their own wallet (MetaMask, Ledger, CLI, etc.).
Option: Agent-Side Signing
Set as an environment variable, or import via Foundry keystore:
BIFROST_PRIVATE_KEYbash
cast wallet import bifrost-agent --interactiveWhen is set, the agent can sign and broadcast transactions directly using .
BIFROST_PRIVATE_KEYcast send支持两种签名模式,默认是手动签名(无需额外设置)。
默认:手动签名
输出完整的交易详情(接收地址、金额、数据、Gas、ChainId)。用户使用自己的钱包(MetaMask、Ledger、CLI等)进行签名。
可选:代理端签名
将设置为环境变量,或通过Foundry密钥库导入:
BIFROST_PRIVATE_KEYbash
cast wallet import bifrost-agent --interactive当设置后,代理可直接使用签名并广播交易。
BIFROST_PRIVATE_KEYcast sendQuick Reference
快速参考
Write Operations
写入操作
| 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 |
| 操作 | 函数 | 选择器 | 描述 |
|---|---|---|---|
| 铸造vETH(通过ETH) | | | 质押原生ETH铸造vETH。ETH以 |
| 铸造vETH(通过WETH) | | | 直接存入WETH为 |
| 赎回vETH | | | 销毁 |
| 领取ETH | | | 领取所有已完成赎回的原生ETH。内部先调用 |
| 领取WETH | | | 领取所有已完成赎回的WETH至 |
| 领取至指定地址 | | | 领取所有已完成赎回的WETH至指定的 |
Pre-Execution Query Functions
执行前查询函数
| 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 |
| 查询项 | 函数 | 选择器 | 描述 |
|---|---|---|---|
| 预览存款 | | | 模拟存款操作,返回预计可铸造的vETH份额 |
| 预览赎回 | | | 模拟赎回操作,返回预计可提取的ETH数量 |
| 备选:份额计算 | | | 使用当前Oracle汇率将ETH金额转换为vETH份额 |
| 备选:资产计算 | | | 使用当前Oracle汇率将vETH份额转换为ETH价值 |
| vETH余额 | | | 查询指定地址的vETH代币余额 |
| 最大可赎回量 | | | 所有者单次交易可赎回的最大vETH份额 |
| 可领取ETH | | | 返回 |
How to Call
调用方式
Read queries — use (no gas):
eth_callbash
undefined只读查询 — 使用(无需Gas):
eth_callbash
undefinedMethod A: cast (preferred)
方式A:使用cast(推荐)
cast call <VETH_CONTRACT>
"<FUNCTION_SIGNATURE>(<ARG_TYPES>)(<RETURN_TYPES>)" <ARGS>
--rpc-url <RPC_URL>
"<FUNCTION_SIGNATURE>(<ARG_TYPES>)(<RETURN_TYPES>)" <ARGS>
--rpc-url <RPC_URL>
cast call <VETH_CONTRACT>
"<FUNCTION_SIGNATURE>(<ARG_TYPES>)(<RETURN_TYPES>)" <ARGS>
--rpc-url <RPC_URL>
"<FUNCTION_SIGNATURE>(<ARG_TYPES>)(<RETURN_TYPES>)" <ARGS>
--rpc-url <RPC_URL>
Method B: curl (if cast unavailable)
方式B:使用curl(若cast不可用)
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"]}'
-H "Content-Type: application/json"
-d '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"<VETH_CONTRACT>","data":"<SELECTOR><ENCODED_ARGS>"},"latest"]}'
If `previewDeposit` or `previewRedeem` fails, fall back to `convertToShares` / `convertToAssets` (same encoding).
**Write transactions** — use `cast send` (requires wallet):
```bashcurl -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"]}'
-H "Content-Type: application/json"
-d '{"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{"to":"<VETH_CONTRACT>","data":"<SELECTOR><ENCODED_ARGS>"},"latest"]}'
若`previewDeposit`或`previewRedeem`调用失败,可改用`convertToShares`/`convertToAssets`(编码方式相同)。
**写入交易** — 使用`cast send`(需要钱包):
```bashMint vETH (stake native ETH)
铸造vETH(质押原生ETH)
cast send <VETH_CONTRACT>
"depositWithETH()" --value <AMOUNT_IN_WEI>
--rpc-url <RPC_URL> --private-key <PRIVATE_KEY>
"depositWithETH()" --value <AMOUNT_IN_WEI>
--rpc-url <RPC_URL> --private-key <PRIVATE_KEY>
cast send <VETH_CONTRACT>
"depositWithETH()" --value <AMOUNT_IN_WEI>
--rpc-url <RPC_URL> --private-key <PRIVATE_KEY>
"depositWithETH()" --value <AMOUNT_IN_WEI>
--rpc-url <RPC_URL> --private-key <PRIVATE_KEY>
Redeem vETH (unstake)
赎回vETH(解除质押)
cast send <VETH_CONTRACT>
"redeem(uint256,address,address)" <SHARES_IN_WEI> <USER_ADDR> <USER_ADDR>
--rpc-url <RPC_URL> --private-key <PRIVATE_KEY>
"redeem(uint256,address,address)" <SHARES_IN_WEI> <USER_ADDR> <USER_ADDR>
--rpc-url <RPC_URL> --private-key <PRIVATE_KEY>
cast send <VETH_CONTRACT>
"redeem(uint256,address,address)" <SHARES_IN_WEI> <USER_ADDR> <USER_ADDR>
--rpc-url <RPC_URL> --private-key <PRIVATE_KEY>
"redeem(uint256,address,address)" <SHARES_IN_WEI> <USER_ADDR> <USER_ADDR>
--rpc-url <RPC_URL> --private-key <PRIVATE_KEY>
Claim ETH (withdraw completed redemptions)
领取ETH(提取已完成的赎回资产)
cast send <VETH_CONTRACT>
"withdrawCompleteToETH()"
--rpc-url <RPC_URL> --private-key <PRIVATE_KEY>
"withdrawCompleteToETH()"
--rpc-url <RPC_URL> --private-key <PRIVATE_KEY>
undefinedcast send <VETH_CONTRACT>
"withdrawCompleteToETH()"
--rpc-url <RPC_URL> --private-key <PRIVATE_KEY>
"withdrawCompleteToETH()"
--rpc-url <RPC_URL> --private-key <PRIVATE_KEY>
undefinedCalldata Encoding (for manual signing output)
调用数据编码(用于手动签名输出)
- uint256: convert wei to hex, left-pad to 64 chars
- address: remove 0x prefix, left-pad to 64 chars
- returns 3 × uint256 (192 hex chars):
canWithdrawalAmount. First 64 chars = claimable ETH amount(totalAvailableAmount, pendingDeleteIndex, pendingDeleteAmount)
- uint256:将wei值转换为十六进制,左填充至64个字符
- address:移除0x前缀,左填充至64个字符
- 返回3个uint256值(共192个十六进制字符):
canWithdrawalAmount,前64个字符为可领取的ETH数量(totalAvailableAmount, pendingDeleteIndex, pendingDeleteAmount)
API 1: Mint vETH (Stake ETH)
API 1:铸造vETH(质押ETH)
Pre-Execution
执行前准备
- Query rate: → expected vETH
previewDeposit(amount) - Check wallet: env var or Foundry keystore
BIFROST_PRIVATE_KEYbifrost-agent - Display preview and wait for CONFIRM
- 查询汇率:→ 预计可获得的vETH数量
previewDeposit(amount) - 检查钱包:是否设置环境变量或Foundry密钥库中的
BIFROST_PRIVATE_KEYbifrost-agent - 显示预览信息,等待用户输入CONFIRM确认
Transaction
交易详情
| Field | Value |
|---|---|
| To | |
| Value | User's ETH amount in wei |
| Data | |
| ChainId | Per selected chain |
| 字段 | 值 |
|---|---|
| 接收地址 | |
| 金额 | 用户质押的ETH金额(wei单位) |
| 数据 | |
| ChainId | 所选链对应的ChainId |
Manual Signing Output
手动签名输出
To: <VETH_CONTRACT>
Value: {wei} ({amount} ETH)
Data: 0x1166dab6
ChainId: {chainId}To: <VETH_CONTRACT>
Value: {wei} ({amount} ETH)
Data: 0x1166dab6
ChainId: {chainId}API 2: Redeem vETH (Unstake)
API 2:赎回vETH(解除质押)
Pre-Execution
执行前准备
- Check ≥ redeem amount
balanceOf(user) - Query → expected ETH
previewRedeem(shares) - Check
maxRedeem(user) - Display preview (warn: ETH enters queue, NOT instant) and wait for CONFIRM
- 检查≥ 赎回份额
balanceOf(user) - 查询→ 预计可获得的ETH数量
previewRedeem(shares) - 检查值
maxRedeem(user) - 显示预览信息(提示:ETH会进入队列,不会立即到账),等待用户输入CONFIRM确认
Transaction
交易详情
| Field | Value |
|---|---|
| To | |
| Value | |
| Data | ABI-encoded |
| ChainId | Per selected chain |
Encode calldata:
cast calldata "redeem(uint256,address,address)" <SHARES> <ADDR> <ADDR>| 字段 | 值 |
|---|---|
| 接收地址 | |
| 金额 | |
| 数据 | ABI编码后的 |
| ChainId | 所选链对应的ChainId |
编码调用数据:
cast calldata "redeem(uint256,address,address)" <SHARES> <ADDR> <ADDR>API 3: Claim Redeemed ETH
API 3:领取赎回的ETH
Pre-Execution
执行前准备
- Check — first return value = claimable amount
canWithdrawalAmount(user) - If 0: inform user redemption may still be processing
- If > 0: display claimable amount and wait for CONFIRM
- 调用— 返回值的第一个参数为可领取金额
canWithdrawalAmount(user) - 若金额为0:告知用户赎回可能仍在处理中
- 若金额大于0:显示可领取金额,等待用户输入CONFIRM确认
Transaction
交易详情
| Field | Value |
|---|---|
| To | |
| Value | |
| Data | |
| ChainId | Per selected chain |
| 字段 | 值 |
|---|---|
| 接收地址 | |
| 金额 | |
| 数据 | |
| ChainId | 所选链对应的ChainId |
Agent Behavior
代理行为
- Environment check: on first interaction, ask user if they want to configure ,
BIFROST_CHAIN, orBIFROST_RPC_URL. If not, use Ethereum Mainnet defaults with manual signing modeBIFROST_PRIVATE_KEY - RPC selection: use if set; otherwise use per-chain default RPC. Fall back to per-chain fallback RPC on failure
BIFROST_RPC_URL - Multi-chain awareness: when user specifies a chain (e.g. "on Base", "on Arbitrum"), switch to that chain's RPC, WETH address, and chainId accordingly
- Wallet detection: check env var or Foundry keystore
BIFROST_PRIVATE_KEY. If found, ask user whether to use it. If not, output tx data for manual signingbifrost-agent - CONFIRM required: display transaction preview (amount, rate, expected output, chain) and require user to type CONFIRM before any write
- Private key import requires CONFIRM: show security warning first, require CONFIRM before accepting key
- Key retention is user-controlled: after tx, ask user whether to keep or delete the key
- Balance pre-check: verify sufficient ETH/vETH before building tx
- Prefer cast, fall back to curl: use pre-computed calldata from selector table if cast fails
- No credential display: never echo private keys; truncate addresses (first 6 + last 4)
- Post-completion tip: if no wallet configured, suggest "set up wallet" after operation
- After successful tx, provide block explorer link: (Ethereum),
https://etherscan.io/tx/{hash}(Base),https://basescan.org/tx/{hash}(Optimism),https://optimistic.etherscan.io/tx/{hash}(Arbitrum)https://arbiscan.io/tx/{hash} - Useful links: direct users to Bifrost vETH page or Bifrost App when relevant
- 环境检查:首次交互时,询问用户是否需要配置、
BIFROST_CHAIN或BIFROST_RPC_URL。若不需要,则使用Ethereum主网默认配置及手动签名模式BIFROST_PRIVATE_KEY - RPC选择:若设置了则使用该地址;否则使用对应链的默认RPC。若默认RPC调用失败,自动切换至备用RPC
BIFROST_RPC_URL - 多链适配:当用户指定链(如“在Base上”、“在Arbitrum上”)时,自动切换至对应链的RPC、WETH地址和ChainId
- 钱包检测:检查是否设置环境变量或Foundry密钥库中的
BIFROST_PRIVATE_KEY。若存在,询问用户是否使用该钱包;若不存在,则输出交易数据供手动签名bifrost-agent - 强制确认:显示交易预览信息(金额、汇率、预计输出、链信息),要求用户输入CONFIRM后再执行任何写入操作
- 私钥导入需确认:先显示安全警告,要求用户输入CONFIRM后再接受私钥
- 密钥由用户控制:交易完成后,询问用户是否保留或删除密钥
- 余额预检查:在构建交易前,验证ETH/vETH余额是否充足
- 优先使用cast,备选curl:若cast调用失败,使用选择器表中的预计算调用数据
- 不显示凭证:绝不回显私钥;地址仅显示前6位+后4位
- 操作后提示:若未配置钱包,操作完成后建议用户“设置钱包”
- 交易成功后,提供区块浏览器链接:Ethereum链为,Base链为
https://etherscan.io/tx/{hash},Optimism链为https://basescan.org/tx/{hash},Arbitrum链为https://optimistic.etherscan.io/tx/{hash}https://arbiscan.io/tx/{hash} - 实用链接:相关场景下,引导用户访问Bifrost vETH页面或Bifrost应用
Security
安全注意事项
- Private keys are opt-in only — default outputs unsigned tx data
- Explicit CONFIRM for every write operation
- Validate amounts against balance and protocol limits
- Recommend dedicated wallet with limited funds for agent-side signing
- 私钥为可选配置 — 默认输出未签名的交易数据
- 所有写入操作均需明确输入CONFIRM确认
- 验证金额是否符合余额及协议限制
- 建议使用专用钱包且仅存入有限资金用于代理端签名
Error Handling
错误处理
| 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..." |
| 错误类型 | 用户提示信息 |
|---|---|
| "未包含ETH,请指定质押金额。" |
| "ETH转账失败,请尝试使用withdrawComplete()领取WETH。" |
| "无可领取的ETH,您的赎回申请可能仍在处理中。" |
| "赎回金额超过您的最大限额,请检查余额。" |
| "vETH合约已暂停,请稍后重试。" |
| ETH余额不足 | "ETH余额不足。当前余额:{bal},所需金额:{amount + gas}。" |
| vETH余额不足 | "vETH余额不足。当前余额:{bal},申请金额:{amount}。" |
| 待处理赎回数量过多 | "待处理赎回数量过多,请先领取已完成的赎回资产。" |
| RPC调用失败 | "无法连接至网络,正在尝试使用备用端点..." |
Notes
注意事项
- wraps ETH → WETH internally via
depositWithETH(). No ERC-20 approval needed. For direct WETH deposits, useWETH.deposit()instead (requires WETH approval)deposit(uint256,address) - internally calls
withdrawCompleteToETH()to receive WETH, then unwraps to ETH viawithdrawCompleteTo(address(this)), then sends ETH to caller. If ETH transfer fails, useWETH.withdraw()to receive WETH insteadwithdrawComplete() - Redemption is NOT instant — /
redeem()add entries to the withdrawal queue, processed in batches via Bifrost cross-chain mechanismwithdraw() - All write functions are protected by and
whenNotPaused(ReentrancyGuardUpgradeable)nonReentrant - Gas estimates are approximate; use for accuracy
cast estimate
- 通过内部调用
depositWithETH()将ETH包装为WETH,无需ERC-20授权。若需直接存入WETH,请使用WETH.deposit()(需预先授权WETH)deposit(uint256,address) - 内部先调用
withdrawCompleteToETH()领取WETH,再通过withdrawCompleteTo(address(this))解包为ETH,最后将ETH发送给调用者。若ETH转账失败,可使用WETH.withdraw()领取WETHwithdrawComplete() - 赎回并非即时到账 — /
redeem()会将申请加入赎回队列,通过Bifrost跨链机制批量处理withdraw() - 所有写入函数均受和
whenNotPaused(ReentrancyGuardUpgradeable)保护nonReentrant - Gas预估为近似值,若需精确值可使用
cast estimate