The app · Robinhood Chain

Vaults

Deposit a coin that pays its holders and hold its share. Every harvest sells the payout for more of the same coin, so the share rate only goes up. Redeem the same coin at the current rate.

Launch statusReading config/addresses.json…

Vaults
—
Releasing now
—
Last harvest
—

Reading the vault list…

Every row is read from its own contract by your browser: exchangeRateRay() · totalAssets() · feeBps() · lastHarvest(). While a harvest is releasing, the rate's last digits move: the contract releases it in a straight line over 6 hours, so the rate between two reads is known. The row is read again every 30 seconds.

Selected vault

Vault #1 · not created yet

No vault exists yet, so there is nothing to read. Every field below says which contract function fills it once one does.

not read
— nothing vesting
Illustration the arc is read
Release of the last harvest no harvest yet
harvest released in a straight line fully released

A harvest does not move the rate at the instant it lands. Its gain is locked and released in a straight line over the vesting window: 6 hours by default, 10 minutes to 7 days, and a lock already running keeps its own end date.

Share rate
—exchangeRateRay() ÷ 1e27
Principal
—totalAssets() · what the shares claim
Held
—rawAssets() · vested or not
Locked, releasing
—lockedProfitRemaining()
Fee on each payout
—feeBps() · 10% default · cap 30%
Last harvest
—lastHarvest()
Harvest throttle
—harvestInterval() · 2 min default
Vesting window
—vestingPeriod() · for the next harvest
Price floor
—twapWindow() · maxSlippageBps()
Pauses
  • Deposits —
  • Harvests —
  • Redeem —
Keys, read from the vault
  • admin—
  • guardian—
  • treasury—
  • keeper—
exchangeRateRay() ÷ 1e27 · vault #1 reading the chain…
1.000000000

coin per share · 9 decimals · never lower than the last reading

Opens at
1.000000000exactly 1e27, before any deposit
Falls
neverno vault function lowers it · invariant #3
Rises
as a harvest vestsor when coin is sent straight to the vault
One harvest on this chartIllustration not to scale
  • At the instant of a harvest the balance and the lock rise together, so the rate does not move.
  • Over the vesting window the lock falls to zero in a straight line and the rate climbs with it.
  • Deposits and redemptions change how much coin the vault holds, never the rate.
exchangeRateRay() = 1000 × 1e27 × (totalAssets() + 1) ÷ (totalSupply() + 1000) starts at exactly 1e27 · totalAssets() excludes the part still vesting
Harvest ledger

Every harvest, as the vault logged it.

Harvest(keeper, rewardHarvested, feeTaken, rewardSwapped, assetsGained, rateRayAfter)topic0 0xeaedd126…9bb3fa3d · read with eth_getLogs from the vault's deploy block

Harvest events of the selected vault, newest first
WhenPayout harvestedFeeSoldCoin gainedRate afterTransaction

No harvest yet: there is no vault to harvest. Each row will be one Harvest event read from the chain, with its block time and a link to the transaction.

reading the chain…

Robinhood Chain · read from your browser

L2 block

—

eth_blockNumber blocks/s: measuring
WETH in USDG

—

0.01% pool · slot0() · this visit · 0 reads
Gas price

—gwei

eth_gasPrice · paid in ETH
Chain id

—

eth_chainId
STASH factory

—

reading config…

How to use one

Four steps, each one checked before your wallet is asked.

