A token that already trades can get two more things on ZKDepth, on the Token vaults page at /launch/vaults: a managed vault over its deepest pool, and a perpetual market before any order book lists it. This is a separate road from the launchpad, where a curve graduates into its pool. Neither contract has an owner or an allow-list, and Graduated and MarketCreated mean only that someone paid gas.
Opening a vault
track(token) needs a token/WETH pool on one of the four Uniswap v3 fee tiers. It grows each pool's observation ring to 60 slots and starts the clock. graduate(token) then checks:
- 1No vault yetA token gets one vault, and it cannot be removed.
- 2Old enoughAt least 3 days since
track. - 3Deep enough, over timeFor each tier, the pool's harmonic-mean in-range liquidity over the last 30 min, summed to at least
MIN_LIQUIDITY. Liquidity added in the same block weighs nothing. - 4Vault deployedOn the single deepest pool, as a clone with no admin.
The vault has the policy of the deploy's own vaults: WETH deposits, a ±25 % range, a 6 h interval, 100 bps of slippage, and compounding. It starts empty.
The Seasoned screen
Seasoned is a screener label: a pool at least 3 days old, a market cap above $1,000,000, and at least 100 trades in 24 h. No contract reads it. ZKDepth indexes its own pools and not the third party's, so /launch/vaults shows the clock and the depth from the chain, and market cap and trades as unknown. A clock starts with track, which anyone can send from that page or any wallet. Each minute the graduator bot sends graduate for a token on the clock once 3 days have passed. You can make either call for any token.
Pre-market perps
PreMarketPerp is a constant-product virtual AMM with no liquidity providers and no counterparty. The contract's USDG balance pays every winner.
| Name | Allowed | Default | Effect |
|---|---|---|---|
Leverage | 1 - 3 x | None | Whole numbers only. |
Taker fee | 30 bps | None | Of notional, on entry and on exit. A third goes to the insurance fund. |
Maintenance | 625 bps | None | Of notional, at the mark and at the index. |
Liquidation bounty | 100 bps | None | Of the remaining margin. The insurance fund gets the rest. |
Market depth | 10,000 or more USDG | None | Set by the creator. Open interest is capped at 5x it. |
Funding | ±1 % an hour | None | One poke charges at most 24 hours. |
Two prices
The index is a 30-minute mean tick of the token/WETH pool, times Chainlink ETH/USD. The mark is the curve's own price, and every fill uses the curve. Funding is the capped gap between the two, and longs pay when the mark has run above the index. A liquidation needs a position below maintenance at both prices, so pushing the mark cannot liquidate anyone by itself. While the index is unreadable, liquidations wait and close keeps working.
A position's life
createMarket(token, fee, virtualLiquidityUsd) is open to anyone, and the curve is seeded at the index. open takes the entry fee out of your collateral first, so a 3x open is about 3.03x on what remains, and a limit price bounds the fill. A 3x long is liquidatable roughly 28.6 % below entry, a 3x short roughly 25.2 % above. close is for the position's trader only. liquidate is open to anyone, and the liquidated trader keeps nothing.
Bad debt and late profits
A close or liquidation that ends below zero is bad debt. The insurance fund pays first, and anything left becomes deficit, which the next profitable closes pay out of their profit, never their collateral.
The contract pays out only free USDG: its balance minus all open collateral and the insurance fund. A profit above that is recorded in deferred[trader], and claimDeferred() pays as much as is free at the time, first come, first served.
contracts/src/LaunchPipeline.soltrack, graduate, canGraduatecontracts/src/PreMarketPerp.solcreateMarket, open, close, liquidate, pokeFunding, claimDeferredapps/api/src/bots/graduator.tsthe bot that graduates