Protocol schema · enforced by contracts

How a launch runs,
from the first buy to permanent liquidity.

Every token starts on a bonding curve that prices itself from supply alone. When that curve sells out, two public actions close it — finish graduation and seat liquidity — and from that block on the market runs on the DEX with the liquidity held in escrow.

Launch a token Explore launches Open trade console

Nothing here is a policy statement: every phase below is a function in a verified contract, and every figure in the snapshot is read from the chain when this page loads.

Protocol snapshot Standby
Live example Loading
The lifecycle

Four phases, one curve, and no manual bookkeeping between them.

Supply is chosen at launch and split once: 75% is sold progressively on the curve, 25% is reserved to fund the market at graduation.

Curve to market
USDC raised on the curve price GRADUATION pair seeded · vault funded
Sold on curve
75%
Reserved for LP
25%
Curve pricing
f(supply)

The curve never depends on an oracle or an external price feed: reserves are virtual, the product of the reserves is the invariant, and the split above is fixed when the token is created.

01

Launch — the token and its curve are created together

Create

You choose the supply, the opening market cap and your creator fee. The factory deploys the token and its bonding curve in one transaction, moves the entire supply onto the curve and indexes the launch. Supply is fixed at deploy: the token has no owner, no mint function and no pause.

createToken() fixed supply
02

Bonding curve — price is a function of supply

Bond

Every buy and sell settles against the curve virtual reserves, so the price is a pure function of supply and reproducible by anyone. Fees are split between the platform and the creator on every fill, anti-snipe caps apply from the first block, and holders can only trade with the curve.

buy() sell() price = f(supply)
03

Curve sells out — the curve announces completion

Complete

When the last curve token is bought the curve flips to complete and emits CurveCompleted. The contract immediately tries to migrate on its own; if that is not possible in the same transaction it defers the migration and reports it, waiting for anyone to trigger it afterwards.

complete = true CurveCompleted MigrationDeferred
04

Graduation — finish, seat liquidity, open the market

Graduate

Two public actions close the curve: finish graduation buys whatever is left with any excess refunded on the spot, and seat liquidity calls migrate(), which seeds the DEX pair, mints the LP into the escrow vault and opens token transfers. From that block on, the market runs on the AMM.

migrate() enableTransfers() vault
Closing the curve

Two buttons finish a launch — and anyone can press them.

Neither action is reserved to the creator. Both are open calls on the curve, so a launch can never be stalled waiting for one wallet to act.

Finish graduation

Near sold out

Shown while the curve is still active but effectively sold out: progress at 99.9% or a single token left. It sends a capped buy for the remainder, so the curve fills what it can and refunds the rest of your input in the same transaction — you never overpay into an empty curve. The moment the curve supply reaches zero the curve flips to complete and runs the migration in that same transaction.

buy() excess refunded complete = true

Seat liquidity

Curve sold out

Once the curve is complete, migration is a single permissionless call. It creates the pair if it does not exist yet, refuses any pair that already holds outside liquidity, seeds it with the raised USDC and the LP reserve, mints the LP straight into the escrow vault, records the migration and opens token transfers for everyone.

migrate() pair check vault funded
Which action is available, and when Read from the curve
Bonding
progress below 99.9% and curve supply remains
Trade on the curve
Ready to finish
progress at 99.9% or one token left
Finish graduation
Sold out
complete true and not migrated yet
Seat liquidity
On the market
migrated true
Trade on the AMM
A button is never shown before its phase, and a phase never waits on the interface. Open trade console
Built-in protections

Guardrails that ship with every curve, not with every promise.

The limits below live in the curve contract and are derived from the supply, so they are enforced from the first block of every launch.

Per transaction Guard
7%
Max buy per transaction

Counted in supply terms, so the cap scales with every launch and applies from the first block.

While bonding Guard
7%
Max wallet concentration

No single wallet can hold more than the cap while the curve is live, which keeps the distribution readable.

First blocks Guard
0.25%
Early-window limit

Public buys are throttled during the opening blocks of every curve, which neutralises front-running bots.

Fee ceiling Guard
6%
Platform plus creator

Platform fee is bounded between 0.5% and 5% and the creator share is capped at 5%, so the two can never exceed the ceiling.

Liquidity escrow

Liquidity that stays put.

At graduation the LP is minted straight into an escrow vault. The vault holds the position, streams swap fees to the creator and the platform, and has no admin path of its own.

  • Permanent by default — or time-locked between 7 and 3,650 days at the creator choice.
  • Permissionless harvesting — anyone can trigger fee collection, and the payout always follows the recipients recorded when the vault was created.
  • Deflationary fee side — the token portion of every pool fee is burned, so the fee stream adds no sell pressure.
  • Reserve floor — the vault always keeps at least a tenth of its position, so the pool is never drained and the stream stays alive.
  • No admin path — the escrow has no owner, no admin function and no upgrade, so custody rules are fixed at graduation.
Escrow rules are fixed at graduation. Inspect on explorer
While bonding Curve fees

Creator share accrues on every curve fill

Your share is charged from the USDC side of every buy and sell, recorded on the curve and withdrawable whenever you like — no lockup and no platform approval step.

withdrawCreatorFees() no lockup
After graduation Pool fees

Earnings continue as real swap fees

Pool fees accumulate in the vault. Harvesting is open to anyone and always pays the recorded recipients: fees are pushed to the wallet, or queued for a pull claim if the wallet cannot accept a transfer at that moment.

harvest() claim()
Principal Timed lock

A timed lock keeps a claim path, a permanent lock does not

With a lock duration the creator may withdraw the position once the lock expires, after unharvested fees are separated out first. With a permanent escrow the principal has no withdrawal path at all — the fee stream keeps running regardless.

withdrawPrincipal() lock 7 – 3,650 days
Token contract guarantees On-chain
Ownership
no owner, no admin key
No owner
Supply
fixed at deployment, no mint function
Fixed
Pause / blacklist / tax
none of them exist in the token
None
Transfers
gated until graduation, opened by the curve
Curve-gated
Liquidity escrow
no withdrawal path while the lock is permanent
Immutable
Harvest
permissionless, recipients fixed in the vault
Open
Source
published and verified on the explorer
Verified
The token standard is shared by every launch on the platform. Open analytics
Schema is the contract

Read the flow in the source, not in a deck.

The curve, the token and the escrow are published and verified. Every step described on this page resolves to a function you can inspect and call yourself, independently of this interface.

Where every number comes from

The snapshot reads getLaunchConfig() and getSupplyBounds() on the factory, so supply range, market-cap bounds, fee split and launch count are never hardcoded here. The live example panel reads getFrontendState() on the newest curve and derives its phase from progress, complete and migrated — the same rule the token page uses to decide between finish graduation and seat liquidity. Vault figures shown on a token page follow the same principle, reading pendingHarvest() and claim balances directly. If a read fails, the interface reports it as unavailable rather than showing a stand-in number.