How it works
Four calls, and nothing between you and them
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.
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.
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.
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.