# 1000X > Token launchpad on BNB Smart Chain (chain id 56). One transaction deploys a fixed-supply BEP-20 (1,000,000,000, 18 decimals, no owner, no mint, no tax), creates its PancakeSwap V3 pool (fee 10000 = 1%), puts the whole supply in as liquidity, locks the position forever and optionally makes the creator's first buy. Every token address ends in 1000. Launching is permissionless: any wallet or bot can call the factory directly. Human guide: https://1000x.family/developers Machine-readable facts: https://1000x.family/developers/manifest.json ABIs: https://1000x.family/developers/abi/factory.json, https://1000x.family/developers/abi/locker.json, https://1000x.family/developers/abi/distributor.json, https://1000x.family/developers/abi/distributor-factory.json, https://1000x.family/developers/abi/quote-pricer.json, https://1000x.family/developers/abi/token.json ## Contracts (BSC mainnet) - Factory: 0x027ad1Bc0C4fdA010566d4535A00eAFb19798f22 (deploy block 125051946) - Locker: 0x79a7CAc0e1ed7CcF18b39B4C0954BCb1c2c63d99 - DistributorFactory: 0xcf7E9883A57eBd26af57ddA051B4165D777facf0 - WBNB: 0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c - PancakeSwap V3 SmartRouter: 0x13f4EA83D0bd40E75C8222255bc855a974568Dd4, QuoterV2: 0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997 ## Launch a token 1. Read factory.launchFee() and factory.tokenInitCodeHash(). 2. Mine a salt for the sending wallet: onchainSalt = keccak256(abi.encode(creator, salt)); token = keccak256(0xff ++ factory ++ onchainSalt ++ tokenInitCodeHash)[12:]; it must end in 1000 (about 65,536 tries). Check with factory.predictToken(creator, salt). A salt only works for the wallet it was mined for. 3. Optional: POST https://1000x.family/api/uploads/image (multipart "file"), then POST https://1000x.family/api/uploads/metadata {name, symbol, imageCid?, description?, website?, twitter?, telegram?} → uri. 4. Call launch((salt, name, symbol, metadataURI, quote, mode, feeRecipient, firstBuy, minMemeOut, quoteRoute)). - BNB pair: quote = WBNB, quoteRoute = [], msg.value = launchFee + firstBuy. - Other BEP-20 quote: POST https://1000x.family/api/preflight/quote {quote, creator} → route.via is quoteRoute; approve the factory for quoteProbeAmount(quote) + firstBuy; msg.value = launchFee. - mode: 0 = Dev (80% of the fees, in the quote, pushed to feeRecipient on every collect); 1 = Burn (meme-side 80% burned; quote-side 80% buys back and burns (Distributor.kick)); 2 = Holders (80% in the quote shared with holders per epoch (snapshot + merkle)). Immutable. - feeRecipient: Dev mode payee, 0x0 = creator. name ≤ 30 characters, symbol ≤ 12 (any printable text incl. spaces and emoji; no line breaks or invisible characters). - Use a gas limit of 8000000; node estimates can fall short. 5. The receipt has TokenLaunched(token, creator, quote, pool, mode, feeRecipient, positionId, salt, initialTick). ## Events - Factory TokenLaunched(address indexed token, address indexed creator, address indexed quote, address pool, uint8 mode, address feeRecipient, uint256 positionId, bytes32 salt, int24 initialTick) — topic0 0xde30572a5d0e09be84a0a9d5225a741b07fe0ae1f30fc7d5b35656e4acb4b3cd. One per launch. The only proof a token is a 1000X token. - Factory FirstBuy(address indexed token, address indexed buyer, uint256 quoteIn, uint256 memeOut) — topic0 0x0beb6c120fb450ea4109a19546dd3fae89fdf4d6f7d76c1925f32d6c471f3a30. Creator's optional buy inside the launch transaction. - Factory QuoteRouted(address indexed token, address[] via, int24 wbnbPerQuoteTick) — topic0 0xc03ee0549a49e6490a9175811045aae94dc0f2d7183be5ca62317fcd24530531. Non-BNB quotes only: the route used to price the launch. A token is a 1000X token only if the factory emitted TokenLaunched for it (or factory.isThousandXToken(token) is true). The 1000 suffix alone proves nothing. ## Errors - BadSuffix(address) (Factory): predictToken(msg.sender, salt) does not end in 1000. Mine the salt for the wallet that sends the tx. - WrongMsgValue(expected, actual) (Factory): msg.value is not launchFee (+ firstBuy for a BNB pair). Read launchFee() right before sending. - FirstBuyTooSmall(min, actual) (Factory): first buy under minFirstBuy (converted to the quote). Raise firstBuy. - QuoteDenied(quote) (Factory): quote is on the platform denylist. Pick another quote. - QuoteIsMeme() (Factory): quote equals the token being created. Use another salt. - RouteForWbnb() (Factory): quoteRoute must be empty for WBNB. Pass []. - QuoteNotERC20(quote) (Factory): not a contract, or the ERC-20 surface fails. Pick a standard BEP-20. - QuoteHasTransferFee(quote) (Factory): the probe transfer was taxed or skimmed. Taxed tokens cannot be quotes. - QuoteRebases(quote) (Factory): totalSupply changed during the probe. Rebasing tokens cannot be quotes. - BadRoute / NoTwap / HopTooThin / NoWbnbPath (QuotePricer): no usable ≤ 3-pool route to WBNB with a 30-min TWAP and depth. Use the route from POST /api/preflight/quote. - PoolPriceMismatch / RepriceNotFree (Factory): someone pre-created the pool at the predicted address and parked liquidity. Mine a new salt. - ERC20InsufficientAllowance (quote token): allowance < quoteProbeAmount(quote) + firstBuy. Approve the factory for both. ## Trading and fees Trade on the token's PancakeSwap V3 pool (fee 10000) with any V3 router; the quote may be WBNB or another BEP-20. Fees: Locker.collect(token) is permissionless and pays 20% to the platform treasury and 80% to the creator mode. Burn/Holders tokens: DistributorFactory.distributorOf(token) → Distributor.kick() (permissionless, cooldown). ## REST API (https://1000x.family/api, read-only JSON, no key, server-side use: no CORS) - GET /tokens?sort=new|last_trade|volume|mcap&q=&limit=1..200&offset=&pin=false — Feed page; total in the X-Total-Count header. pin=false for a plain ranking. - GET /tokens/{token} — One token: creator, feeRecipient, mode, quote, pool, positionId, launchTx, burned, prices. - GET /tokens/{token}/trades?limit=1..500&before_id=&offset= — Indexed swaps, newest first (trader = tx signer). - GET /tokens/{token}/ohlcv?interval=1s|1m|5m|15m|1h|4h|1d&since= — Candles in the quote; usdPerQuote converts. - GET /tokens/{token}/holders?limit=1..500 — Top holders. - GET /tokens/{token}/epochs — Holders mode: epochs, roots, payouts. - GET /tokens/{token}/burns — Transfers to 0x…dEaD with a running total. - GET /accounts/{wallet}/tokens — Tokens a wallet launched (creator = sender of launch), newest first. - GET /accounts/{wallet}/claims — What a wallet can claim (holder rewards, credited fees). - POST /preflight/quote — Body {quote, creator, via?}. Read-only check of a non-BNB quote: reasons, route.via, start_tick, min_first_buy, decimals. - POST /uploads/image — multipart file → {cid, uri}. Re-encoded, EXIF stripped, ≤ 1024 px. - POST /uploads/metadata — Body {name, symbol, imageCid?, description?, website?, twitter?, telegram?} → {uri} for metadataURI. - GET /launches/by-tx/{txHash} — Token of a launch tx, even before the indexer has it. - GET /quotes/launched — Non-BNB quotes used by real launches, most used first. - GET /stats?window=24h|all — Launches, trades, volume, creators. - GET /health — Indexer head, lag in blocks, BNB/USD. Limits: Every request: 400 per 10 s per IP at the edge (then a 10 s block); /api/*: ≈ 1,800 per minute per IP; POST /preflight/quote: 60 per minute per IP; POST /uploads/*: 20 per 10 minutes per IP; Searches (?q=): busy → 503, retry after a few seconds; GET caching: responses are up to ~2 s old (shared edge cache). ## Risks Contracts are live on mainnet and not audited. Tokens can go to zero. Nothing here is investment advice.