Reading token state
Everything about a launch is readable on-chain. This page lists the view calls that matter, in the order you typically need them. For anything you rely on, prefer these reads over the convenience API.
A coin has no pool contract to call: pool state lives in the singleton
PoolManager keyed by PoolId, and the fee model lives on the hook. (Coins
from the V3 generations are standard V3 pools instead; see
Earlier generations.)
The hook is the fee oracle
Section titled “The hook is the fee oracle”From TokenLaunchedV4 you have token, poolId, poolKey, and positionId.
The hook answers the fee questions (addresses on
Contract addresses):
| Call | Returns |
|---|---|
hook.feeRate(poolId, zeroForOne) |
the live rate for a direction (true = buy); the sell rate is both legs summed |
hook.burnRate(poolId) |
the burned leg of a sell right now |
hook.configs(poolId) |
launch block, token, position id, sell preset |
hook.buyFee() / hook.maxFee() |
the generation’s flat buy rate and ceiling |
Rates are in v4 units (1e6 = 100%). The sell rate decays per block, so quote
it “up to X%”, or just read the coin’s manifest from the API, which carries
the whole curve.
ERC-20 metadata
Section titled “ERC-20 metadata”The launch token is a standard, inert ERC-20. These never change:
| Call | Returns |
|---|---|
name() |
token name |
symbol() |
token symbol |
decimals() |
always 18 |
totalSupply() |
fixed supply, constant forever |
balanceOf(addr) |
holder balance |
There is no owner, mint, pause, blacklist, or tax function to read. They do not exist.
The locked position (LpLockerV4)
Section titled “The locked position (LpLockerV4)”The locker records the fee recipient per position. locks is public:
// tokenId here is the positionId from TokenLaunchedV4struct Lock { address creator; bool exists; }mapping(uint256 tokenId => Lock) public locks; // locks(positionId)mapping(uint256 tokenId => address) public pendingCreator; // in-flight handoverlocks(positionId).creator: the address currently entitled to the creator fee share (this is what a community takeover of the fee stream changes).pendingCreator(positionId): a non-zero value means a two-step fee-stream handover (or a marketplace sale) is in flight.
The position NFT itself is owned by the locker and is never transferable out. That is invariant L1. There is no function that releases locked liquidity.
Accrued fees
Section titled “Accrued fees”The hook accrues fees per pool and releases them to the creator and ops
treasury; historical payouts are best read from its FeeReleased
events. The indexer also aggregates
them at GET /coins/:address/fees.
Fee-stream marketplace
Section titled “Fee-stream marketplace”To check whether a creator fee stream is for sale, read the market’s listing by position id:
// FeeStreamMarketlistings(positionId) // → seller, price, activeRelated
Section titled “Related”- Onchain events: the events these reads pair with.
- Pricing calculations: turning
sqrtPriceX96into a price.

