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
Thirty-eight assets, in three buckets, offered by name in the interface:
| bucket | what is in it |
|---|---|
| Majors | WETH, USDC, USD₮0, WBTC, USDC.e; the staked and wrapped majors wstETH, weETH, rETH, cbBTC, tBTC, RBTC; and LINK, UNI, CRV, AAVE, DAI, USDe, USD0, RAIN, CAKE, SUSHI |
| Arbitrum eco | PENDLE, ARB, GMX, MOR, LON, VSN, ESP, OHM, LPT, SQD, PEAS, ETHFI, FOLKS |
| Memes | LION, AIDOGE, NYA, NST |
| Stocks | none today — see the last section |
Every row was measured by the gates themselves on 2026-09-10 and listed only with 1.5x the headroom on its bar, so an ordinary withdrawal cannot drop it below the line the day after.
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 | $15,000 |
| pasted in by address | $50,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.
That is not hypothetical. On the Base deployment this fork descends from, cbMEGA was on the list
and came off it: its market thinned to around $13,000, hovering either side of the bar from one
block to the next. The chain would have refused a launch against it anyway — the point of taking it
off the published list is that the interface should not offer by name something the chain is going
to reject. A test walks the list against live Arbitrum 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, Camelot's Algebra pools, PancakeSwap V3 and SushiSwap V3 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.
Camelot is the one venue that is not a Uniswap V3 fork — it is Algebra — and the difference is only
cosmetic from here: the same two accumulators come out of a call named getTimepoints instead of
observe, and there is one pool per pair rather than one per fee tier.
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 five anchors: WETH, USDC, USD₮0, WBTC and the bridged USDC.e. Five rather than three because Arbitrum's dollar liquidity is split across three dollar tokens, and reading only one would call a real market thin. In v4, native ETH counts as WETH — the two are the same asset to price, and most v4 pools quote in the native one.
Where it looks
Six sources, 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 |
| Camelot (Algebra), one pool per pair | the pool's own oracle, via getTimepoints | no |
| PancakeSwap V3, every fee tier (0.25% where Uniswap has 0.3%) | the pool's own oracle | no |
| SushiSwap V3, every fee tier | the pool's own oracle | no |
| Uniswap V2, SushiSwap V2 and Camelot's classic pairs | reserves | no |
| Uniswap v4 | tick walk | the pool has to be named once |
The venues matter more than it sounds. Arbitrum's majors sit on Uniswap V3, but what is native to
the chain — GRAIL, Camelot's launches, most of the memecoins — has its deepest market on Camelot or
on a constant-product pair that no concentrated-liquidity gate can see. MAGIC measures $7,000 on
Uniswap V3 and $87,000 on SushiSwap V2; AIDOGE $2,000 on Uniswap V3 and $246,000 on a Camelot
classic pair; LION nothing at all outside its one Uniswap V2 pair. A gate wired to Uniswap alone
would refuse all three.
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 Pair 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 Pair coin becomes usable as a pair asset once $50,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, USD₮0, WBTC or USDC.e — 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 on the Uniswap-shaped ones it is fixable by anyone:
primeObservations grows a pool's observation buffer permissionlessly, and the asset becomes
measurable once the window has elapsed. Camelot's Algebra pools keep every timepoint from their first
block, so there is nothing to prime — a young pool is simply not measurable until it is older.
What about tokenised stocks
The bucket the product was pitched on, and on Arbitrum today the honest answer is that it is empty. Of 1,012 tokenised stock and ETF tokens with an Arbitrum deployment — Dinari's dShares, Backed's xStocks, Ondo's — eighteen have a pool against any anchor on any venue the gates read, eight hold anything at all, and one holds more than $1,000 (a tokenised pound, not a stock). The rest are mint-and-redeem with their issuer: real tokens, no market. Robinhood's stock tokens live on Robinhood Chain, not on Arbitrum One.
Uniswap v4 was walked separately, from the PoolManager's own Initialize events, since it has no
factory to ask: 220 v4 pools hold a stock-like token, 190 of them quoted in spam tokens, and the
deepest of the 29 quoted in a dollar holds $259. An aggregator will still print a route from ETH
into NVDAx through those pools — at a 76% price impact on a tenth of an ether, which is a quote,
not a market.
The one tokenised stock with genuine depth — FNVDA, about $510,000 on Uniswap V3 — is quoted in
FUSD, a dollar token with $3,000 of market of its own. The depth is real, in a unit nothing here
can price, and making that unit an anchor would mean trusting a $3,000 pool to say what a dollar is
worth. So it stays out, and it is written down here so nobody re-discovers it.
Nothing about a stock is special-cased. The day one has a market against an anchor, the gate lets it
in and the Stocks tab comes back — contracts/stocks.txt is the measurement, and
test/TokenisedStock.t.sol is the test that will start failing when it changes.