Skip to main content
This endpoint requires a Growth or Enterprise plan. Learn more.

Returns

LiquidityLockV2Connection
See 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 pairAddress for one pool, or by tokenAddress for every pool containing that token. networkId is 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.
  • lockedPercent is 0–100 and is locked / liquidity from the same read, so it can never exceed 100. Note that lockedLiquidityPercentage on liquidityMetadataByToken is 0–1.
  • locked is permanentLocked plus vestedLocked. permanentLocked is burned LP or a lock with no withdraw path; vestedLocked sits behind an unlock date. unlocked is everything else, including expired locks.
  • Vesting is matured at read time. Once a lock’s unlockAt passes it moves from vestedLocked to unlocked, whether or not the LP has been withdrawn from the locker. nextReleasePoint is when the next vested tranche matures, in the pool’s own clock units (block, slot or seconds depending on the lock). Use holders[].unlockAt (unix seconds) for dates.
  • holders attributes locked liquidity to whoever custodies it. lockProtocol is null for custodians the LiquidityLockProtocol enum cannot name, so use displayName or entityId to identify them. When shared is true, several holders name the same liquidity; count it once.
  • updatedAt is when the state read was taken. Pools are re-read whenever liquidity is added or removed, and reconciled on a six-hour sweep. current: false means vesting could not be matured to now and the figures are as of that last refresh.
  • Use cursor to 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

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.
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”.
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.
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.
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.
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.
Last modified on October 2, 2026