# BaseLaunchGraduationExecutor

Mints each graduated pool's full-range position to the locker for the factory, then sends rounding dust to the protocol fee recipient (dust of the coin itself goes to the locker).

Performs the heaviest step of launcher graduation on BaseLaunchFactory's behalf: minting the full-range Uniswap V4 position. Split out into its own contract purely so BaseLaunchFactory's own bytecode stays under EIP-170's 24576-byte deployed-code limit: the Permit2 approval dance, PositionManager action encoding, and post-mint dust sweep account for a large share of that size on their own. The factory transfers exactly the assets a mint needs here immediately before calling in, so this contract never holds a balance between transactions.

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

### Deployed at

BaseLaunchGraduationExecutor (2.1.0)`0x56eB01751007e982Cc01861829dDDd151E129852`[](https://basescan.org/address/0x56eB01751007e982Cc01861829dDDd151E129852)

BaseLaunchGraduationExecutor (2.0)`0x4a8443A8773d0aFF04edC60347b60DE75788FBd1`[](https://basescan.org/address/0x4a8443A8773d0aFF04edC60347b60DE75788FBd1)

### Read functions (4)

| Function | What it does |
| --- | --- |
| [factory](#factory) `factory() view returns (address)` selector 0xc45a0155 Anyone | The launch factory, the only caller allowed to mint. |
| [locker](#locker) `locker() view returns (address)` selector 0xd7b96d4e Anyone | The locker each position is minted to. |
| [permit2](#permit2) `permit2() view returns (address)` selector 0x12261ee7 Anyone | The Permit2 contract used to approve the PositionManager. |
| [positionManager](#positionManager) `positionManager() view returns (address)` selector 0x791b98bc Anyone | The Uniswap v4 PositionManager that mints each position. |

### Write functions (2)

| Function | What it does |
| --- | --- |
| [mintFullRangePosition](#mintFullRangePosition) `mintFullRangePosition(address launchToken, PoolKey key, int24 tickLower, int24 tickUpper, uint160 sqrtPriceX96, uint256 amount0Max, uint256 amount1Max, address currency0, address currency1, address protocolFeeRecipient) payable` selector 0xcbba1910 Factory only | Mints a full-range position directly to the locker from balances the factory just transferred here, then forwards any post-mint rounding dust on either leg to `protocolFeeRecipient`. Full-range liquidity is derived here from the pool's starting price and the target amounts, rather than by the factory, because the tick and liquidity math inlines a large amount of code that the factory has no room for. The exact amounts SETTLE_PAIR ends up pulling almost always round down slightly against those targets, so the post-mint sweep prevents dust piling up here. |
| [receive](#receive) `receive() payable` Anyone | Accepts the ETH the factory forwards for a mint and any dust the PositionManager returns. |

### Events (2)

| Event | What it means |
| --- | --- |
| [GraduationDustRetained](#event-GraduationDustRetained) `GraduationDustRetained(address indexed launchToken, address indexed currency, uint256 amount)` topic0 0x667636bce2491e3f246c8b4ec1f4ca0be227dfa611d0575c59f5949283b433c1 | Leftover dust after a mint could not be sent and stays in the executor; the next graduation in the same currency carries it out. Emitted by [mintFullRangePosition](#mintFullRangePosition) |
| [GraduationDustSwept](#event-GraduationDustSwept) `GraduationDustSwept(address indexed launchToken, address indexed currency, uint256 amount)` topic0 0x80a5a2ff8b8c5533e5862e4e161bbcade9af6fd9d67bef56a590b062107f027f | Leftover dust after a mint was sent on: coin dust to the locker, other dust to the protocol fee recipient. Emitted by [mintFullRangePosition](#mintFullRangePosition) |

### Structs

| Struct | Fields, in ABI order |
| --- | --- |
| `PoolKey` | `address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks` |

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/executor
