A token launch that survives scrutiny.
We build the launch the honest way: a clean contract, supply that adds up, liquidity locked, and team tokens vested. No hidden mint, no rug lever, nothing to explain away when someone reads the code.
Click a slice to read its terms, and drag the scrubber to see exactly when tokens hit the market. Every lock and vest is on-chain, so a buyer can verify it instead of taking your word.
The rug test.
A rug is one transaction: the founder pulls the liquidity and the price goes to zero. Flip the lock off and pull it. Then flip it on and watch the same pull revert.
The LP tokens sit in a time-lock. The pull transaction reverts, so the liquidity physically can't leave until the unlock date.
Launched clean.
The first minutes are a feeding frenzy for bots. Per-wallet and per-tx limits at the open give real buyers a fair shot, then lift once the dust settles. Try to beat them.
- Trading gated until the launch tx
- Max wallet 2% while limits are on
- Max transaction 1% while limits are on
- Same-block buys blocked at open
- Limits lifted a few minutes in
- No privileged mint, ever
Read it yourself.
The whole promise is only worth what the code says. So here it is: a fixed supply, no mint, a one-way trading switch, and the wallet cap enforced on every transfer.
1// SPDX-License-Identifier: MIT2pragma solidity ^0.8.24;34import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";56contract Acme is ERC20, Ownable {7 uint256 public immutable maxWallet; // 2% of supply8 bool public tradingOpen;910 constructor() ERC20("Acme Protocol", "ACME") {11 _mint(msg.sender, _000_000e18); // the entire supply, once12 maxWallet = totalSupply() / 50; // 2%13 }1415 // there is no mint() after this. the supply is fixed forever.1617 function openTrading() external onlyOwner {18 tradingOpen = true; // one-way switch, no close19 }2021 function _update(address from, address to, uint256 value) internal override {22 require(tradingOpen || from == owner(), "trading not open");23 require(to == pair || balanceOf(to) + value <= maxWallet, "max wallet");24 super._update(from, to, value);25 }26}The full 100M is minted in the constructor. That line runs a single time.
There is no mint function, so the supply can never grow.
openTrading() turns trading on. Nothing turns it back off.
_update runs the 2% check on every transfer, so nobody corners the open.
A launch that survives scrutiny.
A clean contract, supply that adds up, liquidity locked, and team tokens vested. Nothing to explain away when someone reads the code.