This endpoint requires a Growth or Enterprise plan. Learn more.
Returns
LiquidityLockV2Connection
Arguments
String
The address of the pair.
String
The address of the token.
Int!
required
The network id of the pair.
String
A cursor for use in pagination.
Example
Test this query in the Explorer →Usage Guidelines
- Query by
pairAddressfor one pool, or bytokenAddressfor every pool containing that token.networkIdis required. - Every result is a read of current on-chain state (the locker’s own registry, the launch hook’s position, the protocol’s lock accounts), not a replay of past lock events. A lock created before Codex indexed a protocol reads the same as one created today.
lockedPercentis 0–100 and islocked / liquidityfrom the same read, so it can never exceed 100. Note thatlockedLiquidityPercentageonliquidityMetadataByTokenis 0–1.lockedispermanentLockedplusvestedLocked.permanentLockedis burned LP or a lock with no withdraw path;vestedLockedsits behind an unlock date.unlockedis everything else, including expired locks.- Vesting is matured at read time. Once a lock’s
unlockAtpasses it moves fromvestedLockedtounlocked, whether or not the LP has been withdrawn from the locker.nextReleasePointis when the next vested tranche matures, in the pool’s own clock units (block, slot or seconds depending on the lock). Useholders[].unlockAt(unix seconds) for dates. holdersattributes locked liquidity to whoever custodies it.lockProtocolis null for custodians theLiquidityLockProtocolenum cannot name, so usedisplayNameorentityIdto identify them. Whensharedis true, several holders name the same liquidity; count it once.updatedAtis when the state read was taken. Pools are re-read whenever liquidity is added or removed, and reconciled on a six-hour sweep.current: falsemeans vesting could not be matured to now and the figures are as of that last refresh.- Use
cursorto page through token-level results.
Coverage
Codex reports a lock only when it can prove it on chain. When a lock cannot be proven, none is reported, so a pool locked through an unverified mechanism shows its liquidity as unlocked rather than unknown. These are the mechanisms read today, across all major EVM networks and Solana:
Known gaps: Meteora’s original DAMM (v1) lock escrows, and Uniswap V3 positions held by burned or third-party NFTs outside a supported locker. If a launchpad or locker you rely on is missing, let us know with a pool address and a graduation transaction hash.
Troubleshooting Tips
How is liquidityLocksV2 different from liquidityLocks?
How is liquidityLocksV2 different from liquidityLocks?
liquidityLocks (deprecated) is event-derived: a lock existed in the data only if Codex decoded the transaction that created it, and nothing was re-checked afterwards, so expired or withdrawn locks kept reporting as locked. liquidityLocksV2 reads what is locked right now, matures vesting at read time, and returns the locked share directly. Migrate to V2; V1 is retiring with the legacy lock pipeline.The locked percentage doesn't match the locker's website.
The locked percentage doesn't match the locker's website.
Almost always an expired lock. Lockers show a deposit until it is withdrawn; Codex stops counting it the moment its
unlockAt passes, because from then on the liquidity can leave at any time. The Codex figure answers “can this liquidity be pulled right now”.This token is locked but lockedPercent is 0.
This token is locked but lockedPercent is 0.
Either the pool’s custodian is one Codex has not verified (an unregistered launchpad hook, a team multisig, an upgradeable lock contract), or the “lock” is a token burn rather than a liquidity lock. A burned token supply is not locked liquidity, and a bonding-curve token has no pool before graduation, so it correctly shows no lock. If the custodian is a launchpad or locker we do not cover yet, contact us with the pool address; verifying and adding a new custodian is routine.
Why does a concentrated-liquidity pool show less than 100%?
Why does a concentrated-liquidity pool show less than 100%?
On Uniswap V3/V4, Orca and Raydium CLMM, several providers can hold positions in the same pool. If a launchpad locks its own position and outside providers add theirs, the locked share is genuinely below 100%. The figure is the locked portion of everything currently in the pool, and it is re-read whenever liquidity is added, so a lock measured at launch is diluted as the pool grows.
Why is lockProtocol null on a holder?
Why is lockProtocol null on a holder?
LiquidityLockProtocol only names some custodians. Others, including several Robinhood Chain launch hooks and burn addresses, are attributed through the registry instead: entityId (for example burn:0x...) and displayName identify them, and permanent still tells you whether the lock can ever be withdrawn. For position-state locks such as Orca and Raydium CLMM, entityId is null because the position holds itself.Are Robinhood Chain launchpad tokens covered?
Are Robinhood Chain launchpad tokens covered?
Yes. Robinhood launchpads run on Uniswap V4 hooks, and the verified hooks (Doppler, Pons, o1 Exchange, letscash.fun, PAIR, LaunchHook, lunch.fun, LaunchTaxHook, Bags, LaunchFair) hold the pool position with no withdraw path, so their pools report as permanently locked from graduation onward. Pre-graduation bonding-curve tokens show no lock because there is no pool yet.