Locked liquidity
Every Moonfiesta launch ends with the pool position being handed to a contract that has no way to give it back. This is the one hard guarantee the platform makes, so it is worth understanding exactly what it covers and exactly where it stops.
The short version: the liquidity cannot be pulled, by the creator or by us. The price can still go to zero. Those are different statements, and only the first one is about the lock.
What an LP position actually is
On Uniswap V3, liquidity is not a fungible LP token you can hold a balance of. It is an ERC721 NFT. When liquidity is deposited, the Nonfungible Position Manager mints an NFT with a numeric id, and that NFT is the deed. Whoever owns it controls the underlying liquidity. It is the only thing that does.
The position itself records a range of prices, an amount of liquidity, and a running tally of fees owed. Two functions on the position manager matter here, and the difference between them is the entire argument on this page:
A rug pull, mechanically, is somebody calling decreaseLiquidity and then collect, draining the pool and leaving holders with a token that has nothing to sell into. That is the thing this design sets out to rule out.
Why the entire supply is in the pool
Moonfiesta launches are single sided. The creator supplies no ETH and no WETH. The factory mints the whole supply, default 1,000,000,000 tokens, and deposits all of it into a fresh pool as concentrated liquidity in a range that starts at the floor price and goes up. The supply is not backed by liquidity. The supply is the liquidity.
The launch actually asserts this on chain. After the mint, the factory checks that the position swallowed the full supply and reverts with SingleSidedMintIncomplete if more than 0.01% got left behind. A launch where tokens were stranded outside the pool does not happen. It fails instead.
This has a consequence people usually miss. Because the range starts at the floor and only goes up, buyers push the price up along it, and the WETH they pay in stays in the position. It does not go to the creator. Nobody raised it. It becomes the bid: the liquidity that later sellers sell into. And because it is now part of the position principal, it is locked on exactly the same terms as the tokens were.
Launch a coin with a 5 ETH floor market cap against a 1,000,000,000 supply and the starting price is 5 / 1,000,000,000, or 0.000000005 ETH per token. If buyers then put 3 ETH in, that 3 ETH is sitting in the position as the bid side. There is no function anywhere that lets the creator, or us, take it out. The only way it leaves the pool is a seller swapping tokens back for it at the market price.
LpLocker, and the exact argument
The last thing the launch transaction does is transfer the position NFT to LpLocker at 0x5D5461aAB0D85DC81fc56cc9c3e369881969aC68. The argument that it can never come back out is not a promise. It is an argument about what is in the bytecode:
- There is no function on LpLocker that transfers the NFT. No transfer, no safeTransferFrom, no approve, no setApprovalForAll. Nothing can hand the deed to anyone.
- There is no function that calls decreaseLiquidity or burn on the position manager. The principal cannot be converted back into withdrawable tokens by any caller.
- It is not upgradeable. There is no proxy in front of it, no delegatecall, and no selfdestruct. The code you read today is the code that runs forever.
- There is no owner, no pause, no emergency exit, and no rescue function.
The whole contract is about 160 lines and it has exactly four externally reachable entry points: a constructor, a one time setFactory, onERC721Received to accept a position, and collectRewards to harvest fees. That is the complete list. The absence of a withdraw path is the guarantee, and absence is something you can check rather than trust.
Why collectRewards cannot touch the principal
collectRewards is permissionless. Anyone can call it for anyone else's token, which is a feature: a creator who loses interest cannot strand the holder share, because any holder can harvest on their behalf. It calls collect with the maximum possible amounts, which looks alarming until you know what collect can actually return.
On Uniswap V3, collect only ever pays out a per position counter called tokens owed. Fee accrual adds to that counter. The only other thing that adds to it is decreaseLiquidity. Since LpLocker never calls decreaseLiquidity, tokens owed can only ever contain fees, so asking for the maximum is asking for all of the fees and none of the principal. Passing a huge number does not widen what is available. It just guarantees the sweep is complete.
Where those fees go is fixed at launch and recorded against the position id. LpLocker reads that split and pushes into the FeeVault. It cannot invent a new recipient. See fees and rewards for how the split works and how to claim.
LpLocker is not literally admin free, and you will see this the moment you read it. It has an admin address and a setFactory function. That function does one thing, points the locker at the factory whose positions it accepts, and it reverts with FactoryAlreadySet if it has already been called. It has already been called. Tokens have launched, and a launch cannot succeed unless the factory is set.
So the admin power is a one shot that is already spent, and it never had any reach over a locked position in the first place. It could only ever affect which factory could deposit new ones. This matters because the factory owner key is compromised. That key can change defaults for future launches, and you should read safety and risks before trusting anything on this platform. It cannot reach into a position that is already locked.
Check it yourself
Do not take our word for any of the above. The point of putting it on chain is that you do not have to. Four minutes on the explorer settles it.
- Find the position idOn the LpLocker contract, read
tokenIdOfwith the token address. It returns the Uniswap position id for that launch. A zero result means the token did not come from this factory. - Confirm who owns itOn the position manager at 0x73991a25C818Bf1f1128dEAaB1492D45638DE0D3, read
ownerOfwith that id. It must return the LpLocker address, 0x5D5461aAB0D85DC81fc56cc9c3e369881969aC68. If it returns a wallet, the liquidity is not locked and you should walk away. - Read the positionStill on the position manager, read
positionswith that id. You will see the token pair, the 1% fee tier, the tick range, and the live liquidity amount. That is the real depth behind the market. - Read the locker itselfOpen the code tab on LpLocker and look for a way out. Search for transfer, withdraw, unlock, burn, and decreaseLiquidity. You will not find them. That absence is the whole guarantee, and it takes about a minute to confirm.
Every address is listed on contracts and addresses.
Why this is stronger than a 12 month lock
The familiar version of this promise is "liquidity locked for 12 months", usually via a third party locker service. That is a real improvement over nothing, but it is a different kind of claim, and the difference is structural.
A timelock has a withdraw function. It is right there in the bytecode, gated on a clock. Someone holds the key that will eventually call it, and the lock is a promise that they will not, yet. Three things can go wrong: the clock runs out and they pull, the key is stolen and the thief waits, or the locker service itself has an admin who can move things. You are trusting a schedule and a keyholder.
Permanent with no path out removes the function instead of gating it. There is no date to wait for, no key to steal, and no keyholder to trust, because there is nothing for a key to call. "They cannot do it yet" and "the code to do it was never written" are not the same guarantee.
What the lock protects you from
Precisely one thing, and it is the thing that kills most launches:
- The creator cannot pull the liquidity. Not after a day, not after a year, not ever. The classic exit, where the deployer drains the pool and the chart goes vertical downward in one block, cannot happen here.
- Nobody else can pull it either. Not us, not the factory owner, not whoever holds any key associated with this platform. There is no privileged caller, because there is no function for one to call.
- The creator cannot remove the bid. WETH that buyers put in is not theirs to take out. But sellers can and do take it out: that is a normal sell. This is not a guaranteed exit, and at the floor there is no WETH left to sell into at all. See safety and risks.
- The market cannot be migrated or turned off. There is no admin able to move the pool somewhere else or pause trading.
What it does not protect you from
This is the part most launchpads leave out, so read it twice. Locked liquidity is a narrow guarantee about one attack. It is not a safety rating, and it says nothing about whether a coin is a good idea.
The price can still go to zero. The lock keeps the pool alive; it does not put a floor under it. As sellers push down the range, the bid gets thinner. A locked pool with no buyers is a locked pool that is worthless. Most new tokens end up here.
A creator can still dump on you. The supply starts in the pool, but nothing stops the creator buying their own coin in the first seconds, cheaper than everyone else, and selling into your buys later. Locked liquidity says nothing about who holds the tokens. Check the holder distribution yourself.
Anti snipe is a deterrent, not a control. The time boxed max wallet cap applies to buys only and is trivially bypassed with several wallets. Do not read it as a guarantee that early supply is spread out.
The contracts are unaudited. Everything on this page is an argument from reading the source. It has not been reviewed by a third party. A bug in code nobody has audited is still a bug, and the reasoning above is only as good as the code it describes.
You are still exposed to MEV. Locked liquidity does not stop your buy being sandwiched. Set your slippage deliberately.
The honest framing: the lock removes one specific way for a creator to steal from you. It does not make the coin good, it does not make the market fair, and it does not make you money. Most memecoins go to zero with their liquidity locked the entire way down. Read safety and risks in full before you buy anything.