# BaseLaunchFactory

Creates every coin and its bonding curve, keeps each launch's record and frozen fee terms, and graduates a finished curve into its locked Uniswap v4 pool.

Deploys a bonding curve and its launch token for every launcher launch, then graduates the curve into a permanently locked, full-range Uniswap V4 position governed by the shared BaseLaunchHook. Each curve already trades in the quote asset its pool will use, so graduation never converts between assets and therefore needs no price oracle. It stays split into two permissionless phases so a failed pool seed cannot strand a curve's reserves: - `graduate`: drains the curve's own reserves into this factory. Purely internal bookkeeping, so it is safe to call automatically from within the crossing buy itself. - `createGraduatedPool`: seeds the new V4 pool with those reserves, and stays retryable until it succeeds.

Part of the [contract reference](https://baselaunch.app/docs/reference).

### Deployed at

BaseLaunchFactory (2.1.0)`0x5C154D821C565eeD0Ee575e5aA9F2fB9Ad736697`[](https://basescan.org/address/0x5C154D821C565eeD0Ee575e5aA9F2fB9Ad736697)

BaseLaunchFactory (2.0)`0x775199d61734EFde2537443eF4614717Afb6CfC2`[](https://basescan.org/address/0x775199d61734EFde2537443eF4614717Afb6CfC2)

### Read functions (34)

| Function | What it does |
| --- | --- |
| [approvedPairTokens](#approvedPairTokens) `approvedPairTokens(address pairToken) view returns (bool approved)` selector 0x9831705e Anyone | Whether an ERC-20 is approved as a pair asset for new launches. |
| [buybackVault](#buybackVault) `buybackVault() view returns (address)` selector 0xf1f5c993 Anyone | The buyback vault that locks and vests bought-back coins. |
| [canLaunch](#canLaunch) `canLaunch(address launcher) view returns (bool)` selector 0x58373f04 Anyone | Whether `launcher` may launch right now: true while the public gate is open, and true for whitelisted addresses while it is closed. The same predicate `launchToken` enforces on its caller. |
| [CREATOR_FEE_RECIPIENT_EXECUTION_WINDOW](#CREATOR_FEE_RECIPIENT_EXECUTION_WINDOW) `CREATOR_FEE_RECIPIENT_EXECUTION_WINDOW() view returns (uint256)` selector 0x02d4753d Anyone | A matured override must execute during this window. Expiration prevents an old, forgotten proposal from remaining executable indefinitely. |
| [CREATOR_FEE_RECIPIENT_TIMELOCK](#CREATOR_FEE_RECIPIENT_TIMELOCK) `CREATOR_FEE_RECIPIENT_TIMELOCK() view returns (uint256)` selector 0x5a83b00a Anyone | Advance notice the protocol owner's creator-fee-recipient override must wait out before it can be executed. The creator's own self-service transferCreatorFeeRecipient is never subject to this delay. |
| [feeEscrow](#feeEscrow) `feeEscrow() view returns (address)` selector 0xc4b7de97 Anyone | The fee escrow that holds every claimable fee balance for this launcher set. |
| [getLaunchConfig](#getLaunchConfig) `getLaunchConfig(uint256 id) view returns (LaunchConfig)` selector 0x1cad862d Anyone | Returns one token launch configuration. |
| [getLaunchedToken](#getLaunchedToken) `getLaunchedToken(address token) view returns (LaunchedToken)` selector 0x3cf28b5a Anyone | Returns the immutable record for a token created by this factory. |
| [getLaunchFeePolicy](#getLaunchFeePolicy) `getLaunchFeePolicy(address token) view returns (FeePolicySnapshot)` selector 0x470ef5fc Anyone | Returns the fee policy frozen for a launch. |
| [GRADUATION_RESCUE_DELAY](#GRADUATION_RESCUE_DELAY) `GRADUATION_RESCUE_DELAY() view returns (uint256)` selector 0x2d1250b8 Anyone | How long a launch must sit in Swept before its reserves may be released manually. Seeding is permissionless and retryable, so this window is what separates a genuinely unseedable launch from one that merely hit a transient failure, and it denies the owner a same-block escape hatch. |
| [GRADUATION_RESCUE_LONG_DELAY](#GRADUATION_RESCUE_LONG_DELAY) `GRADUATION_RESCUE_LONG_DELAY() view returns (uint256)` selector 0xfcd6fa8a Anyone | Time after a sweep (30 days) before the owner may rescue the reserves of a launch whose pool seed still looks viable. |
| [graduationExecutor](#graduationExecutor) `graduationExecutor() view returns (address)` selector 0xcc6d7a39 Anyone | The graduation executor that mints each graduated pool's position. Wired once by the owner. |
| [graduationGuard](#graduationGuard) `graduationGuard() view returns (address)` selector 0x496aa100 Anyone | The stateless graduation guard this factory created in its constructor, used to check that a pool seed is mintable. |
| [launchConfigCount](#launchConfigCount) `launchConfigCount() view returns (uint256)` selector 0xae72d871 Anyone | Returns the number of launch configurations. |
| [launchDeployer](#launchDeployer) `launchDeployer() view returns (address)` selector 0x858f5964 Anyone | The deployer helper that creates each coin and its curve with CREATE2. |
| [launchEnabled](#launchEnabled) `launchEnabled() view returns (bool)` selector 0x236a4afb Anyone | Whether launching is open to everyone. While false only whitelisted launchers may launch. |
| [launchFee](#launchFee) `launchFee() view returns (uint256)` selector 0xcf3cf573 Anyone | The fixed fee, in wei of ETH, a launch must send as msg.value. It is forwarded to the protocol fee recipient. |
| [launchForwarder](#launchForwarder) `launchForwarder() view returns (address)` selector 0x9b924452 Anyone | The router trusted to launch on behalf of the account that called it (launchTokenFor). |
| [launchHook](#launchHook) `launchHook() view returns (address)` selector 0x403cc96f Anyone | The Uniswap v4 hook every graduated pool uses; it also holds the current fee policy. |
| [locker](#locker) `locker() view returns (address)` selector 0xd7b96d4e Anyone | The locker that holds every graduated pool position and the excess coins, forever. |
| [maxCreatorTaxBps](#maxCreatorTaxBps) `maxCreatorTaxBps() view returns (uint256)` selector 0xf325a5fb Anyone | The highest creator fee a new launch may choose, in basis points (at most 10%). |
| [owner](#owner) `owner() view returns (address)` selector 0x8da5cb5b Anyone | Returns the address of the current owner. Inherited from Ownable. |
| [pairTokenEconomics](#pairTokenEconomics) `pairTokenEconomics(address pairToken) view returns (uint256 phantomQuote, uint256 graduationThreshold, uint8 decimals)` selector 0x31082134 Anyone | Virtual reserve, graduation target and decimals set for an ERC-20 pair asset, in that asset's own units. |
| [pendingCreatorFeeRecipient](#pendingCreatorFeeRecipient) `pendingCreatorFeeRecipient(address token) view returns (address newRecipient, uint256 effectiveAt, uint256 expiresAt)` selector 0x9beacf4a Anyone | An owner-proposed creator fee recipient change for a coin: new recipient, time it becomes executable and time it expires. Zero when none is pending. |
| [pendingOwner](#pendingOwner) `pendingOwner() view returns (address)` selector 0xe30c3978 Anyone | Returns the address of the pending owner. Inherited from Ownable2Step. |
| [permit2](#permit2) `permit2() view returns (address)` selector 0x12261ee7 Anyone | The Permit2 contract used to approve the PositionManager when a pool is seeded. |
| [poolManager](#poolManager) `poolManager() view returns (address)` selector 0xdc4c90d3 Anyone | The Uniswap v4 PoolManager graduated pools are created in. |
| [positionManager](#positionManager) `positionManager() view returns (address)` selector 0x791b98bc Anyone | The Uniswap v4 PositionManager that mints each graduated pool's full-range position. |
| [previewLaunchEconomics](#previewLaunchEconomics) `previewLaunchEconomics(uint256 launchConfigId, address pairToken) view returns (bytes32)` selector 0xf718b78c Anyone | Returns the economics digest a launch of `launchConfigId` in `pairToken` would produce right now, for a creator to pass back as TokenParams.expectedEconomics. Reading the digest and launching in separate transactions still leaves the terms free to move in between; the pin is what makes that movement revert instead of silently repricing the launch. |
| [renounceOwnership](#renounceOwnership) `renounceOwnership() pure` selector 0x715018a6 Anyone | Permanently disabled. An ownerless factory could never approve a pairToken, adjust fee ceilings, or recover a creator's fee recipient, and every launch already live would keep depending on those powers. Ownership can still be handed to a new owner via the two-step transfer. |
| [snipeTaxSeconds](#snipeTaxSeconds) `snipeTaxSeconds() view returns (uint256)` selector 0x6783774b Anyone | Seconds over which the launch tax decays to zero, snapshotted by every new launch. |
| [snipeTaxStartBps](#snipeTaxStartBps) `snipeTaxStartBps() view returns (uint256)` selector 0x50e25ac2 Anyone | The launch tax a buy pays in the launch second, in basis points of the pair asset spent, snapshotted by every new launch. Zero turns the launch tax off for new launches. |
| [VERSION](#VERSION) `VERSION() view returns (string)` selector 0xffa1ad74 Anyone | Release of the BaseLaunch launcher contracts. |
| [whitelistedLaunchers](#whitelistedLaunchers) `whitelistedLaunchers(address launcher) view returns (bool enabled)` selector 0xda3eda65 Anyone | Whether an address may launch while public launching is closed. |

### Write functions (29)

| Function | What it does |
| --- | --- |
| [acceptOwnership](#acceptOwnership) `acceptOwnership()` selector 0x79ba5097 Pending owner | The new owner accepts the ownership transfer. Inherited from Ownable2Step. |
| [addLaunchConfig](#addLaunchConfig) `addLaunchConfig(LaunchConfig config) returns (uint256 id)` selector 0x0e5b0aae Owner | Adds a launch configuration new tokens can be deployed against. |
| [cancelCreatorFeeRecipientChange](#cancelCreatorFeeRecipientChange) `cancelCreatorFeeRecipientChange(address token)` selector 0x6e47a188 Owner | Cancels a pending protocol-owner override before it takes effect. |
| [createGraduatedPool](#createGraduatedPool) `createGraduatedPool(address token) returns (uint256 positionId)` selector 0x2f53ef2f Anyone | Initializes the V4 pool with the swept reserves, mints a full-range position directly to the locker, and registers the pool with the launch hook. The curve already holds the pool's quote asset, so this seeds with exactly what it swept and needs no slippage bound. Permissionless and retryable: a launch stays in Swept until a seed succeeds, so a transient failure can never strand reserves. |
| [executeCreatorFeeRecipientChange](#executeCreatorFeeRecipientChange) `executeCreatorFeeRecipientChange(address token)` selector 0x3d3d2d58 Anyone | Applies a protocol-owner's proposed creator fee recipient change once its timelock has elapsed. Permissionless: anyone can execute an already-matured proposal. |
| [forceSweptGraduation](#forceSweptGraduation) `forceSweptGraduation(address token)` selector 0x7aed273e Owner | Sweeps a curve whose seed the preflight refuses, moving its reserves into this factory so the delayed rescue path can return them. The preflight in `graduate` runs before the irreversible sweep, so a launch it refuses stays in NotGraduated. Trading is already closed at that point, because the curve shuts its sell side the moment it is ready to graduate, and `rescueSweptGraduation` keys off the Swept phase, so without this the reserves would have no exit at all. Restricted to launches the preflight genuinely refuses: while a seed is still viable anyone can call `graduate` and this reverts, so it cannot be used to take a healthy launch's reserves in place of seeding its pool. The rescue timelock still runs from the sweep recorded here. |
| [graduate](#graduate) `graduate(address token)` selector 0xff6d8d05 Anyone | Sweeps the curve's remaining quote and token reserves into this factory and halts curve trading. Purely internal to the curve's own balances, so it is safe for the curve to call this automatically the instant a buy crosses the graduation threshold. |
| [launchToken](#launchToken-4) `launchToken(TokenParams params, uint256 launchConfigId, address pairToken, address[] snipeTaxExemptions) payable returns (address token, address curve)` selector 0xa72101af Anyone while launches are open, otherwise a whitelisted launcher | Same launch flow, plus a creator-declared list of wallets exempted from the snipe tax before trading opens to anyone else. This is the sanctioned pathway for organized teams that bundle their opening buys across several wallets: declared wallets clear at the untaxed price during the launch window while undeclared snipers pay the decaying tax. |
| [launchToken](#launchToken) `launchToken(TokenParams params, uint256 launchConfigId, address pairToken) payable returns (address token, address curve)` selector 0xf35abbcf Anyone while launches are open, otherwise a whitelisted launcher | Deploys a bonding curve and its launch token, wires them together, and records the launch. Trading starts immediately on the curve; the graduation pool's pairToken is fixed here, chosen by the caller. The caller and their creator fee recipient are exempted from the snipe tax automatically; a launch with additional bundle wallets should use the overload that takes an exemption list. |
| [launchTokenFor](#launchTokenFor) `launchTokenFor(TokenParams params, uint256 launchConfigId, address pairToken, address originalDeployer, address[] snipeTaxExemptions) payable returns (address token, address curve)` selector 0xd6a0eef5 Launch forwarder (the router) only | Launches for the initiating user of the trusted atomic launch-and-buy router, with its declared opening-buy exemptions. Only the configured `launchForwarder` may supply `originalDeployer`. This preserves the real caller without `tx.origin`, which breaks through account-abstraction relayers and must never be used for authorization. |
| [rescueCurveFees](#rescueCurveFees) `rescueCurveFees(address token)` selector 0x189eb0f5 Owner | Pays a still-trading launch's pending curve fees directly to the protocol and creator recipients, bypassing the escrow, when its quote asset has stopped delivering there. Also the only way to unwedge such a launch's graduation, since `graduate` sweeps fees before handing over the reserves and cannot succeed while that sweep reverts. Clearing the buckets makes the sweep a no-op and lets graduation proceed. |
| [rescueSweptGraduation](#rescueSweptGraduation) `rescueSweptGraduation(address token, address recipient)` selector 0xdbcb9c76 Owner | Releases a swept launch's reserves to `recipient` when its quote asset can no longer satisfy the seed step. `graduate` accepts a quote asset that under-delivers, because it credits the balance it actually received, but the seed leg funds the executor through `_transferExact` and requires the full nominal amount. An asset that becomes fee-on-transfer, rebasing, or blocklisting after approval therefore leaves a launch that has already halted its curve with a seed step that can never succeed, and every holder's quote asset frozen behind it. Deliberately does not use `_transferExact`: the asset's inability to deliver exactly is the reason this path exists, so requiring it here would reproduce the failure it recovers from. The reserves are moved whole to a single recipient for off-chain distribution rather than split on chain, since a launch in this state has no reliable way to pay many holders in an asset that cannot pay one. The owner is trusted here, bounded by two delays from the sweep. A launch whose seed the preflight refuses (the same check that gates forceSweptGraduation) is rescuable after GRADUATION_RESCUE_DELAY. A launch that still looks seedable reverts with GraduationStillViable until GRADUATION_RESCUE_LONG_DELAY, so a healthy launch can only go to createGraduatedPool, which stays permissionless throughout. The preflight is a math probe and cannot see a pair asset that stopped delivering after the sweep; a launch still unseeded after the long delay is in practice undeliverable, so the reserves are never frozen for good. Mirrors BaseLaunchHook.rescuePoolFees, which covers the same asset class for the post-graduation pool. |
| [setBuybackEnabled](#setBuybackEnabled) `setBuybackEnabled(address token, bool enabled)` selector 0xb18f1db1 Creator fee recipient (on or off), or owner (off only) | Enables or disables buyback-and-lock for one launch. Only the current creator recipient may enable it, since the buyback slice is funded from the creator's own bucket. The protocol owner may only disable it (a strictly creator-favorable action), so the owner can never force a creator's fees into the buyback vault to capture the protocol's 30% release share against the creator's wishes. |
| [setCreatorFeeRecipient](#setCreatorFeeRecipient) `setCreatorFeeRecipient(address token, address newRecipient)` selector 0xe102c9aa Owner | Proposes a protocol-owner override of a launch's creator fee recipient. Its motivating case is recovery when a creator loses access to their wallet, but the power is deliberately not conditioned on that: the owner may redirect the recipient of any launch. Takes effect only after `CREATOR_FEE_RECIPIENT_TIMELOCK` has elapsed and someone calls `executeCreatorFeeRecipientChange`, giving the community advance notice instead of applying instantly. A new proposal for the same token replaces any earlier pending one and resets the clock. A matured proposal takes precedence over any creator transfer made while it was pending. `transferCreatorFeeRecipient` deliberately does not cancel it, so the timelock is a notice period rather than a window in which the creator can veto by moving the recipient themselves. The override is therefore a standing protocol power over creator fee routing, not a narrowly scoped lost-key recovery, and it is documented as such rather than left to whichever call lands last. The collision is observable without extra state: this function emits the recipient as it stood at proposal time, and `_setCreatorFeeRecipient` emits the recipient it actually replaced. A creator transfer landing in between shows up as a mismatch between the two. |
| [setGraduationExecutor](#setGraduationExecutor) `setGraduationExecutor(address executor)` selector 0xfbec2d8b Owner | One-time wiring of the graduation executor, set after both are deployed since the executor's constructor needs this factory's already-known address. |
| [setLaunchDeployer](#setLaunchDeployer) `setLaunchDeployer(address deployer)` selector 0x3a9391e8 Owner | One-time wiring of the launch deployer, set after both are deployed since the deployer's constructor needs this factory's already-known address. |
| [setLaunchEnabled](#setLaunchEnabled) `setLaunchEnabled(bool enabled)` selector 0xf56f05b2 Owner | Opens or closes launches to non-whitelisted callers. |
| [setLaunchFee](#setLaunchFee) `setLaunchFee(uint256 newLaunchFee)` selector 0x5313be2c Owner | Changes the fixed native launch fee. |
| [setLaunchForwarder](#setLaunchForwarder) `setLaunchForwarder(address forwarder)` selector 0x767b7c16 Owner | Sets the router allowed to preserve the initiating user across an atomic launch-and-buy call. May be rotated when the router is upgraded without replacing the rest of the launch stack. Kept separate from `whitelistedLaunchers`: that list controls who may launch while the public gate is closed, whereas this address is trusted to identify another account for CREATE2 namespacing and launch attribution. |
| [setMaxCreatorTaxBps](#setMaxCreatorTaxBps) `setMaxCreatorTaxBps(uint256 bps)` selector 0x2260aead Owner | Adjusts the ceiling a creator's chosen trade tax is validated against at launch time. Already-launched tokens keep the immutable tax rate they launched with regardless of later ceiling changes. |
| [setPairTokenApproved](#setPairTokenApproved) `setPairTokenApproved(address pairToken, bool approved)` selector 0x8763e3dc Owner | Approves or removes a standard ERC-20 quote asset for new launches. Because curves collect the quote asset directly, approving one needs nothing beyond a real token contract and the economics its curves will price against. The stored scale is re-verified here rather than trusted from the economics call. Approval is the point where the asset enters service, and it is the only point at which the address is guaranteed to hold code, so this is what closes the gap for an asset configured before it was deployed or one that has since changed its reported decimals. |
| [setPairTokenEconomics](#setPairTokenEconomics) `setPairTokenEconomics(address pairToken, uint256 phantomQuote, uint256 graduationThreshold, uint8 expectedDecimals)` selector 0x092c08bd Owner | Sets the curve economics a quote asset's launches use, in that asset's own decimals. Required before the asset may be approved, and updatable afterwards so the peg to a target native-quote value can be refreshed as rates move. Existing launches are unaffected: each curve receives both figures as constructor immutables, so this only governs launches created after it. |
| [setSnipeTaxSeconds](#setSnipeTaxSeconds) `setSnipeTaxSeconds(uint256 secondsWindow)` selector 0xd1ec471a Owner | Sets the decay window new launches snapshot at creation, in seconds. Capped at one minute so a misconfiguration cannot leave a launch effectively closed to the public for minutes; disabling the tax is done through `setSnipeTaxStartBps`, so a zero window is refused rather than overloaded to mean off. |
| [setSnipeTaxStartBps](#setSnipeTaxStartBps) `setSnipeTaxStartBps(uint256 bps)` selector 0xb20e51af Owner | Sets the launch-second snipe tax that new launches snapshot at creation. Curves already trading keep the figure they launched under. Zero disables the tax for launches created while it is zero; a nonzero figure must exceed the 20% combined base fee ceiling, so the launch-window tax always dominates the ordinary fee take, and stays below 100% so a taxed buy always nets the buyer something. |
| [setWhitelistedLauncher](#setWhitelistedLauncher) `setWhitelistedLauncher(address launcher, bool enabled)` selector 0x366f0f3e Owner | Grants or revokes permission to launch while the public gate is closed. |
| [transferCreatorFeeRecipient](#transferCreatorFeeRecipient) `transferCreatorFeeRecipient(address token, address newRecipient)` selector 0x2931861b Coin's current creator fee recipient | Lets the current creator fee recipient hand off future creator fees for `token` to a new address, whether the launch is still trading on its bonding curve or has already graduated into its Uniswap V4 pool. Does not clear a pending protocol-owner override. If one is outstanding, it still executes on schedule and supersedes the address set here. See `setCreatorFeeRecipient`. |
| [transferOwnership](#transferOwnership) `transferOwnership(address newOwner)` selector 0xf2fde38b Owner | Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner. Setting `newOwner` to the zero address is allowed; this can be used to cancel an initiated ownership transfer. Inherited from Ownable2Step. |
| [updateLaunchConfig](#updateLaunchConfig) `updateLaunchConfig(uint256 id, LaunchConfig config)` selector 0xe73e334a Owner | Replaces an existing launch configuration. Already-launched tokens are unaffected since their pool parameters were snapshotted. |
| [receive](#receive) `receive() payable` Anyone | Accepts ETH swept out of a graduating curve and any dust the Uniswap PositionManager refunds while seeding a pool. |

### Events (25)

| Event | What it means |
| --- | --- |
| [BuybackEnabledUpdated](#event-BuybackEnabledUpdated) `BuybackEnabledUpdated(address indexed token, bool enabled, address indexed controller)` topic0 0xbd886f85b7731f66269f57707414d435bf8df930d3357a10becc48a69377f6d5 | A coin's buyback-and-lock was turned on or off; controller is the account that did it. Emitted by [setBuybackEnabled](#setBuybackEnabled) |
| [CreatorFeeRecipientChangeCancelled](#event-CreatorFeeRecipientChangeCancelled) `CreatorFeeRecipientChangeCancelled(address indexed token, address indexed proposedRecipient)` topic0 0xbe2de91c1cbef653c760573fff8355c0c851d35ed2a898342b4db556301cccf4 | The owner cancelled a pending creator fee recipient change for a coin. Emitted by [cancelCreatorFeeRecipientChange](#cancelCreatorFeeRecipientChange) |
| [CreatorFeeRecipientChangeProposed](#event-CreatorFeeRecipientChangeProposed) `CreatorFeeRecipientChangeProposed(address indexed token, address indexed currentRecipient, address indexed proposedRecipient, uint256 effectiveAt, uint256 expiresAt)` topic0 0x7f119e44c84a715429bee60d30ad2e14afdef6c60bb1a7eaa01290ecf6d1b2e5 | The owner proposed a new creator fee recipient for a coin; it can be executed between effectiveAt and expiresAt. Emitted by [setCreatorFeeRecipient](#setCreatorFeeRecipient) |
| [CreatorFeeRecipientUpdated](#event-CreatorFeeRecipientUpdated) `CreatorFeeRecipientUpdated(address indexed token, address indexed previousRecipient, address indexed newRecipient)` topic0 0x308c390ed1ab5873392818e036cabdf408bc8ad042fbaead3108954ff75ba980 | A coin's creator fee recipient changed, by the creator's own transfer or by an executed owner proposal. Emitted by [executeCreatorFeeRecipientChange](#executeCreatorFeeRecipientChange), [transferCreatorFeeRecipient](#transferCreatorFeeRecipient) |
| [GraduationExecutorSet](#event-GraduationExecutorSet) `GraduationExecutorSet(address executor)` topic0 0xac04674474e93058fae25e6df5dd94f57cdcacfe560a182a2eefc8c6006fbf6f | The graduation executor was wired (once). Emitted by [setGraduationExecutor](#setGraduationExecutor) |
| [GraduationTokensPermanentlyLocked](#event-GraduationTokensPermanentlyLocked) `GraduationTokensPermanentlyLocked(address indexed token, uint256 amount)` topic0 0xa0a18f5bf205becee8b268d7cf69addab8548ae8ef361791464cf0e0e17c1361 | At graduation, the coins not needed to seed the pool at the curve's final price were locked in the locker forever. Emitted by [createGraduatedPool](#createGraduatedPool) |
| [LaunchConfigAdded](#event-LaunchConfigAdded) `LaunchConfigAdded(uint256 indexed id)` topic0 0xedd96c570c6e5ef9add0378e59df53579a283889dc5dab6440ef6eca2ee6c8ce | The owner added a launch configuration. Emitted by [addLaunchConfig](#addLaunchConfig) |
| [LaunchConfigUpdated](#event-LaunchConfigUpdated) `LaunchConfigUpdated(uint256 indexed id)` topic0 0x2f8ba78ae68cfd0c82c7756c540eaf4eead3341aef9ccebcb91d546bff10d62b | The owner replaced or disabled a launch configuration. Emitted by [updateLaunchConfig](#updateLaunchConfig) |
| [LaunchDeployerSet](#event-LaunchDeployerSet) `LaunchDeployerSet(address deployer)` topic0 0xd5ea7aa3e328a0594dcf6914cd9e5369779efaa194ee4dd4c5afcad4f4ebbb0c | The launch deployer was wired (once). Emitted by [setLaunchDeployer](#setLaunchDeployer) |
| [LaunchEnabledUpdated](#event-LaunchEnabledUpdated) `LaunchEnabledUpdated(bool enabled)` topic0 0x4f1ea5016c51c2f82324e00e9b8a4a95ee5aeaa10c653dabaec5f1bc9047ba0b | Public launching was opened or closed. Emitted by [setLaunchEnabled](#setLaunchEnabled) |
| [LaunchFeeUpdated](#event-LaunchFeeUpdated) `LaunchFeeUpdated(uint256 launchFee)` topic0 0xc799be5eb19a1a6d6ba7368d21e2bc367c8a335e4a07cd3d954482e6f714d3c5 | The launch fee changed. Emitted by [setLaunchFee](#setLaunchFee) |
| [LaunchForceSwept](#event-LaunchForceSwept) `LaunchForceSwept(address indexed token)` topic0 0x52c1a28345695afc7f6b7629133124dec5d61ee745affd65e4fd2a776bc05840 | The owner swept a finished curve whose pool seed the guard refuses, so the delayed rescue can return its reserves. Emitted by [forceSweptGraduation](#forceSweptGraduation) |
| [LaunchForwarderSet](#event-LaunchForwarderSet) `LaunchForwarderSet(address forwarder)` topic0 0x56b32d3633fed72f97c4df44a78b5fa04f1d662d4bddebcd8a9b216d26d093ad | The trusted launch forwarder (router) changed. Emitted by [setLaunchForwarder](#setLaunchForwarder) |
| [LaunchGraduationRescued](#event-LaunchGraduationRescued) `LaunchGraduationRescued(address indexed token, address indexed recipient, uint256 quoteAmount, uint256 tokenAmount)` topic0 0x7017304fdd491394686dce984eac721f0be1a22228346210f16694772bde44ca | The owner released a swept launch's reserves to a recipient after the rescue delay. Emitted by [rescueSweptGraduation](#rescueSweptGraduation) |
| [LaunchSwept](#event-LaunchSwept) `LaunchSwept(address indexed token, uint256 quoteOut, uint256 tokenOut)` topic0 0xcdb72f157fd3666758a6ce201387ffb52038c7562e4fff352828da1096c4b6b4 | Graduation phase one: the curve's reserves moved into the factory and curve trading stopped. Emitted by [forceSweptGraduation](#forceSweptGraduation), [graduate](#graduate) |
| [MaxCreatorTaxUpdated](#event-MaxCreatorTaxUpdated) `MaxCreatorTaxUpdated(uint256 bps)` topic0 0x3e99ceb3e222d2214d53dacca902810db845f156f78152fdc076be628c4e9a40 | The ceiling on the creator fee changed. Emitted by [setMaxCreatorTaxBps](#setMaxCreatorTaxBps) |
| [OwnershipTransferred](#event-OwnershipTransferred) `OwnershipTransferred(address indexed previousOwner, address indexed newOwner)` topic0 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0 | Ownership moved to a new owner (at deployment, or when a pending owner accepted). Emitted by [acceptOwnership](#acceptOwnership), `constructor` |
| [OwnershipTransferStarted](#event-OwnershipTransferStarted) `OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner)` topic0 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700 | The owner named a pending owner; ownership moves when that account accepts. Emitted by [transferOwnership](#transferOwnership) |
| [PairTokenApprovalUpdated](#event-PairTokenApprovalUpdated) `PairTokenApprovalUpdated(address indexed pairToken, bool approved)` topic0 0x060d1992d069dc524985f328329aae36102a017c59733c5c91fc0691ee0703b6 | An ERC-20 pair asset was approved or removed for new launches. Emitted by [setPairTokenApproved](#setPairTokenApproved) |
| [PairTokenEconomicsUpdated](#event-PairTokenEconomicsUpdated) `PairTokenEconomicsUpdated(address indexed pairToken, uint256 phantomQuote, uint256 graduationThreshold, uint8 decimals)` topic0 0x67d517ee0e305d608b8410ddef27bbd2ed964d843d9b936e84ea2ad1bd65e5d1 | The virtual reserve and graduation target of an ERC-20 pair asset changed. Emitted by [setPairTokenEconomics](#setPairTokenEconomics) |
| [PoolGraduated](#event-PoolGraduated) `PoolGraduated(address indexed token, uint256 positionId, uint256 tokenAmount, uint256 pairTokenAmount)` topic0 0x0a44ef75df69c534f43cd6c1aa3ef8983065fe5fe79ef9e79f6494e6f258c259 | Graduation phase two: the Uniswap v4 pool was created and seeded, and its position locked. Emitted by [createGraduatedPool](#createGraduatedPool) |
| [SnipeTaxSecondsUpdated](#event-SnipeTaxSecondsUpdated) `SnipeTaxSecondsUpdated(uint256 secondsWindow)` topic0 0x2b1bf8cf5a401a6dd314ae29520988783e31f0e50ec734aa9ef26b8b7ff24a1f | The launch tax decay window for new launches changed. Emitted by [setSnipeTaxSeconds](#setSnipeTaxSeconds) |
| [SnipeTaxStartBpsUpdated](#event-SnipeTaxStartBpsUpdated) `SnipeTaxStartBpsUpdated(uint256 bps)` topic0 0x82d0fc041b26338f6e9cc240adde9cbe5b20064b4cb39ab96c953d5643687b1e | The starting launch tax for new launches changed. Emitted by [setSnipeTaxStartBps](#setSnipeTaxStartBps) |
| [TokenLaunched](#event-TokenLaunched) `TokenLaunched(address indexed token, address indexed curve, address indexed deployer, address pairToken, uint256 launchConfigId, uint256 graduationThreshold)` topic0 0x8d4aad4953d0ca700d468f3753aa14432d1b35b43ec6409f051fb6aa43a89607 | A coin and its bonding curve were created. deployer is the account the launch was made for. Emitted by [launchToken](#launchToken), [launchToken (4 args)](#launchToken-4), [launchTokenFor](#launchTokenFor) |
| [WhitelistedLauncherUpdated](#event-WhitelistedLauncherUpdated) `WhitelistedLauncherUpdated(address indexed launcher, bool enabled)` topic0 0xef2b562a67f01ed4b7c4265ec09b539039c6d5dd7e752191d3940508c3dc0068 | An address was added to or removed from the launch whitelist. Emitted by [setWhitelistedLauncher](#setWhitelistedLauncher) |

### Structs

| Struct | Fields, in ABI order |
| --- | --- |
| `FeePolicySnapshot` | `uint16 protocolFeeShareBps, uint16 buybackBurnBps, uint16 hookFeeBps, uint16 maxInternalPriceImpactBps` |
| `LaunchConfig` | `uint256 supply, uint256 curveFeeBps, uint256 phantomQuote, uint256 graduationThreshold, uint24 poolFee, int24 tickSpacing, bool enabled` |
| `LaunchedToken` | `address token, address curve, address deployer, address creatorFeeRecipient, address pairToken, uint256 graduationThreshold, uint24 poolFee, int24 tickSpacing, uint16 creatorTaxBps, bool buybackEnabled, GraduationPhase phase, uint256 sweptQuote, uint256 sweptTokens, uint256 sweptAt, bool exists` |
| `Socials` | `string twitter, string telegram, string discord, string website, string farcaster` |
| `TokenParams` | `string name, string symbol, string logo, string description, Socials socials, address creatorFeeRecipient, uint16 creatorTaxBps, bool buybackEnabled, bytes32 expectedEconomics, bytes32 salt` |

Two launcher sets on Base

Addresses are listed for launcher 2.1.0, where new coins launch, and for launcher 2.0, which keeps serving the coins launched before the cutover. A coin stays on the set that launched it. The functions and events are the 2.1.0 contracts'; the 2.0 contracts are an earlier version of the same code and have no interface registry, so check a 2.0 contract's verified source on Basescan before relying on a detail listed here.

How the fees are split is on [fees](https://baselaunch.app/fees), what the owner can and cannot change is on [security](https://baselaunch.app/security), and short answers are in the [FAQ](https://baselaunch.app/faq).

Meme coins are highly speculative and most lose their value. Nothing here is financial advice.

Last updated 2026-10-21.

Canonical page: https://baselaunch.app/docs/reference/factory
