Factory
LaunchCreated is your discovery stream. It carries the creator’s launchParams (for type 1, the addresses exempt from the anti-snipe surcharge) but not the launch’s economics: a launch snapshots the factory defaults and its type’s parameters at creation, so one config() call on a type-1 launch turns the log into a priceable curve. contractURI is write-once — no setter, no update event. Pool creation at graduation logs on the DEX factory, not here.
Launch (one stream per clone)
- The launch is
log.address. There is no token or launch field — one contract, one token, one stream. traderis asymmetric by design: on a buy it is the recipient (who ends up holding); on a sell it is the seller (whose balance moved). The event follows whose balance in the launched token changed.quoteAmountis the reserve delta, whichever entry was used. A buyer paidquoteAmount + fee(minus any completion refund); a seller receivedquoteAmount − fee.soldis not monotonic — sells decrease it. It is curve state, not cumulative volume.CurveCompletedandGraduatedshare a transaction. The buy that fills the curve emits itsTrade, thenCurveCompleted, and graduates the launch before it returns — the DEX’sPoolCreatedand the locker’sLockedland in between,Graduatedlast. There is no block in which a launch is full but not graduated.FeesSweptfires insidecollectFees(), once per side actually paid — creator or protocol. A side whose transfer fails emits nothing and keeps its balance.
LunyaLaunchToken
Graduated, different topic0. It is a signal only — the token is freely transferable from its first block. Burns show up as ordinary ERC-20 Transfer events to the zero address.
Locker
tokenId; locker.positionOf(token) maps a graduated token to its position. There is no protocol-recipient event on the locker: the protocol’s side follows the factory, so watch the factory’s FeeRecipientUpdated.
Indexer rules of thumb
- Never infer state from balances. A launch rejects stray native transfers, and counts none of any stray quote tokens sent to it;
reserve()andprogress()are the truth. - Two
FeesSweptevents share a name, not a topic0: the launch’s(to, amount)per side paid bycollectFees(), and the factory’s(quoteToken, to, amount)fromsweepFees. At graduation, the launch tries to move its protocol fees to the factory — visible only as an ERC-20Transfer, and absent if the quote token refused it. - One
eth_callper launch (config()on type 1) turns the log stream into a priceable curve. Inside the anti-snipe window, buy fees also depend onopenedAt()and the buyer’s exemption. - Attribute launches to
creator, fees tocreatorFeeRecipient— they can differ. - Handle launch types: the same
LaunchCreatedstream will carry future implementations. Treat a launch’s ABI as a function of itslaunchType.