Five parties take part in a v2 launch: the creator, the buyer, the keeper, the protocol and the owner Safe.
Nobody is appointed. Each table lists what the party does, pays and receives, and what it can change.
At a glance
| Creator | Buyer | Keeper | Protocol | Owner Safe |
|---|
| does | picks a stock, a tax, a window and a strategy kind; launches once | buys on the curve or in the pool; sells at will | sends due calls | receives its share of every tax | lists stocks, sets defaults for future launches, may upgrade a treasury's logic after two days |
| pays | 0.0005 ETH and gas; optionally a first buy | stock, or any asset the router converts to stock | gas | nothing per launch | nothing per launch |
| receives | up to half of the collected tax, in stock, for as long as the token trades | tokens; a shrinking supply | 0.1% of what each strategy action produced | 30% of the collected tax, in stock, plus the launch fee | nothing from these contracts |
| can lose | the fee and the first buy, like any buyer | the token's price; no claim on the treasury | gas on a call that lands second | | |
| can change a live launch | the token's page only | no | no | no | treasury logic, with a two-day notice |
Creator
| |
|---|
| chooses | a listed stock; name and symbol; tax 1% to 15%; own share 0% to 10% of the collected tax; opening window 0 to 180 s; strategy kind and its numbers; staleness band, where the stock allows one; up to 40 addresses exempt from the opening premium |
| cannot choose | sale share (79.31%); LP share (70% of the raise, per stock); opening price ($2,140.38 FDV at listing) |
| pays | 0.0005 ETH to the protocol at launch; gas; optionally a first buy, which pays the base tax and skips the opening premium |
| receives | creatorBps of every collected tax, curve and pool, buy and sell, in stock. Curve stage: anyone may push it with claimFees(creator). Pool stage: paid by sweep |
| income formula | traded stock volume × taxBps × creatorBps |
| gives up | the tax, split, kind, rule and liquidity, all frozen at launch; the treasury's logic, which only the owner can change |
| must keep | the receiving address. After 14 days of a payout proposal on chain, vetoCreator ends it and bars another for 180 days. An EOA or a Safe |
| volume per day, both sides | tax 3%, creator 10% | tax 1%, creator 10% |
|---|
| $10,000 | $30 | $10 |
| $100,000 | $300 | $100 |
| $1,000,000 | $3,000 | $1,000 |
Buyer
| |
|---|
| pays on the curve | the stock price of the tokens; the tax in stock, 1% to 15%; in the opening window, a premium burned from the tokens (99% at the launch second, the tax from the end of the window) |
| pays in the pool | the tax in stock, taken before the swap; the 0.20% pool fee on the net amount. About 1.2% at the minimum tax. No sell spike |
| receives | a token whose supply only shrinks: the opening premium, the treasury's buy-backs and the token side of the pool fee are burned |
| does not receive | dividend, yield, a share of the treasury, redemption |
| can sell | back to the curve before graduation; in the pool after |
| exposure | the token's price, and the stock through the treasury's holdings |
| what to read | where |
|---|
| stage | curve.status(): 0 Active (sell back to the curve only), 2 Graduated (the pool) |
| graduation progress | realStockReserve() / terminalStock() |
| the kind and its numbers | treasuryDeployer.strategyKindOf, treasury.params(), treasury.engineConfig() |
| the creator's exemptions | curve.openingTaxExemptions |
| whether the treasury can trade now | treasury.health() |
| a pending logic upgrade | controller.proposals(treasury) |
Keeper
There is no keeper role in the contracts. Every call checks its own trigger and either fires or reverts NotDue.
| call | due when | receives | in |
|---|
execute(), kinds 0, 4, 5 | a stop, a take-profit or a dip buy is due | 0.1% of the profit (take-profit), of the proceeds (stop), of the spend (dip buy) | stock, USDG, USDG |
execute(), kinds 2, 3 | the treasury is outside its band and past its cooldown | 0.1% of the gross swap output | USDG or stock |
buyback(), every kind | buybackStock() is nonzero and 10 s have passed | 0.1% of the tokens bought | the token |
book() | stock has arrived and the oracle is live | nothing | |
hook.sweep(poolId) | tax has accrued on a pool | nothing (sweepTipBps 0) | |
vault.collectFees() | pool fees have grown | nothing | |
curve.claimFees(recipient) | fees are owed on an Active curve | nothing | |
| |
|---|
| pays | gas; a call that lands second reverts NotDue |
| example | a 2,000 USDG take-profit at a 3% gain pays about 0.06 USDG |
| who runs it | the protocol runs one, because 0.1% does not pay an outside keeper; the calls stay open to anyone |
| cannot | hold the treasury's money or pick a price; every trade executes inside the oracle-derived bound |
Protocol
| |
|---|
| receives | 30% of every collected tax, curve and pool, buy and sell, in stock, at protocol; the launch fee of 0.0005 ETH at the same address |
| collects | curve stage: claimFees(protocol) by anyone; pool stage: sweep |
| use of income | 30% of its tax income is used by the Safe to buy back $HEDGE, periodically; see the protocol's share |
| runs | the in-house keeper, at the same 0.1% reward anyone receives |
| cannot | change a frozen rate or reach a treasury's money |
Owner Safe
| for future launches only | |
|---|
setDefaults | tax bounds, splits, pool fee, gates, keeper reward, buy-back pace, launch fee |
list, setListingGates, setBandCeiling | listings, their gates and band ceilings |
setLpBps | the per-stock LP share, 10% to 100% |
setLauncher, setPublicLaunch | which routers may launch; whether launching is public |
registerKind, registerEngineKind, registerPolicy, disablePolicy | the registry; append-only; a policy may be disabled for new launches |
A pending launch quoted before any such change reverts Restated. Nothing launched is touched.
| over a live launch | bound |
|---|
schedule a treasury logic upgrade through V2TreasuryUpgradeController | fixed 2-day delay; matching code and calldata hashes; same config hash and storage schema; anyone executes after the delay; the owner may cancel; an ownership handover voids pending proposals |
| halt trading through the calendar | an unscheduled closure |
setProtocol(poolId, to) | the protocol's own payout address |
proposeCreator(poolId, to) | 14 days on chain; the creator's veto ends it and bars a new proposal for 180 days |
| cannot | |
|---|
| remove liquidity from the vault | no function exists |
| withdraw from a treasury | no function exists |
| change a frozen rate | Restated protects pending launches; launched terms are immutable |
| move a launched curve's fee recipients | immutable |
One wallet, several hats
A creator is usually the first buyer. The protocol runs a keeper. A buyer with a script can be a keeper. Each hat
is paid by its own rule, and none of them adds a power over a live launch beyond the owner's table.