Pump.fun bonding curve mathematics: how the price actually moves.
A first-principles walkthrough — the constant-product invariant, the virtual SOL reserve, the exact price formula, why early buyers pay less than late buyers, the graduation cap, and how to compute the SOL needed to push from any curve position to graduation. With worked examples.
Pump.fun's bonding curve is a constant-product AMM (x · y = k) over a synthetic SOL/token pair, biased by a large virtual SOL reserve. Price scales non-linearly: late buyers pay sharply more SOL per token than early buyers. The curve graduates to Raydium when the real SOL reserve crosses a fixed threshold (~85 SOL of real liquidity, ~$69k market cap on launch). Knowing the math lets you size your trades to curve position instead of guessing.
What a bonding curve actually is
A bonding curve is a deterministic price function: the price of token X at any moment is a known mathematical function of how much X has been issued so far. There is no order book, no liquidity provider, no market-maker — just a formula that says "if you want to buy the next 100 tokens, here is exactly how much you pay."
For Pump.fun specifically, the curve is implemented as a constant-product AMM with a synthetic counter-asset. The protocol pretends, for math purposes, that there is a SOL/token pool. Every buy adds SOL to the pool and removes tokens. Every sell adds tokens and removes SOL. The math that governs the prices comes from one equation that the pool must always satisfy.
The constant-product invariant
The invariant is the same one that powers Uniswap v2:
x · y = k
Where:
xis the SOL reserve in the pool (real + virtual — see next section).yis the token reserve in the pool.kis a constant set at curve creation, equal to the initial product of the two reserves.
For any trade, the pool must end up at a new (x', y') such that x' · y' = k still holds. This is what determines the price you pay.
Concretely: if you want to buy Δy tokens (so the new token reserve is y - Δy), the new SOL reserve must be x' = k / (y - Δy), and the SOL you must put in is Δx = x' - x. That Δx is the cost of your buy.
The virtual SOL reserve
If Pump.fun started a curve with zero SOL in the pool and 1 billion tokens, the math would explode — the first buy would face a price function that grows asymptotically. To keep early-stage prices sane, every curve starts with a virtual SOL reserve baked into the pool from inception.
The virtual SOL is not actually held by the contract — it is a number that exists only to bias the math. It makes the early curve look "as if" there were already significant liquidity in the pool, so the first buyer doesn't pay a million SOL for a million tokens.
The Pump.fun curve, at the time of writing, initializes with approximately:
- Virtual SOL reserve: ~30 SOL.
- Token reserve: ~1.073 × 10⁹ tokens (1.073 billion, of which 793M are sellable on the curve and 280M are reserved for the post-graduation Raydium pool).
k(initial): ~30 × 1.073 × 10⁹ = ~3.22 × 10¹⁰.
(Numbers are approximate and have varied across protocol updates — the structural math is what matters.)
Computing price at any point
The instantaneous price P of one token at any pool state (x, y) is:
P = x / y(SOL per token)
This is the same as Uniswap. At curve start, with x ≈ 30 and y ≈ 1.073 × 10⁹:
P_initial ≈ 30 / 1.073e9 ≈ 2.8 × 10⁻⁸ SOL/token
That is roughly $0.0000028 per token at SOL ≈ $100 — a market cap of ~$2,800 at curve creation, which is the baseline Pump.fun starts every token at.
Cost to buy N tokens
To buy Δy tokens at current state (x, y), the SOL you put in is:
Δx = x · Δy / (y - Δy)
Or equivalently:
Δx = k / (y - Δy) - x
Both forms come from the same constant-product equation. The first is intuitive; the second is what you actually compute on-chain because k is a stored value.
The average price you pay across the buy is Δx / Δy. The marginal price after the buy is (x + Δx) / (y - Δy). Marginal is always higher than average for a buy — that gap is what late buyers feel.
The graduation cap
Pump.fun closes the curve and migrates to Raydium when the real SOL reserve in the pool crosses a fixed threshold. "Real" here means the SOL actually held by the curve contract, not the virtual SOL used for math:
real_SOL = x - virtual_SOL
The graduation threshold is roughly 85 SOL of real reserve, corresponding to a token market cap of approximately $69,000 at SOL ≈ $100. (The exact threshold has shifted across Pump.fun protocol versions.)
When graduation triggers:
- The remaining curve tokens (~793M) and the accumulated SOL (~85 real SOL) are migrated to a new Raydium AMM pool.
- The bonding curve contract is closed — no more trades happen on it.
- The token now lives on Raydium, with all the implications of an AMM-based price discovery (LP fees, MEV exposure, range orders, etc.).
Worked examples
Example 1: Cost to buy 1M tokens at curve start
State: x = 30 SOL (virtual + real ≈ 30), y = 1.073 × 10⁹ tokens.
Buy: Δy = 1,000,000 tokens.
Cost: Δx = 30 · 10⁶ / (1.073e9 - 10⁶) = 30 · 10⁶ / 1.072e9 ≈ 0.0280 SOL.
You pay 0.028 SOL for 1M tokens. Average price: 2.8 × 10⁻⁸ SOL/token — basically the initial price, because the buy is small relative to y.
Example 2: Cost to buy 1M tokens halfway up the curve
Assume real SOL reserve has grown to 40 SOL, so x = 70 (30 virtual + 40 real). To find the corresponding y at this state, we use the invariant: k = 3.22 × 10¹⁰, so y = k / x = 3.22e10 / 70 ≈ 4.6 × 10⁸ tokens remaining.
Buy: Δy = 10⁶ tokens.
Cost: Δx = 70 · 10⁶ / (4.6e8 - 10⁶) ≈ 70 · 10⁶ / 4.59e8 ≈ 0.1525 SOL.
The same 1M tokens cost 5.4× more at this point on the curve than at the start. That is the non-linearity in action.
Example 3: Cost near graduation
Assume real SOL reserve has grown to 80 SOL, so x = 110. Then y = 3.22e10 / 110 ≈ 2.93 × 10⁸ tokens remaining.
Buy: Δy = 10⁶ tokens.
Cost: Δx = 110 · 10⁶ / (2.93e8 - 10⁶) ≈ 0.377 SOL.
Same 1M tokens, this time costing 13.5× more than at curve start. This is why dumping a large session into a curve already at 80% position is inefficient — most of your SOL buys very few tokens, contributes minimally to graduation progress, and pushes price far past where any organic buyer would step in.
SOL needed to graduate from any position
One of the most useful applications of this math: how much SOL do I need to push the curve from its current position to graduation? The answer follows from the constant-product invariant — the curve graduates when the real SOL reserve hits ~85, so:
SOL_to_graduate = (85 + 30) - x_current = 115 - x_current
Where x_current is the current total reserve (virtual + real). For example:
- Curve at
x = 35(virtual 30 + real 5): need115 - 35 = 80SOL of buys to graduate. - Curve at
x = 70(virtual 30 + real 40): need115 - 70 = 45SOL. - Curve at
x = 100(virtual 30 + real 70): need115 - 100 = 15SOL.
Note: this is the SOL paid into the pool, not "SOL spent on the chain". The actual SOL you need to send is slightly higher because of LP fees (1% on Pump.fun curves) and Solana network fees.
vs. Uniswap CPMM
Pump.fun's curve is mathematically identical to Uniswap v2's constant-product AMM, with three structural differences:
- Virtual reserve. Pump.fun bakes in a starting SOL reserve so the early curve has tame prices. Uniswap pools start from real LP deposits.
- No LP positions. Pump.fun does not let users provide liquidity. The pool is fully synthetic until graduation. Uniswap is the opposite — anyone can provide.
- Graduation transition. When the curve hits the cap, Pump.fun migrates to a real Raydium AMM pool. Uniswap pools just keep going.
The price math is the same. The implications for traders are different.
Implications for your launch
- Early SOL is much more efficient than late SOL. 10 SOL spent at
x = 35moves the curve more than 10 SOL spent atx = 100. If your goal is graduation, front-load. - Late-curve volume is for visibility, not progress. Once the curve is past 80% real reserve, additional volume mostly buys price impact rather than graduation distance. Late-curve runs are about appearing on the trending board, not about pushing the curve.
- The 85-SOL graduation threshold is a hard line, not a target. Many launches that aim for graduation overshoot — they hit 85 SOL and stop, but the resulting Raydium pool has no remaining curve momentum. Plan the post-graduation phase from the start.
- Sizing trades inversely to curve position keeps price impact even. A bot that fires constant-size trades wastes SOL late on the curve. A curve-aware bot scales trade size down as
xgrows. - Slippage is your enemy on late-curve buys. A 5 SOL buy at
x = 100moves the price meaningfully — the average price you pay is much higher than the spot price you saw before submitting. This is also why MEV protection matters more on late-curve trades than early ones.