Klik lets anyone launch tokens with on-chain liquidity. This guide covers the current Ethereum ETH, Stock and Custom launch flow: direct Uniswap v4 pools against native ETH or an allowed ERC-20, with optional holder dividends.
New direct-pair pools use the actual pairing asset. Other networks, Reserves and older tokens keep their own deployed contracts and fee rules.
KLIK is the platform's own token, launched on Klik. Its original deployed contracts and fee rules remain separate from the current direct-pair release below.
| Field | Value |
|---|---|
| Token | 0x5886e4d8d6a41a5ea2f3f77f23d7a7e942d581f1 |
| Chain | Ethereum mainnet 1 |
| Symbol / decimals | KLIK / 18 |
| Initial supply | 1,000,000,000 |
Supply only ever goes down. Buybacks burn what they buy, sototalSupply() is the live number and the figure above is the starting one.
80% of supply is held in the Safe multisig and is not circulating. It splits two ways:
The entire 80% allocation has been burned, including the 70% community reserve and the 10% team allocation. Neither allocation remains available for distribution or vesting.
The remaining 20% went into the Uniswap V4 pool at launch and is what trades today. There was no presale, no private round and no allocation to anyone outside the two lines above.
Klik earns a share of every swap on every token launched through it, across all chains (see Fee Schedule). That revenue funds three things and nothing else:
Both sides scale with usage: every launch and every trade on any Klik chain feeds the same pool of revenue. Burns are visible on chain in the token's fallingtotalSupply().
Klik pays rewards in rounds, straight out of platform revenue.
After the launch block, current Ethereum direct-pair pools charge 1% on buys and sells, collected by the hook in the pairing currency. The pool itself has a 0% LP fee.
The creator's opening buy in the launch block is exempt from the hook fee.
| Item | How it works |
|---|---|
| Hook trading fee | 1% of the pair side of swaps after the launch block |
| Additional pool fee | 0% |
| Holders / creator | 80% of collected fees: holders with dividends enabled; otherwise the token creator |
| KLIK | 20% of collected fees |
| Payout currency | ETH for ETH pairs, or the actual paired ERC-20 |
The fee split is 80% to holders or the creator / 20% to KLIK. On a swap with a 1% fee, those shares are 0.8% and 0.2% of the fee-bearing pair amount.
The controller can change this split for future fees across all pools using that hook. Already-accrued fees keep their original allocation. There is no per-token split override.
This schedule applies to the latest Ethereum direct-pair release. Older tokens and other deployments retain their own fee rules. The hook's protocolFeeBps() is the authoritative setting; KLIK's share is capped at 50% of collected fees.
Chain ID: 1. These addresses identify the deployed direct-pair release. Before a new launch, resolve activeEngine() from the gateway. For an existing token, resolve engineOf(token) instead.
| Role | Address |
|---|---|
| Launch gateway | 0xCA7aF38b09c49a87d8a3936F47972365Bf41531C |
| Direct-pair factory / engine | 0xFE4a23bBE27bE16955f4d8599C73bac88ef647D1 |
| Dividend hook | 0xCBa49142A75dA64A679F32a159F4316f11a7e0cc |
| Token deployer | 0xDF521b5Ef5B34aF125E5611940813a21B2A32dB5 |
| Direct-pair router | 0x75D1648FaeBA7A189b46c4521d7FF4a245D8583a |
| ETH route / zap | 0xD2C245A5266ca12D3dcC06591c6375FbD6709DD9 |
The gateway can select a new engine for future launches. Existing tokens remain bound to their original engine and hook. Changing the gateway selection does not upgrade an existing pool.
targetMcapUsdE8() setting, initialized to $5,000.POST /api/uploadImage, then metadata withPOST /api/uploadMetadata. External image and metadata URLs are also supported.GET /api/anypair/price?chain=1&token=PAIR&launcher=ENGINE. Native ETH uses the zero address. The quote must be unexpired and signed for that engine.mineAnySalt helper handles this; a legacy factory salt is not interchangeable.gateway.launch(request) with the actual funding and current engine. Review the expected token amount, then sign.// Outer gateway request. launchData encodes the active engine's V2 payload.
{
expectedEngine, fundingAsset, expectedVault,
assetsIn, minSharesOut, deadline, launchData
}
// V2 launchData fields, ABI-encoded as one tuple:
{
name, symbol, metadata, salt, pair, liquidityProfile,
withDividends,
quote: { priceUsdE8, deadline, signature },
router, minPairOut, swapData
}Use the ABI and buildGatewayLaunchCall helper insrc/lib/anypairGateway.ts. Native funding sends ETH as transaction value; ERC-20 funding uses the gateway's funding flow. Direct-pair format 2 settles in the raw currency; do not substitute wrapper shares. A changed engine or expired quote requires a fresh preview.
Dividends direct the non-platform fee share to eligible token holders in the pairing currency. Creators can enable them at launch or later through enableDividends(token) on the token's engine. Activation is irreversible. Earlier creator fees remain claimable.
Automatic payouts are processed in bounded batches during supported token activity; they are not a promise of an immediate payout after every trade. Assigned rewards can also be claimed manually. Sell-generated rewards wait for a buy in a later block before allocation.
Read withdrawableDividendOf(holder) on the token for assigned pending rewards. The holder can call claimDividend(recipient) to receive their own entitlement. Parked sell rewards are separate from claimable balances.
| Recipient | Contract and call |
|---|---|
| Creator | Token's engine: collectFees(token), called by creator or platform controller; pays the recorded creator |
| Holder | Token: claimDividend(recipient); only the caller's entitlement |
| KLIK treasury | Hook: flushFees(token), then pullPlatformFees(pair); payout goes to the configured treasury |
Creator claims attempt to flush pending fees before paying the engine's recorded balance. Reading a token contract's ETH balance is not a creator-fee quote for this release. The KLIK admin Treasury tab separates fees ready to pull from fees still waiting to flush.
Discover new tokens using tokenCount() and deployedTokens(index) on the engine. Keep previous engines indexed after upgrades; resolve each token through its gateway binding.
getMarketCapInPair(token) reads the pool price and supply in raw pair units. Divide by the pair's decimal unit and multiply by a current pair/USD price for dollar market cap.getMarketCapUsdE8(token) uses a saved pair-price quote and is not a live USD oracle.
POST /api/uploadImage: multipart form with a file field. Response: { "cid": "...", "url": "..." }.
POST /api/uploadMetadata: JSON metadata, returning a CID.
{
"name": "My Token",
"symbol": "MYT",
"description": "Your token description",
"image": "ipfs://IMAGE_CID",
"website": "https://example.com",
"twitter": "https://x.com/example",
"telegram": "https://t.me/example"
}GET /api/anypair/price?chain=1&token=PAIR&launcher=ENGINE returns the engine address, priceUsdE8, deadline and signature alongside pair information. Always supply and verify the selected engine; omitting it can select a legacy quote domain.
nosign=1 is for display only: its empty signature and zero deadline cannot launch a token. Pair availability, quote expiry and simulation must all pass before submission.
Legacy /api/uploadTokenMetadata and /api/generate-saltintegrations do not replace the current gateway preparation flow.
This read-only example discovers the active factory and fee split. It does not sign or send a transaction.
import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://ethereum-rpc.publicnode.com');
const gateway = new ethers.Contract(
'0xCA7aF38b09c49a87d8a3936F47972365Bf41531C',
['function activeEngine() view returns (address)',
'function engineOf(address) view returns (address)'], provider
);
const engineAddress = await gateway.activeEngine();
// For existing tokens, use await gateway.engineOf(tokenAddress) instead.
const engine = new ethers.Contract(engineAddress,
['function hook() view returns (address)'], provider);
const hook = new ethers.Contract(await engine.hook(), [
'function FEE_BPS() view returns (uint256)',
'function protocolFeeBps() view returns (uint256)'
], provider);
const share = await hook.protocolFeeBps();
console.log('Trading fee:', Number(await hook.FEE_BPS()) / 100, '%');
console.log('KLIK share:', Number(share) / 100, '%');
console.log('Creator / holders share:', Number(10000n - share) / 100, '%');Older pools and other networks remain accessible in the app. Their original contracts determine their fees; this guide's current Ethereum schedule does not overwrite them.