Appearance
Bonding curve
Each launch trades against its own HanokCurve, a constant-product market with a virtual quote reserve. The virtual reserve sets the opening price without anyone depositing ETH up front; it is counted for pricing but never withdrawable.
Pricing
Let V be the virtual reserve, q the real ETH collected so far, T the curve's token balance and x the ETH that reaches the curve after fees.
tokensOut = T · x / (V + q + x)The marginal price is (V + q) / T. Large buys move the price more than small ones, exactly like any pool with limited liquidity.
Default config
Launch configs are append-only and immutable. The default testnet config:
| Parameter | Value |
|---|---|
| Supply | 1,000,000,000 tokens |
Virtual reserve V | 0.005 ETH |
Graduation target G | 0.02 ETH of real ETH collected |
| Reserved for the pool | S · V / (V + G) = 20% of supply |
| Pool tick spacing | 60 |
| Opening price | V / S = 0.000000000005 ETH per token |
| Market cap at graduation | (V + G)² / V = 0.125 ETH |
Reserving S · V / (V + G) tokens is not a separate parameter: it is exactly the token balance at which the curve has collected G, so the ETH target and the token allocation are the same point. That is what makes every graduation identical.
Fees on the curve
Fees are charged on the ETH leg in both directions:
- Buys: the platform fee, the creator tax and any snipe tax come off the ETH input before the curve prices the trade.
- Sells: the trade is priced first and the platform fee and creator tax come off the ETH output. Sells never pay snipe tax.
See fees for the rates and where each part goes.
Partial fills near graduation
A buy that would take the curve past its reserved allocation is not rejected. It is filled up to the allocation, charged only for what it received, and the rest of the ETH is refunded in the same transaction. This matters for the buy that finishes a launch: otherwise anyone could block graduation by slipping a tiny purchase in first.
Because a fill can shrink, minTokensOut bounds the rate, not the quantity. The curve checks that the price you received is no worse than the price implied by your own arguments, so a clamped fill that honours your rate still succeeds.
Selling after sell-out
Once the curve sells out it is holding exactly the pool's seed, so sells are closed until graduation completes (normally the same transaction). If graduation cannot complete for seven full days, sells reopen on the curve so no holder is ever trapped. See graduation.
On-chain quotes
Unlike many launchpads, the curve exposes exact quotes you can call directly:
solidity
function quoteBuy(uint256 quoteIn, address recipient)
external view returns (uint256 tokensOut, uint256 quoteSpent, uint256 fee, uint256 tax);
function quoteSell(uint256 tokensIn)
external view returns (uint256 quoteOut, uint256 fee, uint256 tax);quoteBuy is keyed on the recipient so the snipe tax exemption of that wallet is applied. See trading and quotes.