Docs

50 minutes of trading. 10 of one price.

CLOCKIN is one Uniswap v4 hook shared by every coin it launches. The clock is global: at :50 every market stops trading and enters an auction, and on the hour each one prints a single price. What follows describes the contracts, not a promise made by a website.

Overview

A launch is three things: a fixed-supply ERC-20 with no owner and no mint function, a Uniswap v4 pool paired against native ETH, and the ClockHook that governs it. The factory deploys all three in one transaction and locks the seed liquidity permanently.

For most of the hour the pool is an ordinary AMM. Then the bell rings, the book opens, and for ten minutes the coin has no price at all — only an order book that resolves into one number.

The clock

WindowSecondsWhat happens
:00–:500–2999LIVE. Normal v4 swaps. Liquidity can be added and removed.
:50–:583000–3479BOOK. Swaps revert. Place buys and sells; cancel freely.
:58–:003480–3599FREEZE. Book sealed, pool frozen, the settler lands the print.

The freeze matters more than it looks. Because swaps and liquidity changes both revert, nobody can move the tick between the last order and the print — the outcome is determined from the moment the book closes.

How the price is set

The uniform price is the VWAP of the residual swap, not the pool’s marginal price. Clearing at the marginal price would charge the heavy side half the impact and hand it to LPs, which would make the auction worse than trading live for exactly the person bringing the most volume.

With E the ETH from buys, T the tokens from sells, and (d0, d1) the residual delta from the hook’s perspective:

Sells are heavyp = d0 / |d1|fillSell = (E/p + |d1|) / T · fillBuy = 1
Buys are heavyp = |d0| / d1fillBuy = p·(T + d1) / E · fillSell = 1

The price is also bracketed: it must land between the pool price before and after the residual, within a small tolerance for tick rounding. Without that anchor a perfectly balanced book would satisfy the identity at any price at all.

Launching

There is no bonding curve and no ETH seed. All of `tokensToPool` goes in as a one-sided position, 100% token, in a tick range entirely below the starting price. The rest of the supply goes to the creator.

This works because crossing an empty range in Uniswap v4 is free: the first buy — ETH into token, which pushes the price down — jumps the gap in the same transaction and lands in the real position. The flip side is that a sell before that first buy has no liquidity above the starting price to execute against, and reverts.

sqrtPriceX96 is therefore a starting valuation rather than the price of a deposit, which is why the launch form asks for a market cap and works backwards to a price per token. Launching is only possible during LIVE, because a launch adds liquidity and the pool is frozen through the auction.

launchExisting() does the same for an ERC-20 you already deployed — approve the factory first. There is also setPool() on the hook, which activates the clock for a pool created through Uniswap’s own interface; the factory path is preferred because it is atomic, leaving no window where the pool exists unregistered.

Minimum order into a book: 0.02 ETH — below that, claiming costs more gas than the order is worth.

Fees

FeeRateWho gets it
Live swap1.00%The coin’s creator, always in ETH
Auction print0.30%The creator, minus the settler’s cut
Settler bounty20% of the print feeWhoever calls settle() — permissionless
Pool LP30.00%Liquidity providers, including the locked seed

The live fee is charged in ETH in all four swap directions. That is why the hook declares both return-delta flags: afterSwap can only touch the unspecified currency, which on an exact-input buy is the token, so the ETH-side fee has to come out of beforeSwap.

Custody & escape

Orders sit still in the hook — no PoolManager round trip per order. Settlement is a single unlock: one residual swap, then settle and take. It is O(1) and never iterates the book.

Claims are pull-based, so each user pays their own gas. And if an hour is never settled, from :10 of the following hour it is voided and every order comes back untouched. Accounting is per pool, so a bug in one coin’s book can never be paid out of another coin’s ETH.

Contracts

These are the addresses this deployment is configured against. Verify them on Etherscan before signing anything.

ClockFactory
0xcc7aeac1b9374c94252bd11dd751a5c6c7368861
ClockHook
0x7bbdf9704c7d1298de98c4ec993b61a397a74acc
PoolManager
0x000000000004444c5dc75cB358380D2e3dE08A90
StateView
0x7fFE42C4a5DEeA5b0feC41C94C136Cf115597227

Test deployment

Neither of these is called by this interface. ClockToken is deployed fresh by the factory on every launch, and ClockMathHarness only exists so the clearing identities can be exercised from a test suite. They are listed here so a test deployment has a home.

ClockMathHarness
0xec337c17b6812e182e77773b380dd34a5c1edc57
Sample ClockToken
0x2068263cb5394d3d6d4b40376aed38b65b54a48e

FAQ

Why one price instead of continuous trading?
Because within an hour the two sides mostly want opposite things. Whatever buyers and sellers cross between themselves never touches the curve, so neither side pays impact on it. Only the residual hits the pool, and both sides clear at its volume-weighted average.
Can the settler pick a favourable price?
No. The settler only proposes how far to push the pool. The hook runs one swap bounded by what the book actually holds and derives the price from the executed delta. Push too far and the heavy side fills above 100%, which reverts. Push too little and the fill falls short, which is only accepted if the ±50% band was hit.
What if nobody settles my hour?
From :10 of the following hour the epoch can be voided and every order is withdrawn intact through rescue(). Nothing gets stuck.
Can I cancel an order?
Until the book closes at :58. After that the book is sealed — that hard cut is what stops someone placing a giant order to move the print and pulling it at the last second.
Is the LP withdrawable?
The launch position belongs to the factory, which has no burn, no owner and no upgrade path. The permanence comes from the code not existing, not from a check someone could bypass. Only the fees it earns can be collected, and they go to the creator.
Does the deployer have any power over my funds?
No. setFactory() runs once before the first launch and closes forever. rescueToken() can only move what exceeds a pool’s tracked reserves and fees. There is no pause, no blacklist, and no way to raise the fee.

Ready to launch?

Questions go to X.

Launch a coin