BaseLaunchLocker
Holds every graduated pool's full-range position NFT and the coins left over at graduation, forever. It has no withdraw, transfer or arbitrary-call function.
Permanently holds the graduated Uniswap V4 position NFT for every launcher launch. Unlike an LP-fee locker, there is no collectFees() here: fee collection and distribution belong entirely to BaseLaunchHook and BaseLaunchFeeEscrow, since a V4 position accrues fees inside the singleton PoolManager rather than on the NFT itself. This contract exposes no withdrawal or arbitrary-call function, so locked liquidity can never be removed by an administrator.
Part of the contract reference.
Deployed at
Read functions (9)
| Function | What it does |
|---|---|
factoryfactory() view returns (address)selector 0xc45a0155Anyone | The launch factory, the only caller that can lock a position or coins. Wired once. |
isLockedisLocked(address token) view returns (bool)selector 0x4a4fbeecAnyone | Returns whether a launch's position has been locked here. |
lockedPositionslockedPositions(address token) view returns (uint256 tokenId)selector 0xfa22143dAnyone | The PositionManager token id of a coin's locked pool position. |
lockedTokenSupplylockedTokenSupply(address token) view returns (uint256 amount)selector 0x732e78e4Anyone | Coins of a launch locked here forever at graduation. |
onERC721ReceivedonERC721Received(address, address, uint256, bytes) view returns (bytes4)selector 0x150b7a02Uniswap PositionManager only | Rejects safe transfers of anything but a canonical position NFT. Not part of the graduation path. Graduation names this locker as the |
ownerowner() view returns (address)selector 0x8da5cb5bAnyone | Returns the address of the current owner. Inherited from Ownable. |
pendingOwnerpendingOwner() view returns (address)selector 0xe30c3978Anyone | Returns the address of the pending owner. Inherited from Ownable2Step. |
positionManagerpositionManager() view returns (address)selector 0x791b98bcAnyone | The Uniswap v4 PositionManager whose position NFTs this locker holds. |
renounceOwnershiprenounceOwnership() pureselector 0x715018a6Anyone | Permanently disabled. Ownership here exists only to perform the one-time factory wiring, and renouncing before that wiring would leave the locker unable to ever accept a graduated position. |
Write functions (5)
| Function | What it does |
|---|---|
acceptOwnershipacceptOwnership()selector 0x79ba5097Pending owner | The new owner accepts the ownership transfer. Inherited from Ownable2Step. |
lockPositionlockPosition(address token, uint256 tokenId)selector 0x292d5732Factory only | Registers and verifies permanent custody of a graduated position. Called once per launch by the factory, immediately after minting the full-range position directly to this locker's address. |
lockTokenSupplylockTokenSupply(address token, uint256 amount)selector 0xb8a0d7abFactory only | Permanently locks the virtual-reserve token remainder that cannot enter the graduated pool without lowering its opening price. |
setFactorysetFactory(address factory_)selector 0x5bb47808Owner | One-time wiring of the launch factory, set after both are deployed. |
transferOwnershiptransferOwnership(address newOwner)selector 0xf2fde38bOwner | 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 Inherited from Ownable2Step. |
Events (5)
| Event | What it means |
|---|---|
FactorySetFactorySet(address factory)topic0 0x1edf3afd4ac789736e00d216cd88be164ddcef26a6eedcc30cdb0cb62f3741b1 | The factory was wired (once). Emitted by setFactory |
OwnershipTransferredOwnershipTransferred(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, |
OwnershipTransferStartedOwnershipTransferStarted(address indexed previousOwner, address indexed newOwner)topic0 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700 | The owner named a pending owner; ownership moves when that account accepts. Emitted by transferOwnership |
PositionLockedPositionLocked(address indexed token, uint256 indexed tokenId)topic0 0x2cabb2a2973327d5863ceb4707e9441851243897e86d587ee35943599752eb54 | A coin's graduated pool position was locked forever. Emitted by lockPosition |
TokenSupplyLockedTokenSupplyLocked(address indexed token, uint256 amount)topic0 0xaf33c4aba92959b3e7ddc83ab728938262da159a6c05ca836f6c46f9bcb2c740 | Coins not needed to seed the pool were locked forever. Emitted by lockTokenSupply |
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.