Muup.fun
Open the app

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

Art, links, creator and launch time come from the public API, which needs no key. This page is about reconstructing trades and prices yourself.

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.

NetworkChain IDFactoryVenue
Arc50420x16e60002451ad549aea409ea2924a14F9BfF5f2eUniswap V4
Robinhood Mainnet46630x4a3F3917e5eF514f5682abFD3dDd2C6DA039935FUniswap V3
Robinhood Mainnet46630x35f120fE125Cd7D0630bb4D22B81D6b007FFaD21Uniswap V4
Base84530x16e60002451ad549aea409ea2924a14F9BfF5f2eUniswap V4
Stable Mainnet9880x42D0C82B794c19d5D607D7018E516b4070b27E8dUniswap 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 to0x8366a39cc670b4001a1121b8f6a443a643e40951

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

NetworkHook
Arc0x8B432120677A54283738ebea6Be0b15d795800cC
Robinhood Mainnet0x1506d044699704d9439714a820D495f9743200Cc

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

If your indexer disagrees with our own numbers, we would rather hear it than not. Both sides read the same chain, so a disagreement is a bug somewhere and it is as likely to be ours.