Concepts
pump.fun integration
How a coin’s creator fees actually reach the vault, step by step, checked against the real pump.fun programs.
pump.fun already has two ways to send a coin's creator fees somewhere other than the creator's own wallet. Upstream uses the first and differs from the second.
Two mechanisms that already exist
| Fee sharing config | Social fee PDA | |
|---|---|---|
| Program | Pump Fees (pfeeUxB6...VojVZ) | the same program |
| What it does | A list of up to several shareholders with shares in basis points; anyone can trigger the payout | A PDA per (platform, user id) that accumulates fees; released to a recipient on the signature of one social_claim_authority |
| Who decides | The coin's creator, once. After update_fee_shares_v2 the admin is revoked and the list is final | pump.fun's claim authority key |
| Trust | None beyond the program | One key signs every release |
The program interface (IDL) documents the platform field as 0=pump, 1=twitter, etc. and shows a single social_claim_authority signer on claim_social_fee_pda_v2. That is the part Upstream replaces: instead of one key deciding who owns a handle, several independent attesters each read the public page, and the vault checks their signatures against a code bound to one wallet.
The route, in order
- Create the vault for the coin's mint with the launcher's wallet:
initialize. The vault address is a PDA of (mint, launcher). - Sweep, if needed. In the current pump program, trading fees first build up as
creator_feeon the bonding curve. pump.fun refuses to change the creator while that is unswept (CreatorFeesNotSwept, error 6095).sweep_creator_feeis open to anyone and pays the original creator's own fee vault, so it takes nothing from anyone. A coin whose routing is set at launch has nothing to sweep. - Create the sharing config (
create_fee_sharing_config). pump.fun re-points the bonding curve's creator at the config. - Set the shareholders (
update_fee_shares_v2): the vault, 100 percent. This call is one-way: pump.fun marks the admin as revoked, so neither the launcher nor anyone else can change the routing afterwards. - Fees accrue. Each trade adds to the coin's creator fee.
sweep_creator_feemoves it to the config's vault anddistribute_creator_fees, which anyone can call, pays the shareholders. The Upstream vault receives plain SOL. - Crank, then claim.
crankmeasures what arrived and splits it. The owner proves the handle andclaimreleases what is waiting.
What was run against the real programs
The test tests-chain/pump-fork.test.mjs forks Solana mainnet, takes a recent real pump.fun coin that had no sharing config, installs the vault program, and plays steps 1 to 6 with the real pump.fun programs (signature checks are off on the fork, so it can act as that coin's creator; nothing touches mainnet). The last run, 2026-10-09:
coin 5BHTmt8bnEizr5tcokZTWoHjMmptR29Me6MqLrVWpump creator gMBQ9t4MnPgAkaZ8A783vdgJa5qmRueSF4K2ntGuMk8
upstream vault 4KkZBKgtuEfmMMy55TYKC8faRVcg1ekVDMfBX6cHZNzv
unswept creator_fee on the bonding curve: 0.019394101 SOL (quote mint 11111111111111111111111111111111)
pump.fun accepted the vault as sole shareholder (100 %), admin revoked, bonding curve re-pointed
pump.fun distribute_creator_fees paid the vault 5 SOL
streamer claimed 4.5 SOL, launcher kept 0.5 SOL
Trading fees are not real in that test: the fork credits the bonding curve's creator_fee field directly, as trades would. Everything after that point, from the sweep to the payout, is pump.fun's own code.
Bonding-curve fees paid in SOL. Fees on coins that graduated to PumpSwap, and coins quoted in a token other than SOL, flow through the quote-token path (distribute_creator_fees_v2, wrapped SOL in token accounts), which the vault does not accept yet. The launcher must be the coin’s creator to run steps 2 to 4.
Why the one-way step matters
Because the routing is final, a launcher who sets it cannot later take it back, which is exactly what a streamer who has not claimed yet needs to know. The flip side is just as real: if the vault program has a bug, the fees of every coin routed to it are affected, and that cannot be undone. That is why the program is small, tested against the JS reference on random histories, and should be audited and frozen before real coins are routed to it.