The panel above does all of this for you. It is written out here so you know exactly what your wallet will be asked to sign, and why each number is there. Nothing is sent that the panel has not simulated first.

  1. 01you

    Connect, on chain 4663

    The panel finds wallets over EIP-6963 and asks yours to switch to Robinhood Chain. A wallet that does not know the chain is asked to add it, with the id, RPC and name from the site's config. Gas is paid in ETH.

    A read on the wrong network is refused: the panel shows which chain your wallet is on and a button to switch back.

    wallet_switchEthereumChain(chainId 0x1237)on error 4902: wallet_addEthereumChain from config
  2. 02you sign

    Approve exactly the amount

    The vault may pull only what you are depositing, never more. A coin that refuses to change one non-zero approval into another gets a reset to zero first, as its own step.

    approve(address vault, uint256 amount)selector 0x095ea7b3 · on the coin
  3. 03you sign

    Deposit, with a minimum

    The panel reads the vault's own preview, takes your slippage limit off it and sends that as minSharesOut. If fewer shares would arrive, the deposit reverts and nothing moves.

    deposit(uint256 assets, address receiver, uint256 minSharesOut)selector 0xbc157ac1
  4. 04you sign

    Redeem the same coin

    Burn shares, get the coin back at the current rate, with a minimum the same way. No exit fee, no queue. The admin can pause redemption for at most 72 hours, then cannot pause it again for 72 hours; the guardian can never pause it.

    redeem(uint256 shares, address receiver, address owner, uint256 minAssetsOut)selector 0x9f40a7b3
Deposit, in order
  1. chain id
  2. balance
  3. maxDeposit · 0 = paused
  4. allowance
  5. approve, exact
  6. previewDeposit
  7. minSharesOut
  8. eth_call dry run
  9. deposit
  10. status 1 + Deposit event
Redeem, in order
  1. chain id
  2. maxRedeem · 0 = paused, until when
  3. previewRedeem
  4. minAssetsOut
  5. eth_call dry run
  6. redeem
  7. status 1 + Withdraw event

Any step that fails stops the flow with one sentence, and nothing after it is sent. A receipt with status 0 is a failure; a missing receipt is "unknown", never success.

Why there is no mint() and no withdraw()

With a coin that charges a transfer tax, the amount that arrives is only known after the transfer, so a call that promises an exact amount out would be a lie. deposit and redeem, each with a minimum you set, are the honest pair. Shares carry 3 more decimals than the coin, and a coin with fewer than 4 decimals cannot get a vault. Docs lists every departure from ERC-4626.

One unit, written out · a 6-decimal coin
coin1.0000006 decimals
share1.000000000coin + 3
refused1.000fewer than 4: no vault

The 3 extra share decimals and 1,000 virtual shares make the first-depositor trick expensive. What protects you is your own minSharesOut, and a seed deposit in every vault before it opens.

When the vault says no

Every error the contracts can raise is decoded into one sentence. These are the ones a deposit or a redeem can meet; the text is what the panel prints.

ErrorSelectorWhat the panel says
Reading the panel's decoder…

Harvest liquidity

Where a harvest sells, and the floor it has to clear.

A harvest is one Uniswap v3 swap at one fee tier, fixed when the vault is created and never changed. The swap must clear the pool's own 30-minute average price, minus the pool fee, minus 1%, or the whole harvest reverts. The keeper can make that floor stricter, never looser.

WETH / USDG pools · WETH on each sidereading config…

Deeper pools move less for the same sale. The tier is chosen once, when the vault is created; the factory refuses a pair and tier with no pool.

The floor under attackfork test · 22 Sep 2026

USDG for 0.9 WETH on the live 0.01% pool. The dump pushed the spot quote below the floor; the floor, read from the 30-minute average, did not move, and harvest(1) reverted with the reward still in the vault.

fork test against live state, 22 Sep 2026

The pools, as measured—

Reading the pool list…

Before you deposit

What this vault cannot protect you from.

The one way redemption can stop

Only the admin can pause redemption. Lifting a pause early does not shorten the cooldown. The guardian can pause deposits and harvests, never redemption.

  • The coin can fall to zero. The share rate counts coin, not dollars. More of a coin that is worth less is still worth less.
  • The coin's own contract still rules. A coin that can freeze, seize or rebase balances can do that to the vault's balance too.
  • The keeper picks the moment. Within the price tolerance, about 1% plus the pool fee by default, it can sell a harvest at the edge of the floor. That costs part of the harvest, never principal.
  • The admin has limited levers. It can raise the fee up to 30%, set the vesting window from 10 minutes to 7 days, reassign the guardian, treasury and keeper, and pause redemption within the limit above.
  • No external audit yet. The review so far is internal: two adversarial passes and the test suite.