Docs

How a creel works, and what was checked.

One contract, 276 lines, 6,520 bytes of runtime. It has no owner, no fee, no oracle, no pause and no upgrade path, and it is not audited.

The contract

A creel is an ERC-20 whose backing is a fixed number of RAW token units per whole share. Five things go into its constructor — the name, the symbol, the Permit2 it trusts, the tokens and the units — and nothing can change afterwards, because there is no function that changes any of them.

Minting

mint(shares, to) pulls ceil(units[i] × shares ÷ 1e18) of every leg from the caller and mints shares. mintWithPermit2 does the same through one Permit2 batch signature, so the only spender you ever authorise is Uniswap's Permit2 and never a contract of ours. The rounding is up, deliberately: a mint that does not divide evenly leaves the creel over-backed by a unit rather than short by one.

Redeeming

redeem(shares, to) burns the shares and sends floor(units[i] × shares ÷ 1e18) of every leg. Rounding down, for the same reason. redeemWaiving(shares, to, takeMask) takes only the legs whose bit is set; the rest stay behind as backing for the shares still outstanding, which can only raise the backing per share.

The invariant

At the end of every mint and every redemption the contract checks, on chain, that for every leg balanceOf(creel) ≥ ceil(totalSupply × units ÷ 1e18), and reverts if it is not true. It is the only thing the contract insists on, and everything else follows from it.

Where it lives

Through Arachnid's CREATE2 factory at 0x4e59b44847b379578588920cA78FbF26c0B4956C, with a salt of keccak256(symbol). The address is therefore a hash of the init code, which contains the composition — so the same basket always has the same address, for everybody, and no other code can ever sit there. The first person to mint a given creel deploys it from their own wallet. This project holds no key and has never broadcast a transaction to this chain.

solc
0.8.26
creation code
8,208 bytes · 0x2ae8b9b89f5b9bb024a7c7efeba7e52a43ddd5684d50f725fc5d6eb12430432e
runtime
6,520 bytes · 0x08f0c9b91015621abdb2418fb89458418a5e34acce6f3c41017afa4e82cd7096

What this chain actually offers

Measured on Sep 20, 2026 at block 68,291,455, not looked up.

What was checked

Properties, on the live chain

20 of 20, with 164 assertions. Each is one eth_call with no to: the harness's creation code runs against the real Robinhood stock tokens and the real Permit2, puts the creel on chain through the real CREATE2 factory, and returns a verdict. Nothing is deployed and nothing is signed. The control — the same property with the wallet funding removed — was refused.

The page's own transaction, against the real pools

3 of 3. The transaction the app would send is built by js/route.js and handed to a harness as bytes, which runs it against the live Universal Router and the live pools inside one eth_call. Buying 7 legs cost $20.04 at quote. The control — the same run funded at a storage slot that is not the balances mapping — was refused.

The sabotage sweep

16 of 18 deliberate breaks in the contract and in the page's own modules were caught by a property NAMED for them — attribution, not "the suite went red", because a suite that goes red for its own reasons takes credit for everything. Every break that survived is declared below with the reason it is invisible, and the tool checks those declarations against the sweep's own output.

The fuzz

4 random sequences, 91 operations in all, with 10 invariants checked after every single one — mint, redeem, waive, transfer, pause a stock, move a multiplier — each seed ending in a fixed coda that forces the operations the dice may have skipped. Then 8 deliberately broken builds replayed against every seed: 7 were caught. The ones that were not are named here: f1 (deleting the backing check from redemption alone changes nothing: redemption already rounds DOWN, so the creel can never be left short by it and the check has nothing to catch. It is the second of two guards. The sabotage sweep pairs this deletion with a redemption that rounds UP (s3), and that pair is caught.).

The whole thing, in a browser

25 of 25. A fork of this chain, the actual files served the way Vercel serves them, Chrome, and a stub wallet holding a key that can only reach the fork — then the site's own buttons: buy the parts, approve Permit2, deploy the creel, mint, pause a stock on the fork and redeem around it, and send the whole basket as one transfer.

What is not done

Back to the front page · Open the app · Photograph and credits