{
  "schemaVersion": "1.0",
  "item": {
    "slug": "stakingverse-ethereum",
    "name": "Stakingverse Ethereum",
    "source": "tencent",
    "type": "skill",
    "category": "内容创作",
    "sourceUrl": "https://clawhub.ai/LUKSOAgent/stakingverse-ethereum",
    "canonicalUrl": "https://clawhub.ai/LUKSOAgent/stakingverse-ethereum",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/stakingverse-ethereum",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=stakingverse-ethereum",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "SKILL.md",
      "scripts/check-state.js",
      "scripts/position.js",
      "scripts/stake.mjs"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/stakingverse-ethereum"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/stakingverse-ethereum",
    "agentPageUrl": "https://openagent3.xyz/skills/stakingverse-ethereum/agent",
    "manifestUrl": "https://openagent3.xyz/skills/stakingverse-ethereum/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/stakingverse-ethereum/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Then review README.md for any prerequisites, environment setup, or post-install checks. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "StakeWise Ethereum Staking Skill",
        "body": "Stake ETH on StakeWise V3 and receive osETH (liquid staking token). Earn staking rewards while keeping your ETH liquid."
      },
      {
        "title": "What This Skill Does",
        "body": "Stake ETH → Receive osETH tokens (handles state updates automatically)\nUnstake ETH → Burn osETH for ETH\nCheck staked position → View vault shares and earned rewards\nMonitor vault state → Check if keeper state update is required\nQuery harvest proofs → Get Merkle proofs from subgraph for deposits"
      },
      {
        "title": "Required Credentials",
        "body": "Set these environment variables or edit the scripts:\n\nexport STAKEWISE_VAULT=\"0x8A93A876912c9F03F88Bc9114847cf5b63c89f56\"\nexport KEEPER=\"0x6B5815467da09DaA7DC83Db21c9239d98Bb487b5\"\nexport PRIVATE_KEY=\"your_private_key\"\nexport MY_ADDRESS=\"your_address\"\nexport RPC_URL=\"https://ethereum-rpc.publicnode.com\""
      },
      {
        "title": "Quick Start",
        "body": "# Stake 0.1 ETH (auto-handles state updates)\nnode scripts/stake.mjs 0.1\n\n# Check staked position\nnode scripts/position.js\n\n# Unstake 0.05 osETH\nnode scripts/unstake.js 0.05\n\n# Check if state update required\nnode scripts/check-state.js"
      },
      {
        "title": "Architecture Overview",
        "body": "StakeWise V3 uses a keeper-oracle pattern for state updates:\n\nUser (EOA/UP)\n    ↓\nVault Contract\n    ↓\nKeeper (Oracle) - Validates and processes rewards\n    ↓\nosETH Token - Liquid staking token"
      },
      {
        "title": "Key Components",
        "body": "ComponentAddressPurposeVault0x8A93A876912c9F03F88Bc9114847cf5b63c89f56Staking/unstaking logicKeeper0x6B5815467da09DaA7DC83Db21c9239d98Bb487b5Oracle for state updatesosETH TokenDynamic per vaultLiquid staking tokenSubgraphhttps://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prodHarvest proofs and data"
      },
      {
        "title": "The State Update Mechanism",
        "body": "Why state updates?\n\nStakeWise accumulates rewards off-chain via validators\nKeeper periodically \"harvests\" and posts state on-chain\nUsers can only deposit when state is current\n\nWhen is state update required?\n\nconst vault = new ethers.Contract(vaultAddress, vaultAbi, provider);\nconst needsUpdate = await vault.isStateUpdateRequired();\n// true = must update state before depositing"
      },
      {
        "title": "Staking Flow (With State Update)",
        "body": "Step 1: Check State\n    User\n      ↓\n    vault.isStateUpdateRequired()\n      ↓\n    Returns: true (update needed)\n\nStep 2: Query Subgraph for Harvest Params\n    User\n      ↓\n    POST to StakeWise subgraph\n      ↓\n    Returns: rewardsRoot, reward, unlockedMevReward, proof[]\n\nStep 3: Update State and Deposit\n    User\n      ↓\n    vault.updateStateAndDeposit(harvestParams, receiver, referrer)\n      ↓\n    Keeper validates harvest\n      ↓\n    Vault mints osETH to receiver\n      ↓\n    User receives osETH"
      },
      {
        "title": "Stake ETH (Full Flow with State Update)",
        "body": "import { ethers } from 'ethers';\nimport fetch from 'node-fetch';\n\n// Setup\nconst provider = new ethers.JsonRpcProvider(process.env.RPC_URL);\nconst wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);\n\n// Vault ABI (minimal)\nconst VAULT_ABI = [\n  'function isStateUpdateRequired() view returns (bool)',\n  'function updateStateAndDeposit(tuple(bytes32 rewardsRoot, uint256 reward, uint256 unlockedMevReward, bytes32[] proof) harvestParams, address receiver, address referrer) external payable',\n  'function deposit(address receiver, address referrer) external payable'\n];\n\nconst vault = new ethers.Contract(\n  process.env.STAKEWISE_VAULT,\n  VAULT_ABI,\n  wallet\n);\n\n// Amount to stake\nconst stakeAmount = ethers.parseEther('0.1'); // 0.1 ETH\n\n// Step 1: Check if state update required\nconst needsUpdate = await vault.isStateUpdateRequired();\nconsole.log('State update required:', needsUpdate);\n\nif (needsUpdate) {\n  // Step 2: Query subgraph for harvest params\n  const subgraphQuery = {\n    query: `\n      query getHarvestProofs($vault: String!) {\n        harvestProofs(\n          where: { vault: $vault }\n          orderBy: blockNumber\n          orderDirection: desc\n          first: 1\n        ) {\n          rewardsRoot\n          reward\n          unlockedMevReward\n          proof\n        }\n      }\n    `,\n    variables: {\n      vault: process.env.STAKEWISE_VAULT.toLowerCase()\n    }\n  };\n\n  const response = await fetch('https://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify(subgraphQuery)\n  });\n\n  const data = await response.json();\n  const harvestProof = data.data.harvestProofs[0];\n\n  // Step 3: Call updateStateAndDeposit\n  const harvestParams = {\n    rewardsRoot: harvestProof.rewardsRoot,\n    reward: BigInt(harvestProof.reward),\n    unlockedMevReward: BigInt(harvestProof.unlockedMevReward),\n    proof: harvestProof.proof\n  };\n\n  const tx = await vault.updateStateAndDeposit(\n    harvestParams,\n    process.env.MY_ADDRESS,  // receiver\n    ethers.ZeroAddress,       // referrer (optional)\n    { value: stakeAmount }\n  );\n\n  const receipt = await tx.wait();\n  console.log(`Staked ${ethers.formatEther(stakeAmount)} ETH with state update`);\n  console.log(`Transaction: ${receipt.hash}`);\n} else {\n  // Simple deposit (no state update needed)\n  const tx = await vault.deposit(\n    process.env.MY_ADDRESS,\n    ethers.ZeroAddress,\n    { value: stakeAmount }\n  );\n\n  const receipt = await tx.wait();\n  console.log(`Staked ${ethers.formatEther(stakeAmount)} ETH`);\n  console.log(`Transaction: ${receipt.hash}`);\n}"
      },
      {
        "title": "Check Staked Position",
        "body": "const OSETH_ABI = [\n  'function balanceOf(address) view returns (uint256)',\n  'function convertToAssets(uint256 shares) view returns (uint256)'\n];\n\n// Get osETH token address from vault\nconst osEthAddress = await vault.osToken();\nconst osEth = new ethers.Contract(osEthAddress, OSETH_ABI, provider);\n\nconst osEthBalance = await osEth.balanceOf(process.env.MY_ADDRESS);\nconst underlyingEth = await osEth.convertToAssets(osEthBalance);\n\nconsole.log(`osETH Balance: ${ethers.formatEther(osEthBalance)}`);\nconsole.log(`Equivalent ETH: ${ethers.formatEther(underlyingEth)}`);"
      },
      {
        "title": "Unstake ETH",
        "body": "const VAULT_FULL_ABI = [\n  'function redeem(uint256 shares, address receiver, address owner) returns (uint256 assets)',\n  'function maxRedeem(address owner) view returns (uint256)'\n];\n\nconst vaultFull = new ethers.Contract(\n  process.env.STAKEWISE_VAULT,\n  VAULT_FULL_ABI,\n  wallet\n);\n\n// Check max redeemable\nconst maxShares = await vaultFull.maxRedeem(process.env.MY_ADDRESS);\nconsole.log(`Max redeemable: ${ethers.formatEther(maxShares)} osETH`);\n\n// Redeem shares for ETH\nconst sharesToRedeem = ethers.parseEther('0.05');\nconst tx = await vaultFull.redeem(\n  sharesToRedeem,\n  process.env.MY_ADDRESS,  // receiver\n  process.env.MY_ADDRESS   // owner\n);\n\nconst receipt = await tx.wait();\nconsole.log(`Redeemed ${ethers.formatEther(sharesToRedeem)} osETH for ETH`);\nconsole.log(`Transaction: ${receipt.hash}`);"
      },
      {
        "title": "Get Latest Harvest Proof",
        "body": "const query = {\n  query: `\n    query {\n      harvestProofs(\n        orderBy: blockNumber\n        orderDirection: desc\n        first: 1\n      ) {\n        id\n        vault\n        rewardsRoot\n        reward\n        unlockedMevReward\n        proof\n        blockNumber\n      }\n    }\n  `\n};\n\nconst response = await fetch('https://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: JSON.stringify(query)\n});\n\nconst data = await response.json();\nconsole.log(data.data.harvestProofs[0]);"
      },
      {
        "title": "Get Vault State",
        "body": "const query = {\n  query: `\n    query {\n      vaults(first: 1) {\n        id\n        address\n        totalAssets\n        totalShares\n        apr\n      }\n    }\n  `\n};"
      },
      {
        "title": "\"State update required\"",
        "body": "The keeper hasn't posted recent rewards\nQuery subgraph for latest harvest proof\nUse updateStateAndDeposit() instead of deposit()"
      },
      {
        "title": "\"Invalid harvest proof\"",
        "body": "Proof may be outdated\nAlways query subgraph immediately before depositing\nProofs are block-specific"
      },
      {
        "title": "\"Insufficient shares\"",
        "body": "Trying to redeem more osETH than you have\nCheck balance: osETH.balanceOf(yourAddress)"
      },
      {
        "title": "\"Vault is paused\"",
        "body": "Emergency pause may be active\nCheck: vault.paused()\nWait for StakeWise team to unpause"
      },
      {
        "title": "Important Notes",
        "body": "APY varies: Based on Ethereum validator rewards, typically 3-5%\nosETH is rebasing: Balance increases automatically as rewards accrue\nKeeper dependency: Deposits require valid state (keeper must be active)\nGas costs: State updates cost more gas than simple deposits\nMEV rewards: Part of harvest includes MEV extraction rewards"
      },
      {
        "title": "Resources",
        "body": "StakeWise App: https://app.stakewise.io\nStakeWise Docs: https://docs.stakewise.io\nSubgraph: https://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod\nVault: 0x8A93A876912c9F03F88Bc9114847cf5b63c89f56\nKeeper: 0x6B5815467da09DaA7DC83Db21c9239d98Bb487b5"
      }
    ],
    "body": "StakeWise Ethereum Staking Skill\n\nStake ETH on StakeWise V3 and receive osETH (liquid staking token). Earn staking rewards while keeping your ETH liquid.\n\nWhat This Skill Does\nStake ETH → Receive osETH tokens (handles state updates automatically)\nUnstake ETH → Burn osETH for ETH\nCheck staked position → View vault shares and earned rewards\nMonitor vault state → Check if keeper state update is required\nQuery harvest proofs → Get Merkle proofs from subgraph for deposits\nRequired Credentials\n\nSet these environment variables or edit the scripts:\n\nexport STAKEWISE_VAULT=\"0x8A93A876912c9F03F88Bc9114847cf5b63c89f56\"\nexport KEEPER=\"0x6B5815467da09DaA7DC83Db21c9239d98Bb487b5\"\nexport PRIVATE_KEY=\"your_private_key\"\nexport MY_ADDRESS=\"your_address\"\nexport RPC_URL=\"https://ethereum-rpc.publicnode.com\"\n\nQuick Start\n# Stake 0.1 ETH (auto-handles state updates)\nnode scripts/stake.mjs 0.1\n\n# Check staked position\nnode scripts/position.js\n\n# Unstake 0.05 osETH\nnode scripts/unstake.js 0.05\n\n# Check if state update required\nnode scripts/check-state.js\n\nHow StakeWise V3 Works\nArchitecture Overview\n\nStakeWise V3 uses a keeper-oracle pattern for state updates:\n\nUser (EOA/UP)\n    ↓\nVault Contract\n    ↓\nKeeper (Oracle) - Validates and processes rewards\n    ↓\nosETH Token - Liquid staking token\n\nKey Components\nComponent\tAddress\tPurpose\nVault\t0x8A93A876912c9F03F88Bc9114847cf5b63c89f56\tStaking/unstaking logic\nKeeper\t0x6B5815467da09DaA7DC83Db21c9239d98Bb487b5\tOracle for state updates\nosETH Token\tDynamic per vault\tLiquid staking token\nSubgraph\thttps://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod\tHarvest proofs and data\nThe State Update Mechanism\n\nWhy state updates?\n\nStakeWise accumulates rewards off-chain via validators\nKeeper periodically \"harvests\" and posts state on-chain\nUsers can only deposit when state is current\n\nWhen is state update required?\n\nconst vault = new ethers.Contract(vaultAddress, vaultAbi, provider);\nconst needsUpdate = await vault.isStateUpdateRequired();\n// true = must update state before depositing\n\nStaking Flow (With State Update)\nStep 1: Check State\n    User\n      ↓\n    vault.isStateUpdateRequired()\n      ↓\n    Returns: true (update needed)\n\nStep 2: Query Subgraph for Harvest Params\n    User\n      ↓\n    POST to StakeWise subgraph\n      ↓\n    Returns: rewardsRoot, reward, unlockedMevReward, proof[]\n\nStep 3: Update State and Deposit\n    User\n      ↓\n    vault.updateStateAndDeposit(harvestParams, receiver, referrer)\n      ↓\n    Keeper validates harvest\n      ↓\n    Vault mints osETH to receiver\n      ↓\n    User receives osETH\n\nDetailed Usage\nStake ETH (Full Flow with State Update)\nimport { ethers } from 'ethers';\nimport fetch from 'node-fetch';\n\n// Setup\nconst provider = new ethers.JsonRpcProvider(process.env.RPC_URL);\nconst wallet = new ethers.Wallet(process.env.PRIVATE_KEY, provider);\n\n// Vault ABI (minimal)\nconst VAULT_ABI = [\n  'function isStateUpdateRequired() view returns (bool)',\n  'function updateStateAndDeposit(tuple(bytes32 rewardsRoot, uint256 reward, uint256 unlockedMevReward, bytes32[] proof) harvestParams, address receiver, address referrer) external payable',\n  'function deposit(address receiver, address referrer) external payable'\n];\n\nconst vault = new ethers.Contract(\n  process.env.STAKEWISE_VAULT,\n  VAULT_ABI,\n  wallet\n);\n\n// Amount to stake\nconst stakeAmount = ethers.parseEther('0.1'); // 0.1 ETH\n\n// Step 1: Check if state update required\nconst needsUpdate = await vault.isStateUpdateRequired();\nconsole.log('State update required:', needsUpdate);\n\nif (needsUpdate) {\n  // Step 2: Query subgraph for harvest params\n  const subgraphQuery = {\n    query: `\n      query getHarvestProofs($vault: String!) {\n        harvestProofs(\n          where: { vault: $vault }\n          orderBy: blockNumber\n          orderDirection: desc\n          first: 1\n        ) {\n          rewardsRoot\n          reward\n          unlockedMevReward\n          proof\n        }\n      }\n    `,\n    variables: {\n      vault: process.env.STAKEWISE_VAULT.toLowerCase()\n    }\n  };\n\n  const response = await fetch('https://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify(subgraphQuery)\n  });\n\n  const data = await response.json();\n  const harvestProof = data.data.harvestProofs[0];\n\n  // Step 3: Call updateStateAndDeposit\n  const harvestParams = {\n    rewardsRoot: harvestProof.rewardsRoot,\n    reward: BigInt(harvestProof.reward),\n    unlockedMevReward: BigInt(harvestProof.unlockedMevReward),\n    proof: harvestProof.proof\n  };\n\n  const tx = await vault.updateStateAndDeposit(\n    harvestParams,\n    process.env.MY_ADDRESS,  // receiver\n    ethers.ZeroAddress,       // referrer (optional)\n    { value: stakeAmount }\n  );\n\n  const receipt = await tx.wait();\n  console.log(`Staked ${ethers.formatEther(stakeAmount)} ETH with state update`);\n  console.log(`Transaction: ${receipt.hash}`);\n} else {\n  // Simple deposit (no state update needed)\n  const tx = await vault.deposit(\n    process.env.MY_ADDRESS,\n    ethers.ZeroAddress,\n    { value: stakeAmount }\n  );\n\n  const receipt = await tx.wait();\n  console.log(`Staked ${ethers.formatEther(stakeAmount)} ETH`);\n  console.log(`Transaction: ${receipt.hash}`);\n}\n\nCheck Staked Position\nconst OSETH_ABI = [\n  'function balanceOf(address) view returns (uint256)',\n  'function convertToAssets(uint256 shares) view returns (uint256)'\n];\n\n// Get osETH token address from vault\nconst osEthAddress = await vault.osToken();\nconst osEth = new ethers.Contract(osEthAddress, OSETH_ABI, provider);\n\nconst osEthBalance = await osEth.balanceOf(process.env.MY_ADDRESS);\nconst underlyingEth = await osEth.convertToAssets(osEthBalance);\n\nconsole.log(`osETH Balance: ${ethers.formatEther(osEthBalance)}`);\nconsole.log(`Equivalent ETH: ${ethers.formatEther(underlyingEth)}`);\n\nUnstake ETH\nconst VAULT_FULL_ABI = [\n  'function redeem(uint256 shares, address receiver, address owner) returns (uint256 assets)',\n  'function maxRedeem(address owner) view returns (uint256)'\n];\n\nconst vaultFull = new ethers.Contract(\n  process.env.STAKEWISE_VAULT,\n  VAULT_FULL_ABI,\n  wallet\n);\n\n// Check max redeemable\nconst maxShares = await vaultFull.maxRedeem(process.env.MY_ADDRESS);\nconsole.log(`Max redeemable: ${ethers.formatEther(maxShares)} osETH`);\n\n// Redeem shares for ETH\nconst sharesToRedeem = ethers.parseEther('0.05');\nconst tx = await vaultFull.redeem(\n  sharesToRedeem,\n  process.env.MY_ADDRESS,  // receiver\n  process.env.MY_ADDRESS   // owner\n);\n\nconst receipt = await tx.wait();\nconsole.log(`Redeemed ${ethers.formatEther(sharesToRedeem)} osETH for ETH`);\nconsole.log(`Transaction: ${receipt.hash}`);\n\nSubgraph Queries\nGet Latest Harvest Proof\nconst query = {\n  query: `\n    query {\n      harvestProofs(\n        orderBy: blockNumber\n        orderDirection: desc\n        first: 1\n      ) {\n        id\n        vault\n        rewardsRoot\n        reward\n        unlockedMevReward\n        proof\n        blockNumber\n      }\n    }\n  `\n};\n\nconst response = await fetch('https://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: JSON.stringify(query)\n});\n\nconst data = await response.json();\nconsole.log(data.data.harvestProofs[0]);\n\nGet Vault State\nconst query = {\n  query: `\n    query {\n      vaults(first: 1) {\n        id\n        address\n        totalAssets\n        totalShares\n        apr\n      }\n    }\n  `\n};\n\nCommon Issues\n\"State update required\"\nThe keeper hasn't posted recent rewards\nQuery subgraph for latest harvest proof\nUse updateStateAndDeposit() instead of deposit()\n\"Invalid harvest proof\"\nProof may be outdated\nAlways query subgraph immediately before depositing\nProofs are block-specific\n\"Insufficient shares\"\nTrying to redeem more osETH than you have\nCheck balance: osETH.balanceOf(yourAddress)\n\"Vault is paused\"\nEmergency pause may be active\nCheck: vault.paused()\nWait for StakeWise team to unpause\nImportant Notes\nAPY varies: Based on Ethereum validator rewards, typically 3-5%\nosETH is rebasing: Balance increases automatically as rewards accrue\nKeeper dependency: Deposits require valid state (keeper must be active)\nGas costs: State updates cost more gas than simple deposits\nMEV rewards: Part of harvest includes MEV extraction rewards\nResources\nStakeWise App: https://app.stakewise.io\nStakeWise Docs: https://docs.stakewise.io\nSubgraph: https://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod\nVault: 0x8A93A876912c9F03F88Bc9114847cf5b63c89f56\nKeeper: 0x6B5815467da09DaA7DC83Db21c9239d98Bb487b5"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/LUKSOAgent/stakingverse-ethereum",
    "publisherUrl": "https://clawhub.ai/LUKSOAgent/stakingverse-ethereum",
    "owner": "LUKSOAgent",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/stakingverse-ethereum",
    "downloadUrl": "https://openagent3.xyz/downloads/stakingverse-ethereum",
    "agentUrl": "https://openagent3.xyz/skills/stakingverse-ethereum/agent",
    "manifestUrl": "https://openagent3.xyz/skills/stakingverse-ethereum/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/stakingverse-ethereum/agent.md"
  }
}