₿BStockFun

How it works

A launch has three states, and never goes backwards

Bonding. A new token mints one billion units to the launchpad. 800M of them sell on a constant-product curve with virtual reserves, which is what lets a launch start at a real price with zero real liquidity behind it. Anyone can buy or sell at any point.

Filled. The moment the whole 800M allocation is bought, the curve closes. The buy that crosses the line is capped exactly at the allocation and the unused portion is refunded, so a launch lands on its target instead of overshooting.

Graduated. The raised quote asset and the remaining 200M tokens seed a PancakeSwap V3 pool, and the position NFT goes into a locker with no withdraw path. Graduation is a separate permissionless transaction — anyone can trigger it.

Paying in BNB, before and after bonding

The launchpad itself is pure ERC-20: it holds curve reserves and has no business knowing about wrapped natives or swap routes. On its own that would mean holding WBNB to touch a WBNB launch and USDT to touch a USDT launch, and nobody carries either.

So every buy and sell here goes through a zap contract that takes native BNB, converts it to whatever the launch is paired against, and hands the rest of the system exactly what it expects. Anything unused — including the refund a graduating curve issues on the buy that fills it — comes back as BNB.

Graduation does not change that. Once bonding ends the curve is shut for good and the token trades in its PancakeSwap pool instead, but the same button does the same thing: it just routes through the pool rather than the curve. The one moment you cannot trade is between a launch filling and someone graduating it — the curve is closed and the pool is not seeded yet.

Why graduation is its own transaction

It would be simpler to graduate inside the final buy. It would also mean that any failure in pool creation — a hostile quote token, a fee tier someone pre-seeded at an absurd price — bricks trading for everyone holding that launch. Splitting it means a failure is contained: the curve is closed, the funds are still in the contract, and graduation can be retried or routed to a different fee tier.

What "locked liquidity" means here

The locker has no withdraw function, no transfer function and no upgrade hook. Its owner can authorise a launchpad to register positions and nothing else — it cannot move funds, unlock a position, or change where harvested fees go. The only value that can leave is accrued swap fees, and their only destination is the fee router.

Where fees go

Curve trades pay 1%. Creators keep 10% of that on their own launch, accrued on-chain and claimable whenever they like. Graduation takes 3% of the raise, once. The rest splits on-chain: curve revenue is 60% buy-and-burn of $BSTOCK and 40% treasury; harvested LP fees are 60% buy-and-burn of graduated launches, 20% $BSTOCK, 20% treasury.

Keepers trigger buybacks but cannot choose what gets bought: the platform flywheel is pinned to $BSTOCK in its constructor, and the ecosystem flywheel can only burn launches the launchpad itself registered at graduation. A keeper picks timing and swap route, nothing more.

Quote assets, including other launches

A launch can be paired against any ERC-20 governance has whitelisted — BNB, stablecoins, BTCB, a tokenised equity. Each quote asset carries its own starting price and graduation threshold, because one unit of USDT and one unit of BTCB are not the same amount of money. Whitelisting is deliberate: an arbitrary token with transfer hooks or a rebasing supply would corrupt curve accounting for every launch priced against it.

Graduated launches join that list automatically. Once a coin has bonded and seeded its pool, new coins can be priced against it. Its starting scale is not guessed: graduation seeds the pool with a known amount of the parent asset against a known amount of the new one, so the exchange rate at that moment is a fact, and the parent's own starting reserve is converted through it. A launch priced in a launch therefore graduates at the same economic size as one priced in its parent.

The chain is bounded. Every level adds a PancakeSwap hop between BNB and the launch, and each hop costs a fee and slippage, so by default a launch priced in a launch does not itself become something new launches can be priced against.

One thing worth understanding before pairing against a launch: how much of it you can actually buy is limited by its own pool. A coin priced against a thinly traded launch is bounded by that launch's liquidity, not by its headline price.

Running it yourself

Deploy the contracts with npm run deploy:testnet in contracts/, then point this app at the launchpad with NEXT_PUBLIC_LAUNCHPAD_ADDRESS. That is the only address the frontend needs — the fee router, locker, both flywheels, the platform token and the quote whitelist are all read back off the launchpad, so a redeploy is a one-line change and the UI can never show a mismatched set of contracts.

Risks worth stating plainly

These contracts have not been audited. Bonding-curve launches are a category with a very high base rate of loss, and pairing against a volatile quote asset adds that asset's risk on top of the launch's own. Locked liquidity stops the LP being pulled; it does not stop a price going to zero, and it does not stop a holder with a large position from selling into you.