The idea
A launchpad coin usually has nothing behind it. The swap fee goes to whoever put up the liquidity, the pool is the only thing setting the price, and the token is worth whatever the next buyer pays. PerpsHook keeps the pool and adds one thing: a trade.
At launch the creator picks a market and a side. From then on, 1% of every swap on the coin's Uniswap v4 pool is pushed into that position as margin, and the position sits in a vault that any holder can redeem against. The coin is still a coin. It just has a balance sheet.
The short version. Volume buys margin. Margin buys exposure. Exposure moves the floor. The floor is redeemable, which is what makes it a floor rather than a claim.
The hook
Uniswap v4 lets a pool run code at defined points in a swap. PerpsHook's hook takes 1% of every swap in the pool's quote currency, which is USDG, and hands it straight to that coin's vault. There is no fee to claim, no keeper to run for collection, and no window where the fee sits somewhere a person controls.
Which callback does the taking depends on the direction, because the fee
has to end up as USDG either way. Buying the coin puts USDG in, so the fee
comes off the input in beforeSwap. Selling it takes USDG out,
so the fee comes off the output in afterSwap. Exact-output
swaps are rejected rather than filled for something other than the amount
that was asked for.
The pool's own LP fee is set to zero, so the 1% is the whole fee on a PerpsHook pool and there is not a second one stacked underneath it.
Because the pool quotes in USDG, the fee arrives already denominated in the collateral the perp venue wants. Nothing has to be swapped in between, so a fee cannot be lost to slippage on its way to becoming margin.
The split is fixed at launch and written into the vault:
- 50% to 100% of the fee becomes position margin. 80% is the default.
- The remainder is the creator's, claimable at any time.
- There is no protocol cut of the swap fee in the contracts as deployed.
The fee has one place to go. A pool is registered against its vault by the factory, once, and the hook rejects a second registration, so nothing can redirect the swap fee later. The creator can hand their own share of it to someone else, and that is the only address in the system anyone can change.
The vault
One vault per coin. One market, one side, one leverage, all chosen once and immutable afterwards. The vault has no ability to flip, close early, or pick a different market, which is the point: a holder should be able to read the position off the launch and know it will still be that position tomorrow.
Margin accumulates until it crosses a minimum of 25 USDG, and then anyone
can call push(), which opens the position or increases it at
the current mark. Entry price is the size-weighted average of every push,
so a coin that keeps trading keeps averaging in. A $2 increase would cost
more in gas than the exposure it buys, which is what the minimum is for.
The push the hook attempts on each swap is wrapped in a try. If the venue refuses it, because it is out of liquidity or at its open interest cap, the margin stays pending in the vault and the swap still goes through. A coin's market does not stop trading because the perp venue is having a bad day. Pending margin is still redeemable; it is just cash rather than exposure.
Nobody is in charge of the position. push() is permissionless and takes no arguments that could change what it does. There is no manager key, no discretionary close, and no way to withdraw margin except by redeeming tokens.
The oracle
Every mark comes from Chainlink, which publishes its own feeds on Robinhood Chain. The venue holds one aggregator per market and reads it straight, so there is no key anywhere in the system that can decide what a position is worth, and nothing has to be posted or paid for to keep a price alive.
Each feed carries a staleness limit, set to 25 hours on every market listed so far, and an answer past it is refused rather than used. That matters more than it sounds. An equity feed that has not moved since Friday afternoon is not a live price, and a position marked against it would be marked against a guess. So over a weekend an equity market cannot be launched against at all, and a vault already holding one cannot be valued, and the pages say NO DATA instead of quietly reusing Friday's number.
Two contracts have an owner, and between them that is the whole privileged surface. The venue's owner can list a market and hand the role on. The oracle's owner can add a feed, change how old an answer is allowed to be, and hand the role on. Neither of them can set a price, close a position or touch a vault.
The floor
The number that matters is:
| floor | vault equity ÷ circulating supply |
| vault equity | position margin + unrealised P&L + margin not yet pushed |
| circulating | total supply − what sits in the pool − what sits in the vault |
| covered | floor ÷ market price, capped at 100% |
A coin trading at four times its floor is 25% covered. That ratio is on the board and at the top of every coin page because it is the honest summary of what the design gives you: not a guarantee, a partial one.
Coverage starts near zero. A coin with a $250K cap that has done $250K of volume has posted roughly $2,000 of margin, which is under 1% of the cap. It grows with volume and with the position working, and nothing about this design makes a fresh coin safe. The simulator on the front page exists so that this is obvious before you launch rather than after.
Redemption
Burning tokens returns the same share of vault equity as the share of supply burned, and closes the same fraction of the position in the same transaction. That second half is what makes it fair:
- Equity falls by exactly the fraction redeemed.
- Circulating supply falls by exactly the fraction redeemed.
- Floor per token for everyone who stayed is unchanged.
A 0.5% redemption fee stays in the vault, so redeeming is very slightly accretive to the holders who do not. Both of those are properties of the vault contract, not of this page.
Liquidation
A leveraged position can be liquidated, and a vault has nobody to call for more margin. When the margin ratio falls to the maintenance floor the position is closed and its equity is gone. Whatever margin had not been pushed yet survives, because it was never in the position, so the floor drops to that and no further. The coin keeps trading and new fees begin building a new position at whatever price the market is then.
This is not an edge case worth burying. A 3x long is liquidated on a 29.8% move against it; a 10x long on a 5.3% move; a 3x short on a 27.0% move, because the two sides are not symmetric. Every coin page shows its liquidation price and its distance from the mark at the top of the position panel, and the launch form tells you how far a position can move against you before you sign for it.
Parameters
| Parameter | Value |
|---|---|
| Chain | Robinhood Chain mainnet, chain id 4663 |
| Supply | 1,000,000,000, fixed, no mint function |
| Opening cap | $6,000, the cap the v4 pool is initialised at. The factory refuses anything under $1,000 |
| Swap fee | 1%, taken by the hook on the USDG side of every swap |
| To the position | 50–100%, set at launch, 80% by default |
| Leverage | 1x to 10x, set at launch, 3x by default |
| Maintenance margin | 5% of notional |
| Open / close fee | 0.06% of notional each |
| Collateral | USDG, six decimals, the dollar this chain settles in |
| Oracle | Chainlink on Robinhood Chain, refused if the answer is over 25 hours old |
| Liquidation bounty | 1% of notional to whoever calls it |
| Open interest cap | 40% of the venue's pool equity, per side, per market |
| Minimum push | 25 USDG of pending margin |
| Redemption fee | 0.5%, kept by the vault |
| Redemption lock | none, you can redeem the moment you hold |
What is built
The contracts are deployed on Robinhood Chain mainnet and this site reads and writes them. These are the addresses, and each one has code at it:
| Contract | Address |
|---|---|
| LaunchFactory | 0x61C4dC6dcF7866c3c7102DAe6e8DA3057d28EafF |
| PerpBackedHook | 0x59CEA84c0B8397741c8058d10CFD2495fFD400cc |
| PerpEngine | 0x8aF78eF7755133558cA60C2859f9439531d2CE77 |
| ChainlinkOracle | 0x523a77dCE0b71c4BeE0B56Cc8d5e2D24f209DfD6 |
| Router | 0x2349DAa598879ed1fB975A1C965ffD8DD6113658 |
| USDG | 0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 |
| Uniswap v4 | 0x8366a39CC670B4001A1121B8F6A443A643e40951 |
The venue is ours: PerpEngine, an oracle-priced perp market
with a USDG liquidity pool as the counterparty. Anyone can deposit into
that pool and anyone can withdraw from it, and the depositors are the side
taking the other end of every coin's trade.
What is missing is liquidity, in two separate places, and neither of them is something a website can fix.
- The venue's pool is empty. Open interest is capped at 40% of pool equity, and 40% of nothing is nothing, so a vault can be created and funded but it cannot open a position. Fees that reach it stay there as cash: redeemable, but not exposed to the market the coin was launched against.
- The factory does not seed the coin's own pool either. It initialises the v4 pool at the opening cap and stops, because adding liquidity means somebody's capital and doing it here would hide whose. A launched pool has a price and no depth, so nothing is swapping and no fees are arriving in the first place.
Between the two, a coin launched today starts with a floor of zero and nothing moves it until both are fixed. That is a deposit and a liquidity position, not a code change.
There is no token for this project. Anything on this site that cannot be read off the chain says so rather than showing you a number: a market with no fresh price shows NO DATA, an empty board says it is empty, and the simulator on the front page is a model of the contracts and is labelled as one.