How it works

Four calls, and nothing between you and them

STEP 01

Deploy your vault

You pick the asset, the virtual offset and the protocol cut. The app builds the creation code from data/cusp.json — the artifact emitted by the same compile that executed the properties — and your wallet signs an ordinary contract creation.

STEP 02

Approve

One approval to the vault address, which the app predicts before the vault exists. If that prediction were wrong the approval would authorise a stranger, so the verifier reverts rather than continuing when it does not match.

STEP 03

See the step, then deposit

The app reads step() and foldLoss() from your vault at the amount you typed and shows the interval before you sign. Every write is simulated from your own address first.

STEP 04

Redeem

Burn shares, take the asset. redeem pays exactly what previewRedeem quoted — property 5 — so what you were shown is what arrives.

The arithmetic

Two divisions, and the direction of each floor

Into shares

shares = assets × (totalSupply + 10^OFFSET)
         / (totalAssets + 1)

Floored, so the depositor absorbs the remainder. Rounded the other way, a deposit mints shares worth more than it paid and the wei comes out of everybody already in the vault.

Back into assets

assets = shares × (totalAssets + 1)
         / (totalSupply + 10^OFFSET)

Floored too, so the redeemer absorbs it. previewMint and previewWithdraw round the other way for the same reason: the vault is never the one that loses the wei.

Everything on the fold follows from those two lines and the fact that both are integers.

No key, no proxy, no backend

And why that is possible here

The node allows the browser

The public Robinhood Chain endpoint answers a browser preflight with access-control-allow-origin: *, so every read on this site is made by your own browser. Several sibling projects need a serverless proxy for exactly this reason; this one does not.

Writes are yours alone

Every state change is an eth_sendTransaction through the wallet you chose. No key material exists in this repository, so the worst this page can do is ask you for a signature you can read and refuse.

The proofs need no account

An eth_call may carry a state override. That is how 24 properties, 11 sabotages and 14 calldata checks all run against live chain state with no funded address anywhere.