Platform › Project launches › The bonding curve

Project launches

The bonding curve

How price follows supply on the curve, what a trade pays, the per-wallet cap and launch tax, and the refund hatch.

Version
1.0
Updated
2026-10-14
Source
Launchpad contract sources · Launchpad contracts — design reference, parts 1 and 2

Status#

Price against supply#

The curve is constant-product over virtual reserves: a virtual currency reserve x and a virtual token reserve y, with spot price x / y. A buy adds currency and removes tokens; a sell does the reverse.

text
C  = curve allocation          (750,000,000 with no holdbacks)
L  = pool allocation           (250,000,000)
T  = graduation target         (net currency raised)
R  = L * C / (C - L)           (375,000,000 with no holdbacks)

y0 = C + R                     (1,125,000,000)
x0 = T * R / C                 (T / 2), rounded up

tokens out  = y * dx / (x + dx)        rounded down
currency out = x * dy / (y + dy)       rounded down
The base curve (no milestone reserve, no quest allocation)
PointPrice per tokenFDV
Openingx0 / y0 = T / 2,250,000,000T / 2.25
Completion(x0 + T) / R = T / 250,000,0004 × T
Pool openingT / L — equal to the completion price4 × T

The price runs 9× from first buy to completion, and the pool opens exactly where the curve closes. A milestone reserve or quest allocation shrinks C while L stays 250,000,000; R is recomputed and x0 rounds up so the curve cannot run out of tokens before the target. Live values: spotPriceWad(), fdvWei(), curveTokensRemaining(), progressBps().

A launch that raises in an ERC-20 runs the same arithmetic in that currency’s units. The ...Eth... function names are kept for every currency.

What a trade pays#

Trade fee on the curve (production)
SideRateTaken from
Buy2% plus any live launch taxThe currency sent, before it reaches the curve
Sell2%The currency the curve pays out
Ceiling5% (MAX_TRADE_FEE_BPS)Any future configuration

All fees accrue to tradeFeesAccrued. claimTradeFees() is permissionless and sweeps the whole balance to TradeFeeSplitter, which divides it on the terms frozen at launch:

Split of every curve fee (production terms)
LegSharePaid to
Creator30%The launch’s CrewSplitter
KOL40%KolSplitter, credited to the launch
Protocol30% (the rest)ReferralLedger, credited to the launch

See Creator fees and Referrals and KOLs.

The per-wallet cap#

Per-wallet cap
TermValueSet by
Size0.5%, 1%, 1.5%, 2% or 2.5% of supply; 2% if none chosenThe creator, at launch
DurationUntil the curve completes (production)PricingRules, stamped on the curve at launch
Measured onThe buyer’s token balance—
Applies toEvery buy, the creator’s opening buy included—

Before graduation a balance can only rise by a buy on the curve, so a sell or a burn frees room. The duration may be a timed value of up to 7 days or “until graduation”; it is never zero. earlyWalletCap(wallet) returns the cap, the balance held and the headroom left.

Launch tax and the direction lock#

Launch tax and the direction lock
RuleValue
Launch tax start0% to 90%, chosen by the creator
Decay1 percentage point every 10 seconds — at most 15 minutes from launch
Charged onBuys only, on top of the trade fee; the creator’s opening buy is exempt
Paid toThe same balance and split as the trade fee
EndsAt zero, or when the curve completes
Direction lockOne account may not buy and sell in the same L1 block (OppositeTradeInSameL1Block)

Read the live tax with launchTaxBps() and its end with launchTaxEndsAt(); buyFeeBps() is the whole buy fee now. A buy is keyed on its recipient and a sell on its seller for the direction lock.

Completion and the refund hatch#

From completion to graduation or refund
EventWhat happens
The target is reachedThe curve completes and stops trading. Currency sent beyond the target is refunded to the buyer.
Within 3 daysAnyone may call graduate(). See Graduation and the locked pool.
After 3 days, not graduatedGraduation closes and redeem() opens: each token returns tokenAmount × realEthReserve / tokensSold, fee-free, the same rate for every holder in any order.