Stakingverse Ethereum

Polar Sponsor
爱发电 赞助
.NET 9.0

在 StakeWise 上质押 ETH(以太坊流动性质押),用于质押、解除质押或查询 StakeWise V3 金库的仓位。

刺杀Ethrewise Ethrewum Swaking Switch. 刺杀V3并获得Oseth(液体吸附物). 刺杀Ethlewy在保持你Eth的液体的同时

功能概述

刺杀Ethrewise Ethrewum Swaking Switch. 刺杀V3并获得Oseth(液体吸附物). 刺杀Ethlewy在保持你Eth的液体的同时是一项面向实际任务的技能,主要用于Take Eth – 接收 ~。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。

核心要点

  • 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
  • 该技能适合需要稳定复用相关能力的场景,可作为自动化工作流的一部分,也便于后续检查、调整和扩展。
  • 从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。

使用与执行

实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。

结果检查与注意事项

执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。

StakeWise 以太坊质押技能

在 StakeWise V3 上质押 ETH,获得 osETH(流动性质押代币)。在保持 ETH 流动性的同时赚取质押奖励。

该技能的功能

  • 质押 ETH → 获得 osETH 代币(自动处理状态更新)
  • 赎回 ETH → 销毁 osETH 换回 ETH
  • 查询已质押仓位 → 查看金库份额及已获奖励
  • 监控金库状态 → 检查是否需要 keeper 状态更新
  • 查询收获证明(harvest proofs) → 从子图(subgraph)获取存款对应的 Merkle 证明

必需的凭据

请设置以下环境变量,或直接编辑脚本文件:

export STAKEWISE_VAULT="0x8A93A876912c9F03F88Bc9114847cf5b63c89f56"
export KEEPER="0x6B5815467da09DaA7DC83Db21c9239d98Bb487b5"
export PRIVATE_KEY="your_private_key"
export MY_ADDRESS="your_address"
export RPC_URL="https://ethereum-rpc.publicnode.com"

快速开始

# 质押 0.1 ETH(自动处理状态更新)
node scripts/stake.mjs 0.1

# 查询已质押仓位
node scripts/position.js

# 赎回 0.05 osETH
node scripts/unstake.js 0.05

# 检查是否需要状态更新
node scripts/check-state.js

StakeWise V3 工作原理

架构概览

StakeWise V3 使用 keeper-oracle 模式 进行状态更新:

User (EOA/UP)
    ↓
Vault Contract
    ↓
Keeper (Oracle) - 验证并处理奖励
    ↓
osETH Token - 流动性质押代币

核心组件

组件 地址 用途
Vault 0x8A93A876912c9F03F88Bc9114847cf5b63c89f56 质押/赎回逻辑
Keeper 0x6B5815467da09DaA7DC83Db21c9239d98Bb487b5 用于状态更新的 Oracle
osETH Token 按金库动态生成 流动性质押代币
Subgraph https://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod 提供收获证明(harvest proofs)及相关数据

状态更新机制

为何需要状态更新?

  • StakeWise 通过验证者在链下累积奖励
  • Keeper 定期执行“收获(harvest)”并将状态发布至链上
  • 用户仅可在状态最新时进行存款操作

何时需要状态更新?

const vault = new ethers.Contract(vaultAddress, vaultAbi, provider);
const needsUpdate = await vault.isStateUpdateRequired();
// 返回 true 表示必须先更新状态,再执行存款

质押流程(含状态更新)

步骤 1:检查状态
    用户
      ↓
    vault.isStateUpdateRequired()
      ↓
    返回:true(需更新)

步骤 2:向子图查询收获参数
    用户
      ↓
    向 StakeWise 子图发起 POST 请求
      ↓
    返回:rewardsRoot、reward、unlockedMevReward、proof[]

步骤 3:更新状态并存款
    用户
      ↓
    vault.updateStateAndDeposit(harvestParams, receiver, referrer)
      ↓
    Keeper 验证收获结果
      ↓
    Vault 向 receiver 铸造 osETH
      ↓
    用户收到 osETH

详细用法

质押 ETH(含完整状态更新流程)

import { ethers } from 'ethers';
import fetch from 'node-fetch';

// 初始化
const provider = new ethers.JsonRpcProvider(process.env.RPC_URL);
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);

// Vault ABI(最小化定义)
const VAULT_ABI = [
  'function isStateUpdateRequired() view returns (bool)',
  'function updateStateAndDeposit(tuple(bytes32 rewardsRoot, uint256 reward, uint256 unlockedMevReward, bytes32[] proof) harvestParams, address receiver, address referrer) external payable',
  'function deposit(address receiver, address referrer) external payable'
];

const vault = new ethers.Contract(
  process.env.STAKEWISE_VAULT,
  VAULT_ABI,
  wallet
);

// 质押金额
const stakeAmount = ethers.parseEther('0.1'); // 0.1 ETH

// 步骤 1:检查是否需要状态更新
const needsUpdate = await vault.isStateUpdateRequired();
console.log('状态更新是否必需:', needsUpdate);

