Every moving part, written down.
The front page keeps the mechanics out of the way on purpose. This page is the opposite: the whole machine, in order, including the parts that are inconvenient for us. Where a number appears, it comes from the contract or from a measurement, and the measurement is named.
Revised whenever the contract changes · numbers verified on chain 4663
Section 1What an offering is
An offering is a subscription with a deadline. People send ETH into a contract during a window. If the founder fires the listing before the window closes, the contract spends that money buying the token on the launchpad — inside the listing block itself — and every subscriber owns a share of what was bought. If the listing never happens, everybody takes their money back.
Nothing here is custodial. Subscribed ETH sits in the contract from the moment it arrives until it is either spent on the listing or returned to the wallet that sent it. There is no third state, no treasury, no multisig, and no human step in between.
The life of an offering
- CreationThe founder writes the terms into the contract: the window, the caps, the rounds and their weights, the vesting, the buyers' share of the bag, the floor on what the money must buy, and the launchpad configuration the money will be spent through. After this call, none of it can be edited. Not by the founder, not by us.
- SubscriptionAnyone may send ETH between
opensAtandclosesAt, subject to the minimum, the per-wallet maximum and the hard cap. Each contribution is weighted by the round it lands in. Anyone may also withdraw in full, at any moment, until ten minutes before the deadline. - The listingThe founder calls
launch. It only goes through if the goal was met and the window is still open. One transaction deducts the platform fee, buys the token, deploys the fee vault, checks the bag against the floor, and credits any change back to the subscribers. - Or the deadlineIf the founder never fires, or the goal is never met, the window simply closes. The exit reopens permanently and everybody withdraws the exact amount they put in. The founder gets nothing: no tokens, no fees, no consolation.
- Afterwards, indefinitelySubscribers pull vested tokens as they unlock and pull dividends as the pool generates fees. There is no end date on either. The contract does not stop caring about a sale once it has listed.
What an offering is not
- It is not a promise of a fixed number of tokens. See §3 — this is the single most important design decision in the whole system.
- It is not a yield product. Dividends are a share of trading volume, and volume is usually zero. Nobody here will quote you a percentage.
- It is not a claim on the founder. The contract does not know how to sue anybody. What it enforces, it enforces mechanically; everything else is trust, and we will tell you which is which.
Section 2Rounds and weights
An offering has one, two or three rounds. A round is not a price. It is a weight — a multiplier applied to the ETH that lands in it. Your share of the offering is your total weight divided by the total weight of everybody.
A round is defined by two numbers: its weight, and the cumulative book size at which it closes. Round I with a cap of 1.0 ETH means "the first 1.0 ETH raised, by anybody, in any number of contributions". Rounds do not have their own clocks; they fill in order, and they fill by money, not by time.
What the contract enforces at creation
- At most three rounds.
- Every weight is between 1.0× and 3.0×. Nobody can mint a 50× founder round.
- Weights never improve: each round must be worth the same as or less than the one before it. Without this rule a founder could hang back and take the best deal at the end of the queue, which is the oldest trick in the presale book.
- Caps strictly increase, and the last round's cap must reach the hard cap — so there is no band of the book that no round covers and no way to reach the hard cap through a gap.
Contributions that cross a boundary
They are split at the boundary and weighted piecewise. If the book stands at 0.4 ETH, round I
closes at 1.0, and you send 0.8 ETH, then 0.6 of your ETH is weighted at the round I multiplier
and 0.2 at the round II multiplier. There is no rounding trick and no rejection: the arithmetic
is weightFor(), it is a view function, and the app calls it before you sign so the
number you are shown is the number you get.
Worked example — a 3.0 ETH book, filled by four people
| Round | Weight | Closes at | Who lands in it |
|---|---|---|---|
| I | 1.5× | 1.0 ETH | Alice in full; Bruno partly |
| II | 1.2× | 2.0 ETH | Bruno partly; Carmen partly |
| III | 1.0× | 3.0 ETH | Carmen partly; Dan in full |
| Subscriber | Book on arrival | Pays | Weighted as | Weight | Share |
|---|---|---|---|---|---|
| Alice | 0.0 | 0.40 | 0.40 × 1.5 | 0.60 | 16.22% |
| Bruno | 0.4 | 0.80 | 0.60 × 1.5 + 0.20 × 1.2 | 1.14 | 30.81% |
| Carmen | 1.2 | 1.00 | 0.80 × 1.2 + 0.20 × 1.0 | 1.16 | 31.35% |
| Dan | 2.2 | 0.80 | 0.80 × 1.0 | 0.80 | 21.62% |
| Book full | 3.00 | 3.70 | 100% |
Read Alice against Dan. Dan paid twice what Alice paid and holds 21.62% against her 16.22%. Per ETH subscribed, Alice's money is worth exactly 1.5× Dan's — which is precisely what the round card said it would be, and the only thing the round card ever says.
Notice also that nobody was rejected, nobody was rationed, and the weights sum to something finite. That is the whole trick: shares of one bag, never quantities.
What happens when somebody leaves
The exit is all-or-nothing: you withdraw your entire subscription, your weight goes to zero, and the book shrinks by exactly what you put in. Since rounds fill by book size, your departure reopens the cheap capacity you were occupying for whoever comes next. If Bruno exits in the example above, the book falls from 3.0 to 2.2 and the next 0.8 ETH is weighted from 2.2 upward — at round III, not at Bruno's old blend. Weights are a function of where the book stood when the money arrived, and nothing else.
The corollary matters if you are thinking of exiting and re-entering: you cannot get your old round back. Re-subscribing is weighted at the book's current position, which is normally worse.
Section 3What your allocation is actually a share of
You own a share of the tokens the offering bought. Not a promised quantity, not a price, not a rate. This is worth being blunt about, because it is the difference between a presale that can fail its last customer and one that cannot.
The launchpad sells along a curve: the more of the supply the purchase takes, the more each additional token costs. A contract that promised "N tokens per ETH" would be writing cheques against a curve it does not control. Raise more, or launch at a different point on the curve, and the sum of the promises exceeds the tokens that exist. The contract would be insolvent and the last person to press claim would find an empty till.
With shares, the sum of everybody's claim is the bag, by construction. It cannot overdraw. The cost of that guarantee is that you cannot know your token count in advance, only your percentage — and we would rather show you an honest percentage than a dishonest number.
Where the raise actually goes
Three deductions stand between the book and the bag, and all three are visible before you subscribe. Using the 3.0 ETH book from §2:
| Step | Who takes it | ETH |
|---|---|---|
| Subscribed by the four buyers | — | 3.0000 |
| Platform fee, 1% of the raise | The platform, once, at listing | − 0.0300 |
| Sent to the launchpad | — | 2.9700 |
| Launchpad listing fee, flat | The launchpad, once | − 0.0005 |
| Spent buying the token | Into the curve | 2.9695 |
At 2.9695 ETH the curve delivers about 68.4% of the one-billion supply, roughly
684,300,000 tokens. That figure is not a guess: the curve was measured on chain and follows
ETH = 1.37 · p / (1 − p) for a fraction p of supply, accurate to within
0.01 percentage points at every size we tested up to 15 ETH. It is also why a bigger book does
not buy proportionally more tokens — the last ETH into a large raise buys far less than the
first.
The bag, split
The bag is divided once, at the listing, into the buyers' share and the founder's payment. The
buyers' share is a term of the offering (buyersBps), fixed at creation, and the
contract refuses to create an offering that gives buyers less than half. Say this one set 80%:
| Holder | Tokens | Of supply | Released |
|---|---|---|---|
| Buyers, as a group | 547,440,000 | 54.74% | By vesting schedule, pulled individually |
| The founder | 136,860,000 | 13.69% | After the launchpad's per-wallet window |
| The bag | 684,300,000 | 68.43% |
The remaining ~31.6% of supply is not held by anybody — it is still in the pool, which is what makes the pool a market. The founder's payment is held by the contract and pulled, never pushed; see §4 for why that is not a courtesy but a requirement.
Individual allocations, from the same example
| Subscriber | Share | Tokens | Of supply |
|---|---|---|---|
| Alice | 16.22% | 88,774,054 | 8.88% |
| Bruno | 30.81% | 168,670,703 | 16.87% |
| Carmen | 31.35% | 171,629,838 | 17.16% |
| Dan | 21.62% | 118,365,405 | 11.84% |
The floor
At creation the founder commits minBagTokens: the minimum number of tokens the
purchase must actually yield, or the listing reverts and the money stays refundable. It is
published with the terms, so before you subscribe you can read the worst bag the offering is
allowed to accept. If the launchpad changes its curve, its fee, or its configuration between
creation and listing, this is the tripwire that catches it.
Section 4The listing block
The founder fires the listing with one call. What that call does, in order, inside a single transaction:
- ChecksCaller is the founder; the sale is neither listed nor cancelled; something was raised; the window has not closed; the goal, if any, was met.
- Books the platform fee1% of the raise is set aside inside the contract as owed to the platform. It never leaves as part of the purchase, and it is booked exactly once — a subtlety that cost us an audit round, see §10.
- Deploys the fee vaultA fresh
FeeVault, belonging to this sale and no other, which will be the launchpad's fee recipient for this token forever. - BuysThe rest of the raise goes into the launchpad through the shared bundler, which creates the token and executes the purchase in the same block, then points the pool's fee stream at the vault.
- VerifiesThe tokens received are counted and checked against the committed floor. Under the floor, the entire transaction reverts and the offering is exactly as it was a second earlier: refundable.
- Splits and settlesThe bag is divided into the buyers' share and the founder's payment. Any ETH the launchpad hands back as change is credited to the subscribers as a dividend — not to the founder, not to us.
Why the same block matters
The launchpad reserves the listing block: in the block the token is created, the only buy that can execute is the creator's, which here is the offering's. A sniper's first opportunity is the block after, by which time the offering already holds its tokens and the subscribers already own their shares of them. This is the one structural advantage the format has, and it is borrowed from the launchpad, not invented here.
The per-wallet window, and what it means for you
For two blocks after the listing the token itself refuses to let any wallet end up holding more than 5% of supply — except transfers coming from the token's deployer, which is the bundler, so the offering can take delivery of its entire 68% bag without tripping it.
The consequence is on the way out. In the example above, Alice's 8.88% and the founder's 13.69% both exceed 5%. If they tried to claim during those first blocks, the token would reject the transfer. So:
- The founder's payment is held by the contract, not sent at listing, and becomes claimable only after the window has passed with a margin. Pushing it during the listing would make any large founder share revert the entire listing — a defect we shipped once and an auditor caught.
- If your own allocation is over 5% of supply, your claim will revert during the window too. Wait a few blocks. The app does this for you; if you are calling the contract by hand, this is the reason your transaction failed.
Every reason a listing reverts
| Reason | What it means |
|---|---|
| not the creator | Only the founder can fire it. Nobody can list on their behalf. |
| closed | Already listed, or cancelled. |
| nothing raised | An empty book cannot be listed. |
| window is over | The deadline passed. There is no grace period and no extension. |
| goal not reached | The soft cap was not met. Subscribers withdraw. |
| token already used | The address produced is already tied to another sale. Salt collision, refused. |
| bought less than promised | The purchase came in under the committed floor. |
In all seven cases the money stays exactly where it was: in the contract, refundable, in the subscribers' names.
Section 5Vesting
An offering may release the buyers' tokens gradually. Three numbers, all fixed at creation and all visible before you subscribe:
| Term | Meaning |
|---|---|
| tgeBps | Fraction unlocked the moment the listing lands. 2000 = 20%. |
| vestStepBps | Fraction that unlocks at each step afterwards. 1000 = 10%. |
| vestStepBlocks | Length of a step, in blocks. Zero means no vesting at all. |
Unlocking is tge + steps × step, capped at 100%, where steps is whole blocks elapsed
divided by the step length. It is a stair, not a ramp: nothing accrues between steps. Claims are
cumulative — the contract remembers what you have taken and gives you the difference, so
claiming early costs you nothing except gas.
This is an Arbitrum-style chain, and the block number a contract sees is the
settlement-layer block number — what the RPC calls l1BlockNumber
— not the sub-second block number the explorer shows you. A vesting step of 300 blocks is
therefore on the order of an hour, not thirty seconds. Anyone reading a schedule off the
explorer's block counter will be wrong by roughly two orders of magnitude, in the direction
that makes it look like the vesting has already finished. The app converts using the same
number the contract uses.
Worked example — 20% at listing, then 10% per step of 300 blocks
Alice's allocation is 88,774,054 tokens. At the listing 20% unlocks: 17,754,811. Each subsequent step of 300 blocks releases 8,877,405 more, and after eight steps she is fully unlocked. In settlement-layer terms that is about an hour per step and about eight hours end to end.
If she claims nothing for four steps and then claims once, she receives everything unlocked so far — 60% of her allocation — in a single transfer. The schedule is a floor on when tokens become available, never a deadline to collect them.
Two things vesting does not touch. It does not touch the founder's payment, which is governed by the per-wallet window instead and is otherwise released in full. And it does not touch dividends: you earn on your whole subscription from the first block, unlocked or not. Vesting slows down what you can sell, not what you are paid.
Section 6The dividend, and how it is funded
Every trade in the pool pays a fee. That fee is the only source of dividends in this system. There is no emission, no treasury top-up and no rebate — if nobody trades, nothing is paid, and no amount of clever accounting changes that.
The path a fee takes
- The pool accrues itThe pool sits in the 1% fee tier. Fees accumulate in both assets — ETH on one side, the token on the other — depending on which direction each trade went.
- The launchpad takes its cutThe launchpad's locker keeps 30% before anything reaches us. This is not our fee and we cannot waive it. See §7.
- The vault receives the restThe remainder is paid to this offering's
FeeVaultand nothing else is ever paid there. One vault per sale is what makes the accounting exact — there is no shared pot to misattribute, and nobody triggering a collection out of turn can strand or misdirect it. - Anyone harvests
harvestis permissionless. It pulls the collection, drains the vault, unwraps the ETH side and splits everything. It can only move money towards the people already owed it, which is why it does not need a guard. If there is nothing to collect it does nothing and says so. - You pull your shareCredited through an accumulator, so an offering with five thousand subscribers costs the same to distribute as one with five. Nothing is pushed at anybody.
The split
| Side | Buyers | Founder | Platform |
|---|---|---|---|
| ETH side of the fee | 50% | 40% | 10% |
| Token side of the fee | 100% | — | — |
Those percentages are constants in the contract. There is no setter, no governance and no owner who could add one. The token side goes entirely to buyers because it is the same asset they already hold a claim on — it arrives as extra tokens attached to your next claim, not as a separate thing to remember.
Worked example — a real measurement, not a hypothetical
A purchase we executed on this chain generated 0.029695 ETH of pool fees. Following it:
| Stage | ETH | Of the fee |
|---|---|---|
| Accrued in the pool | 0.0296950 | 100% |
| Launchpad keeps 30% | − 0.0089085 | 30% |
| Delivered to the vault | 0.0207865 | 70% |
| → subscribers, as a group | 0.0103932 | 35.0% |
| → founder | 0.0083146 | 28.0% |
| → platform | 0.0020787 | 7.0% |
Alice, holding 16.22% of the weight, is credited 0.0016854 ETH from that harvest. Stated the way a trader would rather hear it: every 1 ETH that changes hands in the pool pays about 0.0035 ETH to the subscribers as a group, and about 0.0028 ETH to the founder.
Three properties worth knowing before you plan around this
Your share is frozen at the listing
Weights cannot change after the listing, because the exit closes at the listing. Whatever fraction of the book you held in that block is the fraction of every future dividend you will receive, forever.
The dividend follows the wallet, not the tokens
This is the most misunderstood part of the design, so plainly: selling your tokens does not end your dividends, and buying tokens on the open market does not start any. The right belongs to the subscribing address. It is not a token, it is not transferable, and there is no function anywhere that moves it. If you want the dividend, subscribe; if you want the dividend and someone offers to sell you "their position", they cannot deliver it.
Dust is carried, not swallowed
Integer division leaves a remainder on every harvest. That remainder stays booked as buyers' money and is added to the next harvest's pot rather than being split again or written off. Over thousands of harvests it comes out to a handful of wei in somebody's favour, and we would rather it be yours.
One loose end the contract also closes: if the launchpad ever routes tokens to the bundler after
the listing, sweepBundler brings them in and credits them to buyers on the token
side. It is permissionless, and it is the only path those tokens have.
Section 7Fees, in full
Every fee in the system, who pays it, and when. There are no others. If you find one this table does not list, the table is wrong and we want to know.
| Fee | Amount | Paid by | Paid to | When |
|---|---|---|---|---|
| Subscribing | none | — | — | — |
| Withdrawing before the listing | none | — | — | — |
| Creating an offering | none | — | — | — |
| Platform fee | 1% of the raise | The offering, out of the book | The platform | Once, at the listing |
| Launchpad listing fee | 0.0005 ETH | The offering, out of the book | The launchpad | Once, at the listing |
| Pool fee | 1% of each trade | Traders | Split below | Every trade, forever |
| — launchpad's cut | 30% of the pool fee | off the top | The launchpad | Before the offering sees a cent |
| — subscribers | 50% of the ETH that arrives 100% of the token side | — | Subscribers, by weight | Forever |
| — founder | 40% of the ETH that arrives | — | The founder | Forever |
| — platform | 10% of the ETH that arrives | — | The platform | Forever |
| Founder's payment | the bag minus the buyers' share | The offering, in tokens | The founder | Once, after the listing |
| Gas | whatever the chain charges | Whoever calls | The chain | Per call |
The launchpad keeps 30% of every trading fee before the offering sees anything. We measured it: 0.029695 ETH of pool fees delivered 0.0207865 ETH to the vault. So when this page says subscribers get half the ETH side, that is half of the 70% that survives — about 35% of the pool fee, not 50%. A model built without the 0.7 factor overstates the dividend by roughly 43%. We would rather you catch that here than in a spreadsheet three weeks from now.
Two structural limits sit behind the table. Subscribers are always entitled to at least half the bag — the contract refuses to create an offering that gives them less. And the platform address is fixed when the contract is deployed; it cannot be repointed, and it has no authority beyond being an address that is owed money.
Section 8The emergency exit
Before the listing you can withdraw everything you subscribed, in one call, at any time. It is not a request, nobody approves it, and it does not depend on the founder being reachable, alive or cooperative. The money was never anywhere else.
| Situation | Exit |
|---|---|
| Window open, more than 10 minutes before the deadline | Open |
| Window open, final 10 minutes | Locked |
| Founder cancelled the offering | Open, immediately, including inside the final 10 minutes |
| Deadline passed with no listing | Open, permanently |
| Listed | Closed. The money is now a pool. |
Why the ten minutes exist
Without them, one wallet could occupy the entire hard cap for free, keep everybody else out of the book for the whole window, and walk away one block before the founder fires — killing the offering at zero cost and zero risk. The lock is the smallest window that makes that attack cost something: the attacker has to be genuinely willing to be listed. Ten minutes is short enough that nobody is trapped in a meaningful way and long enough that the founder can act on a book that will still be there when the transaction lands.
The lock is also the one moment in the whole flow where you are not fully in control of your money, so we would rather point at it than bury it. The offsetting rule: if the deadline passes without a listing, the exit reopens and never closes again. There is no window in which the money is stuck with no way out.
Cancellation
The founder can cancel at any time before the listing. Cancelling is permanent — it cannot be undone, no further subscriptions are accepted, and it reopens the exit for everybody immediately, including during the final ten minutes. It is the founder's way of saying "this is not happening, take your money now" without waiting for the clock.
Withdrawal is all-or-nothing: there is no partial exit. And after the listing there is no exit at all, in any circumstance, for anybody — the ETH is not ETH any more, it is a pool and a bag of tokens with your name on a share of them.
Section 9What the contract can and cannot do
The useful question about any contract holding other people's money is not what it promises but what it is capable of. Both columns below are statements about code, and both are checkable in Schedule B.
It can
- Hold subscribed ETH and give it back to the exact wallet that sent it.
- Spend it, once, on the launchpad configuration committed at creation.
- Deduct the 1% platform fee, once, at the listing.
- Hold the bag and hand out shares of it against a vesting schedule.
- Pull trading fees from the vault and credit them by weight.
- Refuse a listing that buys less than the published floor.
It cannot
- Send subscribed money anywhere except into the listing or back to the subscriber. No function exists. Not for the founder, not for the platform, not for whoever deployed it.
- Be paused, upgraded, migrated or steered. It has no owner and no admin role at all.
- Change the terms once an offering exists — the founder's own included.
- Give the founder more than half the bag.
- Redirect the fee stream away from the vault. The only address the launchpad would accept that instruction from is this contract, and this contract has no function that sends it. The redirect is permanent by omission.
- Block your withdrawal, your claim or your dividends. Everything is pulled, never pushed, so a wallet that refuses ETH — including ours — can only ever block itself.
- Accept a stray ETH transfer. Money that arrives outside
buy()is refused, because it would be money credited to nobody.
One contract, many offerings
A single deployment escrows every live offering at once. That is efficient and it is also the sharpest edge in the design: an accounting error in one sale could reach into another sale's escrow. It has happened — see the second audit round in §10, where a platform fee counted twice would have paid one sale's subscribers out of every other sale's money. Every balance the contract reads is now measured as a delta against a baseline taken in the same call, never as a share of the total balance. If you audit one thing in this contract, audit that.
What it cannot do for you, either
- Make the token worth anything. It buys a memecoin; the market does the rest, usually downward.
- Force a founder to list, or to be interesting after they have.
- Stop the founder from selling their share the moment the restriction window drops.
- Get your money back after the listing.
- Recover a lost wallet. The subscription, the vesting and the dividend right all live at that address and nowhere else.
- Do anything at all about the launchpad's decisions — see §11.
Section 10Audit history, and what was fixed
The contract has been through two adversarial review rounds, each run by several independent reviewers working from different angles, with no instruction to be kind. The first round found five critical defects. Naming them is the point of this section — a list of what was found is worth more than a badge saying it was.
First round — five criticals
| The defect | The fix |
|---|---|
| The listing paid all leftover change to the founder, and the spend parameters were chosen at listing time. A founder could raise a hundred, spend one, and keep the rest. | Parameters are committed at creation; change is credited to subscribers. |
| The founder's tokens were pushed during the listing, inside the launchpad's per-wallet window. Any founder share above 5% of supply would have reverted the entire listing. | The payment is held and pulled afterwards. |
| Dividends were pushed with a hard requirement on success. One address that refused ETH would have frozen every other subscriber's dividends permanently. | Everything is pulled, per address. |
| Token claims and dividend claims were welded into one call, so a failure in either blocked both. | Separate calls, plus a convenience wrapper that takes whichever has something waiting. |
| The token side of the trading fee was stranded forever, and the ETH side could be griefed to zero by anyone calling the collection out of turn. | A dedicated vault per offering, and both assets captured on every harvest. |
Second round — the fixes were audited too
The second round confirmed nine of twelve fixes and found two regressions introduced by the fixes themselves. The first: the platform fee was being counted twice — once as fee and again as change — which would have paid one offering's subscribers out of every other live offering's escrow. The second: a fee route that, as written, could never have been triggered at all, quietly paying nobody. Both are fixed.
We are recording this because it is the honest lesson and not a flattering one: patching money code without re-auditing the patch is the same as not auditing. The second round existed only because we assumed the first round's fixes were safe, and they were not.
No offering accepts a stranger's money before a complete rehearsal on mainnet, with trivial amounts, start to finish — subscribe, exit, subscribe again, list, claim, harvest, withdraw — verified in public. Plumbing that has been read is not plumbing that has been proved. An audit is a reason to test, not a substitute for it.
Section 11What we don't control
The token, the pool, the curve, the fee schedule and the fee locker all belong to the launchpad. We are a customer of it. That dependency is load-bearing and you should price it.
| Piece | Owned by | What it decides |
|---|---|---|
| Launch factory | The launchpad | The curve, the supply, the listing fee, the per-wallet window |
| Fee locker | The launchpad | How much of the trading fee it keeps, and who may collect |
| The pool | The DEX | The fee tier, and whether the market functions at all |
| The bundler | Nobody — no owner, no pause | Bundles the launch and the buy into one block; points the fee stream at the vault |
What could change, and what it would do
- The launchpad raises its cut of the trading fee. Dividends shrink, proportionally and immediately. We cannot stop it and cannot opt out. The measured 30% is what it was when we measured it, not a guarantee.
- The launchpad changes the curve or the listing fee. Existing offerings buy a smaller bag than modelled. This is exactly what the committed floor is for: under the floor, the listing reverts instead of proceeding on worse terms.
- The launchpad changes the per-wallet window. A longer window delays large claims. Nothing is lost; claims simply revert until it lapses.
- The pool goes illiquid, or the token stops trading. Dividends go to zero and stay there. Nothing breaks; there is simply nothing to distribute. This is the ordinary outcome, not the exotic one.
- The launchpad's own contracts fail. A listing that reverts leaves the money refundable, which is the good case. A pool that misbehaves after the listing is not something this contract can undo.
What none of them can do is reach your subscription. The launchpad never holds it. Neither do we. The worst a change on their side can do before the listing is make the listing fail — and a failed listing is a full refund.
Section 12Plain questions
What happens if the offering misses its goal?
Nothing is listed and everyone withdraws in full. The founder gets no tokens and no fees. The only thing anybody loses is the time the money spent parked.
Can the founder simply never press the button?
Yes, and there is nothing anybody can do about it. Then the deadline passes and the exit reopens permanently. This is the reason the exit exists in the form it does.
Can I subscribe more than once?
Yes, subject to the per-wallet maximum if the offering sets one. Each contribution is weighted by where the book stood when it arrived, so your second subscription is usually worth less per ETH than your first.
Can I withdraw only part of my subscription?
No. The exit is all-or-nothing. You can withdraw everything and subscribe again, but the new money is weighted at the book's current position — normally a worse round.
Do I earn dividends on tokens I have not claimed yet?
Yes. Dividends are computed from your subscription weight, not from your wallet balance. Vesting never delays a payment.
If I sell my tokens, do I keep the dividends?
Yes — and this surprises people, so it is worth repeating. The dividend right belongs to the address that subscribed. Selling the tokens does not sell it, and buying tokens on the open market does not buy it.
Can I sell my position before the listing?
Not through this contract. There is no transfer function for a subscription. Your only exit before the listing is a withdrawal, and it pays you exactly what you put in.
Why did my claim transaction fail right after the listing?
Almost certainly the launchpad's per-wallet cap: for two blocks after the listing no wallet may end up holding more than 5% of supply. If your allocation is larger than that, wait a few blocks and claim again. Nothing is lost.
Who can call harvest?
Anyone, including you, including a bot. It can only move money towards the people already owed it. If there is nothing to collect, it does nothing.
What if nobody ever calls harvest?
The fees sit in the vault, which belongs to that offering alone, and wait. They are not lost and they cannot be redirected. Any subscriber can trigger the collection at any time.
What stops the founder dumping their tokens instantly?
Nothing beyond the launchpad's two-block window, and we will not pretend otherwise. What you can check before subscribing is how large their share is: it is a published term, it is capped at half the bag, and a founder who takes the maximum is telling you something.
Can the platform change the fees after my offering is created?
No. Every split in §7 is a constant in the contract, and the contract has no owner. Changing them would mean deploying a different contract, which existing offerings would never touch.
What if I lose the wallet I subscribed with?
Then the subscription, the unvested tokens and the dividend right are gone. There is no recovery, from us or from anyone. This is not a policy; it is the absence of a function.
How do I verify all this myself?
Read Schedule B, then read the source. Every claim on this page maps to a specific function or the demonstrable absence of one, and every offering's terms are readable on chain before you send anything.
Is this a security?
We are not lawyers and this is not advice. What we can tell you is precisely what the contract does, which is the entire purpose of this page. Everything else is between you, your dog and your jurisdiction.
Schedule AParameters and limits
Fixed in the contract, identical for every offering
| Constant | Value | Effect |
|---|---|---|
| PLATFORM_RAISE_BPS | 100 (1%) | Platform fee taken from the raise at the listing |
| FEE_BUYERS_BPS | 5000 (50%) | Subscribers' share of the ETH side of trading fees |
| FEE_CREATOR_BPS | 4000 (40%) | Founder's share of the same |
| FEE_PLATFORM_BPS | 1000 (10%) | Platform's share of the same |
| MIN_BUYERS_BPS | 5000 (50%) | Floor on the buyers' share of the bag |
| MAX_WEIGHT_BPS | 30000 (3.0×) | Ceiling on any round's weight |
| MAX_ROUNDS | 3 | Ceiling on rounds per offering |
| EXIT_LOCK | 10 minutes | Exit freeze before the deadline |
| RESTRICTION_BLOCKS | 3 | Wait before the founder's payment is claimable — the launchpad's two blocks plus a margin |
Chosen per offering, frozen at creation
| Term | What it sets | Rule the contract enforces |
|---|---|---|
| opensAt / closesAt | The subscription window | Close after open, and at least 10 minutes into the future |
| softCap | The goal below which no listing is allowed | Not above the hard cap; zero means no goal |
| hardCap | The most the book will accept | Greater than zero; must be covered by the rounds |
| minBuy / maxBuy | Per-transaction minimum, per-wallet maximum | Max at or above min; zero max means no limit |
| buyersBps | Subscribers' share of the bag | Between 50% and 100% |
| tgeBps | Unlocked at the listing | At most 100% |
| vestStepBps / vestStepBlocks | The unlock stair | A non-zero step length requires a step size in range |
| minBagTokens | The floor the purchase must clear | Greater than zero — an offering must commit to something |
| launchConfigId / dexId | How the money is spent on the launchpad | Committed at creation, unchangeable at the listing |
| rounds[] | Weights and cumulative caps | Increasing caps, non-increasing weights, covering the hard cap |
The launchpad's numbers, measured on chain
| Fact | Value |
|---|---|
| Curve | ETH = 1.37 · p / (1 − p) for fraction p of supply |
| Supply | 1,000,000,000 tokens |
| Listing fee | 0.0005 ETH |
| Pool fee tier | 1% |
| Launchpad's cut of the pool fee | 30% |
| Per-wallet cap after listing | 5% of supply, 2 blocks |
| Graduation threshold | 4.2 ETH |
Schedule BEvery function, and who may call it
The complete external surface. There is nothing else — no admin namespace, no proxy, no initializer, no emergency function. If a capability is not in this table, the contract does not have it.
| Function | Who may call | What it does |
|---|---|---|
| createSale | Anyone | Creates an offering and makes the caller its founder. Terms are frozen here. |
| buy | Anyone, during the window | Subscribes ETH and records the weight. |
| pullOut | Any subscriber, when the exit is open | Refunds the caller's entire subscription. |
| cancel | The founder, before the listing | Kills the offering permanently and reopens the exit. |
| launch | The founder only | Fires the listing. Chooses metadata; cannot change where the money goes. |
| creatorClaim | Anyone — the tokens go to the founder regardless | Releases the founder's payment once the per-wallet window has lapsed. |
| claimTokens | Any subscriber | Transfers vested tokens plus any token-side fee share. |
| claimDividends | Any subscriber | Transfers accrued ETH dividends. |
| claimAll | Any subscriber | Calls whichever of the two has something waiting. |
| harvest | Anyone | Collects pool fees into the contract and splits them. |
| sweepBundler | Anyone | Recovers tokens left at the bundler and credits them to subscribers. |
| withdrawOwed | Whoever is owed | Pays out a founder's or the platform's ETH balance. |
| weightFor, unlockedBps, claimableTokens, claimableDividends, sales, rounds, contributed, weightOf, owed | Anyone, read-only | Everything the app displays, readable directly from the chain. |
| FeeVault.collect / drain | The offering contract only | Pulls the launchpad's collection and moves it in. The vault holds one sale's fees and nothing else. |
Absent from that list, deliberately: any owner, any pause, any upgrade path, any setter for a fee or a split, any function that moves subscribed ETH to a third party, and any way to redirect a pool's fee stream away from its vault.