PerpsHook
FEED Launch a coin

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:

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:

floorvault equity ÷ circulating supply
vault equityposition margin + unrealised P&L + margin not yet pushed
circulatingtotal supply − what sits in the pool − what sits in the vault
coveredfloor ÷ 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:

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

ParameterValue
ChainRobinhood Chain mainnet, chain id 4663
Supply1,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 fee1%, taken by the hook on the USDG side of every swap
To the position50–100%, set at launch, 80% by default
Leverage1x to 10x, set at launch, 3x by default
Maintenance margin5% of notional
Open / close fee0.06% of notional each
CollateralUSDG, six decimals, the dollar this chain settles in
OracleChainlink on Robinhood Chain, refused if the answer is over 25 hours old
Liquidation bounty1% of notional to whoever calls it
Open interest cap40% of the venue's pool equity, per side, per market
Minimum push25 USDG of pending margin
Redemption fee0.5%, kept by the vault
Redemption locknone, 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:

ContractAddress
LaunchFactory0x61C4dC6dcF7866c3c7102DAe6e8DA3057d28EafF
PerpBackedHook0x59CEA84c0B8397741c8058d10CFD2495fFD400cc
PerpEngine0x8aF78eF7755133558cA60C2859f9439531d2CE77
ChainlinkOracle0x523a77dCE0b71c4BeE0B56Cc8d5e2D24f209DfD6
Router0x2349DAa598879ed1fB975A1C965ffD8DD6113658
USDG0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168
Uniswap v40x8366a39CC670B4001A1121B8F6A443A643e40951

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.

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.