Teardown
What we read, what we rebuilt
pump.fun's holder rewards, from its own public docs and IDL: HOLDER_REWARDS_README.md and idl/pump.json. We are not pump.fun and run none of its code: the mechanism is rebuilt on Raydium LaunchLab.
| pump.fun | What it does there | What BAGHOLDR does on Raydium |
|---|---|---|
| distribute_fee_to_holders(amounts) | Pays a coin's holders out of its holder_rewards account. The amounts arrive as a list, one per recipient, worked out off chain. | The creator's wallet claims its LaunchLab fee vault and sends each holder a SOL transfer, pro rata by balance, worked out in your browser from chain balances. |
| holder_reward_claim_authority | One global key, set by pump.fun's admin, signs every payout. | Only the coin's creator wallet can claim its vault, so only the creator can press pay. The site refuses any other wallet before the popup. |
| holder_rewards (per mint) | One holder-rewards account per coin holds that coin's creator fee. | LaunchLab keeps ONE creator fee vault per creator wallet, across all its coins. A claim takes all of it, and the payout sends all of it to the holders of the coin you press on. |
| HolderRewardRecipientsMismatch | The amounts and the recipient accounts must match one for one. | Native SOL only: one system transfer per wallet, built from the same list that's shown on the page. |
| HolderRewardTokenAccountMissing | On a token quote, a holder-rewards token account is required. | SOL quote only. The claim lands in wrapped SOL and is closed back to SOL in the same transaction, then sent on. |
| HolderRewardsRentFloor | The holder-rewards account can't be left below its rent-exempt minimum. | A holder whose wallet would still sit under Solana's rent floor can't receive SOL. That share stays with the creator, and the coin page lists it. |
| DistributeFeeToHoldersEvent { recipients, total } | Each payout emits how many were paid and the total. | Each payout transaction carries this pad's key and a memo (bagholdr|holders|<mint>|<lamports>|i/n). The coin page and Rewards read the history back from chain with nothing else. |
| update_holder_reward_config | Admin only. Sets is_holder_reward_enabled and holder_reward_claim_authority. | No switch and no authority key: any coin launched here has holder rewards, and its creator is the one who pays. |
| create_v2(…, is_holder_reward) | A holder-rewards coin records a pump.fun controlled address as its creator, so no person can claim the fee. | The creator stays a wallet (LaunchLab needs one). The rules (top N, minimum bag, exclusions) are locked into the coin's metadata under extensions.holderRewards. |
| TradeEvent.holder_rewards_bps | Trades report the creator fee rate and amount that went to holders. | The creator fee is LaunchLab's: 0.05% of each trade, read from the platform account on every coin page. |
| HolderRewardCreatorImmutable | A holder-rewards coin's creator can never be changed. | The fee vault is keyed to the creator wallet recorded in the pool, and only that wallet can claim it, so only that wallet can pay holders. |
What runs where
Raydium's program enforces
The curve, the 85 SOL raise and graduation, every fee (protocol 0.25%, platform 0.75%, creator 0.05%), and that only the creator's wallet can claim its fee vault.
The signed transaction does
Claims the whole vault and sends each listed holder their SOL in the same signing. One wallet popup, as many transactions as the holder count needs, each one checkable on Solscan.
The creator decides
When to press the button. Raydium's program doesn't know the holder rules: they live in the coin's metadata, and this site works out the split from them and from chain balances every time.