How it works.
A hybrid is not an NFT wrapped in a token or a token pretending to be an NFT. It is one supply of 10,000 whole units, viewed two ways.
The two faces
The ERC-20 contract holds every balance. The ERC-721 mirror is a second address that reads the same state and emits the events marketplaces index. Hold 3.4 tokens and you hold 3 pieces; the 0.4 backs nothing. Send 1 token and one piece goes with it. Sell 0.5 and a piece is released back to the pool for the next buyer.
Two contracts is a deliberate choice. ERC-20 transferFrom(address,address,uint256) and ERC-721 transferFrom(address,address,uint256) are the same function selector — a single-contract hybrid has to guess whether the last argument is an amount or a token id, and that guess is where ERC-404 style tokens break. Here nothing is ambiguous: the ERC-20 face only speaks amounts, the mirror only speaks ids.
The lifecycle
- Launch. One transaction deploys the pair of contracts and mints all 10,000 units into the curve. No pre-mint, no allocation, no owner keys — there is no mint function to call afterwards.
- Curve. 8,000 units are sold along a constant product curve (E × T = k). Price is a pure function of how much has been sold, so it can only move when someone actually trades. Selling back into the curve is always available at the same curve price, minus the 2% fee.
- Graduation. The moment the 8,000th unit is sold, the contract deposits the remaining 2,000 units plus every ETH raised into Uniswap V2 and burns the LP to 0xdEaD. Nobody triggers it and nobody can skip it.
- After. The curve is closed for good. The same collection now trades on Uniswap like any ERC-20 — and because it is still the mirror's supply, buying on Uniswap hands you pieces and selling releases them.
Why 10,000 is a real cap
Every piece must be backed by one whole token, and the token supply is fixed at 10,000 units with no mint function anywhere in the bytecode. So the piece count cannot exceed 10,000 — not by an owner call, not by a bug in a mint counter, not ever. Ids released by a sale go back onto a stack and are handed out again, so the collection recycles rather than inflates.
Pools and contracts skip the NFT side by default, which is what stops a Uniswap pair from swallowing 2,000 pieces and locking them out of circulation. Any wallet can opt in or out.
The honest edges
Pieces are handed out in batches of 100 per transaction. Each piece is real storage, so an unbounded mint loop inside one buy would eventually exceed the block gas limit and make large trades impossible. Your ERC-20 balance is always exact and immediate; anything above 100 pieces stays owed to you and is collected from the launch page. That is a deliberate trade against a class of bug, not a hidden fee.
Fees: 2% on curve trades — 1.5% to the creator, 0.5% to the protocol — and both are claimed, never pushed. After graduation there is no ppand fee at all, only Uniswap's 0.3% to liquidity providers.
Art is fixed before the first sale. A creator can upload their own PSD — every group becomes a trait category, every layer becomes a trait, and each layer is stored on chain as a palette-indexed bitmap. The store is then sealed, and a launch refuses to accept art that is not sealed, so it can never be swapped or rug-pulled afterwards. Upload nothing and the launch keeps the shared generative renderer. Either way the trait for a piece comes from keccak256(collection address, id) — never from block data, which on this chain is not random at all.