How Catflow Works
What a flow is
A flow is a coin's creator-fee right, held as an NFT. Whoever holds the NFT is the coin's registered creator for fee purposes, and receives the fee on every trade the coin makes. It is the right itself — not a claim on a fund, not a share in a pool. MotoSwap's vault pays the address the registry names, and the NFT's holder is that address.
That makes a flow a perpetual, cash-paying stream: a bet on the coin's trading volume. It can be listed, offered for, and sold like any other NFT.
Where the fees come from (Ethereum, moto.fun)
Every moto.fun coin pays its creator:
- 0.5% of every trade while the coin is on its bonding curve;
- 0.3% of every swap on its pools after it graduates — with no end date.
The fees accrue in MotoSwap's CreatorFeeVault, and they are paid in the trade's quote asset: ETH on the curve and on the coin/ETH pool, MOTO on the coin/MOTO pool. Never in the coin itself. A flow therefore pays out two assets, ETH and MOTO, at every claim.
Accrual is keyed per coin, not per recipient. Whatever is unclaimed at the moment the right moves goes with it.
Where the fees come from (Robinhood Chain, pons)
The fee source is different on pons. pons runs two generations of
launch on Robinhood Chain, and every coin belongs to exactly one of them, so the app routes each
coin to the factory for its generation: generation-1 flows live at /catflow/rh/:id and
generation-2 flows at /catflow/rh/v2/:id. Everything other than the fee source — the NFT,
listings, offers, the claim fee, sale fees, release — is the same market in all three cases.
Generation 1
A generation-1 pons coin's whole supply sits in a single Uniswap V3 position that pons's locker holds forever, and pons pays the creator 70% of the fees that pool collects — in WETH and the coin itself, not ETH and MOTO.
Two consequences carry into the market:
- Hand-over is
locker.setFeeRedirect(coin, position)— the pons equivalent ofregistry.setCreator. Only the coin's current fee recipient can create its flow. - Anyone can push fees in. pons's
collectFeesis callable by several parties, so a claim pays out the position's whole balance rather than a delta around its own collect. That is why a pons flow pays in the coin as well as WETH.
Generation 2
Every new pons launch is a generation-2 coin. It trades on a bonding curve first, and a trade charges its fee against the coin's quote asset — native ETH on most coins, otherwise a Robinhood stock token. Stock tokens are ordinary ERC-20s, but they do not all use 18 decimals (USDG uses 6), so a figure is always shown in the token's own units. The curve never accrues the coin itself.
sweepFees moves the creator's share into a shared fee escrow, which credits whoever is the
coin's fee recipient at the moment of the sweep. Three things follow:
- Hand-over is
transferCreatorFeeRecipient(coin, position)on the launch factory. Only the coin's current recipient can call it, and unlike generation 1 it is instant — there is no timelock on this path. - A flow settles a sale only when it can sweep. A small share of coins turn on a buyback mechanism, and on those only pons's own operator may sweep — so the position could not settle the seller's pending fees at sale time, and those fees would fall to whoever bought the flow. Catflow therefore refuses to open a flow on such a coin at all, and every sale path re-checks it, so a flow whose fees cannot be settled can never be sold. It is a deliberate trade-off: it declines roughly 4% of launches to keep a seller from handing a buyer fees that were theirs.
- The pending balance is read directly from the escrow instead of being simulated, so the claimable figure is the real number. Where a figure also counts fees still sitting on the curve, the copy says so, so nothing reads as money the flow might not collect.
There is no on-chain USD price for a stock token, so a flow over a stock-quoted coin shows its fees in that token and never as a dollar figure.
Creating a flow, and handing the right over
Creating a flow and giving it the right are two separate transactions:
- Create — the app clones a position contract for the coin and mints you the NFT. At this point the position holds nothing; the right is still yours.
- Hand over — you call
registry.setCreator(coin, position)on Ethereum,locker.setFeeRedirect(coin, position)on Robinhood Chain generation 1, ortransferCreatorFeeRecipient(coin, position)on generation 2 — each names the position as the address paid the coin's fees. Only the current creator / fee recipient can do this, so you do it yourself; Catflow never needs your key.
On generation 2 those two transactions are adjacent, and until the second one lands you are still the coin's fee recipient — which is why the List-fees step offers to collect any fees already sitting on the curve first. If you skip it, they simply become the flow's and are paid out on the flow's next claim.
Until step 2 the flow is inert. isActive() returns false, and every sale path refuses it.
isActive() — the one-line health check
isActive() is true when the coin's registered creator is this position. It is false before
you hand the right over, and it goes false again if MotoSwap takes the coin's fees back (see
below). A flow that is not active cannot be bought — buy and acceptOffer both revert — so a
buyer is never sold a right that has already moved.
The pending balance
Fees that have accrued but not yet been claimed are the pending balance. Two things matter:
- A sale through Catflow pays the pending balance to the seller. When you sell a flow, the sale claims every pending fee (less the claim fee) and pays it to you, inside the same transaction. You keep everything you earned up to the sale; the buyer starts at zero.
- A sale elsewhere does not. An ordinary
transferFrom, or a sale on another marketplace, carries the pending balance to the new holder, because hooking a claim into every ERC-721 transfer would give the transfer a way to revert. If you are selling off-market, claim first.
The app's listing flow makes this explicit, so a seller is never surprised by it.
Taking it back out
release(to) calls registry.setCreator(coin, to) on Ethereum (on Robinhood Chain,
locker.setFeeRedirect(coin, to) for generation 1 and
transferCreatorFeeRecipient(coin, to) for generation 2) and hands the fee right to any wallet
you name. The position keeps nothing. It is the escape hatch — the way to stop using Catflow at
all.
release requires isActive(): once MotoSwap has reassigned or disabled a coin, the position no
longer holds a right it can hand back, and release reverts.
What Catpound can and cannot do
- It cannot take a flow. There is no admin path to move your NFT or your fees. The NFT is a standard ERC-721: whoever holds it, holds the flow.
- It cannot raise your fees after the fact. Fee rates are fixed per flow and per listing; see Fees.
- It can be beaten to a claim, but never to the money. A claim is open to anyone, but it always forwards to the current NFT owner.
- The launchpad's owner is a separate, larger trust boundary. On Ethereum, MotoSwap's registry
owner can reassign any coin's fees (
adminSetCreator) or stop them accruing (setDisabled); on Robinhood Chain, pons's owner can redirect any coin's fees and upgrade the locker. Catflow cannot remove either power, so it is disclosed on every listing. See the FAQ for the full picture.