{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "defi-staking-yield-vault",
  "title": "Defi Staking Yield Vault",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-react/blocks/defi-staking-yield-vault/DefiStakingYieldVault.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport {\n  ArrowUpRight,\n  Check,\n  Coins,\n  Copy,\n  Flame,\n  Fuel,\n  Lock,\n  Percent,\n  RefreshCw,\n  ShieldAlert,\n  ShieldCheck,\n  TrendingUp,\n  Unlock,\n  Wallet,\n  Zap,\n} from 'lucide-react'\nimport { cn } from '@/lib/utils'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Input } from '@/components/ui/input'\nimport { Separator } from '@/components/ui/separator'\nimport { Slider } from '@/components/ui/slider'\n\nexport interface DefiStakingYieldVaultProps extends React.HTMLAttributes<HTMLDivElement> {}\n\ninterface TokenOption {\n  symbol: string\n  name: string\n  price: number\n  balance: number\n  apyBoost: number\n  description: string\n  iconColor: string\n}\n\nconst tokenOptions: TokenOption[] = [\n  {\n    symbol: 'ETH',\n    name: 'Native Ether',\n    price: 3450.0,\n    balance: 32.5,\n    apyBoost: 0,\n    description: 'Base Layer Staking',\n    iconColor: '#627EEA',\n  },\n  {\n    symbol: 'stETH',\n    name: 'Lido Staked ETH',\n    price: 3450.0,\n    balance: 15.2,\n    apyBoost: 0,\n    description: '1:1 Rebase Token',\n    iconColor: '#00A3FF',\n  },\n  {\n    symbol: 'wstETH',\n    name: 'Wrapped stETH',\n    price: 4015.0,\n    balance: 8.4,\n    apyBoost: 0.15,\n    description: 'Compounding Value Token',\n    iconColor: '#0052FF',\n  },\n]\n\ninterface LockupOption {\n  id: string\n  label: string\n  durationText: string\n  days: number\n  boost: number\n  badge: string\n}\n\nconst lockupOptions: LockupOption[] = [\n  { id: 'flex', label: 'Flexible', durationText: '0-Day Lock', days: 0, boost: 0, badge: 'Flexible' },\n  { id: '30d', label: '30 Days', durationText: '30-Day Lock', days: 30, boost: 0.5, badge: '+0.5% APY' },\n  { id: '90d', label: '90 Days', durationText: '90-Day Lock', days: 90, boost: 1.2, badge: '+1.2% APY' },\n  { id: '365d', label: '365 Days', durationText: '365-Day Lock', days: 365, boost: 2.5, badge: '+2.5% APY' },\n]\n\ninterface VaultItem {\n  id: string\n  name: string\n  pairSymbol: string\n  protocol: string\n  apy: string\n  apyRaw: number\n  tvl: string\n  risk: 'Low Risk' | 'Medium Risk' | 'High Risk'\n  riskVariant: 'emerald' | 'amber' | 'rose'\n  strategy: string\n  metricLabel: string\n  metricValue: string\n  isCurrentVault?: boolean\n}\n\nconst yieldVaults: VaultItem[] = [\n  {\n    id: 'eth-usdc-lp',\n    name: 'ETH-USDC LP',\n    pairSymbol: 'ETH + USDC',\n    protocol: 'Uniswap v3 · Concentrated',\n    apy: '12.40%',\n    apyRaw: 12.4,\n    tvl: '$58,420,000.00',\n    risk: 'Medium Risk',\n    riskVariant: 'amber',\n    strategy: 'Automated Rebalancing Range ±5%',\n    metricLabel: '24h Volume',\n    metricValue: '$4.2M Vol',\n    isCurrentVault: false,\n  },\n  {\n    id: 'liquid-staked-eth',\n    name: 'Liquid Staked ETH',\n    pairSymbol: 'ETH / stETH',\n    protocol: 'Lido & Distributed Validator',\n    apy: '7.42%',\n    apyRaw: 7.42,\n    tvl: '$142,850,000.00',\n    risk: 'Low Risk',\n    riskVariant: 'emerald',\n    strategy: 'Consensus Layer + MEV Boost',\n    metricLabel: 'Lockup Period',\n    metricValue: 'Instant 0-Day',\n    isCurrentVault: true,\n  },\n  {\n    id: 'stablecoin-vault',\n    name: 'Stablecoin Multi-Vault',\n    pairSymbol: 'USDC + USDT + DAI',\n    protocol: 'Curve & Morpho Blue Optimizer',\n    apy: '9.80%',\n    apyRaw: 9.8,\n    tvl: '$94,180,000.00',\n    risk: 'Low Risk',\n    riskVariant: 'emerald',\n    strategy: 'Multi-Asset Lending & Arbitrage Yield',\n    metricLabel: 'Coverage',\n    metricValue: 'Nexus Mutual Protected',\n    isCurrentVault: false,\n  },\n]\n\nexport function DefiStakingYieldVault({ className, ...props }: DefiStakingYieldVaultProps) {\n  // Wallet State\n  const [isWalletConnected, setIsWalletConnected] = React.useState(true)\n  const walletAddress = '0x71C856402244243b92834b9d09c2534575823a9F'\n  const shortAddress = '0x71C...3a9F'\n  const [copied, setCopied] = React.useState(false)\n\n  const copyAddress = React.useCallback(() => {\n    if (typeof navigator !== 'undefined' && navigator.clipboard) {\n      navigator.clipboard.writeText(walletAddress)\n      setCopied(true)\n      setTimeout(() => {\n        setCopied(false)\n      }, 2000)\n    }\n  }, [walletAddress])\n\n  // Rewards State\n  const [unclaimedEth, setUnclaimedEth] = React.useState(0.485)\n  const [isClaiming, setIsClaiming] = React.useState(false)\n  const [claimSuccess, setClaimSuccess] = React.useState(false)\n\n  const unclaimedUsd = React.useMemo(() => {\n    return (unclaimedEth * 3450).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })\n  }, [unclaimedEth])\n\n  const handleClaimRewards = () => {\n    if (unclaimedEth <= 0 || isClaiming) return\n    setIsClaiming(true)\n    setTimeout(() => {\n      setIsClaiming(false)\n      setClaimSuccess(true)\n      setUnclaimedEth(0)\n      setTimeout(() => {\n        setClaimSuccess(false)\n      }, 3500)\n    }, 1200)\n  }\n\n  // Simulator State\n  const [selectedTokenSymbol, setSelectedTokenSymbol] = React.useState('ETH')\n  const [selectedLockupId, setSelectedLockupId] = React.useState('flex')\n  const [stakeAmountStr, setStakeAmountStr] = React.useState('10.0')\n  const [isStaking, setIsStaking] = React.useState(false)\n  const [stakeSuccess, setStakeSuccess] = React.useState(false)\n\n  const currentToken = React.useMemo(() => {\n    return tokenOptions.find((t) => t.symbol === selectedTokenSymbol) ?? tokenOptions[0]\n  }, [selectedTokenSymbol])\n\n  const currentLockup = React.useMemo(() => {\n    return lockupOptions.find((l) => l.id === selectedLockupId) ?? lockupOptions[0]\n  }, [selectedLockupId])\n\n  const parsedAmount = React.useMemo(() => {\n    const val = parseFloat(stakeAmountStr)\n    return isNaN(val) || val < 0 ? 0 : val\n  }, [stakeAmountStr])\n\n  const baseVaultApy = 7.42\n  const effectiveApy = React.useMemo(() => {\n    const total = baseVaultApy + currentLockup.boost + currentToken.apyBoost\n    return total.toFixed(2)\n  }, [currentLockup.boost, currentToken.apyBoost])\n\n  const stakedFiatValue = React.useMemo(() => {\n    return (parsedAmount * currentToken.price).toLocaleString('en-US', {\n      minimumFractionDigits: 2,\n      maximumFractionDigits: 2,\n    })\n  }, [parsedAmount, currentToken.price])\n\n  const annualYieldEth = React.useMemo(() => {\n    const rate = parseFloat(effectiveApy) / 100\n    return (parsedAmount * rate).toFixed(3)\n  }, [effectiveApy, parsedAmount])\n\n  const annualYieldUsd = React.useMemo(() => {\n    const rate = parseFloat(effectiveApy) / 100\n    const usd = parsedAmount * rate * currentToken.price\n    return usd.toLocaleString('en-US', {\n      minimumFractionDigits: 2,\n      maximumFractionDigits: 2,\n    })\n  }, [effectiveApy, parsedAmount, currentToken.price])\n\n  const monthlyYieldUsd = React.useMemo(() => {\n    const rate = parseFloat(effectiveApy) / 100\n    const usd = (parsedAmount * rate * currentToken.price) / 12\n    return usd.toLocaleString('en-US', {\n      minimumFractionDigits: 2,\n      maximumFractionDigits: 2,\n    })\n  }, [effectiveApy, parsedAmount, currentToken.price])\n\n  const monthlyYieldEth = React.useMemo(() => {\n    const rate = parseFloat(effectiveApy) / 100\n    return ((parsedAmount * rate) / 12).toFixed(4)\n  }, [effectiveApy, parsedAmount])\n\n  const dailyYieldUsd = React.useMemo(() => {\n    const rate = parseFloat(effectiveApy) / 100\n    const usd = (parsedAmount * rate * currentToken.price) / 365\n    return usd.toLocaleString('en-US', {\n      minimumFractionDigits: 2,\n      maximumFractionDigits: 2,\n    })\n  }, [effectiveApy, parsedAmount, currentToken.price])\n\n  const dailyYieldEth = React.useMemo(() => {\n    const rate = parseFloat(effectiveApy) / 100\n    return ((parsedAmount * rate) / 365).toFixed(5)\n  }, [effectiveApy, parsedAmount])\n\n  const handleSliderChange = (vals: number[]) => {\n    if (vals && vals[0] !== undefined) {\n      setStakeAmountStr(vals[0].toFixed(2))\n    }\n  }\n\n  const setPercentageAmount = (pct: number) => {\n    const amt = currentToken.balance * (pct / 100)\n    setStakeAmountStr(amt.toFixed(2))\n  }\n\n  const setMaxAmount = () => {\n    setStakeAmountStr(currentToken.balance.toFixed(2))\n  }\n\n  const handleExecuteStake = () => {\n    if (parsedAmount <= 0 || isStaking) return\n    setIsStaking(true)\n    setTimeout(() => {\n      setIsStaking(false)\n      setStakeSuccess(true)\n      setTimeout(() => {\n        setStakeSuccess(false)\n      }, 3500)\n    }, 1400)\n  }\n\n  return (\n    <div\n      data-slot=\"defi-staking-yield-vault\"\n      className={cn('mx-auto w-full max-w-6xl space-y-6', className)}\n      {...props}\n    >\n      {/* Header Section */}\n      <header className=\"border-border/80 bg-card/60 rounded-xl border p-4 shadow-xs backdrop-blur-xs sm:p-6\">\n        <div className=\"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n          {/* Title & Protocol Badges */}\n          <div className=\"space-y-2\">\n            <div className=\"flex flex-wrap items-center gap-2.5\">\n              <div\n                className=\"bg-primary/10 text-primary border-primary/20 flex size-9 shrink-0 items-center justify-center rounded-lg border shadow-xs\"\n                aria-hidden=\"true\"\n              >\n                <Zap className=\"size-5\" />\n              </div>\n              <div>\n                <div className=\"flex flex-wrap items-center gap-2\">\n                  <h1 className=\"text-foreground text-xl font-bold tracking-tight sm:text-2xl\">\n                    ETH Liquid Staking & Yield Vault v3\n                  </h1>\n                  <Badge variant=\"outline\" className=\"border-border/80 font-mono text-xs font-normal\">\n                    v3.2 Protocol\n                  </Badge>\n                </div>\n              </div>\n            </div>\n\n            <div className=\"flex flex-wrap items-center gap-2.5 text-xs\">\n              {/* Audit Badge */}\n              <Badge variant=\"outline\" className=\"border-success/30 bg-success/10 text-success gap-1.5 font-normal\">\n                <ShieldCheck className=\"size-3.5\" aria-hidden=\"true\" />\n                Audited by Trail of Bits & OpenZeppelin\n              </Badge>\n\n              {/* TVL Badge */}\n              <Badge variant=\"secondary\" className=\"gap-1.5 font-medium tabular-nums\">\n                <span className=\"bg-success size-1.5 animate-pulse rounded-full\" aria-hidden=\"true\" />\n                $142,850,000.00 TVL\n              </Badge>\n\n              <span className=\"text-muted-foreground hidden items-center gap-1 sm:inline-flex\">\n                <Zap className=\"text-warning size-3\" aria-hidden=\"true\" />\n                Auto-Compounding Enabled\n              </span>\n            </div>\n          </div>\n\n          {/* Wallet Connection Action */}\n          <div className=\"flex flex-wrap items-center gap-2.5\">\n            {isWalletConnected ? (\n              <>\n                <div className=\"border-border bg-muted/60 flex items-center gap-2 rounded-lg border px-3 py-1.5 shadow-xs\">\n                  <span className=\"bg-success size-2 rounded-full\" aria-hidden=\"true\" />\n                  <span className=\"text-foreground font-mono text-xs font-medium\">{shortAddress}</span>\n                  <Button\n                    variant=\"ghost\"\n                    size=\"icon-sm\"\n                    className=\"text-muted-foreground hover:text-foreground size-5\"\n                    aria-label=\"Copy wallet address\"\n                    onClick={copyAddress}\n                  >\n                    {copied ? (\n                      <Check className=\"text-success size-3\" aria-hidden=\"true\" />\n                    ) : (\n                      <Copy className=\"size-3\" aria-hidden=\"true\" />\n                    )}\n                  </Button>\n                </div>\n                <Button\n                  variant=\"outline\"\n                  size=\"sm\"\n                  className=\"shadow-xs active:scale-[0.98]\"\n                  onClick={() => setIsWalletConnected(false)}\n                >\n                  Disconnect\n                </Button>\n              </>\n            ) : (\n              <Button\n                size=\"sm\"\n                className=\"gap-2 shadow-xs active:scale-[0.98]\"\n                onClick={() => setIsWalletConnected(true)}\n              >\n                <Wallet className=\"size-4\" aria-hidden=\"true\" />\n                Connect Web3 Wallet\n              </Button>\n            )}\n          </div>\n        </div>\n      </header>\n\n      {/* 4 Staking Performance KPI Cards */}\n      <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n        {/* Card 1: Net Staking APY */}\n        <Card className=\"border-border/80 shadow-xs\">\n          <CardHeader className=\"pb-2\">\n            <div className=\"flex items-center justify-between\">\n              <CardDescription className=\"text-muted-foreground text-xs font-semibold tracking-wider uppercase\">\n                Net Staking APY\n              </CardDescription>\n              <div\n                className=\"border-success/30 bg-success/10 text-success flex size-7 items-center justify-center rounded-md border\"\n                aria-hidden=\"true\"\n              >\n                <TrendingUp className=\"size-4\" />\n              </div>\n            </div>\n            <div className=\"mt-1 flex items-baseline gap-2\">\n              <span className=\"text-success text-success text-2xl font-bold tracking-tight tabular-nums sm:text-3xl\">\n                7.42% APY\n              </span>\n            </div>\n          </CardHeader>\n          <CardContent className=\"text-muted-foreground space-y-1 text-xs\">\n            <div className=\"text-success flex items-center gap-1.5 font-medium\">\n              <span className=\"bg-success size-1.5 rounded-full\" aria-hidden=\"true\" />\n              Auto-Compounding daily\n            </div>\n            <p className=\"text-muted-foreground tabular-nums\">Base 4.92% + 2.50% MEV Boost</p>\n          </CardContent>\n        </Card>\n\n        {/* Card 2: Your Staked Balance */}\n        <Card className=\"border-border/80 shadow-xs\">\n          <CardHeader className=\"pb-2\">\n            <div className=\"flex items-center justify-between\">\n              <CardDescription className=\"text-muted-foreground text-xs font-semibold tracking-wider uppercase\">\n                Your Staked Balance\n              </CardDescription>\n              <div\n                className=\"border-primary/30 bg-primary/10 text-primary flex size-7 items-center justify-center rounded-md border\"\n                aria-hidden=\"true\"\n              >\n                <Coins className=\"size-4\" />\n              </div>\n            </div>\n            <div className=\"mt-1 flex items-baseline gap-2\">\n              <span className=\"text-foreground text-2xl font-bold tracking-tight tabular-nums sm:text-3xl\">\n                24.50 ETH\n              </span>\n            </div>\n          </CardHeader>\n          <CardContent className=\"text-muted-foreground space-y-1 text-xs\">\n            <div className=\"text-muted-foreground font-medium tabular-nums\">≈ $84,525.00 USD</div>\n            <div className=\"flex items-center gap-1\">\n              <Badge variant=\"outline\" className=\"border-border/80 px-1.5 py-0 text-xs font-normal\">\n                Active in Vault v3\n              </Badge>\n            </div>\n          </CardContent>\n        </Card>\n\n        {/* Card 3: Unclaimed Rewards */}\n        <Card className=\"border-border/80 shadow-xs\">\n          <CardHeader className=\"pb-2\">\n            <div className=\"flex items-center justify-between\">\n              <CardDescription className=\"text-muted-foreground text-xs font-semibold tracking-wider uppercase\">\n                Unclaimed Rewards\n              </CardDescription>\n              <div\n                className=\"border-warning/30 bg-warning/10 text-warning flex size-7 items-center justify-center rounded-md border\"\n                aria-hidden=\"true\"\n              >\n                <Coins className=\"size-4\" />\n              </div>\n            </div>\n            <div className=\"mt-1 flex items-baseline gap-2\">\n              <span className=\"text-foreground text-2xl font-bold tracking-tight tabular-nums sm:text-3xl\">\n                {unclaimedEth} stETH\n              </span>\n            </div>\n          </CardHeader>\n          <CardContent className=\"space-y-2.5 text-xs\">\n            <div className=\"text-muted-foreground font-medium tabular-nums\">≈ ${unclaimedUsd} USD</div>\n            <Button\n              variant=\"outline\"\n              size=\"sm\"\n              className=\"h-7 w-full gap-1.5 text-xs font-medium shadow-xs\"\n              disabled={unclaimedEth <= 0 || isClaiming}\n              onClick={handleClaimRewards}\n            >\n              {isClaiming ? (\n                <RefreshCw className=\"size-3 animate-spin\" aria-hidden=\"true\" />\n              ) : claimSuccess ? (\n                <Check className=\"text-success size-3\" aria-hidden=\"true\" />\n              ) : null}\n              {isClaiming ? 'Claiming On-Chain...' : claimSuccess ? 'Rewards Claimed!' : 'Claim Rewards'}\n            </Button>\n          </CardContent>\n        </Card>\n\n        {/* Card 4: Staking Pool Share */}\n        <Card className=\"border-border/80 shadow-xs\">\n          <CardHeader className=\"pb-2\">\n            <div className=\"flex items-center justify-between\">\n              <CardDescription className=\"text-muted-foreground text-xs font-semibold tracking-wider uppercase\">\n                Staking Pool Share\n              </CardDescription>\n              <div\n                className=\"border-chart-1/30 bg-chart-1/10 text-chart-1 flex size-7 items-center justify-center rounded-md border\"\n                aria-hidden=\"true\"\n              >\n                <Percent className=\"size-4\" />\n              </div>\n            </div>\n            <div className=\"mt-1 flex items-baseline gap-2\">\n              <span className=\"text-foreground text-2xl font-bold tracking-tight tabular-nums sm:text-3xl\">0.017%</span>\n            </div>\n          </CardHeader>\n          <CardContent className=\"text-muted-foreground space-y-2 text-xs\">\n            <div className=\"flex items-center justify-between\">\n              <span>of total vault</span>\n              <span className=\"text-foreground font-medium tabular-nums\">$142.85M TVL</span>\n            </div>\n            <div className=\"bg-muted/80 h-1.5 w-full overflow-hidden rounded-full\">\n              <div className=\"bg-primary h-full w-[17%] rounded-full\" />\n            </div>\n          </CardContent>\n        </Card>\n      </div>\n\n      {/* 2-Column Staking Simulator & Yield Directory */}\n      <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-12\">\n        {/* Left Column: Deposit & Stake Calculator (7 Cols) */}\n        <div className=\"space-y-6 lg:col-span-7\">\n          <Card className=\"border-border/80 shadow-xs\">\n            <CardHeader className=\"pb-4\">\n              <div className=\"flex items-center justify-between\">\n                <div className=\"space-y-1\">\n                  <CardTitle className=\"text-foreground flex items-center gap-2 text-base font-semibold sm:text-lg\">\n                    <Zap className=\"text-primary size-5\" aria-hidden=\"true\" />\n                    Deposit & Stake Calculator\n                  </CardTitle>\n                  <CardDescription className=\"text-muted-foreground text-xs\">\n                    Simulate staking yields with custom lockup multipliers and real-time auto-compounding.\n                  </CardDescription>\n                </div>\n                <Badge variant=\"outline\" className=\"border-success/30 bg-success/10 text-success text-xs font-semibold\">\n                  {effectiveApy}% APY\n                </Badge>\n              </div>\n            </CardHeader>\n\n            <CardContent className=\"space-y-5\">\n              {/* Token Selector Tabs */}\n              <div className=\"space-y-2\">\n                <div className=\"text-muted-foreground flex items-center justify-between text-xs\">\n                  <label className=\"text-foreground font-medium\">Select Staking Asset</label>\n                  <span className=\"tabular-nums\">\n                    Available: {currentToken.balance} {currentToken.symbol}\n                  </span>\n                </div>\n\n                <div className=\"grid grid-cols-3 gap-2\">\n                  {tokenOptions.map((token) => {\n                    const isSelected = selectedTokenSymbol === token.symbol\n                    return (\n                      <button\n                        key={token.symbol}\n                        type=\"button\"\n                        className={cn(\n                          'border-border/80 focus-visible:ring-ring flex flex-col items-start gap-1 rounded-lg border p-3 text-left transition-[colors,transform] duration-150 focus-visible:ring-2 focus-visible:outline-none active:scale-[0.98]',\n                          isSelected\n                            ? 'border-primary bg-primary/5 ring-primary/20 shadow-xs ring-1'\n                            : 'bg-card hover:bg-muted/50 text-muted-foreground',\n                        )}\n                        onClick={() => setSelectedTokenSymbol(token.symbol)}\n                      >\n                        <div className=\"flex w-full items-center justify-between\">\n                          <div className=\"flex items-center gap-2\">\n                            {token.symbol === 'ETH' && (\n                              <svg\n                                viewBox=\"0 0 32 32\"\n                                className=\"size-5 shrink-0 rounded-full shadow-xs\"\n                                aria-hidden=\"true\"\n                              >\n                                <circle cx=\"16\" cy=\"16\" r=\"16\" fill=\"#627EEA\" />\n                                <path fill=\"#ffffff\" fillOpacity=\"0.6\" d=\"M16.5 4v8.87l7.5 3.35z\" />\n                                <path fill=\"#ffffff\" d=\"M16.5 4L9 16.22l7.5-3.35z\" />\n                                <path fill=\"#ffffff\" fillOpacity=\"0.6\" d=\"M16.5 21.97v6.03L24 17.62z\" />\n                                <path fill=\"#ffffff\" d=\"M16.5 28v-6.03L9 17.62z\" />\n                                <path fill=\"#ffffff\" fillOpacity=\"0.2\" d=\"M16.5 20.57l7.5-4.35-7.5-3.35z\" />\n                                <path fill=\"#ffffff\" fillOpacity=\"0.6\" d=\"M9 16.22l7.5 4.35v-7.7z\" />\n                              </svg>\n                            )}\n                            {token.symbol === 'stETH' && (\n                              <svg\n                                viewBox=\"0 0 32 32\"\n                                className=\"size-5 shrink-0 rounded-full shadow-xs\"\n                                aria-hidden=\"true\"\n                              >\n                                <circle cx=\"16\" cy=\"16\" r=\"16\" fill=\"#00A3FF\" />\n                                <path fill=\"#ffffff\" fillOpacity=\"0.8\" d=\"M16 4.5l-6.5 10.8 6.5 3.9 6.5-3.9z\" />\n                                <path fill=\"#ffffff\" d=\"M16 19.2l-6.5-3.9L16 27.5l6.5-12.2z\" />\n                                <circle cx=\"16\" cy=\"16\" r=\"3.5\" fill=\"#ffffff\" fillOpacity=\"0.3\" />\n                              </svg>\n                            )}\n                            {token.symbol === 'wstETH' && (\n                              <svg\n                                viewBox=\"0 0 32 32\"\n                                className=\"size-5 shrink-0 rounded-full shadow-xs\"\n                                aria-hidden=\"true\"\n                              >\n                                <circle cx=\"16\" cy=\"16\" r=\"16\" fill=\"#0052FF\" />\n                                <path fill=\"#ffffff\" d=\"M16 5.5l-5.8 9.5 5.8 3.5 5.8-3.5z\" />\n                                <path fill=\"#ffffff\" fillOpacity=\"0.6\" d=\"M16 18.5l-5.8-3.5 5.8 11 5.8-11z\" />\n                                <circle\n                                  cx=\"16\"\n                                  cy=\"16\"\n                                  r=\"13.5\"\n                                  stroke=\"#F5AC37\"\n                                  strokeWidth=\"2\"\n                                  fill=\"none\"\n                                  strokeDasharray=\"3 2\"\n                                />\n                              </svg>\n                            )}\n                            <span className=\"text-foreground text-xs font-semibold\">{token.symbol}</span>\n                          </div>\n                          {isSelected && (\n                            <span className=\"text-primary size-3.5\" aria-hidden=\"true\">\n                              <Check className=\"size-3.5\" />\n                            </span>\n                          )}\n                        </div>\n                        <span className=\"text-muted-foreground text-xs tabular-nums\">{token.balance} avail.</span>\n                      </button>\n                    )\n                  })}\n                </div>\n              </div>\n\n              {/* Amount Input & Quick Percentages */}\n              <div className=\"bg-muted/40 border-border/80 space-y-3 rounded-lg border p-4\">\n                <div className=\"text-muted-foreground flex items-center justify-between text-xs\">\n                  <label htmlFor=\"stake-amount-input-react\" className=\"text-foreground font-medium\">\n                    Deposit Amount\n                  </label>\n                  <div className=\"flex items-center gap-1.5\">\n                    <span className=\"tabular-nums\">\n                      Wallet: {currentToken.balance} {currentToken.symbol}\n                    </span>\n                    <button\n                      type=\"button\"\n                      className=\"text-primary hover:text-primary/80 inline-flex min-h-6 items-center px-1 font-semibold uppercase transition-colors focus-visible:outline-none\"\n                      onClick={setMaxAmount}\n                    >\n                      MAX\n                    </button>\n                  </div>\n                </div>\n\n                {/* Input Row */}\n                <div className=\"flex items-center justify-between gap-3\">\n                  <Input\n                    id=\"stake-amount-input-react\"\n                    value={stakeAmountStr}\n                    onChange={(e) => setStakeAmountStr(e.target.value)}\n                    type=\"number\"\n                    step=\"any\"\n                    min=\"0\"\n                    className=\"h-9 border-none bg-transparent px-0 text-xl font-bold tracking-tight tabular-nums shadow-none focus-visible:ring-0\"\n                    placeholder=\"0.0\"\n                  />\n\n                  <div className=\"border-border bg-background flex shrink-0 items-center gap-1.5 rounded-md border px-2.5 py-1 text-xs font-semibold shadow-xs\">\n                    <span>{currentToken.symbol}</span>\n                  </div>\n                </div>\n\n                {/* USD Approximation & Presets */}\n                <div className=\"flex flex-wrap items-center justify-between gap-2 pt-1 text-xs\">\n                  <span className=\"text-muted-foreground tabular-nums\">≈ ${stakedFiatValue} USD</span>\n                  <div className=\"flex items-center gap-1\">\n                    {[25, 50, 75, 100].map((pct) => (\n                      <button\n                        key={pct}\n                        type=\"button\"\n                        className=\"border-border bg-background hover:bg-muted text-muted-foreground hover:text-foreground min-h-6 rounded border px-2 py-0.5 font-mono text-xs transition-[colors,transform] duration-150 focus-visible:ring-1 focus-visible:outline-none active:scale-95\"\n                        onClick={() => setPercentageAmount(pct)}\n                      >\n                        {pct === 100 ? 'MAX' : `${pct}%`}\n                      </button>\n                    ))}\n                  </div>\n                </div>\n\n                {/* Interactive Slider */}\n                <div className=\"pt-2\">\n                  <Slider\n                    value={[Math.min(parsedAmount, currentToken.balance)]}\n                    onValueChange={handleSliderChange}\n                    min={0}\n                    max={currentToken.balance}\n                    step={0.1}\n                    className=\"w-full\"\n                  />\n                </div>\n              </div>\n\n              {/* Lockup Duration Selector */}\n              <div className=\"space-y-2\">\n                <div className=\"text-muted-foreground flex items-center justify-between text-xs\">\n                  <span className=\"text-foreground font-medium\">Lockup Duration & Boost</span>\n                  <span className=\"text-muted-foreground\">Longer lockups multiply daily yields</span>\n                </div>\n\n                <div className=\"grid grid-cols-2 gap-2 sm:grid-cols-4\">\n                  {lockupOptions.map((opt) => {\n                    const isSelected = selectedLockupId === opt.id\n                    return (\n                      <button\n                        key={opt.id}\n                        type=\"button\"\n                        className={cn(\n                          'border-border/80 focus-visible:ring-ring flex flex-col items-center justify-center gap-1 rounded-lg border p-2.5 text-center transition-[colors,transform] duration-150 focus-visible:ring-2 focus-visible:outline-none active:scale-[0.98]',\n                          isSelected\n                            ? 'border-primary bg-primary/5 ring-primary/20 shadow-xs ring-1'\n                            : 'bg-card hover:bg-muted/50 text-muted-foreground',\n                        )}\n                        onClick={() => setSelectedLockupId(opt.id)}\n                      >\n                        <div className=\"flex items-center gap-1\">\n                          {opt.days === 0 ? (\n                            <Unlock className=\"text-muted-foreground size-3.5\" aria-hidden=\"true\" />\n                          ) : (\n                            <Lock className=\"text-primary size-3.5\" aria-hidden=\"true\" />\n                          )}\n                          <span className=\"text-foreground text-xs font-semibold\">{opt.label}</span>\n                        </div>\n                        <Badge\n                          variant=\"outline\"\n                          className={cn(\n                            'border-border/60 font-mono text-xs font-normal tabular-nums',\n                            opt.boost > 0 ? 'border-success/30 text-success' : 'text-muted-foreground',\n                          )}\n                        >\n                          {opt.badge}\n                        </Badge>\n                      </button>\n                    )\n                  })}\n                </div>\n              </div>\n\n              {/* Estimated Returns Highlight Box */}\n              <div className=\"border-success/20 bg-success/5 space-y-3 rounded-lg border p-4\">\n                <div className=\"flex items-center justify-between\">\n                  <span className=\"text-foreground flex items-center gap-1.5 text-xs font-semibold\">\n                    <Flame className=\"text-success size-4\" aria-hidden=\"true\" />\n                    Estimated Annual Yield\n                  </span>\n                  <Badge\n                    variant=\"outline\"\n                    className=\"border-success/30 bg-success/10 text-success font-mono text-xs font-semibold\"\n                  >\n                    {effectiveApy}% APY\n                  </Badge>\n                </div>\n\n                {/* Main Yield Value */}\n                <div className=\"flex flex-wrap items-baseline gap-2\">\n                  <span className=\"text-success text-success text-xl font-bold tracking-tight tabular-nums sm:text-2xl\">\n                    +${annualYieldUsd} / year\n                  </span>\n                  <span className=\"text-muted-foreground font-mono text-xs tabular-nums\">\n                    ({annualYieldEth} {currentToken.symbol})\n                  </span>\n                </div>\n\n                <Separator className=\"bg-success/20\" />\n\n                {/* Yield Breakdown Grid */}\n                <div className=\"grid grid-cols-2 gap-3 text-xs sm:grid-cols-3\">\n                  <div className=\"space-y-0.5\">\n                    <div className=\"text-muted-foreground\">Daily Returns</div>\n                    <div className=\"text-foreground font-medium tabular-nums\">+${dailyYieldUsd}</div>\n                    <div className=\"text-muted-foreground font-mono text-xs tabular-nums\">\n                      {dailyYieldEth} {currentToken.symbol}\n                    </div>\n                  </div>\n                  <div className=\"space-y-0.5\">\n                    <div className=\"text-muted-foreground\">Monthly Returns</div>\n                    <div className=\"text-foreground font-medium tabular-nums\">+${monthlyYieldUsd}</div>\n                    <div className=\"text-muted-foreground font-mono text-xs tabular-nums\">\n                      {monthlyYieldEth} {currentToken.symbol}\n                    </div>\n                  </div>\n                  <div className=\"col-span-2 space-y-0.5 sm:col-span-1\">\n                    <div className=\"text-muted-foreground\">Network Gas & Fee</div>\n                    <div className=\"text-foreground flex items-center gap-1 font-medium tabular-nums\">\n                      <Fuel className=\"text-muted-foreground size-3\" aria-hidden=\"true\" />\n                      ~$2.85 (0% fee)\n                    </div>\n                    <div className=\"text-success text-xs\">No exit penalty</div>\n                  </div>\n                </div>\n              </div>\n\n              {/* Primary Stake CTA Button */}\n              <Button\n                size=\"lg\"\n                className=\"w-full gap-2 font-semibold shadow-xs active:scale-[0.98]\"\n                disabled={parsedAmount <= 0 || isStaking}\n                onClick={handleExecuteStake}\n              >\n                {isStaking ? (\n                  <RefreshCw className=\"size-4 animate-spin\" aria-hidden=\"true\" />\n                ) : stakeSuccess ? (\n                  <Check className=\"text-success size-4\" aria-hidden=\"true\" />\n                ) : (\n                  <Zap className=\"size-4\" aria-hidden=\"true\" />\n                )}\n                {isStaking\n                  ? 'Submitting Staking Transaction...'\n                  : stakeSuccess\n                    ? `Successfully Staked ${parsedAmount} ${currentToken.symbol}!`\n                    : `Stake ${parsedAmount > 0 ? `${parsedAmount} ${currentToken.symbol}` : 'ETH'} Now`}\n              </Button>\n\n              <div className=\"text-muted-foreground flex items-center justify-center gap-2 text-center text-xs\">\n                <ShieldCheck className=\"text-success size-3.5\" aria-hidden=\"true\" />\n                <span>Smart contracts verified on Etherscan · 100% non-custodial</span>\n              </div>\n            </CardContent>\n          </Card>\n        </div>\n\n        {/* Right Column: Yield Vaults Directory (5 Cols) */}\n        <div className=\"space-y-6 lg:col-span-5\">\n          <Card className=\"border-border/80 shadow-xs\">\n            <CardHeader className=\"pb-3\">\n              <div className=\"flex items-center justify-between\">\n                <div>\n                  <CardTitle className=\"text-foreground text-base font-semibold\">Yield Vaults Directory</CardTitle>\n                  <CardDescription className=\"text-muted-foreground text-xs\">\n                    Active liquidity pools and automated yield strategies.\n                  </CardDescription>\n                </div>\n                <Badge variant=\"secondary\" className=\"text-xs font-normal tabular-nums\">\n                  3 Vaults Active\n                </Badge>\n              </div>\n            </CardHeader>\n\n            <CardContent className=\"space-y-3.5\">\n              {yieldVaults.map((vault) => (\n                <div\n                  key={vault.id}\n                  className={cn(\n                    'border-border/80 relative space-y-3 rounded-lg border p-3.5 transition-colors',\n                    vault.isCurrentVault\n                      ? 'bg-primary/5 border-primary/40 ring-primary/20 ring-1'\n                      : 'bg-card hover:bg-muted/30',\n                  )}\n                >\n                  {/* Vault Header Row */}\n                  <div className=\"flex items-start justify-between gap-2\">\n                    <div className=\"space-y-1\">\n                      <div className=\"flex items-center gap-2\">\n                        <span className=\"text-foreground text-sm font-semibold\">{vault.name}</span>\n                        {vault.isCurrentVault && (\n                          <Badge\n                            variant=\"outline\"\n                            className=\"border-primary/40 bg-primary/10 text-primary px-1.5 py-0 text-xs font-medium\"\n                          >\n                            Current\n                          </Badge>\n                        )}\n                      </div>\n                      <p className=\"text-muted-foreground text-xs\">{vault.protocol}</p>\n                    </div>\n\n                    <div className=\"text-right\">\n                      <div className=\"text-success text-success text-base font-bold tabular-nums sm:text-lg\">\n                        {vault.apy} APY\n                      </div>\n                      <div className=\"text-muted-foreground font-mono text-xs tabular-nums\">{vault.tvl}</div>\n                    </div>\n                  </div>\n\n                  {/* Vault Meta Details */}\n                  <div className=\"border-border/60 bg-muted/30 flex flex-wrap items-center justify-between gap-2 rounded-md border p-2 text-xs\">\n                    <div className=\"flex items-center gap-1.5\">\n                      <Badge\n                        variant=\"outline\"\n                        className={cn(\n                          'px-1.5 py-0 text-xs font-normal',\n                          vault.riskVariant === 'emerald'\n                            ? 'border-success/30 bg-success/10 text-success'\n                            : 'border-warning/30 bg-warning/10 text-warning',\n                        )}\n                      >\n                        {vault.risk}\n                      </Badge>\n                      <span className=\"text-muted-foreground max-w-[140px] truncate sm:max-w-none\">\n                        {vault.strategy}\n                      </span>\n                    </div>\n                    <div className=\"text-muted-foreground font-medium tabular-nums\">{vault.metricValue}</div>\n                  </div>\n\n                  {/* Vault Actions */}\n                  <div className=\"flex items-center justify-between pt-1\">\n                    <span className=\"text-muted-foreground font-mono text-xs\">{vault.pairSymbol}</span>\n                    <Button\n                      variant={vault.isCurrentVault ? 'default' : 'outline'}\n                      size=\"sm\"\n                      className=\"h-7 px-3 text-xs shadow-xs\"\n                    >\n                      <span>{vault.isCurrentVault ? 'Manage Vault' : 'Deposit Pool'}</span>\n                      <ArrowUpRight className=\"ml-1 size-3\" aria-hidden=\"true\" />\n                    </Button>\n                  </div>\n                </div>\n              ))}\n            </CardContent>\n\n            <CardFooter className=\"border-border/60 bg-muted/20 flex flex-col gap-2 rounded-b-xl border-t p-3.5 text-xs\">\n              <div className=\"text-muted-foreground flex items-center gap-2\">\n                <ShieldAlert className=\"text-warning size-4 shrink-0\" aria-hidden=\"true\" />\n                <span>Yields adjust dynamically with Ethereum validator queue and DEX trading fee volumes.</span>\n              </div>\n            </CardFooter>\n          </Card>\n        </div>\n      </div>\n    </div>\n  )\n}\n\nexport default DefiStakingYieldVault\n",
      "type": "registry:block",
      "target": "~/components/blocks/DefiStakingYieldVault.tsx"
    }
  ],
  "dependencies": [
    "lucide-react"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/react/badge.json",
    "https://uipkge.dev/r/react/button.json",
    "https://uipkge.dev/r/react/card.json",
    "https://uipkge.dev/r/react/input.json",
    "https://uipkge.dev/r/react/separator.json",
    "https://uipkge.dev/r/react/slider.json"
  ],
  "description": "Nodeka and Uniswap-inspired decentralized finance staking yield vault, liquidity pool APY calculator, and reward claimer with live TVL metrics, multi-tier lockup multipliers, and real-time yield simulator.",
  "categories": [
    "finance",
    "app",
    "dashboard"
  ]
}