Harvest and fees
Hook fee, harvest splits, pending LP ETH, and sweeping protocol fees.
The 2% hook fee
MintFastHook charges 200 bps of the ETH side on every swap (buys and sells). The pool's own LP fee is zero. Fees accrue per token as ERC-6909 claims on the PoolManager until harvest.
- Exact-in buys: 2% of the full ETH input (including unfilled remainder on a partial fill)
- Other shapes: 2% of ETH actually moved
Read pending hook fees with hook.pendingFees(token).
harvest
function harvest(address token) external returns (uint256 devEth);Permissionless. Pulls fresh fees from the hook, then splits using the token's snapshotted socialSplitBps and lpSplitBps:
devEth = fresh * socialSplitBps / 10000 // Fletcher cut → vault
lpEthFresh = fresh * lpSplitBps / 10000
protoEth = fresh - devEth - lpEthFresh // → protocolFeesAccrued
lpEth = lpEthFresh + pendingEth[token]Defaults at create (unless owner changed defaults earlier):
| Split | bps | Share of harvested fees |
|---|---|---|
| Fletcher (social) | 5000 | 50% |
| LP reinvest | 2500 | 25% |
| Protocol | 2500 | 25% |
At those defaults, effective take from the ETH side of a swap is about 1% Fletcher / 0.5% LP / 0.5% protocol.
LP reinvest and pendingEth
The LP cut tries to mint more ETH-side liquidity in a spacing-aligned range between the current price and the launch boundary. If there is no placeable room yet (price too close to the boundary, or dust), the ETH stays in pendingEth[token] and rolls into the next harvest. It is never swept to the protocol.
Solvency identity when nothing is mid-flight:
address(launchpad).balance == protocolFeesAccrued + totalPendingEthsweepProtocolFees
function sweepProtocolFees() external;Permissionless pull-payment: sends protocolFeesAccrued to treasury and zeroes the accrual.
Creation fees collected at mint also land in protocolFeesAccrued and leave through the same sweep.
What can change later
| Knob | Who | Applies to |
|---|---|---|
Hook FEE_BPS = 200 | immutable | forever |
creationFee | owner | future creates only |
| default social / LP bps | owner | future creates only |
| per-token splits | immutable after create | that token |
| Fletcher list | creator once if unlocked, or fee manager anytime | after auto-harvest to old set |
treasury | owner | next sweeps |
Example calls
await walletClient.writeContract({
address: launchpad,
abi: launchpadAbi,
functionName: "harvest",
args: [token],
})
await walletClient.writeContract({
address: launchpad,
abi: launchpadAbi,
functionName: "sweepProtocolFees",
})Fletcher recipients then claim from the vault. See Claim fees.