Skip to content

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.)

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.

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 locker records the fee recipient per position. locks is public:

// tokenId here is the positionId from TokenLaunchedV4
struct Lock { address creator; bool exists; }
mapping(uint256 tokenId => Lock) public locks; // locks(positionId)
mapping(uint256 tokenId => address) public pendingCreator; // in-flight handover
  • locks(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.

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.

To check whether a creator fee stream is for sale, read the market’s listing by position id:

// FeeStreamMarket
listings(positionId) // → seller, price, active