Bonding Curve
Price discovery before graduation. A quadratic curve with a linear floor, plus a tax that decays as supply grows. Denominated in the chain's native asset; the shape is identical everywhere.
Lots, not tokens
All curve trading is denominated in lots. One lot is 1,000 × 10⁹ (1,000 tokens). The curve runs from 60,000 lots (the deployer's pre-mint) to 800,000 lots, so 800,000 − 60,000 = 740,000 lots are actually purchasable.
| Constant | Value |
|---|---|
LOT_SIZE | 1,000 × 10⁹ (1,000 tokens) |
INITIAL_SUPPLY_LOTS | 60,000 |
MAX_SUPPLY_LOTS | 800,000 |
MIN_LOTS | 1 |
MAX_USER_LOTS | 36,000 |
Pricing
Let x be scaled supply above the floor and n the scaled trade size:
n = delta_lots * 1000
x = (supply_lots - INITIAL_SUPPLY_LOTS) * 1000
x_start = x (buy) | x - n (sell)
x_end = x + n (buy) | x (sell)
quad = PRICE_SLOPE * (x_end^2 - x_start^2) / TWO_TIMES_CAP
linear = P_START * n
base = quad + linear
Integrating the marginal price over the traded range in one step means a trade of any size costs exactly what the same volume would cost as a sequence of single-lot trades. There is no discount for size and no penalty.
Dynamic tax
The tax is computed from the average supply across the trade, so it is symmetric between buys and sells of the same range:
avg_supply = min((x_start + x_end) / 2, ADDITIONAL_CAP_TOKENS_BASE)
tax_rate_bp = T_START_BP - (TAX_DECREASE_BP * avg_supply / ADDITIONAL_CAP_TOKENS_BASE)
tax_rate_bp = max(tax_rate_bp, T_END_BP)
tax = base * tax_rate_bp / 10000
| Constant | Value | Meaning |
|---|---|---|
T_START_BP | 1,200 (12%) | Tax at the floor |
T_END_BP | 120 (1.2%) | Tax at and beyond the cap |
TAX_DECREASE_BP | 1,080 | Total decay across the range |
ADDITIONAL_CAP_TOKENS_BASE | 740,000,000 | Supply at which the tax bottoms out |
TWO_TIMES_CAP | 1,480,000,000 | Quadratic denominator |
Buyers pay base + tax. Sellers receive base - tax. Tax accrues to the curve and is split 90/10 between deployer and protocol at graduation — or 10% to protocol and the rest to holders if the curve refunds instead.
Per-chain curve parameters
| Constant | Base | BSC | Polygon | Robinhood | Gnosis |
|---|---|---|---|---|---|
P_START | 1_200_000_000 | 3_600_000_000 | 28_800_000_000_000 | 1_200_000_000 | 2_880_000_000_000 |
PRICE_SLOPE | 8_410_810_800 | 25_232_432_400 | 201_859_459_200_000 | 8_410_810_800 | 20_185_945_920_000 |
DEPLOYER_INITIAL_PAYMENT | 0.06 ETH | 0.18 BNB | 1,440 POL | 0.06 ETH | 144 xDAI |
FIXED_LIQUIDITY_NATIVE | 4 ETH | 12 BNB | 96,000 POL | 4 ETH | 9,600 xDAI |
Trading rules
- Exact payment.
buy()assertsmsg.value == total. Quote immediately before sending; there is no refund of overpayment. - Per-wallet cap. Post-trade balance may not exceed 36,000 lots. Checked against live
balanceOf, not a stored figure. - Deployer cannot sell.
sell()rejects the deployer address outright. - No selling at the floor. Supply cannot fall below 60,000 lots.
- No per-user storage. Holdings are read from the token contract, so a first buy costs no extra storage slot.
quote_buy_price() reads current supply. Any buy landing before yours changes the price and your exact-value transaction reverts with Incorrect payment. This is deliberate — it prevents overpayment being silently absorbed — but it means integrations should quote and submit tightly, and re-quote on revert.