BeeFun
Launch coin

Contracts

Deployed on BNB Chain mainnet, chain ID 8453. Every one of them is verified on Basescan, so the code below the links is the code that runs.

contractaddress
PairLaunchpad0x45Ba82BdD9671ba35c022ba0E750a01dF5DC8c8c
FeeVault0x41A00c179C96380C4952B698b3B13D4d2B005816
QuoteRegistry0x8D24424806cE1bfEFAdec9328A2C1c4e8EBFeA68
CompositeQuoteGate0xaBaD2c322A087dDE9F4633E5e6c2F2b5CC128Cc5
UniV3QuoteGate0x40f7F4Ae85f293Ac9bD53374BBdc98b372992be0
AerodromeQuoteGate0xe1B63AF3219147a396fd2B878175E305A6394656
SampledV4QuoteGate0xf4Ab65DFFC26E422E50deF0b7528b469be2e4EAa
V2QuoteGate0x886572143B29B3d3d903f5550d9f03a2D8A12226

Your coin's own contract

Every coin launched here is a PairToken, and every one of them shows as verified without anyone submitting it. That is not a courtesy — PairToken takes no constructor arguments (it calls back into the launchpad for its name, symbol and supply), so the creation bytecode is byte-identical every time. One instance was verified; the explorer matches all the others, including coins that do not exist yet.

What that verified source says, and what it therefore cannot do: fixed supply set once in the constructor, no mint function, no transfer tax, no blacklist, no pause, no owner.

External contracts it uses

Pancake Infinity PoolManager0x498581fF718922c3f8e6A244956aF099B2652b2b
PancakeSwap V3 factory (measurement only)0x33128a8fC17869897dcE68Ed026d694621f6FDfD
PancakeSwap PancakeSwap V3 factory0x5e7BB104d84c7CB9B682AaC2F3d509f5F406809A
PancakeSwap PancakeSwap V3 factory #20xf8f2eB4940CFE7d13603DDDD87f123820Fc061Ef
PancakeSwap V2 factory (measurement only)0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6
SushiSwap V2 factory (measurement only)0x71524B4f93c58fcbF659783284E38825f0622859
PancakeSwap classic AMM factory (measurement only)0x420DD381b31aEf6683db6B902084cB0FFECe40Da
Chainlink BNB/USD0x71041dddad3595F9CEd3DcCFBe3D1F4b0a16Bb70
Chainlink BTC/USD0x64c911996D3c6aC71f9b455B1E8E7266BcbD848F

Calls worth knowing

Before launching

// Non-reverting. Returns whether it would be allowed, and why not if not.
registry.status(address quote)
  returns (bool eligible, Decision decision, Report report)

// The bar this particular asset has to clear — $15,000 if listed, $50,000 if not.
registry.requiredDepthUsdE8(address quote) returns (uint256)

Naming a v4 pool

Every other venue can be searched: a factory answers getPair(a, b) or getPool(a, b, fee). Pancake Infinity's singleton cannot — a pool is identified by the hash of its key, and the key contains a 160-bit hook address, so it can be verified but never enumerated. A v4 pool therefore has to be named once before the gate can see it. Anyone may do it, once, for everyone.

v4Gate.registerPool(PoolKey key) returns (address token)
v4Gate.registerLaunch(address token) returns (address)   // for a coin launched here
v4Gate.probe(PoolKey key) returns (uint256 usdE8, address anchor)   // read-only, changes nothing

Nothing equivalent is needed for the V2-shaped venues or for PancakeSwap V3 and PancakeSwap V3: those are searched directly, so a coin with a market there is usable the moment its address is pasted in.

Launching

launchpad.launch(LaunchConfig cfg) payable returns (address token, bytes32 poolId)
launchpad.predictToken(address creator, bytes32 salt) returns (address)
launchpad.launchFee() returns (uint256)

LaunchConfig carries, beyond the obvious:

fieldwhat it does
creatorBpsshare of supply kept back for you, capped at 20%
feeRoute0 keeps your fees, 1 buys the coin back and burns it
feeRecipientzero means the launching wallet
devBuyQuotepair-asset amount spent buying your own coin as the pool's first trade; needs an approval to the launchpad first
devBuyMinOutleast you will accept from that buy — nobody can front-run it, so this guards against you and the pool disagreeing on the opening price

After launching

// Anyone can call. Proceeds only ever reach the recorded recipient, the sink and the treasury.
feeVault.collect(address token)

// Creator only. Both take effect from the next collect.
feeVault.setFeeRoute(address token, FeeRoute route)
feeVault.setFeeRecipient(address token, address recipient)

// Reads
launchpad.launchOf(address token)                              // a public mapping: an unnamed tuple
feeVault.launchOf(address token) returns (Launch)              // includes the PoolKey
feeVault.feeRouteOf(address token) returns (FeeRoute)
feeVault.feeRecipientOf(address token) returns (address)
feeVault.owed(address token, address who) returns (uint256)    // a payout that could not be pushed
feeVault.claim(address token)                                  // collect one

Where the liquidity lock actually lives

There is no lock contract and no locked LP token, because Pancake Infinity has no LP tokens at all — a position is a storage slot keyed by (owner, tickLower, tickUpper, salt). The usual "liquidity locked" detectors look for LP tokens sent to a burn address or a locker, and here there is nothing of the sort for them to find.

What holds instead is a property of FeeVault, and now that its source is published you can check it rather than believe it: no code path in the vault ever passes a negative liquidityDelta. Collecting fees calls modifyLiquidity with a delta of exactly zero. There is no withdraw, no emergency exit, and no owner function that adds one. The float cannot come back out — not by the creator, not by us.

Owner powers

The owner can retune the depth bars, the fee bounds, the launch fee, the treasury, the buyback sink, the curated list, the gates and their parameters. It cannot touch a launch's liquidity, change an existing launch's creator share, or redirect a creator's fees.

Ownership transfer is two-step everywhere: a handover that is never accepted leaves the current owner in place rather than sending the protocol to a wrong address.

Today the owner is a single EOA. It should be a multisig behind a timelock, and the contracts do not enforce that themselves.

None of this has been audited.