Complete Pump protocol fee system — tiered protocol fees based on market cap, creator fee collection across two programs, basis point arithmetic, and ceiling division for dust-safe calculations.
Implement and extend the Pump protocol's fee system: tiered protocol fees based on market cap, creator fee collection across two programs, and fee computation with ceiling division.
The Pump protocol charges fees on every buy/sell transaction. Fees flow to protocol fee recipients and token creators. The fee system spans three programs and must handle tokens in both bonding curve and graduated (AMM) states.
| Fee | Recipient | When Charged |
|---|---|---|
| Protocol fee | feeRecipients[] in Global | Every buy/sell |
| Creator fee | Token creator's vault PDA | Every buy/sell (if creator is set) |
| LP fee | Liquidity providers (AMM only) | Post-graduation trades |
When a FeeConfig exists, fees are market-cap-dependent:
function calculateFeeTier({ feeTiers, marketCap }): Fees {
// Iterate tiers in REVERSE order
for (let i = feeTiers.length - 1; i >= 0; i--) {
if (marketCap >= feeTiers[i].marketCapLamportsThreshold) {
return feeTiers[i].fees;
}
}
return feeTiers[0].fees; // fallback to lowest tier
}
function getFee({ global, feeConfig, mintSupply, bondingCurve, amount }): BN {
const { protocolFeeBps, creatorFeeBps } = computeFeesBps(...);
const protocolFee = ceilDiv(amount * protocolFeeBps, 10000);
const creatorFee = hasCreator ? ceilDiv(amount * creatorFeeBps, 10000) : 0;
return protocolFee + creatorFee;
}
Creator fees accumulate in PDAs:
creatorVaultPda(creator) — Pump program vaultammCreatorVaultPda(creator) — PumpAMM program vaultBalance = total lamports - rent exemption minimum.
| Error | Condition |
|---|---|
NoShareholdersError | Empty shareholders array |
TooManyShareholdersError | More than 10 shareholders |
ZeroShareError | Shareholder has shareBps <= 0 |
InvalidShareTotalError | Shares don't sum to 10,000 bps |
DuplicateShareholderError | Duplicate addresses |
ceilDiv) for all fee calculations to prevent dust losssimulateTransaction) for read-only fee queriesbondingCurve.creator != PublicKey.default or it's a new curvecomputeFeesBps returns different results depending on whether feeConfig is null (legacy vs tiered)getMinimumDistributableFee requires transaction simulation — it cannot be computed offlinetransferCreatorFeesToPump is only for graduated tokens — non-graduated tokens will fail