LESSON 2 OF 10·Beginner9 min

The Pump.fun Bonding Curve Explained (With the Actual Math)

How Pump.fun's constant-product bonding curve prices tokens, where the virtual reserves come from, how the ~85 SOL migration threshold works, and how to compute price and market cap yourself.

Every Pump.fun price you have ever seen comes out of one equation. Once you understand the constant-product bonding curve and its virtual reserves, you can compute price, market cap, and migration progress for any token directly — no API, no guesswork.

It’s a constant-product AMM

Pump.fun’s bonding curve is a constant-product market maker — the same x · y = k invariant Uniswap and Raydium use — but with a twist: the reserves are virtual. Instead of requiring a real liquidity provider to deposit both sides, the contract initializes the curve with virtual token and SOL reserves that define the starting price and shape of the curve.

THE INVARIANT
virtual_sol_reserves × virtual_token_reserves = k   (constant)

price_per_token (in SOL) = virtual_sol_reserves / virtual_token_reserves

When someone buys, tokens leave virtual_token_reserves and SOL is added to virtual_sol_reserves. Because the product k must stay constant, removing tokens forces the SOL side — and therefore the price — up. Selling does the reverse. There is no order book; the curve is the counterparty to every trade.

Where the numbers start

The commonly used initial parameters for a fresh Pump.fun curve are approximately:

ReserveInitial valueMeaning
virtual_token_reserves~1,073,000,000 tokensStarting token side of the curve
virtual_sol_reserves~30 SOLStarting SOL side — sets the opening price
real_token_reserves~793,100,000 tokensTokens actually available to buyers on the curve
token_total_supply1,000,000,000Fixed supply (6 decimals → 1e15 base units)

With ~30 SOL against ~1.073B tokens, the opening price is roughly 30 / 1,073,000,000 ≈ 2.8 × 10⁻⁸ SOL per token — a market cap around a few thousand dollars at typical SOL prices. Every buy nudges those reserves and re-prices the whole supply.

“Virtual” reserves are why a Pump.fun token has a live price with zero real liquidity at launch. The curve simulates a pool that does not exist yet. Real SOL only accumulates as people actually buy.

Computing price and market cap yourself

Given the live reserves (which you can read straight off the bonding curve account — see How to Read Pump.fun Token Data On-Chain), the math is direct. Remember the unit conversions: SOL reserves are in lamports (÷ 1e9), token reserves are in base units with 6 decimals (÷ 1e6).

PRICE + MARKET CAP
const solReserves   = Number(virtual_sol_reserves) / 1e9;   // → SOL
const tokenReserves = Number(virtual_token_reserves) / 1e6; // → tokens

const priceInSol = solReserves / tokenReserves;             // SOL per token
const priceInUsd = priceInSol * solPriceUsd;

const supply     = 1_000_000_000;                           // fixed
const marketCap  = priceInUsd * supply;

The migration threshold

The curve is designed to “complete” once buyers have absorbed the real token reserves — historically when about ~85 SOL has been raised into the curve, corresponding to roughly a $69k market cap. At that point the complete flag on the account flips to true and the token graduates to a real AMM pool (Raydium historically; PumpSwap since 2025), where the accumulated SOL and remaining tokens seed genuine liquidity.

// Rough migration progress from live reserves
const raised   = (Number(virtual_sol_reserves) / 1e9) - 30; // minus the initial virtual 30
const progress = Math.min(1, raised / 85);                  // 0.0 → 1.0

console.log(`${(progress * 100).toFixed(1)}% to migration`);
Migration progress ≈ SOL raised so far ÷ ~85 SOL completion target.
These economic constants (30 virtual SOL, ~85 SOL to complete, ~$69k) are the widely-documented historical parameters. Pump.fun has adjusted mechanics over time, so treat them as the model’s shape rather than guaranteed forever-fixed values — and always read the live complete flag rather than inferring it.

Why devs should care

  • Slippage grows along the curve. Early buys move price far more per SOL than late buys — the curve flattens as reserves grow.
  • Market cap is a curve output, not an input. You cannot “set” it; it is entirely a function of how much SOL is in the curve.
  • Migration is a liquidity event. Graduating to an AMM changes the microstructure — real LPs, real slippage, and MEV all appear post-migration.

FAQ

Why does the price move so much on tiny early buys?
Because the curve is steepest at the start. With reserves near their initial values, a small SOL inflow shifts the ratio a lot. As reserves grow, the same SOL buys proportionally less price movement.
Is the market cap 'real'?
It is a mathematical output of the curve: price × 1B supply. It reflects what the last marginal token traded at, not what you could sell the whole supply for — selling large amounts walks the price back down the curve.
What exactly triggers migration?
The bonding curve completing — buyers absorbing the real token reserves, historically ~85 SOL raised. The contract flips the account's `complete` flag and the token graduates to an AMM pool.
Can I read the curve state without an API?
Yes. Every value here lives in the bonding curve account on Solana and is readable with a single getAccountInfo RPC call. See our on-chain reading guide.