Skip to content

Fees & Holder Rewards

Every trade against a HoodPump pool generates LP fees. Anyone can trigger collectFees() on the locker to pull those fees and split them three ways.

The three-way split

LP fees collected (in WETH)


┌───────────────────┐
│  Platform share    │  ← platformFeePercentage(poolFee) of the total
└───────────────────┘

        ▼  (remaining)
┌────────────────────────┐
│  Distributor share      │  ← distributorFeePercentage% of remaining
│  (only if hasRewards)   │     (paid out to holders, see below)
└────────────────────────┘

        ▼  (remaining)
┌───────────────────┐
│  Agent share        │  ← whatever's left, paid to the Agent NFT
└───────────────────┘     owner (or split across fee recipients)

Platform share

The platform's cut depends on the pool's fee tier, not a flat rate. Lower fee tiers take a larger percentage cut, higher fee tiers take a smaller one, since a higher tier already generates more fee revenue per trade:

Pool feePlatform cut of collected fees
1% (10000)50%
2% (20000)25%
3% (30000)~16.7%

Distributor share (holder rewards)

If the token was launched with hasRewards: true, distributorFeePercentage (0–100) of the remaining fees (after the platform cut) routes to that token's DividendDistributor. If reward delivery ever fails for some reason (e.g. the swap route is misconfigured), the distributor's share gracefully rolls into the agent's share instead. collectFees() never reverts because of a reward-delivery hiccup.

Agent share

Whatever's left goes to the Agent NFT owner, see The Agent NFT for how this can be split across up to 5 wallets.

How holder rewards actually pay out

Reward tokens aren't a transfer tax. They're funded entirely from the LP fee split above. The flow:

  1. collectFees() swaps the distributor's WETH share into the launch's configured reward token (via a V3 route) and delivers it to that token's DividendDistributor contract.
  2. The distributor tracks every holder's proportional share of the pool (setShare(), called automatically on every token transfer).
  3. Payout only happens when someone calls process(gas). This is permissionless (anyone can call it) but nothing calls it automatically. It iterates holders and pays out anyone owed more than minDistribution, using up to gas worth of execution budget per call so it never runs the caller out of gas on a large holder set.

Someone has to call process()

There's no keeper built into the protocol. If you launch with rewards enabled, you (or anyone) need to periodically call process() on your token's distributor for holders to actually receive payouts. See the integration examples repo for a ready-made script.

Additional distributor rules:

  • A holder needs at least 1,000 tokens (rewardThreshold) for their balance to count toward rewards at all.
  • Payouts respect a 5-minute minimum period between claims per holder, on top of the minDistribution floor.

Reward tokens must be pre-whitelisted

You can't launch with an arbitrary rewardToken. It has to already be whitelisted on the locker, with a configured swap route and a minDistribution floor (the minimum unpaid balance before a payout triggers, denominated in the reward token's own smallest unit). Check before you launch:

js
const allowed = await locker.isRewardTokenAllowed(rewardTokenAddress);

There's no self-service way to whitelist a new reward token. If you want one added, reach out to the HoodPump team (@HoodPumps).

Built on Robinhood Chain.