bitpro가 원문에서 글자만 모은 내용이에요. 표·그림·수식은 빠지거나 깨질 수 있어요. 전체 35쪽 중 22쪽
and revision-checked tick updates |
| Bindings | `settlementReserve`, `launchBuyAdapter`, `tokenDeployer`, `hook`, `poolManager`, `announcementRegistry` |
| Launch events | `PoolRegistered`, `Seeded`, `Launched`, optional `LaunchBuyExecuted` |
| Swap events | `Trade` for every successful swap; `QuoteBurned` only for a positive actual burn |
| Reserve reads / events | `quoteReserveBalance`, `QuoteReserveDeposited`, `QuoteReserveWithdrawn`, `ReserveAssetRecovered` |
| Creator rights | Current/original/pending creator, transfer and reassignment; no `creatorFeeRecipient` or fee-recipient update |
`Trade` includes explicit `isBuy`, `grossQuoteAmount`, `launchTokenAmount` and `burnAmount`. Its executor is not necessarily the wallet. Do not count the matching `QuoteBurned` twice or treat a reserve deposit as a trade. Read [receipt attribution](/launchpad/integration/wsto#events-and-attribution) before decoding atomic launches.
There is no read of accumulated per-pool burns in the Hook. Aggregate confirmed burn events with deduplication and reorg handling. `totalSupply()` on wstO includes deposit, redemption and other burn effects, so it cannot replace that event history.
## Launchpad of Launchpads registry and vault
### Registry functions
| Function | Who can call | Result |
| - | - | - |
| `registerExisting(slug, padToken, key, payout, ownerShare, expectedVaultVersion, initData)` | Current creator of an \$O launch token | Creates the vault, applies the launch policy and pays the registration fee. `msg.value` must equal `registrationFee()` |
| `predictVault(slug, owner)` | Anyone | Returns the vault address before registration |
| `pads(slugHash)` / `padByVault(vault)` / `padOwner(slugHash)` | Anyone | Returns the launchpad record, for example the owner, token and vault |
| `childLaunchesOpen(slugHash)` | Anyone | Checks only the global pause and the launchpad pause. It does not check that the launchpad exists, its launch rules or the factory. Use `acceptsLaunch` and a simulation for a real check |
| `isMember(suiteId, poolId)` | Anyone | True only when the hook recorded that the vault of this registry accepted the launch |
| `proposePadOwner(slugHash, newOwner)` / `cancelPadOwnerProposal(slugHash)` | Launchpad owner | Starts or cancels an ownership transfer |
| `acceptPadOwner(slugHash, payout, expectedCreator)` | Proposed owner | Completes the transfer. A nonzero `expectedCreator` must be the current creator of the launchpad token |
| `setPadChildSuite(slugHash, suiteId, accepted)` | Launchpad owner | Accepts or refuses tokens of an additional enabled suite |
| `setPadTakeThreshold(slugHash, threshold)` | Threshold setter | Changes the burn amount of one launchpad, inside the supply bounds |
| `setRegistrationPaused`, `setChildLaunchesPaused`, `setPadChildLaunchesPaused` | Owner or guardian | Pauses or resumes new launchpads, all token launches or the token launches of one launchpad |
| `setRegistrationFee`, `setTakeThreshold`, `setOwnerBpsBounds`, `setDefaultOwnerBps`, `reserveSlug` | Registry owner | Changes settings for new launchpads |
| `addSuite`, `setActiveChildSuite`, `setChildSuiteEnabled`, `addVaultVersion`, `setDefaultVaultVersion` | Registry owner | Admits suites and vault versions. Existing pools and vaults do not change |
The app sends the registry default owner share. A direct call can send another value inside the registry bounds. The pool key must be the recorded wstO pool of the token, paired with the fixed wstO quote.
### Vault functions
| Function | Who can call | Result |
| - | - | - |
| `claim(escrow, currency)` | Anyone | Collects the vault credit from an admitted fee escrow, then splits it |
| `sync(currency)` | Anyone | Splits unrecorded income between the owner share and the burn fund |
| `donate(currency, amount)` | Anyone | Adds the complete amount to the burn fund. It gives no owner share |
| `claimDividends(suiteId, token)` | Anyone | Collects dividends for the vault from an admitted Tax token |
| `withdrawOwner(currency)` | Anyone | Pays the owner share of one currency to the payout address |
| `take(nonce, expectedThreshold, currencies, minAmounts, deadline, recipient)` | Any holder of the burn amount | Burns the launchpad tokens and sends the burn fund of up to 20 currencies to the recipient |
| `takeable(currencies)` | Anyone | Returns the burn fund of each currency after a virtual split |
| `setLaunchPolicy(policy, changes)` | Launchpad owner | Replaces the launch rules and changes both lists in one transaction |
| `closeLaunches()` | Launchpad owner | Stops new token launches without a tax check |
| `setPayout(recipient)` | Launchpad owner or registry | Changes the payout address. The registry calls it when the proposed owner accepts |
| `launchPolicy()` / `acceptsLaunch(context, hook)` | Anyone | Returns the launch rules, or checks one launch against them |
### Events
| Event | Meaning |
| - | - |
| `PadRegistered` / `PadOrigin` | A new launchpad, its token, vault, owner and suite |
| `PadOwnerProposed` / `PadOwnerTransferred` | An ownership proposal and its completion |
| `PadTakeThresholdUpdated` / `TakeThresholdUpdated` | A burn amount change for one launchpad or for new launchpads |
| `RegistrationPausedUpdated` / `ChildLaunchesPausedUpdated` / `PadChildLaunchesPausedUpdated` | A pause change |
| `VaultEvent(vault, kind, data)` | A vault event that the registry relays |
`VaultEvent` kinds are `Synced`, `Donated`, `OwnerWithdrawn`, `Taken`, `PayoutUpdated`, `OwnerBpsUpdated`, `LaunchPolicySet`, `LaunchAllowlistUpdated` and `LaunchQuotesUpdated`. Each `kind` is the `keccak256` hash of its name. Index the registry address only, because every vault event goes through it.
## Staking contract
One staking contract serves every vault on its chain. The vault creator and complete immutable configuration determine the `vaultId`.
| Function | Who can call | Result |
| - | - | - |
| `createVault(params, expectedFeeConfigVersion)` | Anyone | Creates and completely funds an immutable vault plus its one-time protocol fee |
| `deposit(vaultId, amount)` | Token holder | Transfers staking tokens into a new deposit lot |
| `withdraw(vaultId, lotId, amount, to)` | Lot owner | Withdraws one lot amount under the vault's early-exit and forfeiture rules |
| `withdrawLots(vaultId, lotIds, amounts, to)` | Lot owner | Atomically withdraws ordered amounts from several lots |
| `claim(vaultId, epochs, to)` | Participant | Claims the caller's rewards from ordered completed epochs |
| `previewWithdraw` / `previewClaim` | Anyone | Previews one withdrawal or an ordered claim batch |
| `deriveVaultId` | Anyone | Derives the vault ID from its creator and complete configuration |
| `getVault` | Anyone | Returns immutable configuration, creator, end time, total staked, reward remaining, and deposit-opening time |
| `getUserState` / `getLot` / `getUserLots` | Anyone | Returns aggregate principal and paginated deposit-lot state |
| `isClaimed` / `epochBounds` | Anyone | Returns claim status and epoch timing |
| `feeConfig` | Anyone | Returns the current creation-fee rate, recipient, and change counter |
| `setFeeConfig` | Contract owner | Updates only the fee used by future vault creation |
| Event | Meaning |
| - | - |
| `VaultCreated` | Vault ID, creator, assets, schedule, reward budget, exit policy, and fee snapshot |
| `Deposited` | Participant, deposit lot, amount, deposit time, and unlock time |
| `Withdrawn` | Lot amount, recipient, remaining principal, penalty result, and current-epoch forfeited weight |
| `EpochRewardClaimed` | Participant reward paid for one completed epoch |
| `FeeConfigUpdated` | New fee rate, recipient, and change counter for later vault creation |
Use the verified explorer ABI for exact types and encoding. See the [staking guide](/launchpad/staking/overview) for the reward, withdrawal, and claim rules.
## Common launch errors
| Error | Meaning |
| - | - |
| `StaleConfig` | Refresh the current factory settings and rebuild the transaction |
| `LaunchExpired` | Use a fresh deadline |
| `QuoteNotRegistered` | The selected quote is unavailable |
| `LaunchCreationDisabled` | New launches through the selected factory are currently switched off |
| `StaleQuoteRevision` | A paired-asset opening-price update used an outdated quote revision |
| `InvalidTokenAddressSuffix` | The prepared token address does not meet that factory's `01` suffix rule |
| `LaunchSaltUsed` | Use a new launch identifier |
| `InvalidNativeLaunchFeePayment` / `InvalidLaunchBuyPayment` | The native creation fee or combined launch-buy payment was not exact |
| `OutOfBounds` / `InvalidConfig` | A hard limit or related-field rule failed |
| `NotImmutable` | The created token failed its fixed-authority checks |
| `NotSingleSided` | Opening liquidity would require the paired asset |
| `LiquidityLocked` | The requested liquidity change is not allowed |
| `ExactOutputDisabledDuringAntiSnipe` | Use an input-amount trade or wait until the normal fee begins |
| `PartialFillUnsupported` | The requested quote-specified amount could not be filled completely |
# Limits and validation
Source: https://docs.o1.exchange/launchpad/reference/limits
Current launch defaults, contract hard caps, form limits, fee limits, quote requirements, and staking limits.
The interface checks launch inputs before the wallet asks for a signature. The contracts enforce the hard caps again onchain.
Tax uses different fee units and validation. Read [Tax limits](#tax-suite-limits) below; the Standard BPS/component limits must not be applied to inclusive Tax inputs.
<span />
## Standard defaults
| Setting | Current value |
| - | -: |
| Supply | 1 billion (1,000,000,000) tokens |
| Liquidity ranges | 1 |
| Base swap fee | 1% |
| Starting total fee | Arc: 1%; Base/Robinhood/Monad/BSC/X Layer: 99% |
| Anti-snipe period | Arc: none (0% surcharge); Base/Robinhood/Monad/BSC/X Layer: 20 seconds |
| Base-fee split | 50% creator / 30% platform / 20% referrer |
| Creation fee | Base/Robinhood: 0.001 ETH; Monad: 100 MON; Arc: 2 native USDC; BSC: 0.003 BNB; X Layer: 0.02 OKB |
| Launch supply placed in the pool | 100% |
<span />
## Standard contract hard caps
| Constraint | Hard limit |
| - | -: |
| Token supply | 1 million to 1 trillion tokens |
| Liquidity ranges | 1 to 10 |
| Base swap fee | At most 10% |
| Starting total fee | At most 99% |
| Fee components | At most 20, including exactly one creator, platform, and referrer component |
| Profile authority choice | Fixed profile or editable profile |
| Managed quote batch | At most 64 entries |
| Atomic launch-buy route data | At most 4,096 bytes |
The supply caps assume the launch token's standard 18 decimals.
<span />
## Standard fee and referral rules
* every configured fee component must be valid and all component bps must add up exactly to the base fee; the current configuration uses creator, platform, and referrer components;
* the starting total fee cannot be lower than the normal base fee;
* the anti-snipe period must be longer than zero;
* the platform fee receiver must be a valid address;
* the o1 interface and Public API reject the trader, original or current creator, current creator fee recipient, platform fee receiver, empty address, and protocol or execution dependencies as referrers;
* the hook independently rejects the empty address, the v4 executor, current creator, current creator fee recipient, hook, factory, fee escrow, and PoolManager; direct integrations must apply the broader product restrictions themselves;
* the unused referral share goes to the platform.
## Tax-suite limits
| Constraint | Rule |
| - | - |
| Percentage precision | Six decimal places: 1% is `1000000`; smallest step is 0.000001% |
| Derived rate denominator | `10^24`; distinct from percentage inputs and token units |
| Ordinary buy / sell totals | Owner-configured per-side bounds, currently 1% to 10% |
| Combined ordinary tax plus surcharge | At most 99% |
| Protocol | Percentage of selected tax with configurable absolute minimum/maximum; included in total |
| Remainder allocations | Creator + burn + dividend + integrator must equal 100% when either side has a remainder |
| No remainder on both sides | All allocations and selected dividend minimum must be zero; no Dividend clone |
| Dividend minimum holding | At least the factory floor and no more than supply; currently a 10,000-token floor |
| No eligible dividend shares | That trade's dividend portion is credited to the frozen protocol recipient |
| Small dividend amounts | Integer rounding may leave residue; it is not a future-holder allocation |
| Anti-sniping duration zero | Valid factory setting; creator opt-out launches remain valid, opt-in rejects |
| Dedicated Claim all helper | 1 to 64 distinct launched tokens; current profile page uses at most 20 positions |
| Dividend API preparation | 1 to 10 distinct token/holder positions, returned as independent steps |
If bounds permit exactly zero, that side has no ordinary fees even with a positive protocol floor. Positive totals below the floor reject. A zero allocation earns no rounding residue. Each configured minimum must be compatible with its maximum and protocol floor. Existing launches keep their frozen values after policy changes.
Tax retains the 18-decimal supply bounds, locked liquidity, 64-entry quote batches and 4,096-byte atomic route-data cap. It has no Standard fee-component list or financial referral fallback. See [exact Tax rules](/launchpad/integration/tax-tokens#zero-and-boundary-rules) and the [dated policy](/launchpad/reference/live-configuration#base-tax-suite).
<span />
## \$O launch limits
| Constraint | Rule |
| - | - |
| Chain / token | Base and Robinhood; fixed-supply 18-decimal ERC-20 launched tokens |
| Burn rates | Independently 0% through 99%; 1% is `1000000` with denominator `100000000` |
| Rate changes | New launches only; every pool retains its frozen rates |
| Creation fee / anti-sniping / allocations | None |
| Quote | Reviewed burn-compatible ERC-20; zero-address native quote is not accepted |
| Token supply / bands | 1 million to 1 trillion tokens; 1 to 10 liquidity bands |
| Quote-management batch | 1 to 64 sorted, distinct entries |
| Atomic route data | At most 4,096 bytes |
| Current ETH Dev Buy | Exact four-operation approved acquisition, vault and launch-pool path |
| Direct held-quote Dev Buy | One final launch-pool operation |
| Hook comment | Empty or exactly 32 bytes; no referral prefix |
| Swap amounts | Positive meaningful execution within signed `int128` bounds, including gross-up |
| Fills | Full requested execution required; no accepted partial Dev Buy or partial launch-pool swap |
Zero and rounded-zero burns still produce trades. A positive exact-output fee rounds up and can consume one raw unit on a dust-sized request. The valid percentage range does not guarantee sufficient inventory or output. See [burn mathematics](/launchpad/integration/wsto#rate-units-and-swap-accounting).
## Token fields
| Field | Interface limit |
| - | - |
| Name | 50 characters |
| Symbol | 11 characters with no spaces; casing is preserved |
| Image | 2 MB; PNG, JPG, WEBP, or GIF |
| Website | Valid website URL |
| X | Valid X profile URL |
| Telegram | Valid Telegram link |
| Extra information | Non-empty keys with public values |
| Trade comment | 32 UTF-8 bytes |
## Creator profile fields
| Field | Interface limit |
| - | - |
| Display name | 40 characters |
| Bio | 180 characters |
| Avatar | 2 MB; PNG, JPG, WEBP, or GIF |
| Website | Valid website URL |
| X | Valid X profile URL |
| Telegram | Valid Telegram link |
Creator-profile changes use a wallet signature and affect the public o1 profile only. They do not change token permissions, balances, or liquidity.
## Quote requirements
Only quote currencies registered by o1 governance can be selected. Quote tokens must behave like standard ERC-20 tokens. Transfer-tax, rebasing, and other non-standard balance behavior is not supported because it can break pool and fee accounting.
The October 1, 2026 [quote verification](/launchpad/reference/live-configuration#verification-history) covers both current Standard and Tax factories. Base has 15 crypto quotes and 51 Stock Tokens; Robinhood has ETH, USDG and 194 Stock Tokens; BSC has BNB, USDC and 21 bStocks; X Layer has OKB, USDC, xETH and 45 wrapped stocks. Monad supports MON, USDC and WETH. Arc registers six-decimal ERC-20 USDC and eight-decimal cirBTC, with launch fees paid in 18-decimal native USDC. Registration is separate from route liquidity and current availability. For X Layer atomic Dev Buy into a non-native quote, the attached adapter must advertise native-V3 support and an executable acquisition route must exist. See [route prerequisites](/launchpad/integration/direct#x-layer-amounts-and-routing).
Every token from a current factory must have an address ending in `01`. A managed quote's opening frame must remain aligned with the active tick spacing. Price updates use per-quote revisions so stale writes fail.
## Staking vault limits
| Constraint | Staking limit |
| - | -: |
| Epoch duration | 1 to 365 days |
| Epoch count | 1 to 50,000 |
| Reward per epoch | Greater than zero and no more than the contract's `uint192` amount limit |
| Early-withdrawal penalty | 0% to 99.99% |
| Pre-deposit window | One epoch before the program starts |
| Protocol fee hard cap | 100% of the complete reward budget |
When early withdrawal is forbidden, the configured penalty must be zero. When it is allowed, a zero penalty provides a penalty-free early exit.
Each deposit creates a separate lot. The interface supports partial withdrawals, withdrawing from several lots together, and claiming multiple completed epochs together.
Staking accepts B20 and ERC-20 assets only when their balances change by the exact transferred amount. Fee-on-transfer, rebasing, reflection, and other non-standard balance behavior is unsupported. See the [staking guide](/launchpad/staking/overview) for the complete lifecycle.
## Launchpad of Launchpads limits
| Constraint | Launchpad limit |
| - | - |
| Launchpad URL | 3 to 32 lowercase letters, numbers or single hyphens. Permanent. The registry refuses its 13 reserved words |
| Launchpad name | Same limit as the token name |
| One-line description | 160 characters |
| Launch guidelines for creators | 2,000 characters |
| Pinned tokens | 10 |
| Page sections | 20 |
| Questions in one section | 12. A question holds 160 characters, an answer 2,000 characters |
| Page content | 64 KB |
| Page text contrast | At least 4.5:1 against the background |
| Allowed paired assets for one launchpad | 64 |
| Allowlist or paired asset changes | Up to 200 addresses in each add or remove list of one transaction |
| Owner claim | Up to 100 currencies in one claim |
| Burn fund claim | 1 to 20 currencies in one burn |
| Burn amount for one launchpad | From 0.0001% to 1% of the launchpad token supply |
| Owner share | Inside the registry bounds, currently 0% to 100%. Fixed at registration |
| Launch rule tax ranges | Each value from 0% to 100%. At least one valid Tax token must fit the rules |
The Tax hook gives the vault launch check a fixed gas budget of 50,000. The vault check never reverts. If the check fails, the launch can complete without membership. See [How the launchpad accepts a token](/launchpad/launchpads/launch-tokens#how-the-launchpad-accepts-a-token).
## Transaction checks
A launch stops when the selected paired asset or creation route is unavailable, the payment is wrong, creation is disabled, the address suffix is invalid, the transaction has expired, protected settings differ from the values the creator reviewed, or the pool cannot open with token-only liquidity.
Developers who need the exact encoded caps and field names can use [Functions and events](/launchpad/reference/events-functions) and the [machine-readable production snapshot](/la프로젝트로 돌아가기