Reading manual

How to read a proof

Lockproof reads Robinhood Chain directly, across every vault we know, and shows what is locked, until when, by whom, and — when it is liquidity — what share of the pool. None of it is opinion or an audit: it is a contract read, published together with its coverage.

1. The question we answer

"Can this token's liquidity disappear?" On-chain, a token's liquidity lives in a DEX position (Uniswap, SushiSwap or PancakeSwap; v2: an LP token; v3 and v4: an NFT). Whoever holds that position can withdraw it. A "lock" means handing the position to a contract that only gives it back after a date, or never. The proof shows where the position is, how much of the pool it represents, and what the contract holding it guarantees.

2. Asset types — we never mix them

typewhat it isprotects the buyer?"share of pool"?
LP v4 LP v3concentrated liquidity position (NFT) locked in a vaultyes, as long as the price stays inside the position's rangeyes: position liquidity ÷ active pool liquidity at the current tick
LP v2Uniswap, SushiSwap or PancakeSwap v2 LP token, locked in a vault or burnedyes — burning the LP token is the oldest permanent lock there is, since nobody can claim the reserves afterwardsyes: locked LP ÷ total LP
tokenproject tokens (team, treasury) locked in a vaultno against a liquidity rug; it caps team dumpingno — we show share of supply
burnsupply sent to 0x0 or 0x…dEaDno against a liquidity rug; it cuts supply foreverno — share of supply

Calling team tokens "locked LP" was the number one error the plan review caught. The mark is different for each type.

3. Where this chain's LP actually sits (census of 2026-09-06, top 300 tokens)

grouptokensLP in a launchpad lockerLP in HoodLock / UNCX / 0x4663LP not found
launchpad tokens (Pons, PairPad, Lemon…)8455 (65%)029 (35%)
tokenised stocks700070 — LP locking does not apply
bridged majors and protocol tokens (LINK, cbBTC, USDe, TAO…)14600146 — LP locking does not apply
  • • The launchpad is what locks LP on this chain: when a token graduates, its graduated LP goes to the launchpad's own locker, with no withdraw function. Permanent by construction. We read the lockers of Pons V1 and V2, PairPad, Lemon and one unnamed fork.
  • • Burning is the most common "lock": 29% of the top tokens burned at least 1% of supply (median 6.7%).
  • • Majors have no team LP: the liquidity behind LINK or cbBTC belongs to market makers and bridges. No lock is not a risk in itself, and the page says so.
  • • Third-party vaults (HoodLock, PinkLock, UNCX, 0x4663) hold LP for zero of the top tokens. They matter in the memecoin long tail: on 2026-09-18 PinkLock held 1,017 locks over 678 tokens and HoodLock 234, nearly all of them team tokens.

4. Vaults we read

