Staked ETH that still behaves like a plain token

Deposit ETH, receive kETH, and let the redemption rate do the work. No lockups, no rebasing balance, nothing to claim — the token simply becomes worth more ETH.

01

The thesis

kETH is one idea held to strictly: the token is worth the vault's ETH divided by the supply. Deposits and redemptions move both sides of that fraction at once, so they can't shift the rate. Only real yield paid into the vault can.

What Zeiko does not do

  • No fixed APY, and no promised return.
  • No rebasing — your balance never changes on its own.
  • No price oracle and no synthetic exposure.
  • No admin function that can write the rate directly.

The number on screen is arithmetic over two on-chain values, not a figure the protocol chooses.

What Zeiko does

  • Deposit ETH, mint kETH at the current rate.
  • kETH stays a transferable, composable ERC-20.
  • Burn kETH to take back its current ETH value, any time.
  • Every input to the rate is readable from the contract.

Backing can be checked in one call: compare the vault's ETH balance against total supply.

02

The mechanic

Four calls describe the whole lifecycle. ETH goes in, an ordinary ERC-20 comes out, and the same token goes back through the contract to leave.

  1. 1

    Deposit

    deposit() payable

    Send ETH to the vault. It mints kETH at whatever the rate is in that block.

  2. 2

    Hold

    transfer(to, amount)

    kETH behaves like any other token. Send it, pool it, post it as collateral.

  3. 3

    Redeem

    redeem(shares)

    Burn kETH and the vault returns its current ETH value to your wallet.

  4. 4

    Verify

    totalAssets / totalSupply

    Two public reads reproduce the rate exactly. No indexer required.

Fixed supply rule

kETH only exists because ETH was deposited for it.

Constant balance

Your token count holds still; the value per token rises.

Exact backing

Vault ETH and kETH supply always move together.

No mint fee

Depositing costs gas and nothing else.

No admin mint

There is no path to new kETH except a deposit.

Open exit

Redemption is permissionless and always fully covered.

03

Mint kETH

Deposit ETH and receive kETH at the live rate. As yield is funded into the vault, every kETH becomes redeemable for more ETH. Redeem at the live rate whenever you like.

You pay Balance: 0.0000
ETH
You receive
0.0 kETH

Connect a wallet to preview your position.

Exchange rate

1.0000 ETH per kETH

Your kETH value

Target yield

0% APY · variable

Backing

0% ETH

Vault ETH

0 ETH

KovaVault.sol · rate = totalAssets / totalSupply
// The seed is minted to DEAD at construction. That fixes the opening
// rate at exactly 1.0000 and puts a floor under totalSupply, which is
// what makes the first-depositor inflation attack impossible.
constructor() payable {
    require(msg.value >= MIN_SEED, "seed below minimum");
    totalAssets = msg.value;
    _mint(DEAD, msg.value);   // 1:1 — sets the opening rate
}

// The rate is read out of two balances. Nothing writes it directly.
function convertToAssets(uint256 shares) public view returns (uint256) {
    return (shares * totalAssets) / totalSupply;
}

// Deposit ETH, mint kETH at the current rate. Quoted against
// pre-deposit balances, so you never mint against your own ETH.
function deposit() external payable returns (uint256 shares) {
    shares = convertToShares(msg.value);
    totalAssets += msg.value;
    _mint(msg.sender, shares);             // holders are not diluted
}

// Exit anytime: burn kETH for its current ETH value. Effects land
// before the transfer, and the whole call is nonReentrant.
function redeem(uint256 shares) external nonReentrant returns (uint256 assets) {
    require(balanceOf[msg.sender] >= shares, "insufficient balance");
    assets = convertToAssets(shares);
    _burn(msg.sender, shares);
    totalAssets -= assets;
    (bool ok, ) = msg.sender.call{value: assets}("");
    require(ok, "ETH transfer failed");
}

// Permissionless yield top-up — mints NO shares, so the rate rises
// for everyone. There is no privileged setter, and no owner
// withdrawal: deposited ETH cannot leave except through redeem().
function addYield() external payable {
    totalAssets += msg.value;
}

Deposited ETH never leaves the contract — there is no owner withdrawal — so redemption is always fully covered. That also means the vault cannot earn on its own: the rate rises only when ETH is funded in through addYield(). The ~8% target is what the operator intends to fund; it is variable, and it is not a guarantee.

04

Where this stands

Deliberately small surface area, stated plainly. ETH enters, kETH is minted at the rate, kETH is redeemed at the rate.

  • Network MAINNET Robinhood Chain, chain ID 4663. Gas is paid in ETH.
  • Contract PREVIEW The vault is not deployed yet — this page runs in preview until it is.
  • Rate ACCRUING Vault ETH ÷ kETH supply. Starts at 1.0000 and only rises.
  • Target yield ~8% · VARIABLE From staking and lending. Variable, and not guaranteed.
  • Withdrawals ALWAYS OPEN Redeem to ETH at the live rate. Deposits never leave the contract, so redemption is always fully covered.
  • Audit PENDING Not yet audited. Use small amounts and read the code first.

05

Questions

The ones integrators actually ask.

What exactly is kETH?

A plain ERC-20 you receive for depositing ETH into the Zeiko vault. It starts at parity with ETH, and its redemption value rises as yield is paid into the vault.

Where does the yield come from?

Someone calls addYield() and sends ETH. That call mints no shares, so the whole amount lands in the rate for every holder at once. It is permissionless — anyone can fund it — and in practice the operator funds it from the returns on its own capital. Note what this rules out: the vault cannot touch deposited ETH, so it is not earning on your deposit itself. The rate only ever reflects ETH that actually arrived. The ~8% target is an intention, not a promise.

Why doesn't my balance grow?

Because kETH is not a rebasing token. Rebases break composability — pools, lending markets and accounting systems all have to special-case them. Zeiko keeps the balance fixed and moves the value instead, so kETH drops into anything that accepts an ERC-20.

Can I redeem at any time?

Yes. Burning kETH returns its current ETH value, with no lockup, no queue and no fee. Because deposits never leave the contract and there is no owner withdrawal, the ETH backing your kETH is always sitting there.

Can the rate go down?

Nothing in the contract lowers it: deposits and redemptions move assets and supply together, and addYield() only adds. The honest caveat is that this is unaudited code, and a bug is a risk the arithmetic cannot rule out.

How do I verify the backing myself?

Read totalAssets and totalSupply from the contract and divide. Compare that to the vault address's ETH balance on any explorer. The site shows the same numbers and nothing else.

Deposit ETH.
Hold an ordinary token.