Pair assets
What your coin can be priced in. This is the part that replaces a hardcoded list of twenty-four tickers with a measurement.
The published list
Ten assets, in three buckets, offered by name in the interface — the tokens with real depth on Unichain, measured on DexScreener rather than GeckoTerminal, which overstates Uniswap v4 pools here by an order of magnitude:
| bucket | what is in it |
|---|---|
| Large cap | WETH and USDC (the anchors), USDT0 (Tether's LayerZero OFT — the liquid USDT), WBTC (the LayerZero OFT — the liquid one), HYPE (Wormhole), wstETH, weETH |
| Unichain eco | UNI |
| Memes | UNICORN, CRED (Unicred) |
Left off on purpose:
- SOL (Wormhole): its v4 market reaches about $10,000 at the gate, just short of the bar. Paste it by address if that changes.
- AG and AGS, whose hooked v4 pools report millions of dollars of "liquidity" against almost no volume. Nothing is priced from them.
- The bridged
WBTCandUSDT— the OP-bridge versions, thin twins of the OFTs above. - The "Universal"
XRP,DOGEandZEC, whose depth sits in hooked v4 pools the gates do not measure. - There is no
cbBTCon Unichain at all.
Anything else
You are not limited to the list. Paste any address and it goes through the same measurement — it just has to clear a higher bar, because nobody has looked at it.
| bar it must clear | |
|---|---|
| on the published list | $10,000 |
| pasted in by address | $25,000 |
Both numbers are depth in USD, and both are read live at the moment of the launch. Being on the list lowers the bar; it never removes it. A listed asset whose market dies stops being launchable on its own, without anyone intervening.
The point of keeping the list honest is that the interface should not offer by name something the chain is going to reject. A test walks the list against live chain state and fails when a row stops clearing its bar.
How depth is measured
Not by asking a price feed, and not from a single number a launcher could have arranged. What the gate reads depends on what the venue keeps.
Venues that keep an oracle
Uniswap V3 and Velodrome Slipstream write their own history on every block. The gates read it over a 30-minute window:
tickCumulativesgives an arithmetic mean tick — a manipulation-resistant pricesecondsPerLiquidityCumulativeX128gives the harmonic mean of in-range liquidity
and those two convert into the depth sitting on the anchor side of the pool. Faking that means actually holding the liquidity for the whole window.
That alone would still be gameable: a very tight range turns a few hundred dollars into an enormous liquidity figure, because it describes depth at the current price and says nothing about what the pool holds. So the reading is capped by the anchor tokens actually in the pool. Spot balance is inflatable with a flash loan; time-weighted liquidity is inflatable with a tight range — but not the same way. Passing requires beating both at once, which is indistinguishable from being a real market.
Venues that keep nothing
Uniswap v4 removed the oracle, and a constant-product pair never had one. There is no history to read, so these gates read the pool as it stands.
Depth on a v4 pool is worked out by walking the pool's ticks outward from the current price and
adding up the real amounts, the way a swap would — not by inferring a reserve from a liquidity
figure. That distinction is not academic: in our own tests a hair-thin range holding $15.0M reads
as $5,000M under the naive method, an overstatement of 334×. A constant-product reserve needs
none of that; getReserves is simply what the contract holds, and it is read rather than
balanceOf so that tokens sent to a pair without being synced in do not count.
What a live reading cannot do, stated plainly rather than buried: it describes this instant, and
this instant is one flash loan away from saying anything — borrow, deposit as liquidity, be measured,
withdraw, repay, all inside one transaction. The machinery to defend against that exists in both
gates and is switched off. It samples the pool over a window and takes the minimum, which is
expensive to fake because nobody controls when the next reading happens; it is one owner call
(setRequireWitness(true)) away, with no redeployment. It is off because the certain cost was
falling on the wrong people: every legitimate coin waited half an hour and in practice almost none
were ever enrolled, so real markets worth hundreds of thousands read as nothing.
Depth is measured against three anchors: WETH, USDC and WBTC, each priced by its Chainlink feed on Unichain. In v4, native ETH counts as WETH — the two are the same asset to price, and most v4 pools on Unichain quote in the native one.
Where it looks
Every venue on Unichain with real liquidity, and the best answer wins — never the sum, because depth on two venues is not depth you can trade through at once.
| venue | how it is read | anything to do first? |
|---|---|---|
| Uniswap V3, every fee tier | the pool's own oracle | no |
| Velodrome Slipstream, every tick spacing, both factories | the pool's own oracle | no |
| Uniswap V2 and Velodrome V2, stable and volatile | reserves | no |
| Uniswap v4 | tick walk | the pool has to be named once |
Uniswap v4 holds most of Unichain's depth, then V3; Slipstream is small and the two V2-shaped venues are nearly empty. Velodrome runs two Slipstream factories on Unichain — the live one and a newer one that has no pools yet — and the gate reads both, so a market that moves to the new one is not lost. There is no SushiSwap deployment on Unichain.
The one thing v4 asks for
Every venue above except v4 can be searched: you ask a factory for the pool and it answers. Uniswap v4's singleton has no such lookup — a pool is identified by the hash of its key, and that key contains a 160-bit hook address. You can verify a key you already hold; you cannot go the other way.
So a v4 pool has to be named once, by anyone, for everyone:
v4Gate.registerPool(PoolKey key) // any v4 pool with an anchor on one side
v4Gate.registerLaunch(address token) // shorthand for a coin launched here
The interface does this for you: paste an address whose market is on v4 and it finds the pool, works
out its key from the Initialize event the PoolManager emitted, and offers a single button. One
transaction, and the coin is usable immediately afterwards.
Registration refuses a pool holding less than a quarter of the bar, so the list stays something worth walking.
Coins launched here
A coin launched on RainbowFun is a v4 coin with no market anywhere else, so it goes through the same
path: registerLaunch, then it counts. Nothing about it is special-cased.
Its liquidity being permanently locked in the vault is a real extra guarantee, but it is not what makes it eligible — the depth is. A RainbowFun coin becomes usable as a pair asset once $25,000 of real backing has accumulated in its pool, and not before.
Why an asset gets refused
| code | meaning |
|---|---|
| 1 | not an ERC-20 |
| 2 | decimals outside 6–18 |
| 3 | no reference pool against WETH, USDC or WBTC — on v4, possibly just not named yet |
| 4 | the pool is too young to have a full window of history |
| 5 | not enough depth |
| 6 | no anchor price available right now — transient, retry |
Code 4 only comes from the oracle venues, and it is fixable by anyone: primeObservations grows a
pool's observation buffer permissionlessly, and the asset becomes measurable once the window has
elapsed.
Hooked v4 pools
The v4 gate walks a pool's ticks whether or not it has a hook, so a hooked pool measures like any
other. What a hook changes is what that depth is worth: it can charge a fee on every swap, and a
badly written one can stop the pool trading altogether. So the published list only relies on a hooked
pool after reading its hook. Today that is one pool — CRED's, against native ETH, behind
UnicredHook: a fee on the ETH side of buys that funds CRED buybacks, capped at 5% in code, and no way
to close trading once it has opened.
A pasted address with a hooked pool goes through the same measurement and the same bar; nobody has read its hook, which is one more reason the custom bar is higher.
