Indexing Muup.fun
For anyone building an indexer against our coins from chain data rather than from the API. Four things here will silently produce believable, wrong numbers if you miss them, and each one has cost us time already.
If you only want metadata, you do not need this page
Finding our coins
A launch is attributed to Muup.fun by the factory that created it. Watch these addresses; everything they emit is ours. They are read from the registry the apps themselves resolve through, so the list cannot drift from what is live.
| Network | Chain ID | Factory | Venue |
|---|---|---|---|
| Arc | 5042 | 0x16e60002451ad549aea409ea2924a14F9BfF5f2e | Uniswap V4 |
| Robinhood Mainnet | 4663 | 0x4a3F3917e5eF514f5682abFD3dDd2C6DA039935F | Uniswap V3 |
| Robinhood Mainnet | 4663 | 0x35f120fE125Cd7D0630bb4D22B81D6b007FFaD21 | Uniswap V4 |
| Base | 8453 | 0x16e60002451ad549aea409ea2924a14F9BfF5f2e | Uniswap V4 |
| Stable Mainnet | 988 | 0x42D0C82B794c19d5D607D7018E516b4070b27E8d | Uniswap V3 |
A V4 pool has no address to watch
On Uniswap V3 each pool is its own contract and you subscribe to it. On V4 there is one PoolManager singleton per chain, every pool lives inside it, and a pool is identified by poolId — the keccak of its pool key. There is nothing per-pool to subscribe to.
// the same PoolManager on every chain Uniswap deploys V4 to0x8366a39cc670b4001a1121b8f6a443a643e40951So a V4 indexer scans the PoolManager and dispatches by poolId, rather than filtering by address. Ours scans it unfiltered every two seconds. Exactly one of poolAddress and poolId is set on any coin; anything keyed on pool address misses every V4 coin we have.
The sign convention is inverted between V3 and V4
This is the one that costs the most and shows the least. V4 reports swap amounts from the swapper’s side; V3 reports them from the pool’s. Passing a V4 amount through logic written for V3 records every buy as a sell and every sell as a buy — silently, because both are valid trades and nothing in the data looks malformed.
The tell is in aggregate, not in any single row: buy and sell volume swap places, and a coin that is being accumulated reads as one being dumped.
On some chains the reported amount is net of a fee taken outside the pool
A QuoteFeeHook takes 1% of the quote side outside the pool — before the swap on a buy, after it on a sell. The amount the pool reports is therefore not the amount the trader moved, and the correction differs by direction: gross up on a buy, net down on a sell.
| Network | Hook |
|---|---|
| Arc | 0x8B432120677A54283738ebea6Be0b15d795800cC |
| Robinhood Mainnet | 0x1506d044699704d9439714a820D495f9743200Cc |
Chains with no hook listed here have no quote-side cut at all: fees accrue inside the liquidity position instead, in both tokens, and the reported swap amount is the trader’s. Branch on whether the hook exists, not on the Uniswap version — the two are not the same question.
The first buy is invisible to every listener
A creator’s opening buy happens inside the launch transaction, before the coin exists as far as any subscriber is concerned. No listener watching for swaps can see it, however early it connects.
The only way to index it is to replay the launch block after the fact. If your first recorded trade for a coin is not its dev buy, that is why — and the coin’s opening price will be missing rather than wrong.
Do not assume the quote asset is the chain’s native token
A V4 market on Robinhood can be opened against a registered ERC-20 — tokenised equities such as NVDA, TSLA and AAPL. Its price, market cap and volume are then denominated in that asset, and most of them carry ether’s 18 decimals, so nothing about the numbers says so.
Read the pool key’s currencies, or take stats.quoteAsset from the public API. Pricing an NVDA market at ether’s rate is roughly 11x out.
Chain-specific things worth knowing
- Robinhood produces about eleven blocks a second, so a block range covers far less wall time than on most chains. Its general RPC pool does not serve
eth_getLogs; a separate endpoint is needed for them. - Arc produces a block roughly every half second, so anything sized in blocks covers about six times less wall time than on a one-second chain. Its PoolManager is shared with every other project on the chain and is busy — an unfiltered swap scan returns tens of logs per block, most of them nothing to do with Muup.fun, so a range that looks small can still exceed an RPC’s result cap. Its native USDC is 18 decimals; see the warning on Networks before reading a balance through the 6-decimal ERC-20 face.
- Base coins are native B20s minted by the chain’s factory precompile rather than deployed ERC-20 contracts, and are created with no admin at all. Their addresses all sort at or above
0xB200…0000. - Stable settles in USDT0, a dollar-pegged native token with 18 decimals. A figure there is dollars, not ether — the same decimal string means something a few thousand times different.
Tell us what breaks
