What we read, what we rebuilt
pump.fun's holder rewards, from a community reconstruction of its public programs: lalalune/pumpfun-source. Each row links the file and line. We are not pump.fun and run none of its code: the mechanic is re-implemented on Raydium LaunchLab.
| pump.fun | What it does there | What this pad does on Raydium |
|---|---|---|
| distribute_fee_to_holders(amounts: Vec<u64>) | Pays a coin's holders out of its holder-rewards account. The amounts come in as a list, one per recipient, worked out off chain. | The creator's wallet claims its LaunchLab fee vault and pays each holder a SOL transfer, pro rata by balance, worked out in the browser from chain balances. |
| has_one = holder_reward_claim_authority | Only one global key, set by pump.fun's admin, may sign a payout. | Only the coin's creator wallet can claim its vault, so only the creator can press the button. The site refuses any other wallet before the popup. |
| seeds = [b"holder-rewards", mint] | One rewards PDA 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 it on. |
| HolderRewardRecipientsMismatch | Recipients come as account pairs (wallet, token account) and must match the amounts one for one. | Native SOL only: one system transfer per wallet, no token account needed, so no rent is spent on recipients. |
| close_account + transfer_native | On a SOL quote, closes the wrapped-SOL account into the PDA, then sends native SOL to each holder. | Claims the vault into wrapped SOL, closes it back to SOL in the same transaction, then sends native SOL to each holder. |
| HolderRewardsRentFloor | The rewards PDA can't be left holding less than its rent-exempt minimum. | A holder whose wallet would end 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 an event with how many were paid and the total. | Each payout transaction carries this pad's key and a memo (holders-ray|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 on the global account. | 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-reward coin's creator is set to the holder-rewards PDA, so no person can claim the fee. | The creator stays a wallet (LaunchLab needs one). The rules (top N, minimum balance, exclusions) are frozen in the coin's metadata under extensions.holderRewards. |
| BondingCurve.is_holder_reward | A flag on the curve. Trades report holder_rewards_bps and holder_rewards equal to the creator fee. | The creator fee is LaunchLab's: 0.05% of each trade, read from the pool on every coin page. |
| HolderRewardCreatorImmutable | A holder-reward 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 does not know the holder rules: they live in the coin's metadata, and this site computes the split from them and from chain balances every time.