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.
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.
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| Point | Price per token | FDV |
|---|---|---|
| Opening | x0 / y0 = T / 2,250,000,000 | T / 2.25 |
| Completion | (x0 + T) / R = T / 250,000,000 | 4 × T |
| Pool opening | T / L — equal to the completion price | 4 × 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#
| Side | Rate | Taken from |
|---|---|---|
| Buy | 2% plus any live launch tax | The currency sent, before it reaches the curve |
| Sell | 2% | The currency the curve pays out |
| Ceiling | 5% (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:
| Leg | Share | Paid to |
|---|---|---|
| Creator | 30% | The launch’s CrewSplitter |
| KOL | 40% | KolSplitter, credited to the launch |
| Protocol | 30% (the rest) | ReferralLedger, credited to the launch |
See Creator fees and Referrals and KOLs.
The per-wallet cap#
| Term | Value | Set by |
|---|---|---|
| Size | 0.5%, 1%, 1.5%, 2% or 2.5% of supply; 2% if none chosen | The creator, at launch |
| Duration | Until the curve completes (production) | PricingRules, stamped on the curve at launch |
| Measured on | The buyer’s token balance | — |
| Applies to | Every 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#
| Rule | Value |
|---|---|
| Launch tax start | 0% to 90%, chosen by the creator |
| Decay | 1 percentage point every 10 seconds — at most 15 minutes from launch |
| Charged on | Buys only, on top of the trade fee; the creator’s opening buy is exempt |
| Paid to | The same balance and split as the trade fee |
| Ends | At zero, or when the curve completes |
| Direction lock | One 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#
| Event | What happens |
|---|---|
| The target is reached | The curve completes and stops trading. Currency sent beyond the target is refunded to the buyer. |
| Within 3 days | Anyone may call graduate(). See Graduation and the locked pool. |
| After 3 days, not graduated | Graduation closes and redeem() opens: each token returns tokenAmount × realEthReserve / tokensSold, fee-free, the same rate for every holder in any order. |