mint.fast docs

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):

SplitbpsShare of harvested fees
Fletcher (social)500050%
LP reinvest250025%
Protocol250025%

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 + totalPendingEth

sweepProtocolFees

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

KnobWhoApplies to
Hook FEE_BPS = 200immutableforever
creationFeeownerfuture creates only
default social / LP bpsownerfuture creates only
per-token splitsimmutable after createthat token
Fletcher listcreator once if unlocked, or fee manager anytimeafter auto-harvest to old set
treasuryownernext 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.