vaultlockswho can touch ithow we enumerate
Pons V1 / Noxa / Lemon / LaunchLocker 0x9A69…graduated v3 position (permanent)nobody withdraws; the owner only routes fees; the creator collects swap feesby token (getLaunchedToken)
Pons V2 (2 lockers)graduated v4 position + part of supply (permanent)nobody withdraws or collects; the owner only swaps the factoryby token (lockedPositions)
Clankerup to 7 graduated v4 positions per token (permanent)nobody withdraws; fee collection is a zero-liquidity decrease; the owner only sweeps fee balancesby token (tokenRewards)
LaunchHood (v3 + v4 lockers)graduated v3 or v4 position (permanent)nobody withdraws; admins only set the fee splitby token (positionOf)
LauncherLockergraduated v3 position (permanent)nobody withdraws; the owner only swaps the factoryby token (getPosition)
PairedLockerV4v4 position(s) per coin (permanent)nobody withdraws; a keeper sweeps fees and runs buybacksby token (positionsOf)
PairPad (4 lockers)v4 position + supply (permanent)nobody withdraws; the owner only swaps the factoryby token
HoodLockany ERC-20 until a date (team tokens or v2 LP)the admin changes only the fee; extend-onlyevery lock
PinkLock02 (PinkSale)any ERC-20 until a date, with optional vesting (team tokens or v2 LP)nobody: the contract has no admin at all. Extend-only, owner-only withdraw, and a renounced lock is permanentby token (1,017 locks is too many for the index)
UNCX (6 UniV3Locker)v3 position until a datethe owner can move positions into a staking poolevery lock
UNCX classic v3 / v4 / v2 (3 lockers)v3 or v4 position, or v2 LP token, until a date or foreverthe owner sets fees and may name a migrator, but only the lock owner can migrate or withdrawevery lock
0x4663 LockerV3v3 position with vesting, or permanentnobody; no adminevery lock
Doppler multicurve hook (long.xyz, Bankr)v4 positions owned by the hook itself, inside the PoolManagernobody, once the pool is Locked or Graduated: exit needs the Initialized status; a pool launched without beneficiaries can still be exited by Doppler's Airlockby token (getState + the hook's own mint logs)
Virtuals agent veTokenthe founder's initial v2 LP stake (token/VIRTUAL) until matureAtVirtuals' admin can move the date, and the factory can pull the pair's liquidity (removeLpLiquidity)every agent in the AgentNft registry
pools.trade (Uniswap Labs' launchpad)the launch's v4 position NFT, held by the FeeSplitternobody: the FeeSplitter has no transfer path; it only realizes fees (a zero decrease) and can add liquidityby token (launcher log → the NFTs it received that block)
Direct v4 (no NFT)position owned inside the PoolManager itselfdepends on the contract; the first one we read has no removal path at allcurated list, read from pool state
Burnsupply at 0x0 / 0xdead, and the v2 LP token of the token's pairsnobody, by constructionby token, plus its pairs against WETH, USDG or VIRTUAL from the Uniswap, SushiSwap and PancakeSwap v2 factories

The guarantees come from a curated registry, read from each vault's verified source, not from the ABI. On every read we check the bytecode hash; if it changed, the guarantee becomes "review pending". A vault outside the registry reads as "not reviewed by us". The registry is served as JSON at /api/vaults, with the bytecode of every vault checked against the review at the time of the call.

5. How complete that list is — measured, not assumed

A vault is a contract that holds many liquidity positions, so the universe of candidates is finite and rankable: both Uniswap position managers are ERC-721 (SushiSwap v3's had no positions on 2026-09-22; PancakeSwap v3's 649 positions are not in this census yet), and their holders can be sorted by how many positions each address holds. Contracts at the top of that ranking are the candidate vaults. Measured on 2026-09-10 across the 500 largest holders of each:

position managerpositions in the top 500 accountsin vaults we readin contracts we do not readburned
Uniswap v3581,321326,879 (56%)75,160 (13%)1,209
Uniswap v4936,3387,300 (1%)153,776 (16%)16,938

Coverage is not spread evenly: 266k of those 326,879 v3 positions sit in a single contract (Pons V1) and 60k in one LaunchLocker, so two launchpad lockers carry almost all of it. The rest sits in ordinary wallets, which is what "not locked" looks like — including MetaMask smart accounts, which carry bytecode but are EIP-7702 delegations, not vaults; we exclude them by their 0xef0100 code prefix. Named contracts we do not read yet include ClankerLpLockerFeeConversion (62,493 v4 positions), PairV4Locker, LaunchHoodV3Locker and LaunchHoodV4Locker, LauncherLocker, HoodMarketsV3LpLocker and LeavehoodLockLP. Burned position NFTs are still a permanent lock we do not show: the burn reader reads ERC-20 balances, which since 2026-09-11 includes v2 LP tokens but not NFTs.

  • • What this means for a page that says "no locks found". It means no vault in our registry holds that token. It does not mean nobody locked it.
  • • Holding positions does not make a contract a vault. Fee splitters, routers, Multicall and upgradeable proxies rank high too. Telling a vault from a router is a human reading the verified source, which is why the registry grows slowly.

6. The locks that have no NFT at all

The ranking above only sees contracts that hold a position NFT. Uniswap v4 does not require one: any contract can call modifyLiquidity on the PoolManager and own the position itself, keyed by owner, tick range and salt. A project that seeds a full-range position and ships no removal path has locked its liquidity forever without minting anything. Sampling 32,000 blocks of ModifyLiquidity on 2026-09-10:

where the liquidity change came fromevents
the PositionManager, so there is an NFT to follow4,653
some other contract, owning the position directly7,114, from 59 addresses

We were blind to all of it until 2026-09-10. The case that caught it: The Index's LpLock holds 90% of its own pool, permanently, and our page for that token said "0 LP locks". We now read that class from pool state — pools[poolId].positions[keccak(owner ‖ tickLower ‖ tickUpper ‖ salt)] — for every contract in the curated list. scripts/direct_lp_scan.py finds the candidates; a contract joins the list only after someone reads its verified source and confirms no code path removes liquidity.

7. How we compute it

  • • Share of pool (v3/v4): position liquidity ÷ active pool liquidity at the current tick. The denominator already includes the position. Out of range means 0% active, and the page says so: that liquidity is not protecting the current price.
  • • Value in USD: the position's amounts at the pool's current price, with ETH/USD read from the deepest WETH/USDG v3 pool and the token from the deepest v3 or v4 pool against ETH or USDG. Pools with a static fee above 10% are ignored: they mark a fake price. USDG is assumed to be $1.
  • • A price that was not read is not zero. Every failed read shows as "not read"; the coverage ("N of M reads ok") sits at the foot of every page and in every API response.
  • • Certified: LP in range, at least 50% of the pool, permanent or 180+ days. It is the only mark where we say "protects".
  • • 0.0₁₅202 is a number, not a typo. The subscript counts the zeros between the point and the first digit, the way every chart site writes dust: $0.0₁₅202 is 0. then fifteen zeros then 202. We round dust down to nothing in a percentage, never in the figure itself — the JSON always carries the full number.

8. What the proof does NOT say

  • • That the token has no other rug: mint, blacklist, a fee in the hook. On v4 the hook can block selling even with LP locked; we show the hook address and flag that it is not audited.
  • • That the locked share is enough: 30% locked with 70% free is locked at 30%. We show the number.
  • • That the price cannot fall: locked LP stops the team from pulling liquidity, it does not stop selling.

9. Routes

/locks/<token>everything locked or burned for that token, across every vault
/proof/<vault>/<id>the proof of one lock (shareable; card for X)
/locksglobal index of the enumerable vaults (HoodLock, UNCX, 0x4663, direct v4); burns by token only
/launchpadLP parked at graduation in a launchpad locker, found in the logs because those lockers only answer per token
/api/eventsevery state change between two index reads, as JSON: new lock, unlockable, withdrawn, extended, owner changed, out of range, liquidity down, certified
/api/locks/<token>JSON for scanners and bots; schema; no key
/api/vaultsthe curated registry, with a live extcodehash check per vault and the list of vaults whose code no longer matches the review
/api/launchpad-locksthe graduated LP behind /launchpad, with the block the scan reached and how far behind the chain it is

Open source at github.com/jonatasmota/locker. Read on-chain, no wallet, no account.