if (needsUpdate) {
  // 步骤 2:向子图查询收获参数
  const subgraphQuery = {
    query: `
      query getHarvestProofs($vault: String!) {
        harvestProofs(
          where: { vault: $vault }
          orderBy: blockNumber
          orderDirection: desc
          first: 1
        ) {
          rewardsRoot
          reward
          unlockedMevReward
          proof
        }
      }
    `,
    variables: {
      vault: process.env.STAKEWISE_VAULT.toLowerCase()
    }
  };

  const response = await fetch('https://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(subgraphQuery)
  });

  const data = await response.json();
  const harvestProof = data.data.harvestProofs[0];

  // 步骤 3:调用 updateStateAndDeposit
  const harvestParams = {
    rewardsRoot: harvestProof.rewardsRoot,
    reward: BigInt(harvestProof.reward),
    unlockedMevReward: BigInt(harvestProof.unlockedMevReward),
    proof: harvestProof.proof
  };

  const tx = await vault.updateStateAndDeposit(
    harvestParams,
    process.env.MY_ADDRESS,  // 接收方
    ethers.ZeroAddress,       // 推荐人(可选)
    { value: stakeAmount }
  );

  const receipt = await tx.wait();
  console.log(`已质押 ${ethers.formatEther(stakeAmount)} ETH,并完成状态更新`);
  console.log(`交易哈希:${receipt.hash}`);
} else {
  // 简单存款(无需状态更新)
  const tx = await vault.deposit(
    process.env.MY_ADDRESS,
    ethers.ZeroAddress,
    { value: stakeAmount }
  );

  const receipt = await tx.wait();
  console.log(`已质押 ${ethers.formatEther(stakeAmount)} ETH`);
  console.log(`交易哈希:${receipt.hash}`);
}

查询已质押仓位

const OSETH_ABI = [
  'function balanceOf(address) view returns (uint256)',
  'function convertToAssets(uint256 shares) view returns (uint256)'
];

// 从 Vault 获取 osETH 代币地址
const osEthAddress = await vault.osToken();
const osEth = new ethers.Contract(osEthAddress, OSETH_ABI, provider);

const osEthBalance = await osEth.balanceOf(process.env.MY_ADDRESS);
const underlyingEth = await osEth.convertToAssets(osEthBalance);

console.log(`osETH 余额:${ethers.formatEther(osEthBalance)}`);
console.log(`等价 ETH:${ethers.formatEther(underlyingEth)}`);

赎回 ETH

const VAULT_FULL_ABI = [
  'function redeem(uint256 shares, address receiver, address owner) returns (uint256 assets)',
  'function maxRedeem(address owner) view returns (uint256)'
];

const vaultFull = new ethers.Contract(
  process.env.STAKEWISE_VAULT,
  VAULT_FULL_ABI,
  wallet
);

// 查询最大可赎回份额
const maxShares = await vaultFull.maxRedeem(process.env.MY_ADDRESS);
console.log(`最大可赎回 osETH:${ethers.formatEther(maxShares)}`);

// 赎回指定份额
const sharesToRedeem = ethers.parseEther('0.05');
const tx = await vaultFull.redeem(
  sharesToRedeem,
  process.env.MY_ADDRESS,  // 接收方
  process.env.MY_ADDRESS   // 所有者
);

const receipt = await tx.wait();
console.log(`已赎回 ${ethers.formatEther(sharesToRedeem)} osETH,换得 ETH`);
console.log(`交易哈希:${receipt.hash}`);

子图(Subgraph)查询

获取最新收获证明(harvest proof)

const query = {
  query: `
    query {
      harvestProofs(
        orderBy: blockNumber
        orderDirection: desc
        first: 1
      ) {
        id
        vault
        rewardsRoot
        reward
        unlockedMevReward
        proof
        blockNumber
      }
    }
  `
};

const response = await fetch('https://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify(query)
});

const data = await response.json();
console.log(data.data.harvestProofs[0]);

获取金库(Vault)状态

const query = {
  query: `
    query {
      vaults(first: 1) {
        id
        address
        totalAssets
        totalShares
        apr
      }
    }
  `
};

常见问题

“状态更新必需(State update required)”

  • Keeper 尚未发布近期奖励数据
  • 请向子图查询最新的收获证明(harvest proof)
  • 应使用 updateStateAndDeposit() 替代 deposit()

“收获证明无效(Invalid harvest proof)”

  • 证明可能已过期
  • 务必在执行存款前立即查询子图
  • 每份证明均与特定区块绑定

“份额不足(Insufficient shares)”

  • 尝试赎回的 osETH 数量超出当前持有量
  • 请检查余额:osETH.balanceOf(yourAddress)

“金库已暂停(Vault is paused)”

  • 可能触发了紧急暂停机制
  • 可通过 vault.paused() 检查状态
  • 需等待 StakeWise 团队解除暂停

重要说明

  • 年化收益率(APY)不固定:取决于以太坊验证者奖励,通常为 3–5%
  • osETH 支持重定基(rebasing):随着奖励累积,余额自动增长
  • 依赖 Keeper:存款操作要求状态有效(Keeper 必须处于活跃状态)
  • Gas 成本差异:状态更新所需 Gas 高于简单存款
  • MEV 奖励:收获内容中包含 MEV 提取奖励

参考资料

  • StakeWise 应用:https://app.stakewise.io
  • StakeWise 文档:https://docs.stakewise.io
  • 子图(Subgraph):https://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod
  • Vault 地址:0x8A93A876912c9F03F88Bc9114847cf5b63c89f56
  • Keeper 地址:0x6B5815467da09DaA7DC83Db21c9239d98Bb487b5

相关专题

更多
Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

2026.11.06

0

12

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

2026.11.06

0

13

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

2026.11.06

0

10

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

2026.11.05

0

12

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

2026.11.05

0

12

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

2026.11.04

0

16

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

15

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

2026.11.04

0

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习