FAQ
The questions worth asking first
So can these vaults actually be robbed?
Not profitably, on most of the markets measured — a trader committing 3× the deposit ended the block behind on 6 of 9. That is the correction this site's own measurement forced on it. The depositor lost money on all 9, and that is the part that matters: the loss needs somebody trading the pool in your block, not somebody attacking you.
Is this a real vault?
Yes. contracts/Plimsoll.sol is 8,542 bytes of runtime with no library and no
inheritance, it compiles with solc 0.8.26, and 32 properties are executed against it on
Robinhood Chain's own EVM on every build. The app deploys one from your wallet. What is not real
is a canonical deployment: that costs gas from a funded account and this repository holds no key.
Is ERC-4626 broken?
No. The standard is a common interface, and a common interface with a slippage parameter in it would have been a different and worse standard. The security considerations in EIP‑4626 say plainly that wrappers should add their own protection. The problem is that almost nobody does, and every front page in the category quotes a preview as though it were a term of the transaction.
Why not just use a TWAP?
A time‑weighted price is harder to move but it is also wrong on purpose: it lags, so a vault marked against one is systematically mispriced in exactly the moments a depositor cares about, and the lag is itself extractable. The load line does not try to find an unmanipulable price. It bounds how far the price could have been moved for a given amount of money, and refuses outside that.
What happens at exactly the size the line prices?
It is a rounding decision, and the site says so rather than rounding it away. loadLine discounts
the quote by exactly what an attacker of the deposit's own size could do, so at precisely that size the floor
and the outcome are the same number and the tick‑crossing error decides. The
sweep either side of it is on the page; it refuses cleanly from that point upward.
Where does the attacker’s budget assumption come from?
It is a choice, and it is stated rather than buried: loadLine(assets) assumes somebody willing to
commit as much capital as the deposit. A reader who thinks that is too generous or too mean can call
swing() with any number they like and pass their own floor to depositWith.
What happens on a pool with no liquidity at the tick?
swing() returns zero and the load line collapses to the quote, which is the safe direction:
a deposit is only accepted if it gets exactly what was previewed. A property executes that case.
Can the guard refuse an honest deposit?
Yes, and it does when the mark moves for real reasons between the read and the execution. That is a failed transaction and a wasted gas fee, and it is the cost of the design. The measured size of it is on the leeway page.
Is any of this audited?
No. It is adversarially self‑reviewed by its author, which is a test suite and not an audit, and the site says so on every page footer and again on /state.
Why Robinhood Chain?
Because the interesting case is a vault holding something whose price is set somewhere you can reach. 82 tokenised‑equity markets on this chain each have a Uniswap V3 pool, the public endpoint answers a browser preflight so every live panel here is a page rather than a server, and the whole ladder is 11,229× wide, which is what makes a single tolerance obviously wrong.